这是《计算机网络 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 网络故障排查的原则与数据库和系统排查相同:先确认影响面,再保存现场,沿路径分层定位,优先止血,事后复盘。本章把 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>
判断:
- 本机 resolver 异常;
- 公共 DNS 正常,运营商异常;
- 权威异常;
- 域名过期;
- NS 委托错误;
- AAAA 返回但 IPv6 不可用。
止血:
- 切换 resolver;
- 临时 hosts;
- 切换备用域名;
- 多 CDN 或多入口切流;
- 恢复权威记录。
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 | 无默认路由或错误接口 |
检查:
- 服务监听
0.0.0.0还是127.0.0.1; - 安全组;
- NACL;
- 系统防火墙;
- 路由表;
- 后端健康状态;
- 监听队列;
- conntrack 表。
26.5 场景三:TLS 握手失败
现象:
certificate verify failed
SSL handshake failed
protocol version
排查:
openssl s_client -connect <host>:443 -servername <host>
curl -v https://<host>
常见原因:
- 证书过期;
- 缺中间证书;
- SAN 不匹配;
- SNI 未配置;
- TLS 版本不兼容;
- Cipher Suite 不匹配;
- 客户端信任库过旧;
- LB 证书配置错误。
止血:
- 更新证书链;
- 回滚证书变更;
- 切换备用入口;
- 客户端紧急更新信任库;
- 临时兼容旧协议需安全评审。
26.6 场景四:请求超时或 P99 毛刺
先拆耗时:
DNS
TCP connect
TLS
first byte
content transfer
可能原因:
- DNS 慢;
- 高 RTT;
- 丢包重传;
- 带宽打满;
- LB 队列;
- 后端线程池满;
- 数据库慢;
- GC 停顿;
- 重试风暴;
- 单机故障。
排查:
curl -w ...
mtr -rw -c 100 <target>
ss -i
netstat -s | grep -i retrans
结合应用指标判断:
- 如果 DNS 阶段高,查 resolver;
- 如果 connect 高,查网络和队列;
- 如果 TLS 高,查握手和证书;
- 如果 TTFB 高,查服务处理;
- 如果 transfer 高,查响应体和带宽。
26.7 场景五:丢包
定位:
mtr -rw -c 200 <target>
ping -c 100 <target>
ip -s link
ethtool -S eth0
常见原因:
- 链路质量;
- 带宽拥塞;
- 队列丢弃;
- 云性能限流;
- 安全策略丢包;
- conntrack 满;
- 网卡缓冲不足;
- 单路径 ECMP 异常。
处理:
- 切换链路或入口;
- 限流大流量任务;
- 扩容带宽;
- 调整队列和缓冲;
- 修复 conntrack;
- 联系云厂商;
- 客户端重试和降级。
26.8 场景六:MTU 黑洞
现象:
- ping 小包通;
- TCP 握手成功;
- 大请求或大响应卡住;
- TLS 握手停在证书阶段;
- VPN、overlay、专线环境明显。
排查:
ping -M do -s 1472 <target>
tracepath <target>
tcpdump -i any 'icmp[icmptype] == 3 and icmp[icmpcode] == 4' -nn
处理:
- 放行 PMTUD ICMP;
- 统一 MTU;
- 配置 MSS Clamp;
- 调整 overlay 封装开销;
- 评估 TCP MTU probing。
26.9 场景七:负载均衡异常
现象:
- 502 / 503 / 504;
- 部分后端不可用;
- 流量倾斜;
- 发布期间错误率上升。
排查:
LB 访问日志
后端访问日志
健康检查状态
后端监听
安全组
upstream connect time
upstream response time
处理:
- 摘除故障后端;
- 修复健康接口;
- 回滚发布;
- 扩容;
- 调整超时;
- 关闭放大重试;
- 恢复 draining。
26.10 场景八:NAT 或 conntrack 异常
现象:
- 外呼偶发失败;
- 新建连接失败;
- 宿主机高并发容器受影响;
- 日志 conntrack full;
- NAT 网关连接数高。
排查:
cat /proc/sys/net/netfilter/nf_conntrack_count
cat /proc/sys/net/netfilter/nf_conntrack_max
conntrack -L | grep <ip>
处理:
- 长连接复用;
- 降低重试频率;
- 增大 conntrack;
- 缩短超时;
- 拆分 NAT 网关;
- 分布实例;
- 优化安全组规则。
26.11 场景九:带宽打满
现象:
- 丢包重传;
- 延迟升高;
- 小请求受大文件影响;
- 备份窗口集中。
排查:
iftop
nethogs
tc -s qdisc show dev eth0
云监控看:
- 入口带宽;
- 出口带宽;
- NAT 网关带宽;
- 包量;
- LB 带宽;
- CDN 回源。
处理:
- 限速备份;
- 错峰任务;
- 扩容带宽;
- CDN 静态化;
- 压缩响应;
- 隔离流量;
- 切流备用链路。
26.12 事故报告模板
标题:
时间:
影响:
发现方式:
时间线:
现象证据:
排查路径:
根因:
触发条件:
止血动作:
恢复验证:
为什么没有提前发现:
改进项:
负责人:
截止时间:
改进项必须具体,例如“外呼客户端统一启用连接池并将最大空闲时间设置为 LB 超时的 80%”,而不是“加强网络意识”。
本章小结
网络故障排查要先确认影响面和时间线,再按 DNS、路由、TCP、TLS、HTTP、LB、云网络和应用逐层定位。常用证据包括 ip、ss、mtr、dig、curl、openssl、tcpdump、LB 日志和 VPC Flow Log。常见故障包括解析失败、连接失败、证书错误、丢包、MTU 黑洞、NAT 端口耗尽、conntrack 满、带宽打满和发布 draining 不当。
思考题
- 为什么偶发超时要先拆分 curl 各阶段耗时?
- Connection refused 和 timed out 有什么区别?
- 如何证明问题发生在客户端、网络还是服务端?
- MTU 黑洞的典型证据是什么?
- 为一次线上外呼偶发失败写排查流程和监控指标。