linux网络丢包需逐层排查:先用ping定位范围,再查网卡错误计数、ring buffer溢出、tc规则、iptables拦截、内核参数及mtr路径分析,关键在理解各指标对应层级。

Linux 网络丢包严重时,不能只盯着 ping 结果看,得顺着数据包从网卡进来到应用层出去的路径逐层排查。丢包可能发生在物理链路、网卡驱动、内核协议栈、防火墙规则,甚至应用自身缓冲区,必须分段定位。
确认丢包现象并锁定范围
先用稳定方式复现并量化丢包:
- 执行 ping -c 100 -i 0.1 目标IP(高频短间隔测试,避免偶然性)
- 对比测试:本地回环(ping 127.0.0.1 -c 100)、同网段主机、网关、外网域名(如 ping www.baidu.com -c 100)
- 若仅对外丢包,而网关和同网段不丢,问题大概率在路由、NAT 或上游设备;若连网关都丢,问题在本机或直连链路
检查网卡硬件与驱动状态
网卡本身异常是常见根源,重点看错误计数和缓冲区溢出:
- 运行 cat /proc/net/dev,关注 eth0 行的 rx_dropped、rx_fifo_errors、tx_dropped
- 查看 Ring Buffer 溢出:执行 ethtool -S eth0 | grep -i “fifo|drop”,若 rx_fifo_errors 持续增长,说明接收缓冲区溢出
- 检查当前 Ring Buffer 大小:ethtool -g eth0;必要时增大:ethtool -G eth0 rx 4096 tx 4096
- 确认网卡协商状态:ethtool eth0,留意 Link detected、Speed、Duplex 是否正常
排查内核协议栈与系统配置
内核参数不当或中间模块干扰常被忽略:
- 检查是否启用了人为丢包的 tc 规则:tc qdisc show dev eth0,若输出含 netem loss X%,立即清除:tc qdisc del dev eth0 root
- 查看 socket 层丢包:netstat -s | grep -i “packet receive errors|overflow”
- 检查 iptables/nftables 是否拦截:iptables -L -n -v | grep -E “(DROP|REJECT)”,特别注意 input/OUTPUT 链中高计数规则
- 确认内核网络参数是否合理:sysctl net.core.rmem_max net.core.wmem_max net.core.netdev_max_backlog,过小易导致缓冲区溢出丢包
验证网络路径与外部设备
排除本机问题后,需判断故障点是否在中间链路:
- 用 mtr -r -c 100 目标IP 查看每跳丢包率,定位具体哪一跳开始丢包
- 抓包确认收发行为:tcpdump -i eth0 -c 50 host 目标IP and port 80,对比发送与响应包数量
- 登录交换机/路由器,检查对应端口的 input errors、output drops、buffer overruns
- 临时关闭防火墙和服务端安全组策略,排除策略误拦
丢包排查本质是缩小范围的过程:从 ping 现象出发,先分清是本机问题还是路径问题,再逐层向下查网卡、协议栈、规则、链路。关键不是试遍所有命令,而是看懂每个指标代表哪一层的失败信号。