一句话定义:MTU(Maximum Transmission Unit,最大传输单元)是一条链路上单个数据帧能装下的最大字节数;IP 分片(IP Fragmentation)是当一个 IP 包超过下一跳的 MTU 时,把它切成几块分别发送、到终点再拼回去的机制。
打个比方。数据像搬家公司的货,MTU 是这条路线上最窄的那道电梯门。货太大有两个办法:一是拆箱(IP 分片),拆成小箱分批送,收件人收到后自己拼;二是先问路(PMTUD,Path MTU Discovery,路径 MTU 发现),也就是发件人在箱子上标“不许拆”(IPv4 的 DF 位,Don't Fragment),路上哪一段过不去,那台设备就回一句“太大了,最多 X 字节”(ICMP 的“需要分片”消息),发件人照此调整大小。
以太网的经典 MTU 是 1500 字节。一个满包减去 IP 头 20 字节、TCP 头 20 字节,剩下 1460 字节,这就是 MSS(Maximum Segment Size)。几个概念容易混:
| 概念 | 管哪一段 | 谁负责 | 出问题的表现 |
|---|---|---|---|
| MTU | 链路层单帧上限 | 链路/设备 | 超了就要分片或丢弃 |
| MSS | TCP 载荷上限 | 两端协商 | 协商值大于实际 MTU 就丢包 |
| IP 分片 | 把大包拆小 | IPv4 路由器可做,IPv6 只能发端做 | 丢一片,整包作废 |
| TCP 重传 | 补丢掉的段 | 两端 | 表现为“卡住然后超时” |
PMTUD 怎么失效的。它依赖 ICMP 回话,而这条回话在现实中常被掐掉:防火墙一刀切屏蔽 ICMP、安全组默认不放行、负载均衡只转发 TCP。于是形成黑洞:发件人标着“不许拆”发出 1500 字节的包,中间某台设备只支持 1400,把它悄悄丢掉,却不回“太大”。发件人不知道,重传、再重传,最后超时。症状很有辨识度——小请求全正常(握手、登录、小 JSON 都通),一返回大结果就挂;换个网络就好了,比如直连没事、连上公司 VPN 必现。
高发区是各种隧道和 overlay:PPPoE、IPsec、GRE、VXLAN 都要在原包外面再套一层头,可用 MTU 因此变小(PPPoE 常见 1492,VXLAN 常见 1450,IPsec 往往更低)。跨节点通信的 K8s 集群、VPN 访问内网服务,都算典型。IPv6 里路由器不再允许分片,PMTUD 从“建议”变成“必须”,配不好就是纯黑洞。
对从业者的意义。排查“大响应超时”,先怀疑 MTU 再怀疑代码,用不同大小的包做二分探测通常几分钟能定位。能改配置就别赌运气:在隧道入口做 MSS clamping(把 MSS 调到与实际 MTU 匹配),是不依赖 ICMP 的稳妥做法。应用层也别指望单个巨大报文,大响应走分块或流式返回,比赌路径 MTU 靠谱得多。具体设备的默认值和配置项,以各厂商官方文档为准。
