最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。数据链路层中的网络对数据帧的长度都有一个限制,不同网络的 MTU 值不同,常用的以太网为 1500 个字节。
若在 IP 层要传输的数据报大小比链路层的 MTU 还大,那么 IP 层就会对这个数据报进行分片。一个数据报会被分为若干片,每个分片的大小都小于或者等于链路层的 MTU 值。
IP 数据报分片以后,只有到达目的地才进行重新组装(这里的重新组装是达到目的地才组装,而不像其他网络协议在下一站就进行重新组装),IP 数据报的分片和组装都是发生在网络层,其目的就是使分片和组装过程对传输层(TCP 和 UDP)是透明的,以及防止某些可能的性能降低。已经分片的数据报有可能会再次进行分片(即可多次分片)。
当 IP 数据报被分片后,只有第一个分片存在运输层协议首部,其余分片都不包含运输层协议的首部,但是每个分片都具有 IP 首部,并且每一片都成为一个分组,在选择路由时每一组与其他分组相互独立。由于分组之间是独立的,所以分片传输的 IP 数据报不一定按照顺序达到目的地,但是每个分片的 IP 首部能够使接收端按照正确的顺序组装这些 IP 数据报分片。
最大报文段长度(Maximum Segment Size,MSS)是 TCP 数据包每次能够传输的最大数据分段。当 TCP 报文段的长度大于 MSS 时,需要将 TCP 数据包进行分段传输。
MSS 是在 TCP 三次握手建立连接时,在两端主机之间被计算得出,会在 TCP 首部中写入 MSS 选项,告诉对方自己的接口能够适应的 MSS 的大小。为了达到最佳的传输效能 TCP 协议在建立连接时通常要协商双方的 MSS 值,然后会在两者之间选择一个较小的值来限制传输数据的大小。TCP 报文段的每个分段中都有 TCP 首部,到了端点后根据 TCP 首部的信息在传输层进行重组(即
TCP 的分段和重组都发生在传输层)。
采用 TCP 协议进行数据传输是不会造成 IP 分片的,因为一旦 TCP 数据超过了 MSS,则在传输层会对 TCP 数据包进行分段,自然到了 IP 层的数据报肯定不会超过 MTU,所以就不用分片了。而对于 UDP 数据报,如果 UDP 组成的 IP 数据报长度超过了 MTU,那么 IP 数据报显然就要进行分片,因为 UDP 不能像 TCP 一样自己进行分段。传输层中的
TCP 会分段,网络层中的 IP 会分片。IP 层的分片更多的是为运输层的 UDP 服务的,由于 TCP 自己会避免 IP 的分片,所以使用 TCP 传输在 IP层都不会发生分片的现象。
IP 层没有超时重传机制,所以 IP 数据报的分片丢失时,必须重传整个 IP 数据报。超时和重传机制由更高层来实现(TCP 有超时重传机制,但 UDP 没有)。当来自 TCP 报文段的某一片丢失后,TCP 在超时后重发整个 TCP 报文段,该报文段对应于一份 IP 数据报。没有办法只重传数据报中的一个数据报片。
参考资料:
《TCP/IP 详解》
《图解 TCP/IP》