当应用程序用 TCP传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当作一串比特流送入网络。其其中每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息)
由于TCP、UDP、ICMP和IGMP都要向IP传送数据,因此IP必须在生成的IP首部中加入某种标识,以表明数据属于哪一层。为此, IP在首部中存入一个长度为8 bit的数值,称作协议域。 1表示为ICMP协议,2表示为IGMP协议,6表示为TCP协议,17表示为UDP协议。
类似地,许多应用程序都可以使用 TCP或UDP来传送数据。运输层协议在生成报文首部
时要存入一个应用程序的标识符。 TCP和UDP都用一个16 bit的端口号来表示不同的应用程序。
TCP和UDP把源端口号和目的端口号分别存入报文首部中。
一个应用对应一个端口,因为TCP协议里面只有16bit的大小来给你保存端口号,所以机器端口号需要小于 65536。
网络接口分别要发送和接收 IP、ARP和RARP数据,因此也必须在以太网的帧首部中加入某种形式的标识,以指明生成数据的网络层协议。为此,以太网的帧首部也有一个 16 bit的帧类型域。
也就是说:下层的协议都会保留一个协议域,用来区分上层协议。
当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报文首部。每层协议盒都要去检查报文首部中的协议标识,以确定接收数据的上层协议。这个过程称作分用。
为协议ICMP和IGMP定位一直是一件很棘手的事情。它们与IP都是网络层的协议,事实上它们是IP的附属协议。但是在这里,我们又把它们放在IP层的上面,这是因为ICMP和IGMP报文都被封装在IP数据报中。
对于ARP和RARP,我们也遇到类似的难题。在这里把它们放在以太网设备驱动程序的上方,这是因为它们和IP数据报一样,都有各自的以太网数据帧类型,并且以此为依据进行分用。
我们又把ARP作为以太网设备驱动程序的一部分,放在链路层,其原因在逻辑上(协议的功能)是合理的。