“网络又超时了"“接口偶发卡顿"“跨机房不通”——网络问题最让人头疼的是看不见摸不着。但网络故障有迹可循:只要按分层方法论逐层排查,用好 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 通但服务不可用"“大包超时小包正常"“跨机房偶发超时"这类问题不再让你抓瞎,你就真正掌握了网络排障的主动权。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。