3. 协议跟踪工具概览:常见工具(Wireshark, tcpdump, 专用 analyzer 等)
做协议 trace 这么多年,我可以说,工具选对了,问题就解决了一半。别笑,这是真的。
早期我做嵌入式开发时,手头只有串口打印,查一个 UDP 丢包问题查了三天。后来换用 tcpdump + Wireshark,两小时定位到是 MTU 分片导致。从那一刻起我就明白:手上有没有趁手的工具,直接决定你 Debug 的效率。
这一章,我带大家过一遍市面上最常见的协议抓包和分析工具。不是罗列功能清单,而是讲我实际用它们时的痛点和技巧。
3.1 Wireshark——最通用的协议分析瑞士军刀
Wireshark 是我用得最多的工具。坦白讲,它的 GUI 在早期版本里确实有点卡,抓大包时卡到你怀疑人生。但现在好多了。
- 抓包过滤器:我最常用的是
tcp port 80或host 192.168.1.1。建议在抓包阶段就过滤,别等到显示过滤里再处理——节省内存,也省时间。 - 显示过滤器:这是 Wireshark 的强项。比如
tcp.analysis.flags可以快速筛选出重传、乱序、丢包等异常包。 - 着色规则:我一般把 TCP 重传标记成红色,零窗口标记成橙色。一眼扫过去,问题区域就暴露了。
- Follow Stream:追踪 TCP 流这个功能,调 HTTP 协议时非常好用。
3.2 tcpdump——轻量级命令行抓包利器
运维和嵌入式场景里,tcpdump 基本是标配。服务器没 GUI,或者资源有限,用 tcpdump 抓个 pcap 文件回头再分析,这是标准动作。
常用参数我记在脑子里:-i any 抓所有接口,-s 0 抓整包(默认只抓前 68 字节),-w file.pcap 写入文件。加上 -v 可以打印详细信息。
# 抓取 eth0 上端口 5060 的 SIP 包,保存到文件
tcpdump -i eth0 -s 0 -w sip_trace.pcap port 5060
我曾经碰到过一个案例:服务器上能 ping 通但 TCP 连不上。我远程用 tcpdump 抓了一小段包,发现 ICMP 回应正常,但 TCP SYN 没回来。一看包,发现防火墙悄悄把入站 SYN 丢掉了。嗯,这种场景只有 tcpdump 能帮你快速验证。
-s 0 才能抓完整包。否则你做 TCP 重组时,payload 不全,分析结果全是错的。我曾经因为这个多花了半天时间,别走我的老路。
3.3 专用协议分析器——哪里不通点哪里
Wireshark 和 tcpdump 是通用工具。但有些协议场景太特殊,需要专用分析器。
| 工具 | 适用场景 | 我最爱的功能 |
|---|---|---|
| USBPcap | USB 协议分析 | 捕获 USB 控制传输与批量传输 |
| Bluez + btmon | 蓝牙/低功耗蓝牙调试 | HCI 日志 + Air 抓包 |
| SIPp / sngrep | VoIP / SIP 协议 | 信令流实时查看与回放 |
| Ostinato / Scapy | 自定义协议构造与仿真 | 手动构造任意协议字段 |
举个例子,我做蓝牙定位项目时,遇到了手机连不上外设的问题。用 btmon 抓 HCI 日志,发现手机发送了配对请求,但外设回复了错误代码 0x08(PIN 或密钥缺失)。翻出外设代码一看,是密钥管理模块没初始化。这种细节,通用抓包工具根本做不到。
3.4 工具选型原则——我个人的判断标准
说实话,我选工具主要看这三点:
- 环境限制:服务器端、嵌入式端只能用命令行,那就 tcpdump;有桌面的用 Wireshark。
- 协议深度:如果只是看 TCP 会话,Wireshark 足够;如果是蓝牙私有 Profile,必须用专用 analyzer。
- 实时性需求:线上环境不允许装图形界面,就 tee 命令实时输出 tcpdump 到管道,配合脚本做实时报警。
3.5 协议抓包知识体系图谱
下面这张图梳理了本章的知识结构,包含工具分类、应用场景、选型要领。
3.6 我的终极建议
不管用哪个工具,记住三条:
- 先抓对包,再分析。很多人一上来就抓,抓完发现 filter 不对,信息不全,白费功夫。我在项目里遇到过,同事抓了一整天 Wi-Fi 包,结果网卡模式不对,所有管理帧都没抓到。我一问,他没看网卡文档。
- 学会打标记。Wireshark 里可以加
tcp.completeness显示过滤,tcpdump 可以用tcp[tcpflags]按位运算。这些技巧能让你过滤速度快五倍。 - 保存原始 pcap。别只截图,截图只留了表象。原始包才是证据。我曾经用一个 pcap 文件二次分析出了协议栈的 bug,全靠原始数据。
tcp.analysis.flags,观察哪些包有重传。然后对比 tcpdump 命令 tcpdump -i lo -w test.pcap 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0',感受两个工具的处理风格差异。