news 2026/9/13 9:34:01

抓包工具选型与实战:五款主流工具对比及高频问题排查

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
抓包工具选型与实战:五款主流工具对比及高频问题排查

搞开发这些年,抓包工具我换了好几轮。Charles、Fiddler、Wireshark、Proxyman,再加上最近不少人问的TraceEagle,每一款我都实际用过一段时间,也踩过不少坑。这篇文章就围绕抓包工具的选型和使用来展开,先讲清楚每款工具的定位差异,再把手机抓包、HTTPS解密、弱网模拟、报文过滤这些高频操作的关键细节一起拆开讲。如果你正准备挑一款抓包工具,或者已经在用但总遇到“抓不到包”“证书不生效”“数据解不开”这类问题,这篇文章应该能帮你省下不少排查时间。

1. 五款工具的定位差异:先想清楚你要解决什么问题

很多新手上来就问“哪个抓包工具最好”,这个问题本身就没法回答。抓包工具不是一个完全同质化的品类,它们工作的层级不同、适用的场景不同、解决的核心痛点也不同。选错了工具,后面再努力都是事倍功半。

1.1 一张表看懂核心区别

我先把五款工具的核心定位、适用场景、平台支持和上手难度放在一起做个对照,方便你快速锁定目标。

工具核心定位最常用场景支持平台上手难度
CharlesHTTP/HTTPS 调试代理移动端 App 接口调试、Mock 数据、弱网模拟Windows / macOS / Linux
ProxymanHTTP/HTTPS 调试代理macOS 和 iOS 生态调试、接口快速查看macOS(含 iOS 模拟器)
FiddlerHTTP/HTTPS 调试代理Windows 平台 Web 与客户端调试、弱网测试Windows / .NET
Wireshark网络协议分析底层协议排查、TCP/UDP 分析、报文追溯全平台
TraceEagle新一代 HTTP 调试平台跨平台接口调试、团队协作、接口文档沉淀全平台中低

1.2 别急着安装,先对号入座

如果你主要调试的是移动端 App 的接口,Charles 和 Proxyman 会是更顺手的工具。它们把请求、响应、Header、Cookie、请求耗时这些信息组织得非常直观,而且可以一键过滤某个域名、一键模拟弱网,做前后端联调非常省心。

如果你工作在 Windows 环境下,或者需要频繁用脚本批量修改请求、做自动化式的抓包验证,那 Fiddler 的 FiddlerScript 机制会让你感觉如虎添翼。它和 Windows 生态的契合度很高,很多早期的.net 客户端调试案例都是围绕 Fiddler 展开的。

如果你遇到的问题已经超出 HTTP 层,比如 TCP 重传、丢包、延迟抖动、DNS 解析异常、某个端口上到底有哪些连接,那就得用 Wireshark 了。它抓的是经过网卡的全部数据包,能看到传输层、网络层甚至链路层的信息,是底层网络排障的最终手段。

至于 TraceEagle,它属于这个领域的新面孔。从它目前暴露出来的产品理念看,更像是想把 Charles 的易用性和团队协作、接口管理能力结合起来。如果你所在团队经常多人联调、希望把抓包记录沉淀成文档,它值得关注,但还没到能完全替代老牌工具的程度。

还有一点需要说清楚:Charles、Fiddler、Proxyman 这类工具本质上是一个本地代理服务器,手机或浏览器把请求指向你电脑上这个代理,工具才能解析和展示数据。而 Wireshark 不是代理模式,它直接监听网卡上的网络流量。理解了这两类原理,你就知道为什么有时候用代理工具抓不到包,换 Wireshark 却能抓到——因为一个是依赖应用主动走代理,一个是网卡层全量捕获。

2. 日常开发场景下的主力工具:Charles 与 Proxyman 实战拆解

日常开发里,Charles 和 Proxyman 是我用得最多的两个工具,因为它们把 HTTP 调试体验做得足够细。下面我把手机抓包的完整链路、HTTPS 解密的关键配置、Mock 和弱网的常用玩法分别讲透。

