网络协议中为什么要有协议类型的字段

299 阅读4分钟

题目解释

先让我解释一下文章题目。

网络协议有多层,然而几乎每一层都有字段来标明上一层的协议类型。

比如IP协议中的Protocol字段。

image.png

其中的protocol需要指明IP包裹的是什么协议类型。

在一个真实的IP Packetimage.png 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文档。

总结来说:

物理层EthernetFrame

网络层IPPacket

控制层:TCP SegmentUDP Datagram

应用层:Message,比如HTTP Message

我们都称之为包,不是更方便吗?

第一、显得专业,不同的名字本身意味着不同的网络层次。在我看来,理工科的学习,基础知识是重点,基础知识是支撑整个专业体系的基石,基础知识的重点是各个基础概念的定义。熟练掌握各种定义的概念,有利于整个体系的学习。

第二、各个层的名字不是随便取的,从名字里会有一些其他的提示。比如TCPSegmentsegment是段的意思。段是相对于整体的部分,其实暗示了TCP单独一个包,是不完整的。没错,很多时候一个http响应,需要拆分成多个tcp包,然后才能发送过来。

一个HTTP的发送之旅

image.png

不过等下,这一节我们并不关注HTTP的发送之旅啦。仅仅是在本地,从应用层到物理层的组装过程,也就是左面。

image.png

上面是一个HTTP请求的wireshark抓包截图

通过包的结构很容易明了HTTP包的包装过程。

结论:对于一个HTTP请求来说,从出生那一刻起就决定了它的成长之旅。即HTTP message -> TCP segment -> IP packet -> Ethenet Frame.

类似HTTP这样的应用层协议,其实都是从出生那一刻,系统已经知道了它的前进之路。

所以我们为什么需要在网络协议的每一层标识协议类型呢?

你要反过来看问题

没错,本地生成网络请求的时候,路径都是规定死的。但是别忘了,网络包发送后是需要被对端接收的。

将自己站在服务端收数据的那一方。当物理层接收到一个目的地址为自身的Ethenet Frame,它可怎么办?

image.png

它怎么能知道Ethernet拆解Frame之后,将剩下的数据交给谁处理呢?

发给ARP module?还是发给IP module

发给IP module之后,它发给谁?

发给ICMP处理?还是交给TCP module?还是发给UDP module

所以拆包的过程,是需要指示的。到底交给上一层的哪个module

image.png

看! EthernetType字段中指明要将拆解之后的数据交给IP module处理。

IP PacketProtocol字段中指明要将拆解之后的数据交给TCP module处理。

总结:揭示答案,从上到下没问题,从下到上,你要整哪样哦。

tcp/udp需要类型字段,指示应用层的协议吗?

上面我们讲Ethernet FrameIP Packet都有专门的字段指示将拆解之后的数据交给谁处理。

怎么到了TCP Segment中 ,我们好像没有找到专门的字段指明前方的路呢。

道理是一样的,如果不指示怎么可能知道交给哪一位应用层来处理。

只不过采用的方式,不同于PacketFrame的专门协议类型字段。

控制层协议:山人自有妙计。

其实就是端口号诶。

控制层协议通过端口号得知要交给谁解析啦。

所以知名的服务进程的端口号一般是不变的。比如HTTP服务对应的80端口HTTPS服务对应的443端口SSH服务对应的22端口DNS服务对应的53端口等等。

总结

计算机网络协议是集结计算机、通信等多个行业中工程师和科学家的智慧结晶。

每一层协议 中的每一个字段,都不是随随便便定义的,是只要出现就肯定发挥着作用的。

当我们对计算机网络协议的内容有一定的把握,此时不妨从不同的角度来看待它。比如本文从协议中协议类型字段的角度看待网络协议,也是一种重新学习和理解的方式。

毕竟『横看成岭侧成峰,远近高低各不同』嘛。

参考

  • Richard Stevens 《TCP/IP illustrated》

  • RFC 1180