ping -M do 是什么
ping -M do 让本机在探测报文的 IP 头里置上 DF(禁止分片)位,这样包一旦超过路径上任意一跳的 MTU,就不会被悄悄切开,而是由该设备回一个『需要分片』的 ICMP 差错,或者干脆被丢弃。用二分法不断调整 -s 的载荷大小,就能找出这条路径真正能通过的最大报文,也就是路径 MTU。隧道、虚拟专用网、容器网络里『小包正常、大包全丢』类故障基本都靠这一招定位。
基本信息
| 命令要点 | ping -M do -s 载荷 目标;DF 置位后超限包不会在本机分片 |
|---|---|
| 换算关系 | IPv4 下路径 MTU = 载荷 + 28(20 字节 IP 头 + 8 字节 ICMP 头),1472 对应 1500 |
| 探测方式 | 先用 1472 试,失败后向下二分;也可从 1200 向上加,收敛更快 |
| Windows 对照 | 用 ping -f -l 1472,-f 相当于 Linux 的 -M do |
| 前提 | 需要路径设备愿意返回 ICMP 需分片差错,否则只能看到丢包 |
典型使用场景
- 虚拟专用网与专线:连接建立正常但大文件、页面大响应卡死,怀疑路径 MTU 偏小
- 隧道与叠加网络:叠加封装会吃掉几十字节,业务实际只能过更小的包
- 容器与集群网络:跨主机通信异常而本机正常,先确认隧道接口的 MTU
- 访问特定站点异常:只有某个目标的大响应失败,需要与正常目标做对照探测
- 变更验证:调整 MTU 或切换线路后,复测最大可通过载荷确认生效
二分法探测
二分法探测
ping -M do -s 1472 -c 2 10.0.0.5 # 1472 + 28 = 1500,标准以太网应能通过
ping -M do -s 1400 -c 2 10.0.0.5 # 不通就向下试,每次取中间值
ping -M do -s 1372 -c 2 10.0.0.5 # 1372 + 28 = 1400,常见隧道直通值
ping -M do -s 1422 -c 2 10.0.0.5 # 继续二分,逼近真实上限
# 找到最大可通过载荷 P 后:路径 MTU = P + 28(IPv4)返回信息判读
| 返回信息 | 含义 | 结论 |
|---|---|---|
| 正常收到回包 | 该尺寸未超过任何一跳的 MTU | 可以继续加大载荷继续试探 |
| 本机报报文过长 | 本机按当前 MTU 发送就已被拒绝 | 本机接口 MTU 小于探测值,先改本机再测路径 |
| 中间设备回需要分片 | 某一跳的 MTU 小于当前载荷 | 该跳的 MTU 已由差错报文给出,可直接采用 |
| 完全没有回包也无差错 | 超限包被静默丢弃 | 典型的路径 MTU 发现黑洞,需缩小包或改隧道参数 |
找到可用载荷后应把两端与隧道接口的 MTU 一起调整,只改一端往往只是把丢包点搬了个位置;改完再复测一次确认。
探测顺序建议从 1472 往下二分:常见限制值(1500、1450、1400、1380、1280)优先试,命中概率高,比逐字节递减快得多。
本机接口的 MTU 决定了 ping 的起点:如果本机接口已经是 1400,用 1472 去探测会在本机就被拒绝,得到的是本机限制而不是路径限制,先看 ip link show 确认起点。
同一条路径在不同时段可能给出不同结果:链路切换、隧道重建或负载分担都会让最大可通过长度变化,重要链路应多次探测取稳定值。
很多防火墙会连 ICMP 差错报文一起拦掉,形成路径 MTU 发现黑洞:表现为小包正常、大包静默消失,此时只能靠手工调低 MTU 或改用 TCP 层探测。