2.1 手机抓包的完整链路:代理、证书、过滤一个都不能少

“为什么手机连上代理还是抓不到包”是我见过最多的新手问题。其实手机抓包是一个非常标准的三步走,少了任何一步都不行。

第一步是确保手机和电脑在同一局域网。这个听起来是废话,但真有人把手机连了 4G、电脑连 WiFi,然后折腾一下午抓不到包。

第二步是在手机 WiFi 设置里配置手动代理,把代理地址填成电脑的局域网 IP,端口填成抓包工具的代理端口。Charles 默认是 8888,Proxyman 通常在 9090 左右,Fiddler 默认也是 8888。电脑 IP 可以直接在抓包工具界面里看到,Charles 的 Help -> Local IP Address 就能看到当前局域网 IP。

第三步是安装并信任根证书。HTTP 协议下代理工具可以明文解析,但 HTTPS 流量是加密的,工具必须用自己生成的根证书对流量做中间人解密。以 Charles 为例,手机浏览器访问chls.pro/ssl下载证书,下载后到系统设置里安装。iOS 用户注意,只点“安装”还不够,还需要到“设置 -> 通用 -> 关于本机 -> 证书信任设置”里把 Charles 的证书开关打开,否则 Safari 和部分 App 依然会报证书错误。

做完这三步,还要检查抓包工具本身的过滤设置。Charles 左下角有一个 Filter 输入框,如果你之前填了某个 host,那其他域名的请求都会被过滤掉。我遇到过好几次“抓不到包”,最后发现是过滤条件没清掉。

2.2 HTTPS 解密的关键:为什么装了证书还是乱码

很多新手装完证书,发现 Charles 里看到的还是 CONNECT 开头的内容,或者响应体是一堆乱码,这大概率是 SSL Proxying 没有开启。默认情况下,Charles 对 HTTPS 流量只会显示 CONNECT 隧道信息,不会解密具体内容。

你需要到 Proxy -> SSL Proxying Settings 里勾选 Enable SSL Proxying,然后在 Location 里添加要解密的域名。直接填*代表解密所有域名,开发环境为了省事可以这样填,但如果遇到证书校验很严格的情况,抓包工具会伪造不出有效证书,反而引发更多问题。建议还是按域名添加,比如api.example.com:443

再说一个比较隐蔽的坑:Android 7.0 之后,系统默认不再信任用户安装的证书,只信任系统证书。也就是说,即使你在 Android 手机上装了 Charles 的证书,普通 App 发起的 HTTPS 请求依然会把你这个代理视为不可信,直接握手失败。解决思路有三个:一是让开发在调试包里配置networkSecurityConfig信任用户证书;二是 Root 手机把证书装进系统证书目录;三是如果只是看网页流量,用 Chrome 这类浏览器访问一般没问题,因为浏览器对用户证书是放行的。这个问题在 iOS 上相对好办,只要证书信任开关打开,大部分 App 都能正常抓。

2.3 Mock 数据和弱网模拟:前后端联调的两把利器

Charles 里 Map Local 和 Map Remote 这两个功能简直是前后端联调的救命稻草。后端接口还没写完时,前端可以先用 Map Local 把某个接口的响应映射到一个本地 JSON 文件,让请求直接返回本地定好的数据。操作路径是 Tools -> Map Local,勾选 Enable Map Local,Add 一条规则,指定协议、host、path 和本地文件路径。这样前端不用等后端接口,自己就能把页面流程跑通。

Map Remote 则是把请求重定向到另一个环境,比如线上请求打到测试环境,或者灰度环境请求打到本地服务,调试一些环境差异问题非常方便。

弱网模拟也很常用。Charles 的 Proxy -> Throttle Settings 里有预设的网速档位,也能自定义带宽、延迟、丢包率。想模拟用户在地铁里的体验,可以设置一个较小的带宽加 300ms 延迟,看看页面加载和接口超时表现。

