MTU 与分片问题
小包能通、大包卡住是典型的 MTU 问题。路径 MTU 取整条链路上所有跳的最小值,隧道与 VPN 封装会额外占用字节,使有效 MTU 变小。IPv4 下用 ping 的 -M do 禁止分片并逐步探测能通过的最大包长,再结合 ip link 确认接口 MTU,就能区分是本地配置问题还是路径限制。
基本信息
| 查看接口 MTU | ip link show eth0 | grep mtu |
|---|---|
| 探测命令 | ping -M do -s 1472 -c 2 <目标地址> |
| 换算关系 | 1472 字节载荷 + 8 字节 ICMP 头 + 20 字节 IP 头 = 1500 |
| 不通时处理 | 逐步减小 -s 值,找到能通过的最大包长 |
| IPv6 注意 | 最小 MTU 为 1280,且链路上不做分片 |
典型使用场景
- 隧道或 VPN 上线后,部分站点能开、部分卡住
- 跨机房大文件传输中断,小请求正常
- SSH 交互卡顿:输入有响应延迟但不断开
- 容器跨主机通信异常,overlay 封装后又叠加了 MTU 损失
- 云环境内多网段 MTU 不一致,排查应用握手超时
检查与探测
检查与探测
ip link show eth0 | grep mtu # 先看接口 MTU
ping -M do -s 1472 -c 2 203.0.113.10 # 1500 字节总长的探测,不通说明路径 MTU 更小
ping -M do -s 1400 -c 2 203.0.113.10 # 逐步减小,找到可通过的最大值
sysctl net.ipv4.tcp_mtu_probing # 确认 PMTU 黑洞探测是否启用现象与处理
| 现象 | 含义 | 处理方向 |
|---|---|---|
| 小包通、大包不通 | 路径 MTU 小于本端接口 MTU | 启用 MSS 钳制或调整接口 MTU |
| 单向可用 | 两端 MTU 设置不一致 | 统一两端与中间设备的配置 |
| 偶发卡顿后恢复 | PMTU 探测生效并收敛 | 确认探测参数,评估是否调大保护 |
| 所有包都不通 | 与 MTU 无关 | 回到链路与路由层排查 |
若链路上屏蔽了 ICMP,ping -M do 的探测结果不能用来判断 MTU,此时应改用抓包观察重传是否总停在某个固定包长,或核对各跳设备的接口配置。
改小接口 MTU 需要两端与中间设备一致,否则会出现单向可通这种更难排查的现象;隧道场景更常用的做法是在网关做 MSS 钳制。
常见封装的开销
- GRE 隧道:外层 IP 头 20 字节加 GRE 头 4 字节,共 24 字节
- VXLAN:外层 IP、UDP 与 VXLAN 头再加内层以太帧头,合计约 50 字节
- IPsec 传输模式:按加密与认证算法额外占用数十字节
- MPLS:每层标签占 4 字节,多层标签时要叠加计算