
搞开发、做测试、管服务的手里没几款趁手的抓包工具很多时候就只能靠猜。接口通了但数据不对、页面加载慢是哪个请求拖后腿、App在真机上请求发不出去、线上问题复现不了……这些问题要是没有抓包工具排查起来基本是“盲人摸象”。我这些年把 Charles、Wireshark、Fiddler、Proxyman 还有 TraceEagle 都折腾过一遍踩了不少坑也总结出每款工具最适合干的活。这篇就按我的实际使用经验把这几款工具的定位、配置方法、高频操作和常见问题一次说透给正准备入门或者想换工具的朋友一个参考。1. 抓包工具的底层差异与选型逻辑1.1 代理型抓包与网卡抓包本质上是两类工具很多人一开始搞不清 Charles 和 Wireshark 到底有什么区别都是抓包怎么界面差这么多这里面的根本原因在于它们的工作方式完全不同。Charles、Fiddler、Proxyman 这三款是代理型抓包工具原理是把自己伪装成一台 HTTP/HTTPS 代理服务器手机或浏览器的流量先经过它再由它转发给真正的服务器。因为流量在中间人这一层被“拆开”看过所以这类工具能直接看到 HTTP 请求的 URL、Header、Body、Cookie能查看 JSON/XML 格式的数据还能对请求和响应做断点、改写、Mock 等操作。用一个生活化的类比来解释代理型工具像是给快递包裹流转环节里加了一个拣货员他打开包裹检查里面装了什么、然后重新打包再寄出去。Wireshark 则是网卡抓包工具它直接在网卡层面把经过的所有数据帧都复制一份不管是 HTTP、TCP、DNS、ICMP 还是 ARP只要在链路上出现全都能抓到。它不看“业务语义”而是把协议栈一五一十地还原出来什么 TCP 三次握手、重传、窗口大小、TLS 握手过程全都铺在你面前。Wireshark 更像监控摄像头把整条路上发生的一切都录下来但录像里哪些是重要对话需要你自己去分析。TraceEagle 的定位又有点不同它更偏向请求链路的追踪与抓包数据的落盘分析通常用于后端服务、日志联动和全链路排查场景和纯代理抓包或网卡抓包形成互补。后面我会单独说。1.2 五款工具横向对比谁擅长什么一目了然我把自己平时对这几款工具的评估整理成一张表方便你按需选择工具支持平台工作层级核心强项适合人群上手难度CharlesWindows / macOS / LinuxHTTP/HTTPS 代理层手机抓包、HTTPS 解密、Mock 数据、弱网模拟客户端开发、测试、前端调试低WiresharkWindows / macOS / Linux网卡链路层全量协议解析、TCP/IP 排障、TLS 握手分析网络工程师、后端开发、协议分析中高FiddlerWindowsClassic/ 跨平台EverywhereHTTP/HTTPS 代理层Composer 构造请求、AutoResponder、弱网模拟Windows 平台的开发测试中ProxymanmacOS / iOSHTTP/HTTPS 代理层iPhone 真机抓包、Simulator 抓包、现代交互macOS/iOS 开发者低TraceEagle跨平台请求链路 / 日志分析层数据落盘、链路追踪、回放分析后端排查、运维辅助中从表里能看出来没有一款工具能包打天下。我现在的习惯是日常开发调试优先用 Charles 或 Proxyman遇到 TCP/IP 层问题或者要分析 TLS 握手细节就切到 WiresharkWindows 机器上临时抓包用 Fiddler服务端链路排查时配合 TraceEagle 做数据复盘。工具不在多关键是知道什么场景叫谁上场。2. 每款工具的核心配置与实操要点2.1 Charles手机抓包的入门必修课Charles 是我使用频率最高的一款工具几乎成了客户端调试的标配。它的安装没有什么特殊门槛官网下载对应系统版本安装即可。但装完之后有几个核心配置不做你连 HTTPS 都解不开。首先是开启 SSL Proxying。Charles 默认只解密 HTTP 流量对 HTTPS 的请求界面上只能看到一堆乱码或者“unknown”。你要在菜单栏找到 Proxy - SSL Proxying Settings勾选 Enable SSL Proxying然后在 Location 里添加一条规则Host 填 *Port 填 443这样才能对所有 HTTPS 请求做解密。然后就是手机抓包的经典流程。手机和电脑连到同一个局域网电脑上先看 Charles 的 Help - Local IP Address找到当前局域网的 IP。手机端打开 Wi-Fi 设置把 HTTP 代理改成手动服务器填电脑 IP端口填 8888Charles 默认端口。此时你在 Charles 上点 Allow 允许手机连接在手机浏览器里访问 chls.pro/ssl 下载证书并安装。iOS 上装完证书后还必须去“设置 - 通用 - 关于本机 - 证书信任设置”里把 Charles 的证书开关打开这一步漏掉的话HTTPS 依然解不开。这里有个非常容易踩的坑Android 7.0 以上的系统默认不信任用户安装的 CA 证书所以即使你在手机里装了 Charles 证书App 的 HTTPS 请求照样抓不到。解决办法要么是让 App 在 manifest 里配置 networkSecurityConfig 允许用户证书要么在测试机上用 root 过的设备把证书装进系统证书目录。对做逆向或者测试的朋友建议准备一台可 root 的 Android 测试机用途很广。2.2 Wireshark给网络做“全量录音”的底层工具Wireshark 的安装其实比很多人想象中简单Windows 上官网下载安装包安装过程中会提示安装 Npcap 或 WinPcap 抓包驱动。这里我建议直接选 Npcap它比老牌的 WinPcap 更新对 Windows 10/11 的兼容性更好还支持一些新特性。macOS 上安装后首次打开可能会被系统安全策略拦截去“系统设置 - 隐私与安全性”里允许加载即可。打开 Wireshark 后会看到本机所有网卡列表选择要抓包的网卡双击就开始抓包了。这里有一个关键选项需要注意如果网卡支持建议开启“混杂模式”它的作用是让网卡不关心数据包是不是发给自己的把所有经过的数据帧都收下来。在抓包界面左上角的捕获选项里可以勾选。Wireshark 最核心的能力是过滤器分为捕获过滤器和显示过滤器。捕获过滤器在开始抓包前设置只保留符合条件的数据包比如 host 192.168.1.100显示过滤器则是在已经抓到的数据里做筛选比如只看 HTTP 流量就输入 http只看某个 IP 的流量就输入 ip.addr 192.168.1.100。显示过滤器更常用因为它不影响原始数据可以随时修改。有个很多新手都会遇到的疑问为什么看到的包长度显示是 520 字节而不是期望中的 2090 字节这个通常有两个原因。第一是链路 MTU 的限制普通以太网 MTU 是 1500扣掉 IP 头和 TCP 头之后TCP payload 大约 1460 字节所以单个 TCP 分段不可能携带 2090 字节的应用数据大数据会被拆成多个分段。第二是网卡的 TSO/GRO 卸载机制网卡为了减少 CPU 开销会在硬件层面把多个数据包聚合之后再交给系统Wireshark 捕获到的就是聚合后的超大帧。如果你希望看到的是“原始”的、网卡卸载之前的包可以在网卡高级属性里关闭 TSOTCP Segmentation Offload和 GROGeneric Receive Offload相关选项或者在 Windows 的网卡属性里把“大量发送卸载”和“大量接收卸载”都禁用。2.3 FiddlerWindows 生态里的“多面手”Fiddler 是很多 Windows 用户的第一款抓包工具尤其是测试同学用得最多的功能是弱网模拟。Fiddler 分为两个版本经典版 Fiddler Classic 只支持 Windows界面老但功能扎实Fiddler Everywhere 是跨平台版本付费订阅界面更现代。如果你只是日常测试Classic 基本够用。Fiddler Classic 安装后默认就已经接管了系统的 WinINET 代理也就是说你的浏览器流量会自动经过 Fiddler不需要手动配置代理。这既是方便也是隐患后面我会专门讲卸载后上不了网的问题。要抓 HTTPS打开 Fiddler 后进入 Tools - Options - HTTPS勾选 Capture HTTPS CONNECTs 和 Decrypt HTTPS traffic按提示安装证书即可。Fiddler 里我最常用的功能有两个一个是 Composer可以手动构造任意 HTTP 请求方便测试各种边界情况另一个是 AutoResponder可以把某个请求映射到本地文件或者另一个 URL实现 Mock 效果这个和 Charles 的 Map Local 功能类似。Fiddler 的弱网模拟在菜单 Rules - Performance - Simulate Modem Speeds勾选之后会模拟拨号上网的速度相当慢。如果你想要更精细的控制可以点开 Customize Rules在脚本里找到 m_SimulateModem 函数修改延迟时间、带宽等参数。对移动端弱网测试来说这种几百毫秒的高延迟环境非常能暴露问题比如超时时间设置不合理、请求队列阻塞、loading 状态处理不完善等等。2.4 ProxymanmacOS/iOS 用户的现代选择Proxyman 是这几款里界面最现代、交互最流畅的特别适合用 Mac 做 iOS 开发的团队。它的功能跟 Charles 高度重合但在 iOS 生态上做了一些更贴心的设计比如直接支持从 Simulator 抓包不需要额外配置代理打开 Simulator 后流量自动就能看到。如果要抓 iPhone 真机的包流程跟 Charles 类似手机和 Mac 连同一 Wi-Fi在 Proxyman 的 Certificate 菜单里先安装并信任 Mac 端证书然后在手机 Wi-Fi 设置里配置 HTTP 代理为 Mac 的局域网 IP端口默认 9090。接着用 Safari 打开 proxyman.io/ssl 下载证书安装并在设置里手动信任。Proxyman 还有一个不错的细节它会自动检测到 iOS 设备的连接并提示你安装证书跟着向导走就行。Proxyman 的脚本功能也值得一试它支持 JavaScript 脚本对请求和响应做动态修改类似 Charles 的 Rewrite但写脚本的方式更灵活。对于 macOS 上同时需要抓包和调试脚本的开发者Proxyman 的学习成本比 Charles 低界面也更直观。2.5 TraceEagle被忽视的链路分析与数据复盘工具TraceEagle 不像前四款那样广为人知我最初接触它是在做服务端接口链路排查的时候。它的核心场景不是“实时看一个请求的报文”而是把抓到的网络数据落盘、做链路追踪再结合服务端日志做回放分析。简单说Charles 和 Wireshark 侧重“现场直播”TraceEagle 更侧重“录像回放和串场分析”。如果你遇到的问题是某个请求在客户端看着正常但服务端日志显示没收到或者收到了但响应超时需要把时间线拉齐来排查那 TraceEagle 这类工具就很有价值。它能帮你把客户端请求的时间点、服务端日志的接收时间点、响应的耗时串成一条完整链路快速定位延迟出在哪个环节。它的定位决定了它更适合后端开发、运维和做性能调优的同事而不是普通的前端调试。所以如果你是刚开始接触抓包可以先跳过它等遇到复杂链路问题再回头用。3. 五个高频实操场景完整走一遍3.1 场景一用 Charles 抓手机 App 的 HTTPS 请求这个场景我几乎每周都会做步骤已经完全固定照着走基本不会出错打开 Charles菜单 Proxy - Proxy Settings确认 HTTP Proxy 端口是 8888勾选 Enable transparent HTTP proxying。菜单 Help - Local IP Address记下电脑的局域网 IP比如 192.168.1.5。手机连到同一个 Wi-Fi进入 Wi-Fi 设置把 HTTP 代理改为手动服务器填 192.168.1.5端口填 8888。手机上打开任意浏览器访问 chls.pro/ssl下载并安装 Charles 证书。iOS 用户记得去“设置 - 通用 - 关于本机 - 证书信任设置”里把 Charles 证书开关打开Android 7.0 以上的设备还需要额外处理用户证书信任问题。回到 Charles如果弹出连接确认框点 Allow。此时打开 App请求就会一条条出现在 Charles 的列表里。确保 Proxy - SSL Proxying Settings 里启用了 SSL Proxying且 Location 是 *:443否则 HTTPS 内容会显示为乱码。实操过程中最常遇到的报错是“SSL handshake failed”或者“Client SSL handshake failed”大概率是证书没装好或者没被信任。iOS 上首先检查证书信任开关其次检查手机系统时间是不是准确的时间偏差太大会直接导致证书校验失败。Android 上则优先检查应用是否禁用了用户证书很多金融类 App 会做 SSL Pinning那就需要脱壳或者 hook已经超出抓包工具的范畴了。3.2 场景二用 Wireshark 抓 TCP 并解密 TLS 流量Wireshark 抓 TCP 很简单选择网卡后直接抓就行但很多人不知道 Wireshark 也能解密 TLS。解密的关键是拿到会话密钥现代浏览器支持通过 SSLKEYLOGFILE 环境变量把密钥导出到一个文件。以 Windows Chrome 为例先建一个文件夹比如 C:\sslkeys然后右键“此电脑”进入属性 - 高级系统设置 - 环境变量新建一个用户变量变量名 SSLKEYLOGFILE变量值填 C:\sslkeys\keys.log。重启 Chrome让它重新读取环境变量。这样 Chrome 里访问 HTTPS 站点时会话密钥就会写入 keys.log。然后在 Wireshark 里打开 Edit - Preferences - Protocols - TLS在“(Pre)-Master-Secret log filename”里填上 keys.log 路径。重新抓包你就会发现原本加密的 TLS 流量在 Wireshark 里能直接看到明文的应用层数据。用 Wireshark 分析 TCP 时我最常看的是三次握手和重传。过滤 tcp.flags.syn 1 能看到 SYN 包顺着 time 列能看到客户端发起 SYN、服务端回 SYNACK、客户端再回 ACK 的完整过程。如果 SYN 发出去了但没有 SYNACK 回应要么是服务端端口没监听要么是被防火墙拦了。如果出现大量的 TCP Retransmission说明网络丢包严重这时候再去看有没有 Duplicate ACK、乱序包基本能定位是链路问题还是服务端处理慢。3.3 场景三用 Fiddler 做弱网测试弱网测试是移动端和前端测试绕不开的环节。Fiddler 做弱网模拟成本最低因为它可以在 Windows 上直接对抓到的所有请求生效。在 Fiddler Classic 里菜单 Rules - Performance - Simulate Modem Speeds勾选后立刻生效。这个选项模拟的网速非常慢大约 56kbps大部分场景用这个已经能粗暴地暴露问题。想自定义网速打开 Rules - Customize Rules会跳出一个脚本编辑器在 OnBeforeRequest 函数里找到这段代码if (m_SimulateModem) { // Delay sends by 300ms per KB uploaded. oSession[request-trickle-delay] 300; // Delay receives by 150ms per KB downloaded. oSession[response-trickle-delay] 150; }request-trickle-delay 表示每上传 1KB 数据延迟的毫秒数response-trickle-delay 表示每下载 1KB 数据延迟的毫秒数。比如我想模拟比较弱的 3G 网络可以把上传改成 500、下载改成 200保存脚本后重新勾选 Simulate Modem Speeds 就生效了。这里提醒一句弱网测试的重点不是看页面加载慢不慢而是看应用有没有做超时处理、有没有失败重试、弱网状态下数据会不会错乱、用户的 loading 状态能不能正常退出。测的时候要配合抓包记录看看哪些请求超时了、哪些请求被阻塞了才能真正发现问题。3.4 场景四用 Charles 对线上 API 做 Mock 数据开发阶段接口还没好或者想模拟异常返回、特定数据用 Charles 的 Map Local 功能可以非常方便地做 Mock。比如线上有个 APIhttps://api.example.com/user/info你想让它返回一份本地 JSON。具体操作先用 Charles 正常抓到这个请求右键这个请求选择 Save Response把响应保存成 user_info.json 文件。修改这个 JSON 文件里的数据改成你想模拟的返回内容。回到 Charles再次右键这个请求选择 Map Local在弹窗里把 Local path 指向你修改后的 JSON 文件。点击 OK 后再刷新 App你会发现请求返回的就是本地 JSON 里的内容。这个方法比在代码里 mock 要快得多而且对客户端完全透明不需要改代码、不需要重新打包。测试异常场景时特别顺手比如把响应改成 HTTP 500、改成超时、改成一个超大的 JSON 来测性能一个文件就搞定了。Charles 还提供了 Rewrite 功能可以对请求和响应做规则化的修改。比如把响应里的某个字段值统一替换掉或者给所有请求加上一个自定义 Header。相比 Map LocalRewrite 更偏向动态修改适合批量处理。3.5 场景五用显示过滤器快速定位目标流量抓包工具最怕的就是抓了一大堆数据不知道看哪里。用好显示过滤器效率能翻好几倍。我把高频过滤器总结一下需求过滤器写法只看某个 IP 的流量ip.addr 192.168.1.100只看某个端口tcp.port 8080只看 HTTP 请求http.request只看 DNS 请求dns只看某个域名的流量http.host example.com只看 TCP 重传tcp.analysis.retransmission按请求方法过滤http.request.method POST按关键字过滤内容tcp contains password这些过滤器在 Wireshark 里最常用Charles 也自带 Filter不过 Charles 的过滤是基于域名的简单匹配功能不如 Wireshark 强大。如果你用 Charles 抓包时发现数据太多最直接的办法是先暂停抓包再在左下角的 Filter 输入框里输入域名或关键字界面上的结果会立刻过滤方便定位。4. 常见问题与排查技巧实录抓包工具用久了遇到的大大小小问题真的不少我把几个高频问题整理成速查表看情况对号入座。4.1 抓包常见问题速查表问题现象根本原因解决办法Charles 抓不到手机的包手机代理没配对 / 没点 Allow确认电脑 IP、端口 8888代理设置正确后重启 AppCharles 能抓到请求但显示乱码SSL Proxying 未开启在 SSL Proxying Settings 里添加 *:443 并勾选 EnableiOS 装了证书还是解不开 HTTPS证书没有被手动信任设置 - 通用 - 关于本机 - 证书信任设置打开开关Android 7.0 抓不到 HTTPS应用不信任用户证书使用可 root 设备把证书装进系统证书目录或让开发修改 networkSecurityConfigFiddler 卸载后上不了网系统代理残留控制面板 - Internet 选项 - 连接 - 局域网设置取消“为 LAN 使用代理服务器”Wireshark 显示“No packets captured”选错网卡或没开混杂模式检查网卡选择开启混杂模式确认链路口是镜像口或者本机有流量Wireshark 里包长度显示 520 而不是 2090MTU 分段 / TSO/GRO 卸载关闭网卡的大量发送/接收卸载选项TSO/GRO或理解 TCP 分段机制Proxyman 无法抓 iPhone 的包证书未信或代理端口不对检查证书信任开关确认代理端口是 9090iPhone 与 Mac 同一局域网抓包工具运行后浏览器无法上网代理端口被占用或代理配置异常关闭抓包工具看是否恢复改用其他端口或检查系统代理设置4.2 几个容易忽略的实操细节第一个细节不管用哪款代理型抓包工具抓完包之后一定记得关掉或者退出程序尤其是 Fiddler 和 Charles它们会影响系统代理设置。我自己吃过一次亏Fiddler 没退出就直接关机第二天打开电脑发现浏览器上不了网排查了半天才发现是系统代理还指着一个已经关闭的进程。第二个细节Wireshark 抓包时如果数据量太大建议用捕获过滤器在开始抓包之前就过滤掉无关流量。不要等到抓完了再用显示过滤器因为 Wireshark 默认是内存缓存抓太久会把内存吃满机器卡成幻灯片。第三个细节抓包工具要抓 HTTPS系统时间一定要准确。证书校验对时间非常敏感手机时间慢了五分钟都可能导致 SSL 握手失败。遇到莫名的证书错误先看一眼设备时间。第四个细节用 Charles/Proxyman 抓 iOS 时如果手机和电脑不在同一网段或者网络做了 AP 隔离是抓不到包的。公司办公室网络经常开 AP 隔离手机能连 Wi-Fi 但和电脑不通这种时候建议开个手机热点让电脑连上去再抓。4.3 关于 TraceEagle 的使用建议TraceEagle 这类工具我第一次用的时候也有点摸不着头脑因为它的界面不像是传统的“抓包列表”更像一个带时间轴的追踪视图。我的建议是不要把它当成 Charles 的直接替代而是在做服务端接口链路分析的时候配合使用。比如客户端反馈某个接口偶尔超时你用 Charles 抓只能看到这次请求花了 5 秒才返回但不知道这 5 秒消耗在哪个环节。如果把 TraceEagle 落盘的数据和服务端日志做时间线对齐就能看到是网关层耗时、业务逻辑耗时还是数据库查询耗时定位就快多了。这类工具的上手成本主要在数据关联需要你对整个系统的调用链有基本认知知道每个时间点对应的是哪个模块的动作。如果你现在只是做前端页面调试或者 App 的接口调试我的建议是先专注掌握 Charles 或 Proxyman等真正需要排查全链路性能问题时再回头研究 TraceEagle会顺手很多。5. 我的组合拳用法与一点心得最后分享一个我自己的工具组合方式。日常开发调试我主力用 Charles因为它在 Mac 上稳定、手机抓包流程成熟、Mock 数据也方便如果是在纯 Windows 环境做测试我会切到 Fiddler它的弱网模拟和 Composer 在 Windows 上确实好用遇到疑似网络层问题、TCP 握手失败或者要深入分析 TLS 细节的情况我会开 Wireshark 配合 SSLKEYLOGFILE 查明文服务端链路排查需要看全链路时间线的时候再把 TraceEagle 的数据拉出来对日志。这几款工具不冲突反而是互补的关系。我的经验是不要执着于“哪款工具最好”而是搞清楚“当前问题发生在哪一层”。是应用层接口数据不对还是传输层连接异常还是服务端链路耗时过长——问题定位清楚工具选型就顺理成章了。还有一个小技巧是抓包之前先随手保存一份原始文件。我在排查线上问题时养成了习惯每次用 Wireshark 抓完包先 File - Save As 存一份 pcap 文件用 Charles 抓完也会右键保存一份会话。这样就算当时没看出问题过后还能重新打开分析或者发给同事一起看省得重复抓包。这个习惯帮我在好几次难复现的 bug 排查中省了大量时间。