丢包要先分层再定位
丢包定位的关键是先判断问题在网络路径还是本机:路径侧用 mtr 看逐跳丢包(从哪一跳开始丢),本机侧用 ethtool -S 看网卡错误计数、ss -ti 与 nstat 看重传和协议栈丢弃,最后用 tcpdump 抓现场做两端对比。按这个顺序走,能避开一上来就换网线或重启服务的无效操作。
基本信息
| 适用平台 | Linux |
|---|---|
| 常用工具 | mtr、ethtool -S、ss -ti、nstat / netstat -s、tcpdump |
| 权限要求 | tcpdump 需 root 或相应网络能力 |
| 判据 | 看计数增量,不看累计值 |
| 注意 | ICMP 优先级低,mtr 结果要与 TCP 重传交叉验证 |
典型使用场景
- 间歇性丢包造成接口偶发超时
- 跨机房传输慢且重传明显增多
- 宿主机与容器网络之间的丢包定位
- 无线或专线链路质量评估
- 云上安全组、限速策略造成的隐性丢包
路径侧与本机侧
路径侧与本机侧
mtr -rnc 50 -i 0.5 10.0.0.9 # 逐跳丢包:从哪一跳开始丢
mtr -rwc 50 10.0.0.9 > /tmp/mtr-$(date +%F).log # 宽屏模式留档,便于多次对比
ethtool -S eth0 | grep -iE 'err|drop|fifo' # 网卡侧错误与丢弃计数
ss -tin state established '( dport = :443 )' | head -20 # 连接级重传(retrans)
nstat -az | grep -iE 'retrans|drop|timeout' | head # 协议栈累计计数
netstat -s 2>/dev/null | grep -iE 'retrans|drop' | head # 老系统的替代写法
tcpdump -i eth0 -nn 'host 10.0.0.9 and tcp port 443' -c 50 -w /tmp/pcap.pcap
# 两端同一时间窗抓包对比:发送侧有而接收侧没有,说明丢在中间观测点与判据
| 观测点 | 看什么 | 判据 |
|---|---|---|
| mtr 逐跳 | 每一跳的丢包百分比 | 从某一跳开始持续丢,问题在该跳之后 |
| mtr 最后一跳 | 目标跳单独丢而前面干净 | 常为目标限速或禁 ICMP,不一定是链路问题 |
| ethtool -S | rx_errors/rx_dropped/rx_fifo 等驱动计数 | 看增量,增量才有当下意义 |
| ss -ti | 连接上的 retrans 与 rtt | 重传多说明路径质量差或拥塞 |
| nstat / netstat -s | 协议栈级丢弃与重传 | 区分是本机内核丢还是网络丢 |
丢包只在最后一跳出现、前面几跳干净时,目标可能只是限速或限制 ICMP:先用 TCP 层的重传与耗时交叉验证,再决定是否换链路或找运营商。
网卡与协议栈计数都是累计值:必须两次采样求增量,或先记基线再对比。直接拿累计值下结论会严重误判。