“后续最长前缀转发决定出接口,路径MTU限制每跳可承载的IP大小。分层不是“每层必定可靠”的阶梯,而是一组需要逐项核查的合同。”
形式陈述
一条链路的MTU是它能承载的最大IP数据报长度,包含IP首部,不包含链路首尾。固定路径的路径MTU是沿途各链路MTU的最小值。路径或封装变化后,这个值也可能变化。
IPv4在允许分片(DF=0)时,可将过大的数据报拆成若干IP分片。每片有自己的IP首部,载荷是原IP载荷的一个区间。Fragment Offset以8字节为单位;除最后一片外,载荷长度须为8的倍数。MF=1表示后面仍有原数据报的字节,MF=0标出末端。目的端依据源、目的、协议和Identification等字段归组,再按偏移重组;路由器不替上层可靠重传缺片。
以下仅计算首部恒为20字节、无选项、起初未分片的IPv4数据报。出链路MTU为
必须同时检查每片总长度不超过
IPv6路由器不执行这种逐跳分片。过大的包被丢弃并产生Packet Too Big;需要分片时由源节点加入Fragment首部。IPv4的DF与“需要分片”错误、IPv6的Packet Too Big都可帮助源端更新路径MTU估计,但反馈丢失或被过滤会造成黑洞。路径MTU探测不是一次握手就永久获知真值。
直觉
MTU限制一个下层盒子装得下多少,不限制整项应用任务有多大。大文件可以被TCP切成许多段,而某个TCP段承载的IP数据报又可能受MTU约束。TCP分段发生在传输层,IP分片发生在网络层,重组位置也不同。
分片没有给丢包增加修复能力。一份数据报需要所有必要片段才能重组;其中一片缺失,已经到达的其余片段也可能在重组超时后被丢弃。
例子与边界
原IPv4总长3020字节,含20字节首部与3000字节载荷,DF=0,出链路MTU=1500。最大非末片载荷为1480。三片账本如下:
| 原载荷区间 | 载荷长度 | IP总长 | Offset字段 | MF |
|---|---|---|---|---|
| [0,1480) | 1480 | 1500 | 0 | 1 |
| [1480,2960) | 1480 | 1500 | 185 | 1 |
| [2960,3000) | 40 | 60 | 370 | 0 |
偏移185与370分别还原为1480与2960字节。若第三片先到,接收者知道终点为3000,却不能凭此交付缺失前缀;只有区间全部覆盖才得到原数据报。这里多出两个IP首部,网络层发送总字节为3060,而不是3020。
若同一原包DF=1,路由器不能按上表分片;它会丢弃并按规范条件返回错误。源端若无视新MTU反复发送同样的大包,重试次数不会解决大小矛盾。
对无扩展首部的IPv6,路径MTU=1280且TCP首部20字节时,不分片的数据载荷上限为
推论与应用
设三片分别独立地以概率
TCP的MSS通告约束对端接收的单段数据大小,并不单独给出路径上所有链路的MTU。可靠传输仍需将MSS、IP首部开销和路径探测共同纳入分段决策。