网络故障排查实战:tcpdump/Wireshark/ss/iperf 工具链与分层诊断方法论

系统讲解网络故障排查的方法论与实战工具链:分层排查(应用/传输/网络/链路)、tcpdump 抓包技巧、Wireshark 流量分析、ss/netstat 连接诊断、iperf 带宽测试、丢包重传与 MTU 黑洞诊断、DNS 问题排查及常见故障速查。

“网络又超时了"“接口偶发卡顿"“跨机房不通”——网络问题最让人头疼的是看不见摸不着。但网络故障有迹可循:只要按分层方法论逐层排查,用好 tcpdump、Wireshark、ss、iperf 这套工具链,绝大多数问题都能在几分钟内定位。本文从方法论讲起,给你一套从"症状"到"根因"的实战打法。

关键概念:网络排查的核心是分层——先确定"哪一层出问题"再动手。自下而上:链路层(物理/二层)→ 网络层(IP/路由)→ 传输层(TCP/UDP)→ 应用层(协议/业务)。每一层都有对应的工具和指标。


一、排查方法论:先定位层,再定位点

1.1 分层定位

症状 → 逐层收敛:

应用层症状(接口报错、超时、5xx)
  ↓  curl 本地回环 vs 域名 vs IP 对比
传输层(TCP 握手失败、RST、重传)
  ↓  ss -tin / tcpdump 看握手与状态
网络层(路由不通、丢包、MTU)
  ↓  ping / traceroute / ip route
链路层(ARP、交换机、物理)
  ↓  arp 表、端口 up/down、抓二层

原则:先自己机器上测,再沿路径向外推

1.2 第一轮快速定位命令

# 连通性 / 可达性(网络层)
ping -c 3 10.0.0.1          # 通不通、RTT、丢包
# 端口 / 服务可达性(传输层 + 应用层)
nc -vz -w 3 10.0.0.1 8080    # 目标端口通不通
curl -v --connect-timeout 3 http://10.0.0.1:8080/health
# 路径探测
traceroute 10.0.0.1          # 或 mtr(更好,持续统计每跳丢包)
# 本地连接与监听状态
ss -tan | head -20
# DNS 解析
dig +short example.com       # 或 nslookup

ℹ️ 第一印象法则:ping 通 说明网络层可达;nc 不通但 ping 通 → 问题在传输层或防火墙;域名解析失败 → DNS;本机 curl 好、对端 curl 差 → 路径中间环节。


二、tcpdump 抓包:让问题现形

2.1 常用抓包姿势

# 基础:抓某主机某端口的包
tcpdump -i eth0 host 10.0.0.1 and tcp port 8080 -nn
# 只看 TCP 标志位(看握手、RST、重传)
tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-ack|tcp-rst) != 0' -nn
# 保存到文件,供 Wireshark 分析
tcpdump -i eth0 -w /tmp/cap.pcap host 10.0.0.1 and port 8080
# 抓大包特征(看是否分片 / MTU 问题)
tcpdump -i eth0 -nn 'ip and not tcp port 22' -c 100

2.2 从抓包能看出的典型问题

1. 握手卡住:
   SYN 发出无 SYN+ACK → 对端/中间被防火墙丢
   SYN+ACK 到本地但状态异常 → 本地 listen 队列满(accept 慢)

2. 大量重传(retransmission):
   丢包或拥塞 → 看是否 MTU 黑洞 / 带宽打满

3. RST 连接被重置:
   - 端口未监听 → 内核回 RST
   - 防火墙主动 reset
   - 应用层异常关闭

4. 零窗口(zero window):
   对端 recv 缓冲满,消费慢 → 应用层问题

5. 分片过多:
   IP 分片 → MTU 不匹配,隧道场景常见
# 快速看抓包文件里的关键统计(tcpdump 直接统计)
tcpdump -r /tmp/cap.pcap -nn | grep -c "retransmission"
tcpdump -r /tmp/cap.pcap -nn | grep "RST"

三、Wireshark:图形化深度分析

