Computer NetworkNotes

第 26 章:网络故障排查手册

zjc 于 2026-01-26 发布

这是《计算机网络 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 网络故障排查的原则与数据库和系统排查相同:先确认影响面,再保存现场,沿路径分层定位,优先止血,事后复盘。本章把 DNS、TCP、TLS、HTTP、LB、云网络、MTU、丢包和带宽问题整理成可执行手册。

26.1 通用流程

1. 确认影响范围:用户、地域、运营商、接口、实例
2. 确认时间线:开始时间、变更、峰值、恢复时间
3. 分层定位:DNS、TCP、TLS、HTTP、应用
4. 保存现场:curl、mtr、ss、tcpdump、日志
5. 止血:切流、限流、扩容、回滚、降级
6. 恢复验证:成功率、P99、连接、错误码
7. 根因分析
8. 固化监控和预案

先问影响面:

现象 优先怀疑
只有某个用户不通 客户端本地网络
某地区不通 运营商、DNS、CDN
某服务不通 LB、安全组、进程
某实例不通 实例路由、网卡、监听
全站不通 入口 DNS、LB、专线
偶发超时 丢包、重传、队列、容量

26.2 快速命令集

基础连通:

ping <target>
mtr -rw -c 100 <target>
traceroute -T -p 443 <target>
curl -v --connect-timeout 3 https://<target>

本地网络:

ip -brief addr
ip route
ip rule
ip neigh
ss -ntp

接口与丢包:

ip -s link
ethtool -S eth0
cat /proc/net/softnet_stat

DNS:

dig <domain>
dig @8.8.8.8 <domain>
dig +trace <domain>

证书:

openssl s_client -connect <host>:443 -servername <host>

耗时拆解:

curl -o /dev/null -s -w \
  'dns:%{time_namelookup} connect:%{time_connect} tls:%{time_appconnect} ttfb:%{time_starttransfer} total:%{time_total}\n' \
  https://<target>

26.3 场景一:域名解析失败

现象:

could not resolve host
NXDOMAIN
SERVFAIL

排查:

cat /etc/resolv.conf
dig @127.0.0.53 <domain>
dig @8.8.8.8 <domain>
dig @<authoritative-dns> <domain>

判断:

  1. 本机 resolver 异常;
  2. 公共 DNS 正常,运营商异常;
  3. 权威异常;
  4. 域名过期;
  5. NS 委托错误;
  6. AAAA 返回但 IPv6 不可用。

止血:

  1. 切换 resolver;
  2. 临时 hosts;
  3. 切换备用域名;
  4. 多 CDN 或多入口切流;
  5. 恢复权威记录。

26.4 场景二:TCP 连接失败

现象:

Connection refused
Connection timed out
No route to host

排查:

ss -lntp
nc -vz <host> <port>
traceroute -T -p <port> <host>
tcpdump -i any host <host> and port <port> -nn

区分:

报错 常见含义
Connection refused 可达但端口未监听或被拒绝
Connection timed out 包被丢弃、路由错误、防火墙丢包
No route to host 本机或中间路由不可达
Network unreachable 无默认路由或错误接口

检查:

  1. 服务监听 0.0.0.0 还是 127.0.0.1
  2. 安全组;
  3. NACL;
  4. 系统防火墙;
  5. 路由表;
  6. 后端健康状态;
  7. 监听队列;
  8. conntrack 表。

26.5 场景三:TLS 握手失败

现象:

certificate verify failed
SSL handshake failed
protocol version

排查:

openssl s_client -connect <host>:443 -servername <host>
curl -v https://<host>

常见原因:

  1. 证书过期;
  2. 缺中间证书;
  3. SAN 不匹配;
  4. SNI 未配置;
  5. TLS 版本不兼容;
  6. Cipher Suite 不匹配;
  7. 客户端信任库过旧;
  8. LB 证书配置错误。

止血:

  1. 更新证书链;
  2. 回滚证书变更;
  3. 切换备用入口;
  4. 客户端紧急更新信任库;
  5. 临时兼容旧协议需安全评审。

26.6 场景四:请求超时或 P99 毛刺

先拆耗时:

DNS
TCP connect
TLS
first byte
content transfer

可能原因:

  1. DNS 慢;
  2. 高 RTT;
  3. 丢包重传;
  4. 带宽打满;
  5. LB 队列;
  6. 后端线程池满;
  7. 数据库慢;
  8. GC 停顿;
  9. 重试风暴;
  10. 单机故障。

排查:

curl -w ...
mtr -rw -c 100 <target>
ss -i
netstat -s | grep -i retrans

