返回首页

网络丢包排查全链路分析:从 ping 到 tcpdump 逐层排查指南

📅 创建于 2026-06-04 🔄 更新于 2026-06-04 📝 643 字

网络丢包排查全链路分析:从 ping 到 tcpdump 逐层排查指南

来源:运维派 | 发布日期:2026-06-03

核心概念:丢包的两个层面

层面 发生位置 排查工具
物理丢包 网卡、交换机、物理链路 ifconfig(RX/TX errors/dropped)、ethtool -S、交换机端口统计
逻辑丢包 网络协议栈内部(IP/TCP/socket) /proc/net/snmpnstatssconntrackiptables

关键指标

指标 说明 排查意义
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-guideDNS 排障实战
fullstack-performance-troubleshooting全栈性能排障
linux-essential-commands-referenceLinux 命令速查