先介绍几个术语:
MSS:最大段尺寸
1. 是应用层(TCP)与传输层之间的接口属性
2. 用于向对端TCP通告对端在每个TCP分节中能发送的最大TCP数据量。
3. 它经常设置成MTU减去IP和TCP首部的固定长度。
4. 它是一个16位的字段,限定最大值是65535,
5. 65535这个MSS值被视为表示“无限”的一个特殊值。
MTU:即Maximum Transmission Unit(最大传输单元)
1. 网络层和链路层之间的接口属性;
2. MTU是一个逻辑限制,目的是为交互使用提供足够快的响应时间。
在一个IP数据报从源端到目的端的传送过程中,分片操作既可能发生在源端,也可能发生在途中,而其逆操作即重组,一般只发生在目的端;
如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还大,那么IP层就需要进行分片,把数据分成若干片,这样每一片都小于MTU;
任何运输层首部只出现在第一片数据中,但是每一片都有自己的IP首部,这些分片只有到达目的地而不是每一个下一站才进行重新组装,重新组装由目的端的IP层来完成;
当来自TCP报文段的某一片丢失以后,TCP在超时后会重发整个TCP报文段,该报文段对应一份IP数据报,没有办法只重传数据报中的一个数据报片;
IP首部标示字段中有一个比特称作不分片位,为1则IP不对数据报分片,数据报大于 MTU则丢弃并发送一个ICMP差错报文;
IP数据报是指IP层端到端的传输单元(在分片之前和重组之后),分组是指IP层和链路层之前传送的数据单元,一个分组可以是一个完整的IP数据报,也可以是IP数据报的一个分片;
IPv4数据报最大大小是65535字节,因为IP首部长度字段占16位;
IPv4和IPv6都定义了最小重组缓冲区大小,它是IPv4和IPv6的任何实现都必须保证支持的最小数据报大小,其值对于IPv4是576字节,对IPv6是1500字节。
本端TCP以MSS大小的或更小的块把数据传递给IP,同时给每个数据块安上一个TCP首部以构成TCP分节,其中MSS或是由对端通告的值,或是536(576-20IP首部-20TCP首部)(若对端未发送一个MSS选项)如果某个UDP应用进程发送大数据报,那么他们相比TCP应用数据更有可能被分片,因为TCP会把应用数据划分成MSS大小的块,而UDP却没有对等的手段。
参考:
《UNIX Network ProgrammingVolume 1, Third Edition: TheSockets Networking API》
《TCP/IP协议详解》原文地址:http://blog.csdn.net/junjun150013652/article/details/37969041