Wireshark 生产落地案例
五、生产落地案例
案例一:线上接口偶发超时定位
背景。某业务接口在高峰期有约千分之几的请求超时,客户端日志只显示超时,服务端日志显示请求已正常返回,双方各说各话。授权范围是自有网关与应用服务器之间的内网链路,抓包时间窗限定为业务低峰加一次压测窗口。
怎么做。在网关侧对目标端口抓包,开启环形缓冲防止磁盘写满,过滤条件收紧到应用端口;抓够时间后用 tshark 统计重传与超时相关的异常,把可疑流单独导出分析。
# 关键配置 1:环形缓冲,避免磁盘爆掉
sudo dumpcap -i eth0 -b filesize:102400 -b files:20 \
-f "tcp port 8080" -w /var/tmp/gw.pcapng
# 关键配置 2:只看问题方向,不要全量分析
tshark -r /var/tmp/gw.pcapng -Y 'tcp.analysis.retransmission || tcp.analysis.zero_window' \
-T fields -e frame.time_relative -e ip.src -e ip.dst -e tcp.len | head -50
# 关键配置 3:确认是网关还是应用侧的问题
tshark -r /var/tmp/gw.pcapng -Y 'tcp.flags.reset == 1 and tcp.port == 8080' \
-T fields -e frame.time -e ip.src -e ip.dst
效果。统计显示超时请求集中在少数几条流上,这些流有明显重传且伴随零窗口,说明应用侧处理慢导致接收缓冲被填满,而不是网络丢包。定位到一个慢查询把连接池占满,优化索引后超时率恢复到正常水平。整个过程抓包文件控制在几百 MB 内,分析在本地完成,不需要在生产机上跑图形界面。
坑与解决。一是最初没开环形缓冲,dumpcap 把测试机的磁盘写满导致服务告警,之后所有长抓包都加上 -b filesize 与 -b files。二是交换机端口镜像的带宽不足,镜像口本身的出口带宽小于被测链路,导致抓到的包本身就有丢包,结论完全错误,后来改用主机侧抓包并在报告里注明抓包方式。三是抓包机 CPU 跑满,导致 snaplen 截断,抓到的是残缺包,分析时看到大量畸形报文,最后把抓包与解码分成两台机器,抓包机只负责落盘。
案例二:大包丢包与上传失败排查
背景。某系统上传大文件时偶发失败,小文件正常。怀疑与 MTU 或链路丢包有关。授权范围是自有办公出口与应用服务器之间,时间窗为夜间,明确要求只抓测试账号的流量并做脱敏。
怎么做。分别在客户端与服务器侧同步抓包,用同一个过滤条件把范围压到测试账号的 IP 与端口,抓完后对比两侧的包序列,找出哪些包在客户端发出但服务器没收到,或服务器发出但客户端没收到。
# 客户端侧抓包,限定测试机 IP 与端口
sudo dumpcap -i any -f "host 203.0.113.30 and tcp port 443" \
-b filesize:51200 -b files:5 -w /tmp/client.pcapng
# 服务器侧同步抓包
sudo dumpcap -i eth0 -f "host 198.51.100.7 and tcp port 443" \
-b filesize:51200 -b files:5 -w /tmp/server.pcapng
# 用 tshark 对比两侧是否收到相同的序号段
tshark -r /tmp/client.pcapng -Y 'tcp.len > 0' -T fields -e tcp.seq -e tcp.len | sort > /tmp/c.txt
tshark -r /tmp/server.pcapng -Y 'tcp.len > 0' -T fields -e tcp.seq -e tcp.len | sort > /tmp/s.txt
comm -23 /tmp/c.txt /tmp/s.txt | head
效果。对比发现客户端发出的大包在服务器侧没有对应记录,且这些包的大小接近链路 MTU,属于典型的分片被丢弃或 PMTUD 被阻断问题。调整路径 MTU 相关配置后,大文件上传恢复正常。
坑与解决。一是抓包范围没过滤,抓到了同一网段其他同事的明文表单提交,意识到问题后立即删除文件、改用严格的过滤器重抓,并把「只抓测试账号流量」写进流程文档,抓包文件全部脱敏后再留档。二是在 Docker 容器里抓包失败,容器缺少网络能力,加上 --cap-add=NET_ADMIN 与 --cap-add=NET_RAW 后正常,但最终仍改回宿主机抓包,因为容器里抓到的视角不完整。三是抓包文件没有及时清理,占用了服务器空间,之后固定为抓完即下载、下载后即删除,只在本地保留脱敏后的分析结果。

