前提知识:
网络层最常用的是IP协议,IP协议会将传输层的报文作为数据部分,再加上IP包头组装成IP报文,如果IP报文大小超过了MTU(1500字节)就会再次分片,得到一个即将发送到网络的IP报文
MTU和MSS:
- MTU:一个网络包的最大长度,以太网中一般为1500字节
- MSS:除去IP和TCP头部后,一个网络包所能容纳的TCP数据的最大长度
如果在TCP的整个报文(头部+数据)交给IP层进行分片:
当IP层有一个超过MTU大小的数据(TCP头部+TCP数据)要发送,那么IP层就要进行分片,把数据分片为若干片,保证每一个分片都小于MTU。把一份IP数据进行分片后,由目标主机的IP层来进行重新组装后再交给上一层TCP传输层。
那么当一个IP分片丢失,整个IP报文的所有分片都得重传。
因为IP层本身没有超时重传机制,它由传输层的TCP来负责超时重传。
当某一个IP分片丢失后,接收方的IP层就无法组装成一个完整的TCP报文,也就无法将数据报文送给TCP层,所以接收方不会响应ACK给发送方,因为发送方迟迟收不到ACK确认报文,所以就会触发超时重传,就会重发整个TCP报文(头部+数据)
因此,由IP层进行分片传输,是非常没有效率的
所以为了达到最佳传输效能TCP协议在建立连接时通常要协商双方的MSS值,当TCP层发现数据超过MSS时,则会先进行分片,分片后的形成的IP包自然不会超过MTU,也就不用IP进行分片了。此时,如果一个TCP分片丢失后,进行重发也是MSS为单位的,而不用重发所有数据,大大增加了重传的效率。