Wireshark 打开 pcap 后的标准动作:
  1. 过滤器:tcp.flags.reset == 1 看 RST;tcp.analysis.retransmission 看重传
  2. 专家信息(Expert Info):自动标出异常(重传、乱序、重复 ACK)
  3. 跟踪 TCP 流(Follow TCP Stream):还原完整应用数据
  4. 统计 → 协议分级 / 会话:看流量分布与谁的包多
  5. 时间列:确认是否中间有 200ms 级延迟跳变

高阶用法:
  - 用 ip.addr == 目标 定位单会话
  - 用 http / dns / tls 过滤器直接过滤协议层
  - tls.handshake.type 看握手阶段卡在哪一步
典型排查剧本(服务偶发超时):
  1. 抓 60s 包,筛选目标 IP:PORT
  2. 看重传率是否高(>5% 算异常)
  3. 看 TCP 握手时延是否稳定
  4. 看应用响应(应用层首字节)时延分布
  5. 若首字节时延高但 RTT 正常 → 应用处理慢(后端问题)

ℹ️ 判断归属:Wireshark 帮你把"超时"拆解成"网络 RTT 大 / 重传多 / 应用响应慢"三个来源,网络层与应用层责任一目了然。


四、ss / netstat:连接与性能状态

4.1 连接状态检查

# 监听端口与服务
ss -tlnp
# 已建立连接(看对端来源)
ss -tan | grep ESTAB
# 各状态计数
ss -tan state established | wc -l
ss -tan state time-wait | wc -l
ss -tan state close-wait | wc -l   # 泄漏预警
# 每连接详细信息(窗口、速率、丢包、RTT)
ss -tin

4.2 端口与文件描述符耗尽

症状:
  连接大量失败,错误 "Cannot assign requested address"
  → 本地端口(ephemeral port)耗尽

确认:
  cat /proc/sys/net/ipv4/ip_local_port_range   # 可用端口范围
  ss -tan state time-wait | wc -l              # TIME_WAIT 数量
  ss -s                                        # 总连接数

对策:
  1. 减少短连接,用长连接/连接池
  2. 开启 TIME_WAIT 快速回收(需谨慎,见避坑)
  3. 增大 ip_local_port_range
  4. 调大文件描述符 ulimit / fs.file-max

五、iperf:带宽与吞吐测试

5.1 用法

# 服务端
iperf3 -s -p 5201
# 客户端,双向测试 30s
iperf3 -c 10.0.0.1 -p 5201 -t 30 -b 1G
# 反向(测对端→本地)
iperf3 -c 10.0.0.1 -p 5201 -R
# 并发流(多流测试,摸清链路真实容量)
iperf3 -c 10.0.0.1 -p 5201 -P 8

5.2 结果解读

关键看三列:Bandwidth / Retr / Cwnd

场景1:带宽远低于预期,Retr 高
  → 网络丢包或拥塞,进一步抓包看重传

场景2:带宽远低于预期,Retr 低,Cwnd 小
  → 窗口限制(BDP 大),调 rmem/wmem 或切 BBR

场景3:单流低、多流高
  → 单流受 cwnd/限制,多流分摊;典型的"高带宽高延迟"链路

场景4:RTT 高且抖动
  → 排队(bufferbloat)或路径绕远,检查路由/防火墙

ℹ️ 结论路径:iperf 是"链路物理能力"与"TCP 调优效果"的裁判。带宽不达标先分"丢包型"和"窗口型”,两种的解法完全不同。


六、丢包、重传与 MTU 黑洞诊断

6.1 丢包与重传

丢包来源:
  1. 物理/链路问题(光衰、CRC 错误)→ 交换机端口统计
  2. 拥塞丢包(队列满)→ 带宽打满
  3. 防火墙/安全组丢包 → 策略问题
  4. MTU 黑洞(DF=1 + 大包超 MTU)→ 静默丢大包

确认方法:
  - ping -M do -s 1472 10.0.0.1   # 固定 DF 测大包
  - tcpdump 看重传与 dup ACK 比例
  - mtr 看每跳丢包率(定位丢在哪一跳)

