tcpdump抓HTTP流量可快速定位卡点:用-i any -nn -A -s 0配合端口或GET十六进制过滤,结合[S]/[S.]/GET/HTTP响应等标志位与时间戳,精准识别连不上、握手慢、请求未发、服务无响应等环节。

直接用 tcpdump 抓 HTTP 流量,结合关键参数和过滤条件,能快速定位请求卡在哪一环——是连不上、卡在握手、发不出请求,还是服务端没响应。
先确认抓包位置和基础参数
服务器上有多块网卡时,不指定接口容易漏掉真实流量。执行 ip link 或 tcpdump -D 查看可用网卡,常用选项组合是:
- -i any:监听所有网卡,适合不确定流量路径的场景
- -nn:禁用 IP 和端口解析,避免 DNS 卡顿,也防止 8080/443 都显示成 http/https
- -c 100:限制抓 100 个包后自动退出,防误操作占满资源
- -s 0:捕获完整数据包,避免截断导致看不到 HTTP body
聚焦 HTTP 流量的常用命令
排查异常,优先抓取可读内容,而不是原始二进制:
- 抓全部 HTTP 请求和响应(端口 80):
sudo tcpdump -i any -nn -A -s 0 'tcp port 80' - 只看 GET 请求(精准匹配):
sudo tcpdump -i any -nn -A -s 0 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420' - 抓特定服务(比如后端 API 端口 8080):
sudo tcpdump -i any -nn -A -s 0 port 8080
加 -A 后,终端里能看到明文的 GET /api/user HTTP/1.1 和 HTTP/1.1 502 Bad Gateway,不用导出也能快速判断是客户端没发出去、服务端拒绝了,还是响应体为空。
从时间线判断异常类型
抓包输出每行开头是时间戳,配合 TCP 标志位,能分清问题阶段:
- 只有 [S] 没有 [S.]:SYN 发出去了,但没收到 SYN-ACK → 网络不通、防火墙拦截、目标服务未监听
- 有三次握手,但没看到 GET:连接建好了,但应用层没发请求 → 客户端逻辑卡住、负载均衡转发失败、TLS 握手阻塞(HTTPS 场景需抓 443)
- 看到 GET,但没对应 HTTP/1.1 200 或 5xx:请求到了,服务端处理超时或崩溃 → 查服务日志,同时关注后续是否出现 RST 或 FIN
- 大量重复 [P.] 或 [.] + 很长间隔:可能丢包重传,或服务端写响应太慢,ACK 延迟高
保存为文件供深度分析
线上问题常需多人协同或复现验证,建议存成 pcap 文件:
- 保存命令:
sudo tcpdump -i any -nn -s 0 -w http.pcap 'tcp port 80' - 之后用 Wireshark 打开,用 Follow → TCP Stream 查看完整请求响应流
- 用 Wireshark 的 Statistics → TCP Stream Graph 查 RTT 波动,或 IO Graph 看流量突增/中断点
不复杂但容易忽略


