Proxyman 在这几个方面做得也很接近,而且它的 UI 对 macOS 用户更友好。比如启动后会自动检测 iOS 模拟器,勾选一个按钮就能让模拟器流量自动走代理,省掉了手动配置 WiFi 代理这一大串操作。它还有一个我很喜欢的小功能,接口响应可以直接以 Pretty Print 方式展示 JSON,还把每个字段的类型高亮出来,排查数据结构问题非常直观。

3. 网络协议层的指挥官:Wireshark 抓包与报文分析

如果说 Charles 和 Proxyman 是“应用层放大镜”,那 Wireshark 就是“协议层显微镜”。它能让你看到 TCP 三次握手、每一个 ACK、每一次重传,甚至数据包在网卡层面的实际大小。代价就是学习曲线陡峭,但一旦掌握,排查网络问题的能力会直接上一个台阶。

3.1 抓包原理与基本过滤语法

Wireshark 不是代理模式,不需要在应用里设置代理,它直接监听网卡的流量。启动时选择正确的网卡很重要,如果你要抓本机回环流量(比如本机服务之间的通信),在 Windows 上需要安装 Npcap 并勾选支持 Loopback,否则127.0.0.1的流量是抓不到的;macOS 上一般用Loopback: lo0口就能抓。

Wireshark 的过滤分为两种:抓包过滤器和显示过滤器。抓包过滤器在开始抓包前设置,语法是 BPF,比如tcp port 443host 192.168.1.100。显示过滤器是抓完包后在上方输入框里过滤,语法更友好,也是非常高频使用的功能。

几个最常用的显示过滤器示例:

  • ip.addr == 192.168.1.100:只看这个 IP 的流量
  • tcp.port == 443:只看 443 端口流量
  • http.request:只看 HTTP 请求报文
  • tls.handshake.type == 1:只看 TLS 握手中的 ClientHello
  • frame contains "password":查找 payload 中包含某段字符串的报文
  • vlan.id == 100:只看指定 VLAN 的报文

很多人还会问怎么“可视化”,其实 Wireshark 自带不少分析视图。Statistics -> Flow Graph 可以看到连接建立和断开的过程,Statistics -> I/O Graph 可以按时间轴画出报文速率曲线,排查突发流量和拥塞时非常好用。

3.2 HTTP/TLS 解密:用 SSLKEYLOGFILE 还原明文

Wireshark 虽然能看到加密后的 TLS 报文,但看不到 HTTP 明文内容。想解密,只有一个正规路径:拿到 TLS 会话密钥。好在现代浏览器都支持通过环境变量把会话密钥导出到文件。

以 Chrome 为例,启动前设置环境变量SSLKEYLOGFILE,指向一个文件路径,比如D:\keys\sslkey.log,然后用命令行启动 Chrome,所有 TLS 会话的密钥就会写入这个文件。接着在 Wireshark 的 Preferences -> Protocols -> TLS 里,把(Pre)-Master-Secret log filename指向同一个文件,再次抓包,Wireshark 就能把 TLS 加密的 HTTP 请求明文还原出来。

Firefox 也支持同样的方式,只要在启动前设置好环境变量即可。这个技巧在做 API 联调、排查第三方 SDK 请求、分析网页性能时特别有用。需要注意新版 TLS 1.3 在某些场景下对会话密钥的导出方式有调整,Chrome 如果开启了部分加密的 ClientHello,可能需要在 Wireshark 里配合 ECH 相关设置才能完整解密,但这属于比较进阶的场景了。

3.3 常见困惑:MTU、分片与“只能显示520字节”的问题

热搜里有个问题很典型:“Wireshark 为何只能显示 520 字节数据,怎么显示 2090 字节数据”。这个得从网络报文的基本机制说起。

以太网的 MTU(最大传输单元)通常是 1500 字节。一个 IP 包封装进以太网帧时,IP 头占 20 字节,TCP 头占 20 字节,所以一个 TCP 段最多携带的应用层数据就是 1500 - 20 - 20 = 1460 字节。这个 1460 就是常见的 MSS。因此你看到的单条 TCP 报文的载荷长度,正常情况下不会超过 1460。

那为什么有时候看到 520 字节,有时候又需要看到 2090 字节?

