题目解释
先让我解释一下文章题目。
网络协议有多层,然而几乎每一层都有字段来标明上一层的协议类型。
比如IP协议中的Protocol字段。
其中的protocol需要指明IP包裹的是什么协议类型。
在一个真实的IP Packet中
Protocol的值为6,它表示TCP协议。
我的问题是,为什么要这么做呢?为什么要有这个字段呢?它发挥了什么作用?
网络包的名称
虽然我们平时将每一层的网络报文都称之为包,比如HTTP包、TCP包、UDP包、IP包等等等。
其实这样是不专业的,网络协议每一层都有自己自己的名字。
In summary: if it is on an Ethernet it is called an Ethernet frame; if it is between the Ethernet driver and the IP module it is called a IP packet; if it is between the IP module and the UDP module it is called a UDP datagram; if it is between the IP module and the TCP module it is called a TCP segment (more generally, a transport message); and if it is in a network application it is called a application message.
上面这段描述来自RFC1180,这是非常值得一看的RFC文档。
总结来说:
物理层Ethernet:Frame
网络层IP:Packet
控制层:TCP Segment、UDP Datagram
应用层:Message,比如HTTP Message
我们都称之为包,不是更方便吗?
第一、显得专业,不同的名字本身意味着不同的网络层次。在我看来,理工科的学习,基础知识是重点,基础知识是支撑整个专业体系的基石,基础知识的重点是各个基础概念的定义。熟练掌握各种定义的概念,有利于整个体系的学习。
第二、各个层的名字不是随便取的,从名字里会有一些其他的提示。比如TCP的Segment,segment是段的意思。段是相对于整体的部分,其实暗示了TCP单独一个包,是不完整的。没错,很多时候一个http响应,需要拆分成多个tcp包,然后才能发送过来。
一个HTTP的发送之旅
不过等下,这一节我们并不关注HTTP的发送之旅啦。仅仅是在本地,从应用层到物理层的组装过程,也就是左面。
上面是一个HTTP请求的wireshark抓包截图
通过包的结构很容易明了HTTP包的包装过程。
结论:对于一个HTTP请求来说,从出生那一刻起就决定了它的成长之旅。即HTTP message -> TCP segment -> IP packet -> Ethenet Frame.
类似HTTP这样的应用层协议,其实都是从出生那一刻,系统已经知道了它的前进之路。
所以我们为什么需要在网络协议的每一层标识协议类型呢?
你要反过来看问题
没错,本地生成网络请求的时候,路径都是规定死的。但是别忘了,网络包发送后是需要被对端接收的。
将自己站在服务端收数据的那一方。当物理层接收到一个目的地址为自身的Ethenet Frame,它可怎么办?
它怎么能知道Ethernet拆解Frame之后,将剩下的数据交给谁处理呢?
发给ARP module?还是发给IP module?
发给IP module之后,它发给谁?
发给ICMP处理?还是交给TCP module?还是发给UDP module?
所以拆包的过程,是需要指示的。到底交给上一层的哪个module。
看!
Ethernet在Type字段中指明要将拆解之后的数据交给IP module处理。
IP Packet在Protocol字段中指明要将拆解之后的数据交给TCP module处理。
总结:揭示答案,从上到下没问题,从下到上,你要整哪样哦。
tcp/udp需要类型字段,指示应用层的协议吗?
上面我们讲Ethernet Frame和IP Packet都有专门的字段指示将拆解之后的数据交给谁处理。
怎么到了TCP Segment中 ,我们好像没有找到专门的字段指明前方的路呢。
道理是一样的,如果不指示怎么可能知道交给哪一位应用层来处理。
只不过采用的方式,不同于Packet和Frame的专门协议类型字段。
控制层协议:山人自有妙计。
其实就是端口号诶。
控制层协议通过端口号得知要交给谁解析啦。
所以知名的服务进程的端口号一般是不变的。比如HTTP服务对应的80端口、HTTPS服务对应的443端口、SSH服务对应的22端口、DNS服务对应的53端口等等。
总结
计算机网络协议是集结计算机、通信等多个行业中工程师和科学家的智慧结晶。
每一层协议 中的每一个字段,都不是随随便便定义的,是只要出现就肯定发挥着作用的。
当我们对计算机网络协议的内容有一定的把握,此时不妨从不同的角度来看待它。比如本文从协议中协议类型字段的角度看待网络协议,也是一种重新学习和理解的方式。
毕竟『横看成岭侧成峰,远近高低各不同』嘛。
参考
-
Richard Stevens 《TCP/IP illustrated》 -
RFC 1180