今天被同学问到一个问题: TCP的分段和IP的分片有什么联系?
先介绍两个概念:
MSS:(Maxitum Segment Size)最大分段大小的缩写,是TCP协议里面的一个概念
MSS就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。
MTU:(Maximum Transmission Unit,MTU),最大传输单元.
以太网和802.3对数据帧的长度都有一个限制,其最大 值分别是1500和1492个字节。链路层的这个特性称作MTU。不同类型的网络大多数都有一个上限。如果IP层有一个数据要传,且数据的长度比链路层的 MTU还大,那么IP层就要进行分片(fragmentation),把数据报分成若干片,这样每一个分片都小于MTU。
TCP的分段:发生在传输层,因为MSS的限制,将应用层传递下来的消息进行分段发送,在对端再进行重组。
IP的分包:尽管IP分片过程看起来透明的,但有一点让人不想使用它:即使只丢失一片数据也要重新传整个数据报。why?因为IP层本身没有超时重传机制------由更高层(比如TCP)来负责超时和重传。当来自TCP报文段的某一片丢失后,TCP在超时后会重发整个TCP报文段,该报文段对应于一份IP数据报(而不是一个分片),没有办法只重传数据报中的一个数据分片。TCP为了保证传输的效率,就要想办法来避免IP层在进行分片,一旦TCP数据过大,超过了MSS,则在传输 层会对TCP包进行分段,自然到了IP层的数据报肯定不会超过MTU,当然也就不用分片了。而对于UDP数据报,如果UDP组成的 IP数据报长度超过了1500,那么IP数据报显然就要进行分片,因为UDP不能像TCP一样自己进行分段。
既然在TCP中进行了分片,IP的分包还有必要吗?其实在IP层的分包本就不是为TCP的传输准备的,而是帮助UDP的传输进行分片的。
总结:
1.TCP分段的原因是MSS的限制,而IP分片是因为MTU的限制。
2.TCP分段发生在传输层,重组也发生在传输层。IP分片发生在网络层,重组也是。
3.对于以太网来说,MTU往往要大于MSS。
当传输层发送一个比较大的数据时,如果是TCP的话,数据在传输层,根据MSS的大小先行进行分段,如果是UDP(或者ICMP)的话,数据在网络层就要进行分片,然后发送。