这背后是 TCP 的分段机制。当应用层一次性写入 2090 字节数据时,TCP 协议栈很可能把它分成两个段:第一个段 1460 字节,第二个段 630 字节。当然还有一种可能,应用层本身只写了 520 字节,整个载荷就是 520 字节,这完全是合法的。Wireshark 默认会对同一 TCP 流的数据做重组,所以你在 Follow HTTP Stream 或 TLS Stream 视图里,能完整看到 2090 字节的连续数据,但数据包列表里每一条记录显示的就是单个段的长度。

如果你的 Wireshark 在流视图里依然只看到零散的段,去 Preferences -> Protocols -> TCP 里检查两个开关:Allow subdissector to reassemble TCP streamsDesegment all TCP streams,把它们打开,通常就能看到重组后的完整应用层数据了。

简单总结就是:520 或 2090 本身都不是错误,而是 TCP 分段的正常现象。你要确认的是工具设置是否允许重组,而不是怀疑工具坏掉了。

4. Windows 生态的调试利器:Fiddler 的高级玩法

Fiddler 在最辉煌的年代几乎是 Windows 开发者人手一个的工具。现在它的热度比当年低了一些,但在 Windows 平台和自动化调试场景下,它依然有不可替代的位置。

4.1 从抓包到断点:用 FiddlerScript 做请求拦截

Fiddler 的杀手锏是 FiddlerScript。它允许你在请求前后执行 JavaScript 代码,实现自定义逻辑。你可以在 Fiddler 的FiddlerScript页签里直接改写代码,改完按 Ctrl+S 保存立即生效。

举个例子,我想把所有发往api.example.com的请求重定向到本地环境:

static function OnBeforeRequest(oSession: Session) { if (oSession.HostnameIs("api.example.com")) { oSession.host = "127.0.0.1:8080"; } }

保存之后,请求就会全部打到本地服务上。这种能力在做后端迁移验证、灰度对比时非常实用。Fiddler 还支持断点调试,菜单里的Rules -> Automatic Breakpoints -> Before Requests可以拦截请求,After Responses可以拦截响应,配合右侧的 Inspectors 面板,可以手动修改请求参数或响应内容再放行,这在调试边界条件时特别有用。

4.2 弱网模拟与性能观察

Fiddler 内置的弱网模拟入口很简单:Rules -> Performance -> Simulate Modem Speeds。不过这个“调制解调器速度”偏向于极限弱网,如果你想模拟 3G、4G 或者更细粒度的延迟和丢包,可以打开 FiddlerScript,查找OnBeforeRequest里与延迟相关的逻辑,手动添加延时逻辑。

比如模拟 200ms 的固定延迟加 20% 丢包,可以这样写:

static function OnBeforeRequest(oSession: Session) { System.Threading.Thread.Sleep(200); if (new Random().Next(100) < 20) { oSession.Abort(); return; } }

这段代码能让你快速体验一下在劣化网络下接口的表现。不过 Fiddler 的弱网模拟更偏“粗粒度”,如果你需要精细控制,用 Charles 或 Proxyman 的 Throttle 设置会更顺手。

4.3 卸载后上不了网?代理残留问题排查

“Fiddler 卸载后上不了网”这个话题在热搜里出现得非常多,我也遇到过几次。原因基本是同一种:Fiddler 在开启抓包时,会把 Windows 的系统代理设置为127.0.0.1:8888。正常退出它会还原设置,但如果在抓包状态下强制杀进程、或者用第三方清理工具把它当作垃圾文件直接删掉,系统代理就不会被还原。

排查顺序很简单。先看 IE 或 Edge 的“Internet 选项 -> 连接 -> 局域网设置”,如果勾选了“为 LAN 使用代理服务器”,取消勾选就能恢复。如果取消了还不行,那就是 WinHTTP 层面的代理被改了,打开命令行执行:

netsh winhttp reset proxy

再执行:

netsh winhttp show proxy