6.2 MTU 黑洞(大包通、小包不通)

经典现象:
  ping 1472(1500 MTU 内)通,但传输大文件/推送大消息超时
  SSH 能连上,但复制大文件卡死
  → 中间链路 MTU 小于 1500,且 DF 置位不降级

对策:
  1. 隧道/VPN 场景调整 MTU(如 VXLAN 用 1450)
  2. 开启 MSS clamp(路由器/防火墙对 SYN 的 MSS 限幅)
  3. 主机开启 MTU 探测:
     sysctl net.ipv4.tcp_mtu_probing=1
# 测最小可用 MTU
ping -c 1 -M do -s 1472 10.0.0.1   # 1500 包
ping -c 1 -M do -s 1450 10.0.0.1   # 1478 包
# 逐步减小,找到通与不通的边界 → 即实际 MTU

七、DNS 问题排查

症状:域名解析慢、间歇性解析失败、解析到错误 IP

排查链路:
  1. dig +short example.com        # 看解析结果
  2. dig example.com               # 看耗时(query time)
  3. nslookup example.com 8.8.8.8  # 换公共 DNS 对照
  4. cat /etc/resolv.conf          # 看本地 DNS 配置
  5. tcpdump -i eth0 port 53       # 看 DNS 请求是否发出/被丢

常见根因:
  - 本地 DNS 服务器故障/超时(内网 DNS 挂了)
  - 域名 TTL 过长缓存了旧 IP
  - 泛解析/被污染返回错误 IP
  - 多网卡 resolv.conf 顺序问题

八、常见避坑

坑现象对策
ping 通就下结论误判服务正常用 nc/curl 验 TCP 端口
禁 ping 回包ping 超时误判宕机用 TCP 探活代替
只看带宽不看丢包无法区分拥塞/窗口型同时看 Retr 与 Cwnd
忽略 MTU大包静默丢固定 DF 测大包 + MSS clamp
盲目开 TIME_WAIT 快速回收NAT 场景误杀优先改长连接/连接池
抓包不带时间戳分析看不出延迟跳变用 Wireshark 时间列
只测单流高 BDP 误判带宽低多流 + 反向测试
忽略防火墙策略端口不通还查应用先查安全组/iptables

九、最佳实践清单

□ 先分层定位(应用→传输→网络→链路),再动手排查
□ 备好一套固定命令清单(ping/nc/ss/curl/dig/mtr)
□ 复杂问题留 pcap,用 Wireshark 深度分析
□ iperf 测链路能力时同时看 Bandwidth/Retr/Cwnd
□ 隧道/跨机房场景先验 MTU(DF 大包测试)
□ 监控连接状态分布(CLOSE_WAIT/TIME_WAIT)日常预警
□ 排查文档化:症状→假设→验证→根因→修复
□ 防火墙/安全组规则变更留审计,避免"玄学不通"

一句话原则

网络排查先分层:ping 看网络、nc 看传输、curl 看应用,
tcpdump 让问题现形,iperf 量化链路能力,MTU 别忘 DF 大包测试。

小结

网络故障排查是"方法论 + 工具链"的组合拳。分层让你不在一堆现象里打转,tcpdump/Wireshark 让看不见的报文现形,ss/netstat 暴露连接状态与资源耗尽,iperf 量化链路真实能力,MTU/DNS 专项解决两类最隐蔽的疑难杂症。落地记住五件事:先分层再动手、抓包留证、iperf 看三列指标、隧道先验 MTU、排查过程文档化。当"ping 通但服务不可用"“大包超时小包正常"“跨机房偶发超时"这类问题不再让你抓瞎,你就真正掌握了网络排障的主动权。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「network」更多文章

  1. 云原生网络:CNI 容器网络、Overlay/Underlay 与 Service Mesh 数据面
  2. SSE 与实时通信方案:Server-Sent Events、WebSocket 对比与选型实战
  3. Socket 编程与连接管理深度:状态机、超时、长连接、心跳与连接池