mtr —— 丢包到底发生在哪一跳
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 |
抖动(标准差),越大越不稳定 |
核心判读原则
- 中间跳丢包但后续跳和终点不丢 → 不是问题。很多路由器对 ICMP 限速或低优先级处理,这是正常现象。
- 某跳开始丢,且之后所有跳都丢,终点也丢 → 问题在这一跳或其后链路。
- 只有终点丢 → 目标主机或目标机房的问题,可能对方防火墙限速 ICMP。
- 延迟突然在某跳跳升几十毫秒 → 跨运营商/跨地域,或该跳拥塞。
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. 常见坑
- 中间跳显示 100% 丢包但终点正常:该路由器不回 ICMP,属正常,忽略。
- ICMP 被限速导致误判:用
-T -P <业务端口>复核。 mtr默认无限运行:脚本/截图务必带-c,否则一直挂着。- DNS 解析拖慢:加
-n,尤其目标域名反解慢时。 - 容器内无权限:需要
NET_RAW,否则报socket: Operation not permitted。 - 云环境 NAT 后路径不完整:中间跳可能全是内网地址或显示
???。 - 出口有多条线路(多 ISP/ECMP):不同包走不同路径,结果会跳变,多跑几次。
- Windows 用 WinMTR,参数与 Linux 不同,报告格式别混用。
-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> # 高频长采样
# 判读:中间丢末端不丢=正常;某跳起全丢=该跳;只末端丢=对端