结合应用指标判断:

  1. 如果 DNS 阶段高,查 resolver;
  2. 如果 connect 高,查网络和队列;
  3. 如果 TLS 高,查握手和证书;
  4. 如果 TTFB 高,查服务处理;
  5. 如果 transfer 高,查响应体和带宽。

26.7 场景五:丢包

定位:

mtr -rw -c 200 <target>
ping -c 100 <target>
ip -s link
ethtool -S eth0

常见原因:

  1. 链路质量;
  2. 带宽拥塞;
  3. 队列丢弃;
  4. 云性能限流;
  5. 安全策略丢包;
  6. conntrack 满;
  7. 网卡缓冲不足;
  8. 单路径 ECMP 异常。

处理:

  1. 切换链路或入口;
  2. 限流大流量任务;
  3. 扩容带宽;
  4. 调整队列和缓冲;
  5. 修复 conntrack;
  6. 联系云厂商;
  7. 客户端重试和降级。

26.8 场景六:MTU 黑洞

现象:

  1. ping 小包通;
  2. TCP 握手成功;
  3. 大请求或大响应卡住;
  4. TLS 握手停在证书阶段;
  5. VPN、overlay、专线环境明显。

排查:

ping -M do -s 1472 <target>
tracepath <target>
tcpdump -i any 'icmp[icmptype] == 3 and icmp[icmpcode] == 4' -nn

处理:

  1. 放行 PMTUD ICMP;
  2. 统一 MTU;
  3. 配置 MSS Clamp;
  4. 调整 overlay 封装开销;
  5. 评估 TCP MTU probing。

26.9 场景七:负载均衡异常

现象:

  1. 502 / 503 / 504;
  2. 部分后端不可用;
  3. 流量倾斜;
  4. 发布期间错误率上升。

排查:

LB 访问日志
后端访问日志
健康检查状态
后端监听
安全组
upstream connect time
upstream response time

处理:

  1. 摘除故障后端;
  2. 修复健康接口;
  3. 回滚发布;
  4. 扩容;
  5. 调整超时;
  6. 关闭放大重试;
  7. 恢复 draining。

26.10 场景八:NAT 或 conntrack 异常

现象:

  1. 外呼偶发失败;
  2. 新建连接失败;
  3. 宿主机高并发容器受影响;
  4. 日志 conntrack full;
  5. NAT 网关连接数高。

排查:

cat /proc/sys/net/netfilter/nf_conntrack_count
cat /proc/sys/net/netfilter/nf_conntrack_max
conntrack -L | grep <ip>

处理:

  1. 长连接复用;
  2. 降低重试频率;
  3. 增大 conntrack;
  4. 缩短超时;
  5. 拆分 NAT 网关;
  6. 分布实例;
  7. 优化安全组规则。

26.11 场景九:带宽打满

现象:

  1. 丢包重传;
  2. 延迟升高;
  3. 小请求受大文件影响;
  4. 备份窗口集中。

排查:

iftop
nethogs
tc -s qdisc show dev eth0

云监控看:

  1. 入口带宽;
  2. 出口带宽;
  3. NAT 网关带宽;
  4. 包量;
  5. LB 带宽;
  6. CDN 回源。

处理:

  1. 限速备份;
  2. 错峰任务;
  3. 扩容带宽;
  4. CDN 静态化;
  5. 压缩响应;
  6. 隔离流量;
  7. 切流备用链路。

26.12 事故报告模板

标题:
时间:
影响:
发现方式:
时间线:
现象证据:
排查路径:
根因:
触发条件:
止血动作:
恢复验证:
为什么没有提前发现:
改进项:
负责人:
截止时间:

改进项必须具体,例如“外呼客户端统一启用连接池并将最大空闲时间设置为 LB 超时的 80%”,而不是“加强网络意识”。

本章小结

网络故障排查要先确认影响面和时间线,再按 DNS、路由、TCP、TLS、HTTP、LB、云网络和应用逐层定位。常用证据包括 ipssmtrdigcurlopenssltcpdump、LB 日志和 VPC Flow Log。常见故障包括解析失败、连接失败、证书错误、丢包、MTU 黑洞、NAT 端口耗尽、conntrack 满、带宽打满和发布 draining 不当。

思考题

  1. 为什么偶发超时要先拆分 curl 各阶段耗时?
  2. Connection refused 和 timed out 有什么区别?
  3. 如何证明问题发生在客户端、网络还是服务端?
  4. MTU 黑洞的典型证据是什么?
  5. 为一次线上外呼偶发失败写排查流程和监控指标。