首页/系统/Linux 运维命令速查/场景:丢包问题定位
网络命令82 条

场景:丢包问题定位

先判断丢在路径还是本机:mtr 看逐跳丢包,本机用 ethtool/ss 看错误与重传计数,最后 tcpdump 抓现场。

Linux 运维命令速查系统更新于 2026-10-13

丢包要先分层再定位

丢包定位的关键是先判断问题在网络路径还是本机:路径侧用 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 -Srx_errors/rx_dropped/rx_fifo 等驱动计数看增量,增量才有当下意义
ss -ti连接上的 retrans 与 rtt重传多说明路径质量差或拥塞
nstat / netstat -s协议栈级丢弃与重传区分是本机内核丢还是网络丢
丢包只在最后一跳出现、前面几跳干净时,目标可能只是限速或限制 ICMP:先用 TCP 层的重传与耗时交叉验证,再决定是否换链路或找运营商。
网卡与协议栈计数都是累计值:必须两次采样求增量,或先记基线再对比。直接拿累计值下结论会严重误判。

易错点

  • 用累计计数判断当前丢包:两次采样求增量才有意义,单看累计值只会得出错误结论
  • 只看 mtr 忽略 TCP 层:ICMP 常被降优先级,与业务真实体验可能不一致
  • 容器或虚机内计数正常就收工:宿主与上游的丢包看不到,需要同时检查宿主和虚拟交换机
  • 只抓单侧报文:必须两端同一时间窗口对比,才能判断丢在中间还是本机协议栈

数据来源与参考

  • man 8 mtr(mtr 官方手册)
  • man 8 ethtool

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