TCP分段与IP分片

链路层的一个作用就是数据成帧,帧包括了head和data,而data有大小限制,就是常说的MTU,对以太网来说是1500字节。data包括了上层的网络层head和传输层head,这两个head共占了40字节,剩下的数据大小不能超过1460字节,也就是MMS
TCP分段与IP分片

分段 Segment

MSS是TCP数据包每次能够传输的最大数据分段,TCP报文段的长度大于MSS时,要进行分段传输。TCP协议在建立连接的时候通常要协商双方的MSS值,这是在三次握手的前两次实现的,两端会在首部写入MSS选项,即Option部分,最终取二者的提出的MSS的较小值,经常是1460。在wireshark中能看到:
TCP分段与IP分片
也就是说TCP连接根据MSS要在传输层进行分段(Segment)与重组。

分片 Fragment

再看网络层,这一层涉及到了分片(Fragment)问题。一个IP数据报在以太网中传输,如果它的长度大于MTU,就要进行分片传输,使得每片数据报的长度小于MTU。分片传输的IP数据报不一定按序到达,但IP首部中的信息能让这些数据报片按序组装。IP数据报的分片与重组是在网络层进完成的。

这样TCP连接的特点就出现了:因为在传输层根据MSS进行了分段,使得每个数据包小于MSS,那到了链路层肯定也是小于MTU的,这样就不必在网络层进行分片了。IP分片用于UDP和ICMP等协议,因为它们不会在传输层分段。

IP数据报分片后,只有第一片带有UDP首部或ICMP首部,其余的分片只有IP头部,到了目标主机而不是下一站后根据IP头部中的信息在网络层进行重组。TCP报文段的每个分段中都有TCP首部,到了对端后根据TCP首部的信息在传输层进行重组。

TCP的分段传输:
TCP分段与IP分片

UDP的分片传输:
TCP分段与IP分片

网络通信尽可能避免IP分片,原因:
- 负责IP分片的主机、路由器会花费很多CPU资源处理分片,同时负责重组分片的主机、路由器需要更多的CPU资源。
- 分片中,如果某个片丢失,会造成整个IP数据报作废,需要重新传整个数据报,而IP层本身没有超时重传机制,由更高层(比如TCP)来负责超时和重传。

TCP避免IP分片的方法一个是上面说的TCP分段,另一个是路径MTU。