最近这一个月,我被一个破事儿折腾得够呛,搞得我不得不把压箱底的封包工具又翻出来重新用了一遍,不然这黑锅我背得冤枉。这个事儿就是我帮一个老客户对接一个新兴的物联网云服务接口,他们用的是那种很小众的私有协议,外面套着一层定制的TLS,看上去牛气哄哄的,但用起来简直就是噩梦。
我按照文档一步步走,我的后端程序给他们发数据,他们那边偶尔能接收到,偶尔就抽风,返回一个莫名其妙的超时错误,或者干脆静默了。客户那边急得火上房,我这边也是抓耳挠腮。我调试了所有代码,确认请求格式、证书、加密参数都没问题。但那边的技术支持死活不认账,就一口咬定是我这边网络环境不稳定,或者说是我发送的数据包结构有问题。

解决扯皮:我如何开始抓包实践
我这人脾气有点倔,你不信我的代码,那咱们就上证据。说干就干,我决定把数据从我的电脑刚出去的那一刻到他们服务器的回应,全都扒下来看个底朝天。
我第一个想到的自然是 Fiddler。这玩意儿对付 HTTP/HTTPS 协议简直是手到擒来,简单得像呼吸一样。我赶紧启动 Fiddler,设置好代理,跑了一遍测试。很快我就抓到了一些 HTTPS 的请求和响应。Fiddler 的好处就是能把那些加密的数据解密给我看,清清楚楚的 JSON 格式。但是,这回遇到的问题偏偏是发生在更底层,当服务开始使用他们自己定制的协议通信时,Fiddler 就不行了,它只能看到一个加密的连接建立了,但里面传输的那些私有数据包,Fiddler 压根儿看不懂,也不负责看。我的需求是查看每一个 TCP 帧里,数据载荷到底长什么样,连接是怎么被断开的。

用 Fiddler 跑了一圈,发现它只能解决表层问题,治标不治本。我心想得,还是得请出那位老大哥。
请出专业选手:深入挖掘Wireshark
我马上就把 Wireshark 装了起来。这才是真正的抓包神器,不管你是TCP还是UDP,不管你是应用层还是数据链路层,它都能给你扒得干干净净。我以前用它都是做一些简单的过滤,但这回要抓的包量巨大,而且目标流量混在一大堆乱七八糟的系统流量里,不加点功夫根本找不着。

我的实践步骤是这样的:
- 我先确定了目标服务器的 IP 地址和端口号,这是抓包过滤的关键。
- 我设置了一个非常精确的捕获过滤器,只抓取源IP或目标IP是对方服务器,并且端口是特定端口的流量。这样能大大减少要处理的数据量。
- 我让我的程序跑了十次失败的请求。Wireshark 那边就开始疯狂地记录数据包。
- 捕获停止后,我花了差不多三个小时在 Wireshark 里进行分析。Wireshark 的强大就在于它的显示过滤器,我可以根据各种条件筛选。我主要关注连接建立(SYN)和连接断开(FIN/RST)的序列。
结果让我目瞪口呆。我发现我的程序发送数据包很正常,但对方服务器在发送了不到一半的应答数据后,会突然发送一个 TCP Reset 包(RST),直接粗暴地把连接给断了!这个 R S T 包根本就没有带任何应用层错误信息,完全是底层网络栈的异常表现。这就是为什么我的程序一直报超时或者连接中断,而不是协议错误。这明摆着是他们服务器的某个中间件或者负载均衡器配置有问题,一遇到特定大小或者特定内容的包就崩了。
有了 Wireshark 导出的 pcap 文件作为铁证,我直接扔给了他们的技术支持。这下他们没法再跟我扯皮了,老老实实回去排查服务器问题去了。果然,第二天他们就回复说,是他们的一个网络安全组件配置出了岔子,导致连接被非法重置。
小环境抓包利器:轻量级Tcpdump的加入
虽然 Wireshark 解决了大问题,但有时候我不需要这么复杂的图形界面,特别是在生产环境的 Linux 服务器上。总不能在客户的服务器上装个 Wireshark 跑图形界面?太重了。
我要推荐的第三个工具就是 Tcpdump。这东西小巧轻便,命令行操作,简直是运维人员和开发人员在服务器上快速定位问题的福音。
我的实践经验告诉我,很多时候服务器上的问题,你只需要确认数据包有没有到达,或者返回的包对不对。用 Tcpdump 配合各种过滤参数,比如只抓取某个端口或者某个IP的数据,然后把抓到的包存成文件,再用 Wireshark 导回本地电脑慢慢分析,效率最高。
- 比如我在生产服务器上发现网络延迟高,就用 Tcpdump 抓几秒钟的包,快速看看有没有大量的重传或者异常的 ICMP 消息。
- 如果我怀疑我的程序在服务器上发的包结构不对,我可以在服务器端用 Tcpdump 抓取出去的包,然后导出来,用 Wireshark 进去细看数据帧的内容。
这三个工具一组合:Fiddler 搞定日常的 HTTPS 调试;Wireshark 专治各种疑难杂症和底层协议分析;Tcpdump 负责服务器环境和快速定位。我这一个月的折腾,虽然累,但值了。至少以后再遇到这种互相推诿的破事儿,我能用数据说话,谁也别想给我甩锅!
总结一下我的经验:封包工具没有绝对的好坏,只有适用不适用。如果你只是做个简单的网页调试,Fiddler 够了;如果你要看透底层的 TCP、UDP 或者各种私有协议,那 Wireshark 是你唯一的选择;如果你经常需要在服务器上快速定位,那 Tcpdump 必须掌握。

