MTR能提供实时丢包率,因它每秒向每跳发送探测包并滚动计算Loss%;而ping仅输出整段统计的平均丢包率,无法反映瞬时抖动或定位具体故障跳。

实时丢包率必须用 mtr,ping 只能算平均丢包,且无法定位哪一跳出问题。
为什么 ping 算不出实时丢包率
ping 默认发包是离散的、单点的,即使加 -c 10 也只反映这 10 次的汇总结果,无法体现“某一秒内突然丢 3 个包”这种瞬时抖动。它的输出里只有 0% packet loss 这种整段统计,没有每轮探测的独立丢包记录。
- 想观察“当前这一秒有没有丢”,
ping做不到;它连“当前这一秒”这个概念都没有 -
ping -f(洪水模式)看似实时,但输出全是.!符号,不显示百分比,也不分跳数,纯靠肉眼数点,不可靠 - 如果目标主机禁 ICMP 回复(常见于云服务器),
ping直接失效,而mtr至少还能看到前面几跳的响应
mtr 的 Loss% 列才是真·实时丢包率
mtr 默认每秒向路径中每一跳发一个探测包,并在 Loss% 列持续更新该跳最近若干次探测的丢包比例。这个值是滚动计算的,不是总和——比如你刚看到某跳 Loss% = 20,过两秒变成 0,说明丢包已恢复。
- 启动时加
-n:避免 DNS 解析拖慢刷新,确保Loss%更新及时 - 交互界面中按
l键可打开丢包率图表,横轴是时间,纵轴是丢包率,波动一目了然 - 某跳
Loss% > 0且StDev > 50ms,基本可断定该节点存在队列拥塞或设备过载 - 注意:首跳(本地网关)
Loss% > 0通常意味着本机网卡、驱动或本地防火墙问题,不是远端的事
用 mtr -r 生成可比对的丢包报告
脚本化排查或需要留证时,不能依赖交互式界面。用 -r(或 --report)让 mtr 发完固定次数包后直接退出并输出统计,Loss% 是基于全部探测包算出的精确值。
- 命令示例:
mtr -r -c 50 -n 223.5.5.5 > mtr-ali-dns.txt,发 50 个包,不解析域名,结果存文件 - 输出中每跳的
Loss%是 “丢包数 / 发送数 × 100%”,不是估算,可直接用于横向对比(比如对比白天/晚上的同一跳) - 别用
-i 0.1(100ms 间隔)跑-c 50:太密容易被中间设备限速,反而导致假性丢包;常规用-i 0.5或默认 1 秒更稳 - 若发现某跳
Loss% = 100但下一跳正常,大概率是该节点主动丢弃 ICMP(如运营商策略),不是物理断连
丢包定位后下一步该做什么
看到 Loss% 异常只是开始,关键是怎么验证和归因。不要直接截图甩给运营商——他们要看的是可复现、可隔离的数据。
- 对异常跳的 IP 单独
ping -c 10 -n [IP],确认是否真丢包,排除mtr自身误判 - 换源测试:
mtr -a 192.168.1.100 -n 223.5.5.5(用指定出口 IP),判断是否本机多网卡路由问题 - 跨协议验证:加
--tcp -P 443用 TCP SYN 替代 ICMP,看丢包是否依然存在——若 ICMP 丢但 TCP 不丢,基本锁定是中间设备过滤 ICMP - 最易忽略的一点:
mtr显示的丢包位置,未必是故障点。比如第 5 跳丢包,但第 4 跳的Wrst已达 800ms 且StDev极高,那真正瓶颈可能在第 4 跳的上行链路,第 5 跳只是“表现出来”的地方


















