3. 抓包工具概览:tcpdump、Wireshark、Charles、Fiddler
做网络抓包这么多年,我常被问到同一个问题:“这么多工具,我到底该学哪个?”其实答案很简单——没有最好的工具,只有最合适的场景。这章我就把最常用的四把“刀”给你掰开揉碎讲清楚。
3.1 抓包工具的分类与定位
先看一张总览图,帮你建立整体认知:
这张图想表达什么?tcpdump 和 Wireshark 是“原生抓包兄弟”,一个命令行一个图形;Charles 和 Fiddler 则是“代理双雄”,专门处理应用层流量。下面我一个个讲。
3.2 工具速览对比
先看个对比表格,心里有个底:
| 工具 | 平台 | 界面 | 核心能力 | 我最常用的场景 |
|---|---|---|---|---|
| tcpdump | Linux / macOS / 嵌入式 | 命令行 | 原始包捕获、表达式过滤、写入pcap | 服务器排查、无图形环境抓包 |
| Wireshark | 全平台 | 图形化 | 细致协议解析、流追踪、统计图表 | 协议分析、问题定位、教学演示 |
| Charles | Windows / macOS | 图形化 | HTTP/HTTPS代理、断点、重放、Map Local | 移动端抓包、接口调试、Mock数据 |
| Fiddler | Windows(有mac版但弱) | 图形化 | HTTP/HTTPS代理、AutoResponder、Composer | Windows平台前端/后端联调 |
3.3 tcpdump——命令行的瑞士军刀
说实话,我入行头两年一直觉得 tcpdump 又难记又难用。直到有一次线上故障,服务器连 SSH 都卡住了,Xshell 都连不上——那时候除了 tcpdump 我别无选择。嗯,从那以后我老老实实背下了几条核心命令。
# 抓取 eth0 上所有流量,保存到文件
tcpdump -i eth0 -w dump.pcap
# 只抓取目标端口 80 的包
tcpdump -i eth0 dst port 80
# 抓取特定主机和特定协议并打印可读内容(不解析 DNS)
tcpdump -i eth0 host 192.168.1.100 and tcp -nn
# 抓取并实时显示十六进制内容(排查应用层报文)
tcpdump -i eth0 -X -s 0 port 443
-c 或 -W 轮转文件。记住,生产环境抓包一定要加抓包数量限制或文件大小限制,不然你会后悔的。
3.4 Wireshark——图形化抓包王者
Wireshark 就像是一把手术刀,能把网络包解剖得清清楚楚。它的过滤器语法和 tcpdump 基本一致,但多了很多可视化功能。
我个人觉得最有用的三个功能:
- 显示过滤器:比如
http.request.method == "POST"能立刻筛出所有 POST 请求。 - Follow TCP Stream:右键一个 TCP 包,选“Follow Stream”,就能看到完整的请求响应内容。我排查接口报错时必用。
- 专家分析:它会自动标记重传、乱序、异常包——很多隐藏问题一眼就能发现。
有次我排查一个数据库连接超时问题,用 Wireshark 抓到三次握手后客户端发了个 RST,再一看是客户端发的——原来代码里连接池用完没释放。这种事用日志根本看不出来,但 Wireshark 一清二楚。
3.5 Charles 与 Fiddler——代理双雄
这两兄弟的定位非常相似:都是给 HTTP/HTTPS 做中间人代理。但细节上各有侧重。
| 功能点 | Charles | Fiddler |
|---|---|---|
| 证书安装 | 自动提示,一键信任 | 需要手动安装到受信任根证书 |
| 移动端抓包 | 非常方便,支持 iOS/Android 代理+证书 | 同样支持,但 Windows 上需要配置 |
| 断点修改 | Breakpoints 更直观,可改 request/response | AutoResponder + FiddlerScript 更灵活 |
| 重放请求 | Repeat / Advanced Repeat 支持迭代 | Composer 可以手动编辑再发送 |
| Map Local / Remote | Map Local 直接替换本地文件 | AutoResponder 匹配规则更丰富 |
我个人在 Mac 上一直用 Charles,Windows 上用 Fiddler。为什么?没什么特别原因,习惯而已。但有一个点值得说:Charles 的 SSL 代理配置比 Fiddler 顺手,尤其对 iOS 抓包。
3.6 场景化选择建议
你想想看,遇到下面这几种情况,你会怎么选?
- 场景一:线上服务器网络延迟高,但只有 SSH 能连。——答案:tcpdump 抓包导出 pcap,本地 Wireshark 分析。
- 场景二:App 接口返回 500,但要改请求参数调试。——答案:Charles 或 Fiddler 的断点功能。
- 场景三:公司内部协议乱码,需要逐字节分析。——答案:Wireshark 的 Follow TCP Stream + 十六进制视图。
- 场景四:Windows 下调试前端 WebSocket 通讯。——答案:Fiddler 的 WebSocket 支持更完善。
3.7 避坑合集(我的血泪史)
最后分享几个我亲手踩过的坑,权当给你排雷。
-i lo 还怀疑了半天。另外 -s0 抓满包长,少写这个会导致包被截断。Wireshark 坑:显示过滤器写错不会报错,只是“不显示任何包”。我曾经以为抓包抓错了,折腾了一小时发现 filter 写了个不存在的协议。
Charles 坑:SSL 代理开启后,如果目标站点使用 HSTS 或证书固定(pinning),就会直接连不上。解决方法是关闭 Charles 的 SSL 代理,或者用 VirtualHost 绕过去。
Fiddler 坑:Windows 下开着 Fiddler 时,很多系统服务(如 Windows Update)走代理会死。记得在 Fiddler 里设置“只捕获浏览器和 .NET 应用”,不然机器越用越慢。
好了,这四种工具的基本面我说完了。实际项目中你会反复用到它们,养成多抓多看的习惯——慢慢的,你看到抓包结果就知道问题出在哪。