3. 抓包工具概览:tcpdump、Wireshark、Charles、Fiddler

做网络抓包这么多年,我常被问到同一个问题:“这么多工具,我到底该学哪个?”其实答案很简单——没有最好的工具,只有最合适的场景。这章我就把最常用的四把“刀”给你掰开揉碎讲清楚。

3.1 抓包工具的分类与定位

先看一张总览图,帮你建立整体认知:

抓包工具全家桶 tcpdump 命令行 | Linux/Unix Wireshark 图形化 | 全平台 Charles HTTP/HTTPS代理 | Mac/Win Fiddler HTTP/HTTPS代理 | Windows 代理抓包工具 中间人、重放、断点 ⬆ 命令行基础 + 图形化分析 适用于网络层/传输层抓包 ⬆ HTTP/HTTPS 代理工具 适用于应用层调试、移动端抓包

这张图想表达什么?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平台前端/后端联调
我的小建议: 如果你主要在服务器上工作,优先深挖 tcpdump + Wireshark 组合;如果你是前端或移动端开发,Charles / Fiddler 更顺手。放心,两者并不冲突——我经常在服务器上用 tcpdump 抓完包,扔到 Wireshark 里慢慢分析。

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
避坑指南: 我曾经在生产服务器上直接 tcpdump 跑了几分钟,结果磁盘写满了——因为没指定 -c 或 -W 轮转文件。记住,生产环境抓包一定要加抓包数量限制或文件大小限制,不然你会后悔的。

3.4 Wireshark——图形化抓包王者

Wireshark 就像是一把手术刀,能把网络包解剖得清清楚楚。它的过滤器语法和 tcpdump 基本一致,但多了很多可视化功能。

我个人觉得最有用的三个功能:

  1. 显示过滤器:比如 http.request.method == "POST" 能立刻筛出所有 POST 请求。
  2. Follow TCP Stream:右键一个 TCP 包,选“Follow Stream”,就能看到完整的请求响应内容。我排查接口报错时必用。
  3. 专家分析:它会自动标记重传、乱序、异常包——很多隐藏问题一眼就能发现。

有次我排查一个数据库连接超时问题,用 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 抓包。

注意: 抓 HTTPS 包时,必须安装根证书并信任。我在教新人时常遇到一个问题:装完证书还是抓不到——多半是因为 代理服务器 IP 配错了,或者手机/电脑走的是 VPN 而不是代理。排查思路:先抓一个简单的 HTTP 网站(比如 http://example.com),确认代理连通。

3.6 场景化选择建议

你想想看,遇到下面这几种情况,你会怎么选?

  • 场景一:线上服务器网络延迟高,但只有 SSH 能连。——答案:tcpdump 抓包导出 pcap,本地 Wireshark 分析。
  • 场景二:App 接口返回 500,但要改请求参数调试。——答案:Charles 或 Fiddler 的断点功能。
  • 场景三:公司内部协议乱码,需要逐字节分析。——答案:Wireshark 的 Follow TCP Stream + 十六进制视图。
  • 场景四:Windows 下调试前端 WebSocket 通讯。——答案:Fiddler 的 WebSocket 支持更完善。

3.7 避坑合集(我的血泪史)

最后分享几个我亲手踩过的坑,权当给你排雷。

tcpdump 坑:抓 lo(回环接口)时,默认有时不生效。我那次因为没加 -i lo 还怀疑了半天。另外 -s0 抓满包长,少写这个会导致包被截断。
Wireshark 坑:显示过滤器写错不会报错,只是“不显示任何包”。我曾经以为抓包抓错了,折腾了一小时发现 filter 写了个不存在的协议。
Charles 坑:SSL 代理开启后,如果目标站点使用 HSTS 或证书固定(pinning),就会直接连不上。解决方法是关闭 Charles 的 SSL 代理,或者用 VirtualHost 绕过去。
Fiddler 坑:Windows 下开着 Fiddler 时,很多系统服务(如 Windows Update)走代理会死。记得在 Fiddler 里设置“只捕获浏览器和 .NET 应用”,不然机器越用越慢。

好了,这四种工具的基本面我说完了。实际项目中你会反复用到它们,养成多抓多看的习惯——慢慢的,你看到抓包结果就知道问题出在哪。