mtr —— 丢包到底发生在哪一跳

运维工具手册 02-进程与网络诊断 4.0 KB 原文

mtr —— 丢包到底发生在哪一跳

分类:02 进程与网络诊断 适用:Linux / macOS / Windows(WinMTR),基于 ICMP/TCP/UDP 一句话:把 ping 和 traceroute 合起来持续跑,直接告诉你哪一跳开始劣化。

1. 它解决什么问题

"网络慢/丢包"最怕扯皮。mtr 对每一跳持续发包并统计丢包率与抖动,能明确指认:

  • 是从本机出口就丢,还是运营商骨干丢;
  • 是目标机房丢,还是目标主机自己丢;
  • 是持续丢包,还是偶发抖动。

2. 安装

apt install -y mtr-tiny      # 无界面依赖,推荐服务器用
apt install -y mtr           # 带 X11 界面的版本
dnf install -y mtr
apk add mtr

3. 两种模式

3.1 交互式(默认)

mtr 8.8.8.8
mtr -n 8.8.8.8          # 不解析域名,快
mtr -b 8.8.8.8          # 同时显示 IP 和域名
mtr -z 8.8.8.8          # 显示 AS 号

交互键:

键 作用
h 帮助
n 开关 DNS 解析
b 开关 IP/域名同时显示
d 切换显示模式(统计/延迟/丢包)
g 切换显示单位(ms/秒)
y 切换 IP 信息(AS 号)
r 重置统计
q 退出

3.2 报告模式(排障/贴给运营商)

mtr -r -c 100 8.8.8.8               # 发 100 个包后输出报告
mtr -rw -c 100 -n 8.8.8.8           # 宽格式 + 不解析
mtr -rwzbc 100 8.8.8.8              # 宽格式+ASN+IP+100 次
mtr --report --report-cycles 100 --json 8.8.8.8 > mtr.json   # JSON 便于入库

给运营商报障必须用 -r -c 100 以上,样本太少没有说服力。

4. 输出怎么读

HOST: web01                     Loss%   Snt   Last   Avg  Best  Wrst StDev
  1.|-- 192.168.1.1              0.0%   100    0.4   0.5   0.3   1.2   0.1
  2.|-- 100.64.0.1               0.0%   100    1.2   1.5   0.9   3.4   0.4
  3.|-- 202.97.12.1              0.0%   100    8.3   9.1   7.2  25.6   2.1
  4.|-- 202.97.50.9             35.0%   100   12.4  13.0  11.8  30.1   3.2
  5.|-- 202.97.90.2              0.0%   100   14.1  14.8  13.2  31.0   3.5
  6.|-- 8.8.8.8                  0.0%   100   15.2  15.9  14.0  33.2   3.8
列 含义
Loss% 该跳丢包率
Snt 发送包数
Last/Avg/Best/Wrst 最近/平均/最好/最差延迟(ms)
StDev 抖动(标准差),越大越不稳定

核心判读原则

  1. 中间跳丢包但后续跳和终点不丢 → 不是问题。很多路由器对 ICMP 限速或低优先级处理,这是正常现象。
  2. 某跳开始丢,且之后所有跳都丢,终点也丢 → 问题在这一跳或其后链路。
  3. 只有终点丢 → 目标主机或目标机房的问题,可能对方防火墙限速 ICMP。
  4. 延迟突然在某跳跳升几十毫秒 → 跨运营商/跨地域,或该跳拥塞。
  5. StDev 大而 Loss% 为 0 → 抖动严重,对实时业务(音视频、游戏、长连接)影响大。

5. 协议选择(关键技巧)

很多网络对 ICMP 限速,导致 mtr 结果虚高。改用 TCP 探测更贴近真实业务:

mtr -T -P 443 -rwc 100 <目标>        # TCP SYN 打 443,绕过 ICMP 限速
mtr -T -P 80 -rwc 100 <目标>
mtr -u -P 53 -rwc 100 <目标>         # UDP
mtr -T --tcp --port 3306 -rwc 50 <db>  # 探数据库端口

排查"业务端口不通但 ping 通"时,用 -T -P <业务端口> 往往能立刻看到问题。

6. 常用参数

-c <n>          发包次数(默认无限)
-r              报告模式
-w              宽格式(长域名不换行)
-n              不解析域名
-b              同时显示 IP 与域名
-z              显示 AS 号
-i <秒>         发包间隔(默认 1)
-s <字节>       包大小(默认 64,测 MTU 时用)
-4 / -6         IPv4 / IPv6
-f <TTL>        起始 TTL
-m <TTL>        最大 TTL(默认 30)
-P <端口>       目标端口(配合 -T/-u)
-T              使用 TCP SYN
-u              使用 UDP
--json          JSON 输出(较新版本)

7. 实战场景

7.1 判断是本地还是对端问题

# 依次探测,看延迟从哪一段开始劣化
mtr -rwc 50 -n <网关IP>
mtr -rwc 50 -n <同机房其他机器>
mtr -rwc 50 -n <公网目标>
  • 连网关就丢 → 本机/交换机/网线问题。
  • 同机房正常、出公网丢 → 出口或运营商。
  • 只有目标丢 → 对端。

7.2 验证 MTU / 分片问题

mtr -s 1472 -rwc 20 <目标>     # 1472+28=1500
mtr -s 1400 -rwc 20 <目标>

小包通、大包丢 → 路径 MTU 问题(VPN、隧道常见),需调 MTU 或 MSS clamping。

7.3 长连接抖动取证

mtr -rwc 500 -i 0.5 -T -P 443 <目标> > /tmp/mtr_$(date +%H%M).txt

看 StDev 和 Wrst,长连接超时多半是抖动导致的重传。

7.4 多目标并发采集

for t in 223.5.5.5 114.114.114.114 8.8.8.8; do
  mtr -rwc 30 -n "$t" > "/tmp/mtr_$t.txt" &
done; wait

8. 常见坑

  1. 中间跳显示 100% 丢包但终点正常:该路由器不回 ICMP,属正常,忽略。
  2. ICMP 被限速导致误判:用 -T -P <业务端口> 复核。
  3. mtr 默认无限运行:脚本/截图务必带 -c,否则一直挂着。
  4. DNS 解析拖慢:加 -n,尤其目标域名反解慢时。
  5. 容器内无权限:需要 NET_RAW,否则报 socket: Operation not permitted。
  6. 云环境 NAT 后路径不完整:中间跳可能全是内网地址或显示 ???。
  7. 出口有多条线路(多 ISP/ECMP):不同包走不同路径,结果会跳变,多跑几次。
  8. Windows 用 WinMTR,参数与 Linux 不同,报告格式别混用。
  9. -c 太少没意义:少于 20 个包的丢包率误差极大。

9. 速查表

mtr -rwc 100 -n <target>              # 标准报告
mtr -rwzc 100 <target>                # 带 ASN
mtr -T -P 443 -rwc 100 <target>       # TCP 探测(绕 ICMP 限速)
mtr -u -P 53 -rwc 50 <target>         # UDP 探测
mtr -s 1472 -rwc 20 <target>          # MTU 测试
mtr -rwc 500 -i 0.5 <target>          # 高频长采样

# 判读:中间丢末端不丢=正常;某跳起全丢=该跳;只末端丢=对端