TCP/IP协议族的封装与分用

封装
    TCP/IP协议族的上层协议是通过封装来使用下层服务的。应用程序数据在发送到物理网络之前,将沿着协议族从上往下依次封装。每层协议都将在上层协议的基础上加上自己的头部信息(以太网还包括尾部信息),以实现改成的功能,这个过程就是封装。
TCP/IP协议族的封装与分用

    经过TCP封装后的数据成为TCP报文段(TCP message segment),或简称TCP段。TCP协议为通信双方维护一个连接,并且在内核中存储相关数据。这部分数据中的TCP头部信息TCP内核缓冲区(发送缓冲区或是接收缓冲区)数据一起构成了TCP报文段。

TCP/IP协议族的封装与分用

    当发送端应用程序使用sendto(或write)函数向一个TCP连接写入数据时,内核中的TCP模块首先把这些数据复制到与该连接对应的TCP内核发送缓冲区中,然后TCP模块调用IP模块提供的服务,传递的参数包括TCP头部信息和TCP发送缓冲区中的数据,即TCP报文段。
    经过UDP封装后的数据称为UDP数据报。UDP对应用程序的封装与TCP类似。不同的是,UDP无须为应用层数据保存副本,因为它提供的服务是不可靠的。当一个UDP数据报被成功发送之后,UDP内核缓冲区中的该数据报就被丢弃了(因此UDP没有真正意义上的发送缓冲区,sendto的数据直接交给内核,由内核进行交给网络层)。如果应用程序检测到该数据报未能被接受端正确接收,并打算重新发送这个数据报,则应用程序需要重新从用户空间将该数据拷贝到UDP内核中。
    经过IP封装后的数据称为IP数据报。IP数据报包括头部信息和数据部分,其中数据部分就是一个TCP报文段、UDP数据报或者ICMP报文。
    经过数据链路层封装的数据称为帧(frame)。传输媒介不同,帧的类型也不同。比如以太网上传输的是以太网帧,而令牌环网上传输的则是令牌环帧。
    帧才是最终在物理网络上传送的字节序列。至此,封装过程完成。


分用
    当帧到达目的主机时,将沿着TCP/IP协议族从下往上依次传递。各层协议依次处理帧中本层负责的头部数据,以获取所需的信息,并最终将处理后的数据交给目标应用程序。这个过程称为分用。分用是靠头部信息中的类型字段实现的

TCP/IP协议族的封装与分用

    因为IP协议、ARP协议和RARP协议都使用帧传输数据,所以帧的头部需要提供某个字段来区分它们。以太网帧就是使用2个字节的类型字段来区分上层协议。
TCP/IP协议族的封装与分用
IP数据报类型字段值是0x800,ARP数据报类型字段值是0x806,RARP数据阿伯类型字段值是0x835,根据值的不同分别交给对应的上层协议。
    同样的,因为ICMP协议、TCP协议和UDP协议都使用IP协议,所以IP数据报的头部采用8位的协议字段来区分它们。ICMP是1,TCP是6,UDP是17。
    TCP报文段和UDP数据报通过头部的16位端口号字段区分上层应用程序。比如DNS协议对应的端口号是53,HTTP协议对应的端口号是80。
    帧通过上述步骤后,最终将封装前的原始数据送至目标服务(ARP服务,RARP服务,ICMP服务或者应用程序)。这样在顶层的目标服务看来,封装和分用似乎完全没有发生过。