简介

  上层协议如何使用下层协议?其实就是通过封装实现的。

  应用程序数据在发送到物理网络上之前,将沿着协议栈从上往下依次传递,每层协议都将在上层数据的基础上加上自己的头部信息(有时还有尾部信息),以实现该层的功能,这个过程就称为封装。

android tcp服务封装 tcp协议封装_TCP


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

android tcp服务封装 tcp协议封装_UDP_02


当发送端应用程序使用send或write函数向一个TCP连接写入数据时,内核中的TCP模块首先把这些数据复制到与该连接对应的TCP内核发送缓冲区中,然后TCP模块调用IP模块提供的服务,传递的参数包括TCP头部信息和TCP发送缓冲区中的数据,即TCP报文段。

  经过UDP封装后的数据称为UDP数据报。UDP对数据的封装与TCP类似。但是UDP无需为应用程序保存数据副本,当一个UDP数据包被成功发送后,UDP内核缓冲区的数据就丢弃了,如果发送失败,则应用程序需要重新从用户空间将该数据拷贝到UDP内核发送缓冲区中。

  经过IP封装后的数据称为IP数据报。它也包括头部信息和数据报部分,其中数据部分就是一个TCP报文段、UDP数据报或ICMP报文。

  经过数据链路层封装的数据称为帧,传输媒介不同,帧的类型也不同。在以太网上传输的就是以太网帧。以太网帧使用6字节的目的物理地址和6字节的源物理地址来表示通信的双方。

android tcp服务封装 tcp协议封装_数据_03


帧才是最终在物理网络上传送的字节序列。至此,封装过程完成。