MTU: Maxitum Transmission Unit 最大传输单元
MSS: Maxitum Segment Size 最大分段大小
对于以太网数据帧:
其中长度/类型字段,当这个值<1518时,那么代表了数据字段的长度;如果这个值>1518,则表示该以太网帧中的数据属于哪个上层协议,例如0x800,代表IP数据包;0x806,代表ARP数据包等。
所以以太网EthernetII最大的数据帧是1518字节。
MTU = 1518 - 以太网帧头(14) - 帧尾(4) = 1500字节
MSS = MTU - IP最小报头长度 - TCP/UDP最小包头长度
- 对于TCP,MSS = 1500 - 20 - 20 = 1460
- 对于UDP,MSS = 1500 - 20 - 8 = 1472
网络层IP协议会检查每个从上层协议下来的数据包的大小,并根据本机MTU的大小决定是否作“分片”处理。
分片最大的坏处就是降低了传输性能。所以上层在实现中会对此加以注意。有些上层会因为某些原因要求不能分片,所以会在IP数据包包头里面加上一个标签:DF(Donot Fragment)。这样,当这个IP数据包在网络传输的时候,如果遇到MTU < IP数据包的情况,转发设备就会根据要求丢弃这个数据包。然后返回一个错误信息给发送者。这样往往会造成某些通讯上的问题,不过幸运的是大部分网络链路都是MTU ≥ 1500。
-
对于TCP,在建立连接的时候,会协商双方的MSS,通常这个 MSS 会控制在 MTU 以内,即最大 IP 包大小 - IP - TCP 协议头的大小,这样 TCP 就可以在传输层,把用户发送的数据,预先分成多个大小限制在 MTU 里的 TCP 包。每个 TCP 的分片包,都完整了包含了 TCP 头信息,方便在接收方重组。
-
如果某些情况导致,已经分好的 TCP 分片,还是大于了 MTU,那就在网络层中,再执行一次分片。
-
如果这个时候数据丢了,那也只需要重传这一个 TCP 的分片,而不是整个原始数据。
-
对于UDP,没有协商,所以只能直接把用户发送的数据传给网络层。如果UDP报文长度 > MTU,那么在网络层会自动对数据进行切割分片。
-
如果网络发生了波动,丢失了某个 IP 包分片, 对于 UDP 而言, 它没有反馈丢失了哪个分片给发送方的能力,这就意味着,50k的数据全都丢失了,如果需要重传,就得再次完整的传递这 50k 的数据。
-
所以如果采用 UDP 来通讯,一般都会特意控制下单个包体的大小,从而提高传输效率。