丢包率度量方法:ping、traceroute、iperf 实战归纳
做网络的人,谁没被丢包折磨过?我记得刚入行那会儿,遇到用户说“卡”,我二话不说就敲个 ping,看个两屏没丢包就回复“网络正常”。现在想想真脸疼。丢包率这玩意儿,光用 ping 看是不够的,不同工具测出来的结果可能完全不一样。
这一章我就把平时最常用的三把刀——ping、traceroute、iperf——拿出来掰开揉碎讲。每种工具测什么、怎么测、数据怎么看、有什么坑,我都会结合自己踩过的坑来说。
1. ping - 最直接的丢包探针
说到丢包,大部分人第一个想到的就是 ping。它基于 ICMP Echo 请求,简单粗暴。但你真的会用吗?
我的基本用法:
# Linux 下,发送 100 个包,间隔 0.1 秒,大包测MTU问题
ping -c 100 -i 0.1 -s 1472 10.0.0.1
输出里面看「packet loss」这一行。举个例子:
--- 10.0.0.1 ping statistics ---
100 packets transmitted, 98 received, 2% packet loss
2% 算不算高?要看场景。语音视频 1% 就可能卡,文件传输 5% 可能还能接受。但注意,这里统计的是整体丢包率,不反映丢包分布。
ping -f(flood模式)测连续丢包,不过千万别在生产环境用。
几个关键参数,我用表格整理一下:
| 参数 | 作用 | 我的推荐值 |
|---|---|---|
| -c | 发送包数 | 至少 100,越多越稳定 |
| -i | 发送间隔(秒) | 0.01~0.1,短时间测压力 |
| -s | payload 大小 | 默认 56,测MTU时设 1472 |
| -W | 超时时间(秒) | 5,别设太长 |
| -f | flood 模式 | 慎用,只在实验室用 |
ping 测阿里云 ECS,发现偶尔丢包 0.5%,吓得差点重启。后来才发现是 ICMP 限速,换成 ping -c 1000 -i 0.01 反而没问题。记住,很多云平台对 ICMP 做了限速,丢包不一定是网络问题。
2. traceroute - 定位丢包节点
ping 能告诉我们有没有丢包,但在哪里丢的?那就得上 traceroute。它通过逐步增大 TTL 来探测每一跳的路由器。
我的常用命令:
# 用 ICMP 模式(避免被 UDP 防火墙拦截)
traceroute -n -I -q 3 10.0.0.1
注意我加了 -I,用 ICMP Echo 代替默认的 UDP。为什么?很多网络设备会丢弃 UDP 高端口包,导致你看到全是 * * *,但其实 ICMP 是通的。
怎么看结果? 看每一跳的延迟和丢包。比如:
1 192.168.1.1 1.2 ms 1.0 ms 1.1 ms
2 10.0.0.254 2.3 ms 2.5 ms * ← 丢了一个包
3 10.0.0.1 5.0 ms 5.1 ms 4.9 ms
第2跳丢了一个包(第三组探测超时),但整体链路还是通的。如果某一跳连续丢包 >20%,那它就是瓶颈。
traceroute -R(记录路由)或者两端同时测。
各模式对比:
| 模式 | 默认端口 | 通过防火墙概率 | 我的选型 |
|---|---|---|---|
| UDP(默认) | 33434+ | 低,容易被拦截 | 不推荐 |
| ICMP (-I) | 无 | 中,某些设备限速 | 首选 |
| TCP (-T) | 80/443 可指定 | 高,模拟真实流量 | 生产环境首选 |
tcpdump 抓包确认。
3. iperf - 压力下的丢包率
ping 和 traceroute 都是轻量探测,但真实业务流量下丢包率可能完全不同。为什么?因为缓冲区。空闲时路由器缓存够用,一旦跑满带宽,缓存丢包才会暴露。
我的 UDP 测试命令(iperf3):
# 服务端(目标)
iperf3 -s
# 客户端(发流端)
iperf3 -c 10.0.0.1 -u -b 100M -l 1400 -t 60
-b 100M 表示以 100Mbps 速率发送 UDP 流。注意 iperf 默认是 TCP,必须加 -u 才是 UDP。
输出看什么? 重点关注这几行:
[ ID] Interval Transfer Bitrate Jitter Lost/Total Datagrams
[ 5] 0.00-60.00 sec 713 MBytes 99.8 Mbits/sec 0.025 ms 0/510115 (0%)
[ 5] 0.00-60.00 sec 713 MBytes 99.8 Mbits/sec 0.025 ms 0/510115 (0%)
[ 5] Sent 510115 datagrams
Lost/Total 后面的百分比就是 UDP 丢包率。Jitter(抖动)也很关键,语音视频对抖动敏感。
ethtool -C eth0 rx-usecs 0 后就好了。iperf 能暴露这类隐含问题,ping 测不出来。
关键参数速查:
| 参数 | 作用 | 推荐值 |
|---|---|---|
| -b | 目标带宽 | 链路带宽的 80%~95% |
| -l | payload 大小 | 接近 MTU(1400 安全) |
| -t | 测试时长 | 30~120 秒 |
| --get-server-output | 获取服务端统计 | 建议加上,看双向丢包 |
-b 设成 1G,而链路实际只有 100M,结果把交换机缓存打满了,导致同链路上的其他业务全部丢包。建议先在低带宽下测试,逐步增加。另外,一定要确认服务端 iperf 进程已经启动,否则测试会失败。
4. 工具选择策略与决策流程
三个工具各有侧重。我画了一张图,帮你快速决策:
这张图展示了我的推荐路径:先用 ping 确认有没有丢包,如果有就 traceroute 定位节点,最后用 iperf 模拟真实压力验证。如果 ping 没丢包但业务慢,别犹豫,直接上 iperf UDP 压力测试。
- ping:快速、轻量,但易受 ICMP 限速影响,不能反映真实业务流丢包。
- traceroute:定位到节点级别,但只有去程信息,且星号可能误判。
- iperf:模拟真实负载,暴露缓存和限速问题,但需要双向部署且注意别打爆链路。
5. 注意事项与避坑指南
- 双向路径不对称:traceroute 只测去程,丢包可能发生在回程。我曾在跨运营商场景中,去程正常,回程在某台设备上丢包 30%。解决方法:在两端同时做 traceroute,或者用
mtr工具结合看。 - QoS 队列影响:有些设备会优先处理控制面流量(如 ICMP),导致 ping 不丢包但业务丢包。我遇到过一个交换机,ICMP 被放在 High 队列,而业务流量在 Default 队列被 tail drop。
- 采样周期:短时间测试不可靠。我建议 ping 至少 1000 个包,iperf 至少跑 30 秒,traceroute 每跳测 3~5 次。
- 防火墙策略:很多防火墙默认丢弃 ICMP,或者对 UDP 高端口限速。我曾经在客户环境里用
ping什么都正常,但业务全丢,后来发现是防火墙把业务端口限速了。用iperf TCP才测出来。
* * *。我以为网络断了,他说不对,网页能打开。后来发现他 traceroute 用的 UDP 模式,而核心路由器正好把 UDP 高端口全 drop 了。换成 traceroute -I 就好了。所以记住:工具的参数选择可能颠覆你的判断。
好了,这三种工具怎么用、怎么看、怎么避坑,基本都讲清楚了。下次你遇到丢包投诉,别再只敲个 ping 就交差了。先快速 ping 摸底,再 traceroute 定位,最后 iperf 做压力验证——这套组合拳下来,绝大多数丢包根因都能揪出来。