用户访问接口 突然变慢
API 请求 偶尔超时
服务之间 调用失败
Kubernetes Pod 偶发连接断开
很多工程师的排查方式是:
pingcurl
如果不行就开始 重启服务、怀疑网络、怀疑人生。但真正成熟的排查方式是:
从应用层 → 一直向下排查到网卡层。
因为绝大多数问题 最先表现为应用异常。
这篇文章会给你一套完整方法:
从第7层 → 第1层逐层定位问题,同时配套 Linux 工具全景图。
工程师最实用的网络排查视角:
+-----------------------------+| 7 应用层 HTTP / DNS | curl httpie dig+-----------------------------+| 6 表示层 TLS / SSL | openssl s_client+-----------------------------+| 5 会话层 Session / TCP | ss netstat+-----------------------------+| 4 传输层 TCP / UDP | ss tcpdump+-----------------------------+| 3 网络层 IP / Routing | ip traceroute mtr+-----------------------------+| 2 数据链路 ARP / MAC | arp tcpdump+-----------------------------+| 1 物理层 NIC / 带宽 | ethtool iftop+-----------------------------+
排查原则:从应用层往下,一层层验证。
因为:
如果 HTTP 都不通说明问题可能在 任意一层
但如果 TCP 都不通说明问题一定在 更底层
这是 绝大多数问题的入口层。
典型问题:
API 请求慢
HTTP 返回 500
DNS 解析失败
常用工具:
测试接口:
curl -v https://example.com输出:> GET / HTTP/1.1> Host: example.com< HTTP/1.1 200 OK
-v 可以看到:DNS 解析
TCP 连接
TLS 握手
HTTP 请求
如果请求慢,可以使用:
curl -o /dev/null -s -w "DNS: %{time_namelookup}sTCP: %{time_connect}sTLS: %{time_appconnect}sTTFB: %{time_starttransfer}sTOTAL: %{time_total}s" http://example.com
示例输出:DNS: 0.017310sTCP: 0.046498sTLS: 0.168062sTTFB: 0.211482sTOTAL: 0.211935s
可以定位:DNS 慢
TCP 慢
服务慢
DNS问题非常常见。
查询解析:
dig example.com输出:ANSWER SECTION:example.com 300 IN A 142.250.72.14
如果 DNS 异常:
connection timed out说明:DNS server 不可达
或网络问题
很多线上问题其实是:
TLS 握手失败
例如:
HTTPS 无法连接
Java SSLHandshakeException
Linux 最好用的工具:
opensslopenssl s_client -connect example.com:443输出:SSL handshake has read 3123 bytesVerify return code: 0 (ok)
如果失败:handshake failure可能原因:TLS 版本不兼容
证书错误
cipher 不支持
这一层关注:
TCP 连接生命周期
常见问题:
连接泄漏
keepalive 异常
连接过多
核心工具:
ssss -ant示例:ESTABSYN-SENTTIME-WAIT
统计:ss -s输出:TCP:estab 120timewait 300
如果:TIME_WAIT非常多说明:
短连接过多
连接复用不合理
这一层关注:
端口与连接
典型问题:
服务没监听
端口被占用
SYN backlog 满
查看监听端口:
ss -lntp输出:LISTEN 0 128 0.0.0.0:8080含义:服务监听 8080如果端口不存在:说明:应用根本没启动
这一层负责:
IP 地址
路由
跨网段通信
常见问题:
路由错误
NAT 问题
网络不通
ip addr示例:inet 192.168.1.10/24ip route输出:default via 192.168.1.1 dev eth0如果没有 default route:所有外网都不通。查看网络路径:
traceroute example.com输出:1 192.168.1.12 10.1.0.13 72.14.233.1
可以看到:哪一跳延迟或丢包。
mtr是traceroute+ping的结合。
mtr example.com输出:Host Loss% Avgrouter 0% 1.2msisp-node 5% 20ms
局域网通信依赖:
ARP表
常见问题:
ARP 冲突
MAC 改变
虚拟网络错误
查看 ARP:
arp -n或:ip neigh示例:192.168.1.1 dev eth0 lladdr 00:11:22:33:44:55如果出现:INCOMPLETEFAILED
说明:ARP 解析失败。
tcpdump -i eth0 arp示例:Who has 192.168.1.1? Tell 192.168.1.10可以发现:ARP 风暴
ARP 欺骗
最底层的问题:
网卡故障
带宽打满
duplex mismatch
使用 ethtool:
ethtool eth0输出:Speed: 1000Mb/sDuplex: FullLink detected: yes
关键指标:使用iftop:
sudo iftop显示实时流量:10.0.0.1 => 10.0.0.2 200Mb可以快速发现:哪个IP占满带宽
是否有异常流量
如果前面工具都没找到问题:
一定要抓包。
抓HTTP:
tcpdump -i eth0 port 80抓TCP SYN:tcpdump 'tcp[tcpflags] & tcp-syn != 0'抓DNS:tcpdump port 53tcpdump的核心作用:看到真实的网络包。
只要包在网络中存在:
tcpdump就能看到。
真实线上问题排查流程:
1 应用层curl2 TLSopenssl3 会话层ss4 传输层ss -lnt5 网络层ip routetraceroute6 链路层arp7 物理层ethtooliftop
如果还找不到:tcpdumpLinux 网络排查的核心思想:
从应用层一路向下,直到网卡。
完整工具链:
应用层 curl dig表示层 openssl会话层 ss传输层 ss网络层 ip traceroute mtr链路层 arp物理层 ethtool iftop抓包 tcpdump
真正的工程师调试网络时会记住一句话:网络没有玄学,只有没抓到的包。