- WinSock网络编程经络
- 张会勇
- 1171字
- 2020-08-28 19:07:24
2.5.1 数据封装
应用程序与另一台主机上的程序通信时,它们之间会有一系列的数据交换,对于任何一端,发送数据时,会把对方的IP地址、端口号和数据交给TCP/IP协议。TCP/IP协议对数据进行封装,每一层都在最前面增加本层的首部,紧接着是上一层传递给它的数据,一些链路层协议还会在最后追加尾部。如:以太网会在帧后添加检测差错的循环冗余检验(CRC)。TCP/IP数据的封装如图2.5所示。
图2.5中以TCP为例说明了数据的传输过程。发送数据时,用户的数据首先由应用层协议处理,通常是增加应用层协议的首部,并把数据处理成应用层协议规定的格式。如:E-mail增加首部,并根据用户的设置判断按什么方式(常用Base64或Quote-Printable)编码数据;SSL需要加密数据等。应用层协议通常位于用户空间,处理完数据,调用send函数把数据传递给内核的TCP/IP协议栈。
TCP层并不是在应用层数据前面简单地增加首部,而是根据建立连接时与对方协商出的参数最大段大小(MSS),把数据分成TCP段,每个TCP段的前面是首部,后面是数据。如果应用层数据太大,就会被分成多个TCP段,TCP把这些段交给IP层去传输。
UDP对数据的封装与TCP不同,它不切分应用层传给它的数据,只是在数据前面增加UDP首部,然后就交给IP层去发送。
图2.5 TCP/IP数据的封装
我们知道,IP协议一次能处理的数据长度是有限制的,由IP首部的16位长度字段决定,最大值是65535。这也决定了UDP每次传输的数据量不能超过65535减去IP和UDP首部的值,如果没有IP选项,这个值是65507(65535 – 20 – 8)。当用户数据超过这个值时,协议会返回错误码。而TCP对数据切割后,每个TCP段都不超过MTU(最大传输单元),所以它一次能够发送的数据量不受这个限制,只要系统有足够的内存。
许多应用程序都使用TCP或UDP传输数据,那么怎么区别这个数据是哪一个应用程序的呢?这是由传输层协议首部中的源端口号和目的端口号确定的,它们分别标识了本地和远端的应用程序。
IP层接到数据,先判断数据的长度是否大于底层网络的MTU,如果小于,就直接在数据前面增加IP首部,否则就把数据分成适合底层网络大小的片,并在每一片的前面加上IP首部,再把数据传送给网络接口。
IP首部中有两个32位的字段源地址和目的地址,分别标识了源主机和目的主机。多个协议,如ICMP、IGMP、TCP、UDP等都可以使用IP来传输数据,那么IP是怎样知道要把数据报交给哪个协议处理呢?这是用IP首部中的协议字段做出判断的,不同的协议用IP发送数据时,会在协议字段中填入不同的值,常用的协议值如表2.3所示
表2.3 常用协议的编号
数据到达网络接口,会被封装成适合物理硬件传输的帧,增加首部,有的还追加尾部。链路层协议除了可以封装IP协议外,还可以传输其他的协议。对于以太网,还能发送和接收ARP和RARP,在它的帧首部有一个16位的类型字段,指明后面的数据属于哪个协议。点对点协议(PPP),数据帧中还可以封装链路控制数据或网络控制数据,这是用它首部中的16位协议字段标识的。
数据被封装成帧后,就发送到物理网络上,向目的地传送。