网络丢包排查全链路分析:从 ping 到 tcpdump 逐层排查指南
来源:运维派 | 发布日期:2026-06-03
核心概念:丢包的两个层面
| 层面 | 发生位置 | 排查工具 |
|---|---|---|
| 物理丢包 | 网卡、交换机、物理链路 | ifconfig(RX/TX errors/dropped)、ethtool -S、交换机端口统计 |
| 逻辑丢包 | 网络协议栈内部(IP/TCP/socket) | /proc/net/snmp、nstat、ss、conntrack、iptables |
关键指标
| 指标 | 说明 | 排查意义 |
|---|---|---|
| RTT | 往返延迟 | 链路质量和拥塞 |
| 丢包率 | 包丢失比例 | 核心判断依据 |
| 重传率 | TCP 重传占总包比例 | 传输层丢包指示 |
| 乱序率 | 到达顺序错乱比例 | 网络抖动 |
| Dup ACK | 重复 ACK 数量 | 网络不稳 |
| 带宽利用率 | 实际/理论带宽 | 拥塞判断 |
排查顺序(从应用到物理)
应用层 → 传输层 → 网络层 → 数据链路层 → 物理层
不要先入为主,每层有各自的工具,逐层排除。
八步排查流程
第一步:确认丢包现象与范围
ping -c 100 -i 0.2 <目标IP>
判断:单方向/双向?间歇/持续?单连接/全连接?特定 IP/全部?
ping 正常但业务超时 → 可能是 TCP 层丢包,ping 无法发现。
第二步:mtr 定位丢包路径
mtr -r -c 100 <目标IP> # 报告模式
mtr -r -c 200 -i 0.5 <目标IP> # 跨机房长时间观察
mtr 结合 traceroute + ping,显示每一跳的丢包率和 RTT。注意:最后一跳的丢包才是真实的,中间跳因 ICMP 限速导致的丢包可能是假象。
第三步:查看 TCP/UDP 统计(本机协议栈)
nstat -az | grep -E "(Tcp|Udp)"
# TCP 关键字段
# TcpExt:ListenDrops — accept 队列满
# TcpExt:TCPLoss — 丢包触发重传
# TcpExt:TCPRetransFail — 重传失败
# TcpExt:PAWS — PAWS 保护
nstat -az | grep TcpRetrans # TCP 重传统计
第四步:查看网卡统计
ip -s link show <接口> # 查看 RX/TX 错误、丢包
ethtool -S <接口> | grep -E "error|drop|miss" # 驱动级统计
ethtool <接口> # 查看协商速率、双工模式
常见物理丢包:rx_fifo_errors / rx_missed_errors → ring buffer 满,需要 ethtool -G 加大 buffer。
第五步:查看 socket 状态
ss -s # socket 统计摘要
ss -tnp # TCP socket 列表
ss -tni # 查看 TCP 发送/接收 buffer 使用
cat /proc/net/sockstat # socket 内存使用
关注 ss -s 中 TCP 的 tw(TIME_WAIT)数量——过多可能导致端口耗尽。
第六步:查看连接跟踪表
sysctl net.netfilter.nf_conntrack_max # 最大连接跟踪数
sysctl net.netfilter.nf_conntrack_count # 当前跟踪数
cat /proc/net/nf_conntrack | wc -l # 查看连接跟踪条目数
连接跟踪表满 → 新连接直接丢包,表现为连接超时。症状:dmesg 出现 nf_conntrack: table full, dropping packet。
第七步:查看 IP 层丢包
cat /proc/net/snmp | grep Ip
# Ip: Forwarding DefaultTTL InReceives ... InDiscards OutDiscards
# InDiscards — IP 层丢弃包数
nstat -az | grep Ip # IP 统计
第八步:查看 Netfilter/iptables 丢包
iptables -L -n -v # 查看各规则匹配的包数量
iptables -L INPUT -n -v # 入站规则,看 DROP 计数
iptables -t filter -L -n -v # filter 表
如果某条 DROP 规则的包计数在增长,就是被它拦了。
常见丢包场景
UDP 丢包
nstat -az | grep Udp
# Udp: InErrors — 接收端 buffer 满导致的丢包
常见原因:接收端 buffer 满、MTU 不一致导致分片失败、中间设备限速。
TCP 重传
nstat -az | grep -E "TcpRetrans|TcpExt"
常见原因:网络质量差(RTT 抖动、拥塞)、对端 socket buffer 满、中间设备丢包。
容器网络丢包(K8s/Docker)
ip -s link show veth<xxxx> # veth pair 统计
ip -s link show docker0 # Docker bridge
常见原因:MTU 不一致(overlay 网络如 Flannel VXLAN、Calico IPIP 额外消耗 50+ 字节)、iptables 规则冲突。
DNS 丢包
dig +trace example.com # 追踪 DNS 解析路径
# DNS 服务器 UDP 53 被防火墙拦截
排查工具速查
| 命令 | 用途 | 关键参数 |
|---|---|---|
ping |
ICMP 连通性测试 | -c 100 -i 0.2 -s 1472(MTU 测试) |
mtr |
逐跳路由+丢包率 | -r(报告)-c 200(包数) |
traceroute |
路由追踪 | -T -p 8080(TCP 模式) |
ss |
socket 状态 | -tupna(TCP/UDP)-i(TCP 信息) |
nstat |
网络统计 | -az(所有计数器) |
ethtool |
网卡配置/统计 | -S(驱动统计) |
ip -s |
接口统计 | link show |
tcpdump |
抓包 | -i eth0 port 80 -nn -w file.pcap |
conntrack |
连接跟踪 | -L -f ipv4 |
dmesg |
内核日志 | grep -i "drop\|error" |
FAQ
Q1: ping 没丢包但业务超时?
ping 用 ICMP,业务通常走 TCP/UDP。中间设备可能对 ICMP 透传但对 TCP 限速或丢包。必须用业务协议测试(如 curl -w "RTT: %{time_total}")。
Q2: mtr 显示中间跳丢包但最后一跳正常?
正常现象。中间路由器对 ICMP 限速,不是真正的丢包。只看最后一跳的丢包率。
Q3: 两端确认丢包但在不同位置?
核心路由器和服务器侧看到的链路可能不同。必须在多个点同时抓包(tcpdump)才能确定丢包点。
排查记录模板
## 丢包排查记录
### 基本信息
- 时间: | 影响范围: | 现象描述:
### 排查路径
1. (第一步:观察什么)
2. (第二步:用了什么命令,看到什么输出)
3. (第三步:进一步定位)
### 根因
### 修复方案
### 验证方法
### 预防措施
关联页面
| 页面 | 关联点 |
|---|---|
| network-troubleshooting-order | 服务器网络排障方法论(七步法) |
| port-connectivity-troubleshooting-guide | 端口排查指南 |
| container-networking-troubleshooting | 容器网络排障 |
| dns-troubleshooting-practical-guide | DNS 排障实战 |
| fullstack-performance-troubleshooting | 全栈性能排障 |
| linux-essential-commands-reference | Linux 命令速查 |