确认输出是“Direct access (no proxy server)”,一般就恢复了。如果还不放心,可以打开注册表编辑器,定位到HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings,把ProxyEnable的值改成 0,删掉ProxyServer的值。操作前记得先备份注册表。整个过程的本质就是清理残留的代理配置,和网卡驱动、系统文件没什么关系。

顺便一提,Windows 下如果浏览器访问 localhost 却走代理,也可能报“无法访问此网站”,常见解法是把地址写成http://localhost.:端口(端口前加一个点),或者用http://127.0.0.1,就能绕开系统代理的干扰。

5. 新一代工具与选型建议:TraceEagle 值得关注吗

TraceEagle 算是个比较新的名字,公开资料还没有老牌工具那么丰富,但这不代表它没有参考价值。从产品设计方向来看,它代表了一类“工具平台化”的新趋势——抓包不只是看报文,而是把调试、协作、文档沉淀绑定在一起。

5.1 TraceEagle 的核心思路

我个人的初步体验是,TraceEagle 更像一个跨平台的 HTTP 调试工具,目标用户很明确:做接口联调的客户端、前端、测试同学。它的界面走的是现代设计风格,不像老工具那样堆满密密麻麻的表格,请求详情展示更接近 Postman 的阅读体验,这对新上手的开发者非常友好。

它比较有辨识度的点是团队协作方向。抓包记录可以持久化保存,也可以导出成接口文档类的结构化数据,多人联调时可以共享某一个抓包会话的上下文,而不是像 Charles 那样靠截图和口头描述来同步问题。另外它还内置了 mock server,可以把某个抓包记录直接变成一个可访问的 mock 接口,这对后端接口还没写好的前端同学挺实用。

不过要提醒一句,工具越新,生态越薄弱。它目前的社区资料、教程案例都比不上 Charles 和 Wireshark,遇到奇奇怪怪的问题时,能搜到的答案有限。所以我的建议是:可以在个人项目或非核心项目里先体验,不要盲目拿它替代已经跑顺的正式链路。

5.2 五款工具怎么选:最终决策建议

如果你让我直接给配置方案,我会这么说:

  • 日常移动端接口调试,首选 Charles。全平台支持、稳定、资料多,团队里任何一个人遇到问题都能很快找到解法。
  • 如果你主力机是 macOS、又主要调试 iOS 生态,Proxyman 会更顺手,模拟器支持比 Charles 更自然。
  • 如果你在 Windows 上,又经常需要写脚本改请求、断点调试、做自动化验证,Fiddler 更合适。
  • 一旦问题掉到 TCP、DNS、丢包、重传、报文大小这些层面,别犹豫,切到 Wireshark。
  • TraceEagle 可以作为团队协作场景的补充工具去观察,等它的生态更成熟一些再纳入正式选型。

工具从来不是越多越好,而是要在合适的场景用合适的工具。我自己电脑上常年装着 Charles 和 Wireshark,这两者一个管应用层、一个管协议层,基本覆盖了 90% 的调试和排障场景。

6. 高频问题与排查手册

这节我把日常见到的高频问题统一整理成速查表,并展开讲两类最让人头疼的故障排查过程,方便你以后直接对照处理。

6.1 问题速查表

问题现象常见原因处理方式
手机连上代理但 App 加载失败证书未安装或不信任安装抓包工具根证书,iOS 需在证书信任设置里开启完全信任
Charles 里全是 CONNECT,看不到内容未启用 SSL ProxyingProxy -> SSL Proxying Settings 开启并添加域名
iOS 装证书后仍然报错未开启完全信任设置 -> 通用 -> 关于本机 -> 证书信任设置
Android 7+ 抓不到 App 的 HTTPS用户证书对 App 默认不生效使用可调试包并配置 networkSecurityConfig,或 root 后装系统证书
卸载 Fiddler 后浏览器无法上网系统代理残留取消“为 LAN 使用代理服务器”,执行netsh winhttp reset proxy
Wireshark 抓不到本地回环流量网卡选择错误或未装 Npcap选择 Loopback 网卡,Windows 安装 Npcap 并启用 Loopback 支持
Wireshark 显示数据不完整TCP 重组未开启Preferences -> Protocols -> TCP 开启重组选项
Fiddler 无法抓取 localhost系统代理绕过本机访问http://localhost.:端口或使用机器名

