网络延迟高、丢包严重,怎么定位问题出在哪一段?
简化版
定位延迟/丢包的核心思路是**「逐跳分段,找出是哪一段变差的」。最好用的工具是 mtr(= ping + traceroute 合体)——它持续对路径上每一跳发包并统计,实时显示每一跳的丢包率和延迟**,一眼就能看出「从第几跳开始丢包/延迟飙升」。基本判断:丢包/高延迟从中间某一跳开始并持续到终点 → 那一段链路有问题(常是运营商骨干或跨网);只有中间某一跳丢包、但终点不丢 → 那跳路由器只是限制了 ICMP 回复,不是真丢包(常见误判)。先用 ping 看总体延迟和丢包率,再用 mtr 逐跳定位。
详细版
第一步·ping 看总体情况
ping -c 100 example.com # 发 100 个包,看统计
关注结尾统计:
- packet loss(丢包率):0% 正常;持续几 % 以上就有丢包问题。
- rtt min/avg/max/mdev:延迟的最小/平均/最大/抖动。max 和 avg 差距大、mdev 大 = 抖动严重(延迟不稳定,比单纯高延迟更影响体验)。
第二步·mtr 逐跳定位(关键)
mtr example.com # 交互式,持续刷新
mtr -r -c 100 example.com # 报告模式,发 100 个包后输出报告
mtr 每一行是一跳,关键列:
| 列 | 含义 |
|---|---|
Loss% | 该跳丢包率 |
Snt | 发送包数 |
Last/Avg/Best/Wrst | 最近/平均/最好/最差延迟 |
StDev | 延迟标准差(抖动) |
读 mtr 的黄金法则:
- 丢包从中间某跳开始,一路持续到最后一跳 → 那一段真有问题。
- 只有中间某跳丢包,后面的跳(含终点)不丢 → 假丢包:那台路由器只是限速回复 ICMP(优先转发、不爱回诊断包),数据实际正常通过,不用管。
- 某跳开始延迟陡增并持续到终点 → 那一段是延迟瓶颈(常是跨运营商、跨地域的长距离链路)。
完整版教学
一、先分清:延迟高、丢包、抖动是三件事
「网络卡」笼统,排查前要先分清三种不同的病:
- 延迟高(高 RTT):包一来一回耗时长。距离远(跨国)会天然高延迟,但异常的高延迟往往是某段链路拥塞或绕路。
- 丢包(Packet Loss):一部分包根本没到。丢包会触发 TCP 重传,表现为「时快时慢、偶发失败、下载卡顿」,危害往往比稳定的高延迟更大。
- 抖动(Jitter):延迟忽高忽低不稳定。对实时应用(语音、视频、游戏)致命——即使平均延迟不高,剧烈抖动也会卡顿。
排查时要先用 ping 看清是哪一种、有多严重,再用 mtr 定位是哪一段造成的。
二、第一步:ping 摸清整体
ping -c 100(发够多的包才有统计意义)看结尾汇总:
100 packets transmitted, 97 received, 3% packet loss
rtt min/avg/max/mdev = 20.1/35.2/210.8/28.4 ms
- 3% packet loss → 有丢包,需要进一步定位。
- avg 35ms 但 max 210ms、mdev 28ms → 抖动严重(大部分包 35ms,偶尔飙到 210ms),延迟不稳定。
ping 能告诉你「端到端有多差」,但不能告诉你差在哪一段——它只测你和终点之间的总体情况。要定位到具体链路,得靠逐跳工具。
三、第二步:mtr——定位的主力
traceroute 能列出路径每一跳,但它每跳只发几个包,看不出持续的丢包率。mtr 把 ping 和 traceroute 合二为一:它持续不断地对路径上每一跳发包并统计,动态显示每跳的丢包率和延迟。这正是定位「哪一段变差」需要的。
Loss% Snt Last Avg Best Wrst StDev
1. 网关 0.0% 100 1.2 1.1 0.9 2.0 0.2
2. 运营商接入 0.0% 100 8.3 9.1 7.5 15.2 1.1
3. 城域网 0.0% 100 12.0 13.5 11.0 40.1 3.2
4. 骨干节点 15.0% 100 85.0 92.3 80.0 210.5 28.0 ← 从这跳开始丢包+延迟飙升
5. 跨省骨干 14.0% 100 88.0 95.1 82.0 205.0 27.5
6. 目标网络 13.0% 100 90.0 96.0 85.0 208.0 26.0
7. 目标服务器 13.0% 100 91.0 97.2 86.0 209.0 25.8 ← 一路持续到终点
上例中,从第 4 跳开始丢包 15%、延迟从 13ms 飙到 92ms,且一路持续到第 7 跳(终点) → 判定第 3 跳到第 4 跳之间那段链路出了问题(拥塞/故障),且它归属运营商骨干,往往不是你能修的(可反馈运营商或换线路)。
四、最大的坑:中间跳丢包≠真丢包
这是延迟/丢包排查最容易误判的点,务必牢记:
mtr 里某个中间跳显示丢包,但它后面的跳(尤其终点)不丢包 → 这是「假丢包」,不用管。
原因:mtr/traceroute 靠让中间路由器回 ICMP 超时包来测量每一跳。但路由器的首要任务是转发数据,回诊断用的 ICMP 是「顺手的活儿」,很多路由器故意限速或低优先级处理 ICMP 回复(甚至遇忙就不回)。于是那一跳的 ICMP 回复丢了、显示「丢包」,但真正过境的数据包一切正常——证据就是它后面的跳都不丢(数据明明顺利通过了)。
判据:只看丢包是否一路持续到终点。
- 持续到终点 → 真丢包,那段链路有问题。
- 只中间某跳丢、终点不丢 → 假象,是路由器限制 ICMP,忽略。
记住这条能避免大量「看到某跳红了就慌」的误判。
五、把丢包点和「归属」对上
定位到「第几跳这段」后,还要看这一跳属于谁,才知道找谁解决:
- 前几跳(网关、你的接入)丢包/高延迟 → 你自己这端的问题:本地网络、路由器、宽带线路、WiFi 信号。这是你能处理的。
- 中间骨干跳开始且持续到终点 → 运营商 / 跨网链路问题:跨省、跨国、跨运营商互联点(如电信↔联通互联)拥塞。多数只能反馈运营商、或用 CDN/多线路规避。
- 最后一两跳(目标网络内)丢包 → 目标服务器侧问题:对方带宽打满、服务器过载、对方机房网络。
通过跳的 IP 归属(whois、看域名)能大致判断是哪一段的责任方。
六、其他辅助手段
ping不同大小的包:ping -s 1472(大包)对比小包,若大包丢小包不丢,可能是 MTU/分片问题。- 换目标对比:同时 mtr 到多个不同目标,如果只有到某个目标差、其他都好 → 问题在那条特定路径;如果到哪都差 → 问题在你本地出口。
- 双向都测:网络问题可能是回程路由差。条件允许时让对端也 mtr 回来,因为去程和回程路径可能不同。
七、常见误区与追问
| 考点 | 正确口径 |
|---|---|
| 延迟 | RTT 增大,来源可能是距离、排队、拥塞、处理慢 |
| 丢包 | 包未到达或未响应,来源可能是拥塞、无线质量、限速、设备故障 |
| 排查 | ping/mtr/traceroute/tcpdump 分段定位 |
ping target
mtr target
compare:
client -> gateway
client -> public DNS
client -> service VIP
server logs and tcp retransmissions
延迟和丢包要分段看:本机到网关、出口到公网、公网到目标、目标内部,哪段变差查哪段。
- 误区:看到中间跳丢包就说明业务一定丢包。 路由器可能只限制 ICMP 回复,对转发流量不丢。
- 误区:平均延迟正常就没有问题。 P95/P99 抖动、偶发重传和队列拥塞也会影响用户体验。
- 误区:丢包只能是网络设备坏了。 拥塞、无线干扰、限速策略、CPU 忙、缓冲区溢出都可能导致丢包。
- 追问:mtr 比 ping 多什么? mtr 持续展示每一跳的延迟和丢包趋势,便于定位异常段。
- 追问:TCP 重传能说明什么? 重传说明发送端未及时收到 ACK,可能有丢包、乱序或严重延迟。
- 追问:Bufferbloat 是什么? 过大的队列缓冲导致拥塞时排队延迟暴涨,吞吐看似高但交互变慢。
八、加强记忆
定位延迟/丢包逐跳分段找变差的那一段:先 ping -c 100 看端到端丢包率 + 延迟 + 抖动(mdev),再用 mtr(ping+traceroute 合体) 看每一跳的 Loss% 和延迟。黄金判据:丢包/高延迟从某跳开始并持续到终点 = 那段真有问题;只中间某跳丢、终点不丢 = 假丢包(路由器限速 ICMP),忽略。再按跳的归属分清是本地(前几跳)/ 运营商骨干(中间持续)/ 对端(最后几跳)。注意抖动比高延迟更伤实时应用,去程回程都要测。