tracepath可直接显示路径mtu变化点,执行tracepath -n 8.8.8.8,输出中带“pmtu”字段的跳点即为实测mtu值,如“2: 10.0.0.1 3.456ms pmtu 1450”,未标注则沿用上一跳值;最后一行“resume: pmtu xxxx”为最终稳定值,但整条路径瓶颈是所有跳中最小的pmtu。

怎么用 tracepath 直接看到路径 MTU 变化点
tracepath 是唯一能边跳边报 PMTU 的原生命令,不用自己算、不依赖目标响应是否开放 ICMP。它每跳发 UDP 包并监听 ICMP “Packet too big”,自动记录每个跳点的当前路径 MTU。
执行 tracepath 8.8.8.8(IPv4)或 tracepath6 2001:4860:4860::8888(IPv6),输出里带 pmtu 的行就是实测值:
1?: [LOCALHOST] pmtu 1500 1: 192.168.1.1 1.234ms 2: 10.0.0.1 3.456ms pmtu 1450 3: 203.208.60.1 8.789ms pmtu 1400
注意:pmtu 字样只出现在它发生变化的跳点;没标就是沿用上一跳的值。最后一行的 Resume: pmtu XXXX 是整条路径最终稳定值,但未必是瓶颈点——真正的瓶颈是所有跳中最小的那个 pmtu。
- 不加
-n会尝试反向 DNS,可能卡住或超时,建议直接加tracepath -n 8.8.8.8 - 某些云厂商网关或防火墙会静默丢弃 ICMP type 3 code 4(Packet too big),这时
tracepath会停在某跳不动或显示???,换ping -M do手动试探更可靠 -
tracepath用的是 UDP,不是 ICMP,所以能绕过部分只放行 ping 的策略,但也可能被 UDP 限速影响时延读数
ping -M do 测出的数字为什么总比预期小 28
因为 -s 参数指定的是 ICMP 载荷字节数,不包含 IP 头(20 字节)和 ICMP 头(8 字节)。所以真实包长 = -s 值 + 28。很多人直接拿 -s 1472 当 MTU 用,结果设成 1472 却不通——其实该设 1500。
正确操作是:找到最后一个成功响应的 -s 值,比如 ping -M do -s 1422 8.8.8.8 成功,-s 1423 返回 Frag needed and DF set,那么路径 MTU 就是 1422 + 28 = 1450。
- 别从 1500 开始试:有些链路实际支持不到,比如阿里云 VPC 内默认是 1450,直接
-s 1472就失败 - Windows 用
-l,逻辑一样:ping -f -l 1422成功 → MTU = 1422 + 28 - 如果
ping一直超时,不是 MTU 问题,先确认基础连通性;DF 包被中间设备过滤时,也会表现类似,需结合tcpdump -i any icmp看是否收到 ICMP type 3 code 4
为什么 ip link show 查到的 MTU 不等于路径 MTU
ip link show dev eth0 | grep mtu 查出来的是本地网卡硬编码的 MTU,比如 1500 或 9000。它只管“我发出去的包最大能多大”,不管“路上能不能完整走完”。路径 MTU(PMTU)是整条链路中最窄那个环节的限制,可能卡在你家光猫、企业防火墙、云厂商隧道封装层,甚至远端服务器的网卡驱动里。
- 回环口
lo的mtu 65536是内核优化值,跟物理链路完全无关,别拿来参考 -
ip addr show有时不显示mtu字段,尤其在容器或精简网络命名空间里,必须用ip link show - 改了本地
mtu但路径不通?大概率是没测准 PMTU,或者改完没重启连接(TCP 连接建立后会缓存 MSS,旧连接仍按老 MTU 分片)
永久生效前最容易漏掉的覆盖源
临时改完 ip link set dev eth0 mtu 1450,几秒后又变回 1500,八成是被系统服务抢改了。NetworkManager、systemd-networkd、cloud-init、Netplan 都可能接管配置,且优先级和触发时机不同。
- Ubuntu/Debian(Netplan):改
/etc/netplan/*.yaml,加mtu: 1450,再sudo netplan apply - RHEL/CentOS:改
/etc/sysconfig/network-scripts/ifcfg-eth0,加MTU=1450,再sudo systemctl restart network - 统信 UOS / 麒麟 KOS:用
nmcli connection modify "有线连接" 802-3-ethernet.mtu 1450,然后nmcli connection down "有线连接" && nmcli connection up "有线连接" - 验证是否真落地:改完立刻跑
ip link show dev eth0 | grep mtu,别只信配置文件写了就完事
路径 MTU 不是固定值——同一台机器访问不同目标,PMTU 可能完全不同;同一个目标,早晚高峰也可能因中间节点负载切换导致 PMTU 动态变化。真要长期稳定,得靠内核的 PMTUD(Path MTU Discovery)自动维护,而不是手动锁死一个数字。