6.2 代理端口冲突与启动失败排查

很多代理类工具启动时会监听一个本地端口,如果这个端口被其他程序占用,就会出现类似failed to listen tcp on 108failed to listen tcp on 8888这样的报错。这类问题看起来吓人,其实就是端口被占用了。

排查思路很简单。Windows 上打开命令提示符,执行:

netstat -ano | findstr :8888

如果看到 LISTENING 状态的记录,最后一列就是占用进程的 PID。再用tasklist | findstr PID查这个 PID 对应的进程,确认不是必要服务后,用taskkill /PID 8888 /F结束它,或者直接在任务管理器里找到对应进程结束。

macOS 和 Linux 上用:

lsof -i :8888 kill -9 PID

除了杀掉占用进程,也可以在抓包工具里换一个端口,比如把 Charles 的代理端口从 8888 改到 8899,避开冲突。如果是在公司网络环境,防火墙也可能拦截这类代理端口的入站流量,需要确保电脑防火墙允许抓包工具对外监听。

6.3 证书信任类问题汇总

证书信任是所有 HTTP 调试代理工具的命门,这块我多写几句。

Windows 上安装 Fiddler 或 Charles 的证书,一般会遇到浏览器提示“不是安全连接”的问题。解决方式是打开浏览器或系统的证书管理器,把抓包工具的根证书导入到“受信任的根证书颁发机构”目录下。Chrome 内核浏览器会读取系统证书存储,导入后基本就能正常访问。

macOS 上安装证书后,还要到“钥匙串访问”里把该证书的信任级别改为“始终信任”,光双击安装是不够的。

iOS 上除了安装描述文件,还要在“设置 -> 通用 -> 关于本机 -> 证书信任设置”里打开完全信任,这个前面已经说过。要注意的是,企业证书和根证书的安装位置不一样,别弄混了。

Android 的信任机制最麻烦,特别是 Android 7.0 以上对用户证书的限制。建议开发阶段在 App 的networkSecurityConfig里显式信任用户证书,或者测试时选择 browser 类的应用验证流量。Root 后把证书写入系统分区是另一个思路,但不建议为了抓包专门去折腾系统分区,风险大于收益。

我在实际使用中还有一个经验:如果 App 做了证书固定(Certificate Pinning),即使你信任了根证书,它依然会拒绝代理的中间人证书。这种情况普通的抓包工具很难突破,需要在 App 端配合调试,或使用支持 SSL Pinning 绕过方案的增强工具。所以遇到抓不到包的问题,先不要怀疑工具坏了,按“代理通不通、证书信不信、App 让不让”这个顺序排查,效率会高很多。

最后再分享一个自己的使用习惯。日常开发调试,我主力是用 Charles 或 Proxyman,因为它们对 HTTP 的展示最友好,手机抓包和 Mock 都很顺手;一旦数据链路出现诡异问题,我会立刻切到 Wireshark 看底层报文,绝不在应用层靠猜;Fiddler 则是在 Windows 上需要写脚本批量改请求、验证一些自动化逻辑时才登场。抓包工具选型没有绝对的对错,关键是你对每款工具背后的原理理解得够不够深,排查问题的思路够不够清晰。希望这篇对比和实操拆解,能帮你少走一些弯路。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 9:30:14

紫外窄带滤光片原理、选型与工程应用指南

1. 窄带滤光片的基础概念与特性解析200-400nm波段的窄带滤光片属于紫外光学元件的核心组件&#xff0c;其工作原理基于多层介质膜的干涉效应。当光线通过不同折射率的介质膜堆叠结构时&#xff0c;特定波长的光因干涉相长被增强&#xff0c;其他波长则因干涉相消被抑制。这种滤…

作者头像 李华
网站建设 2026/9/13 9:23:41

告别臃肿Postman:用开源轻量工具Bruno实现接口调试与自动化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华