tcpdump + wireshark 是定位接口调用超时等网络层问题最硬核的方式,可直观验证数据包是否发出、响应是否返回及卡在tcp握手、dns解析或http交互哪一环节。

接口调用超时,不能只盯着应用日志或服务响应时间。真正的问题可能藏在网络传输层——比如DNS卡顿、TCP连接慢、三次握手失败、SYN重传、RST异常中断,或者服务端根本没收到请求。Linux 下用 tcpdump + Wireshark 组合,能直接看到“数据包有没有发出去、有没有被回应、卡在哪一步”,是定位这类问题最硬核也最可靠的方式。
确认是否真为网络层问题
先排除常见干扰,避免误判:
- 用
curl -v http://xxx或time curl -s http://xxx测一次,看耗时是否集中在 DNS 解析(* Trying xxx.xxx.xxx.xxx:80...前长时间停顿)或 TCP 连接阶段(* Connected to...前延迟高) - 执行
ss -tuln | grep :80确认目标端口监听正常;ping -c 3 目标IP验证基础连通性 - 检查
/etc/resolv.conf和 DNS 配置,若超时偶发且与域名强相关,大概率是 DNS 轮询超时或上游解析慢(Linux 默认会尝试多个 nameserver,单个失败后等待几秒再试)
用 tcpdump 抓取真实通信过程
在发起调用的客户端机器上抓包,重点捕获目标服务的 IP 和端口:
- 查网卡名:
ip -br a或sudo tcpdump -D,确认业务走的是哪块网卡(如eth0) - 快速抓包(不保存):
sudo tcpdump -i eth0 -n host 10.20.30.40 and port 8080 -A,实时看 ASCII 内容,验证请求是否发出、是否有响应 - 保存完整包(推荐):
sudo tcpdump -i eth0 -n -s 0 -w /tmp/timeout.pcap host 10.20.30.40 and port 8080,-s 0 表示不截断,-n 避免 DNS 查询拖慢抓包 - 如果超时偶发,可加
-C 100 -W 5实现循环滚动抓包(每 100MB 切一个文件,最多存 5 个),防止磁盘写满
用 Wireshark 分析关键时间点
把 .pcap 文件拖进 Wireshark,聚焦三个核心环节:
- TCP 三次握手:看 SYN → SYN-ACK → ACK 是否完整。若只有 SYN 没回包,可能是防火墙拦截、目标未监听、路由不可达;若 SYN 多次重传(间隔 1s/3s/7s…),说明网络路径不通或中间设备丢包
-
HTTP 请求发送时机:过滤
http.request,看 POST/GET 包是否在握手完成后立即发出。若握手完成几秒后才发请求,说明应用层阻塞(如线程池满、DNS 缓存未命中) -
响应缺失或延迟:过滤
http.response或tcp.stream eq X(右键某条流 → Follow → TCP Stream),查看服务端是否返回了 200/5xx,或干脆无任何响应包。若客户端持续重传 FIN/RST,说明连接被异常中断
结合 ss 和时间戳交叉验证
抓包同时,记录系统时间并补充内核视角:
- 执行
date; sudo ss -i src :8080(或对应源端口),看当前连接的 RTT、retrans、rto 等指标。若 retrans > 0,说明已有丢包 - 对比抓包中 SYN 时间戳和
ss输出的timer字段(如timer:(on,156ms,0)),确认内核是否已启动重传定时器 - 若怀疑 DNS,抓包时加
port 53过滤:sudo tcpdump -i eth0 -n port 53 -w dns.pcap,观察查询是否超时、是否收到 NXDOMAIN 或无响应











