1. 工具怎么选:五款抓包工具的“工种”其实完全不同
很多刚接触抓包的朋友,第一反应都是“到底哪款工具最好用”。这个问题我被人问过无数次,但说实话,抓包工具之间根本不是“谁比谁强”的关系,而是“工种”完全不同。你让一个干体力活的去绣花,再好的体格也白搭;你让一个做精工的师傅去搬砖,手艺再好也使不上劲。选错工具,往往就是你折腾半天抓不到包、抓到包又看不懂的根源。
先说Charles、Fiddler、Proxyman这三款。它们的本质是一个本地代理服务器,手机或者浏览器的流量先走到你的电脑上,再由它转发到真正的服务器。这种模式决定了它们天生擅长“应用层调试”——你可以看到完整的HTTP/HTTPS请求和响应、可以打断点改数据、可以模拟弱网、可以Mock接口。而Wireshark走的是另一条路线,它直接采集网卡上的原始数据包,管你是HTTP还是TCP还是UDP,统统先捞上来再说。所以Wireshark更适合“底层网络分析”——排查三次握手异常、看重传、分析TLS握手过程、配合抓包文件做协议逆向。
TraceEagle这个名字可能很多人第一次听。它的定位更偏向于轻量级的多协议抓包工具,属于“小而快”的那一类。不需要像Charles那样装证书搞半天,打开就能抓,适合临时分析TCP/UDP报文、快速确认某个端口有没有数据在跑、或者做一个简单的联网排查。
我用一张表把它们的核心属性列出来,你照着选就行:
| 工具 | 技术路线 | 核心能力 | 最适用的场景 | 上手难度 |
|---|---|---|---|---|
| Charles | HTTP代理 + MITM | HTTPS解密、断点、弱网、Mock | App开发调试、前后端联调 | 中等,需要正确安装证书 |
| Fiddler | HTTP代理 + MITM | HTTPS解密、弱网、脚本扩展 | Windows环境、.NET调试、抓取浏览器行为 | 中等,老牌教程多 |
| Proxyman | HTTP代理 + MITM | HTTPS解密、多Tab管理、原生macOS体验 | macOS/iOS开发、Swift/Flutter调试 | 较低,界面最友好 |
| Wireshark | 网卡级抓包 | 底层协议分析、TLS解密、过滤追踪 | 网络问题排查、协议学习、安全分析 | 偏高,需要理解协议栈 |
| TraceEagle | 轻量多协议捕获 | 快速抓包、无需繁琐配置 | 临时排查、Linux环境、轻量验证 | 低,几乎没有门槛 |
这里有个很关键的认知:不是所有抓包工具都能“改包”。Wireshark是只能看不能改的(除非你手工构造报文再注入,那是另一个玩法),而Charles、Fiddler、Proxyman这类代理型工具,因为流量经过了它们,你可以在中间对数据做任意篡改,这也是接口联调和Mock测试非常依赖它们的原因。
所以在选择之前,先问自己一个问题:你是想知道“我的App为什么请求失败”,还是想知道“我的网络为什么这么慢”。前者用Charles/Fiddler/Proxyman,后者用Wireshark,思路一下就清晰了。
2. HTTPS解密原理:每条请求为什么默认都抓不到内容
用抓包工具的人,百分之八十的时间都耗在“怎么解密HTTPS”上。很多人卡在这里,就是因为不理解原理,只知道照着教程点点点,一旦环境和教程不一致就彻底懵了。搞懂了原理,你遇到任何异常都能自己推出来。
2.1 中间人代理到底做了什么
HTTPS的通信是加密的,正常情况下你在抓包工具里只能看到一堆乱码。抓包工具能解密,靠的是“中间人攻击”的思路——虽然这个词听着很吓人,但它也是抓包工具能用的原理。
以Charles为例,当你开启SSL Proxying后,它会在你的设备和目标服务器之间扮演一个“中间人”。你的设备连接的其实是Charles,Charles再代替你去连接真正的服务器。在这个过程中,Charles会生成一张它自己的证书,并让服务器那头建立起的是“设备—Charles”的加密通道和“Charles—服务器”的另一条加密通道。两边都是HTTPS,但Charles在中间充当“拆信人”,把两边的内容都解开看一下,再重新封装好发出去。这就是为什么客户端和服务器都感知不到异常,而抓包工具却能看到明文。
关键点来了:你的设备凭什么信任Charles的证书?如果不信任,客户端就会报证书校验失败,根本不让你连。所以你要做的事情,就是把Charles的根证书安装到设备上,并把它设置为“完全信任”。这一步就是你手机和电脑上所有“证书安装教程”要做的事。
2.2 各个端安装证书的通用流程
不管你是用哪款代理型工具,证书安装的思路是大同小异的。以Charles为例,整体分三步:
- 在电脑端打开Charles,菜单里找到 Help → SSL Proxying → Install Charles Root Certificate,先在电脑上安装一份根证书。Mac上装完后,记得在钥匙串里把这个证书设为“始终信任”,否则电脑端的浏览器一样会报错。
- 手机端要和电脑连同一个Wi-Fi,然后设置Wi-Fi的HTTP代理,指向你电脑的IP地址和Charles的默认端口8888。
- 手机浏览器访问
chls.pro/ssl,下载并安装证书。iOS还需要去 设置 → 通用 → 关于本机 → 证书信任设置 里,把Charles的证书开关打开。
Fiddler是类似的思路,只是地址换成了http://你的IP:8888,你在手机浏览器里访问后会看到一个Fiddler的证书下载页。Proxyman在iOS上更自动一点,它可以直接通过描述文件方式安装证书。
这里我很想单独提一个坑:Android 7.0 之后,系统默认不再信任用户安装的证书。你装好了证书,抓普通的浏览器流量没问题,但抓App内的HTTPS请求时会发现依然是加密的。这是因为App自己指定了只信任系统级证书,或者更严格地做了证书锁定。这种情况下,你需要把证书安装到系统证书目录,这意味着你的设备得先root。这是我工作中遇到最多次的“疑难杂症”,根源不在工具,而在Android的安全机制。
2.3 Wireshark解密TLS是另一套思路
Wireshark解密HTTPS,不走中间人那套。它更简单直接:你告诉它“SSL的会话密钥文件在哪里”,它拿密钥去解之前抓到的包。用环境变量SSLKEYLOGFILE指定一个文件路径,然后启动Chrome或Firefox,浏览器就会把会话密钥写进这个文件里。Wireshark里设置好这个文件的路径,重新加载抓包文件,HTTPS流量就能解出明文了。
这个方法的好处是,你不需要给系统装证书,也不会被App的证书锁定拦截;坏处是它只能解浏览器或者支持这个机制的程序,很多原生App根本不输出这个日志文件。所以Wireshark的TLS解密更适合“我在电脑上用浏览器访问某个服务,想分析一下通信细节”这种场景,App的加解密还是得靠Charles那套中间人方案。
3. 实战拆解:五个高频场景的操作要点与参数解析
工具选好了、证书装完了,接下来进入实际操作环节。我挑了五个大家在开发调试里最高频的场景,把每一步的操作要点和背后的参数逻辑一次性讲清楚。
3.1 手机抓包:一套流程搞定Charles与Proxyman
iOS和Android的抓包流程,核心逻辑是一致的:让手机的流量走电脑上的代理。但这里面有几个细节,处理不好就前功尽弃。
第一步是确保电脑和手机在同一个局域网,然后查看电脑的局域网IP地址。macOS上可以在 系统设置 → 网络 里看到,Windows在ipconfig里就能查到。然后手机Wi-Fi设置里选择手动代理,服务器填电脑IP,端口填工具的监听端口——Charles是8888,Proxyman默认是9090。
这里有一个我实测遇到的经典问题:手机设置了代理后,一开抓包工具就提示“Network is unreachable”或者干脆连不上。90%的原因是电脑防火墙拦截了监听的端口。解决方法是把对应端口加入防火墙入站规则,或者临时关掉防火墙测试确认是这个原因。另一个常见原因是手机和电脑连的“同一个Wi-Fi”其实处于AP隔离状态,比如公司网络、访客网络,手机和电脑之间不允许互相访问,这种情况换手机热点就能定位。
Proxyman在iOS上的体验比Charles好一点,它的证书安装流程更顺畅,而且在状态栏里可以直接看到每个请求的耗时和大小,对iOS开发者来说非常直观。如果你主要做iOS,Proxyman的Tab式多请求并发对比功能很实用,能同时打开多个请求做差异比较。
Android这边,抓App包之前建议先去开发者选项里看看,如果开了“网络安全配置”或者App配置了只信任系统证书,就需要另外处理。一般的第三方App还好,只要装了证书就能抓到,但像银行类、支付类App基本都有证书锁定,抓包工具只能拿到一个握手失败的结果。这种情况不要一根筋去破解App,换思路用Wireshark去看TLS层的元数据信息,同样是排查问题的有效路径。
3.2 弱网模拟:参数怎么设置才贴近真实环境
弱网测试是客户端开发者绕不开的环节。Charles的Throttle Settings和Fiddler的模拟调制解调器都能做,但很多人只是打开开关就完事,这其实是远远不够的。
Charles里按Shift + Command + T打开Throttle Settings,你会看到带宽、延迟、丢包率这些参数。我建议你不要用默认的预设,而是根据真实场景手动配置:
- 带宽:4G网络一般下行100Mbps、上行50Mbps起步,3G时代下行2Mbps、上行768Kbps。如果你写的是视频类App,应该模拟2Mbps左右;如果是IM工具,1Mbps都嫌高。
- 延迟:4G网络RTT大约30-50ms,3G是100-200ms,弱网环境可以到300ms以上。国内网络环境复杂,运营商跨网时延迟会翻倍,建议测试时至少测一遍150ms的场景。
- 丢包率:这是最容易被忽略的参数。真实网络环境下丢包率在0.1%到1%之间,但弱网场景会飙到3%-5%。丢包对TCP传输的影响是致命的——拥塞控制算法会直接把速率降下来,表现就是卡顿、超时。建议测试时设置2%丢包,感受一下你App的容错能力。
Fiddler的弱网模拟入口在 Rules → Performance → Simulate Modem Speeds,它模拟的是一个56Kbps的老式调制解调器,速度慢得离谱,适合做极端场景测试。但它的可配置性不如Charles,想在Fiddler里自定义带宽和丢包率,需要装FiddlerScript或者用扩展。如果你主要工作在Windows环境,建议加装一个叫做Simulate Network Conditions的扩展插件,能补上这个短板。
3.3 Mock数据与断点调试:让后端接口“按剧本演出”
前后端联调时最烦的事情就是后端还没写好接口,或者某一个异常分支不好触发。这时候Charles的Map Local和Breakpoints就派上用场了。
Map Local的意思是,指定某一个网络请求,让它直接返回你本地的一个文件内容。后端接口还没好时,你先写一个JSON文件,放在本地,然后在Charles里右键请求,选择Map Local,把请求映射到这个文件上。再刷新页面,你的前端拿到的就是Mock数据。这样前端开发和UI调试完全不用等后端。
另一个常用能力是Breakpoints断点。你可以在Charles里设置一个断点规则,命中某个URL时请求会暂停,这时你能手动修改请求参数再放行,也能等待服务器响应回来时修改响应内容。比如你要模拟“登录接口返回500”的场景,不用真的让后端出故障,直接在断点里把响应状态码改成500就行。这在测试异常分支时效率极高。
这里有一个经验:Charles的Map Local对本地文件路径有要求,如果路径包含中文或者空格,有些版本会加载失败。我习惯把所有Mock文件放在一个纯英文的目录下,比如/Users/me/mocks/,文件名也用全小写下划线风格,踩过几次中文路径的坑后就长记性了。
3.4 底层网络排查:Wireshark的过滤语法与“520字节之谜”
Wireshark和前面三个工具的用法完全不在一个维度。它不处理“业务”,只看“包”。学习Wireshark,过滤器是核心技能。显示过滤器(Display Filter)决定你能看到什么,抓包过滤器(Capture Filter)决定网卡上过滤掉什么。
比较常用的显示过滤器:
ip.addr == 192.168.1.10:只看这个IP地址的流量tcp.port == 443:只看443端口的流量http.request:只看HTTP请求tls.handshake.type == 1:只看TLS的ClientHello握手包tcp.analysis.flags:快速标出所有异常TCP报文,重传、乱序、零窗口都会特殊标色
这块内容平时积累几个核心的就够用了,别上来就背几百个过滤表达式。
关于“Wireshark为何只能显示520字节数据”这个问题,很多帖子都在问。我解释一下,这不是Wireshark的显示限制,而是TCP分段的结果。当你在Wireshark里看到数据包的长度只有520字节,大概率是因为TCP的MSS(最大分段大小)协商成了这个值,导致上层HTTP数据被拆成了多个段。MSS的值取决于链路层MTU,以太网MTU是1500字节,减去IP头20字节和TCP头20字节,MSS就是1460字节。而你看到的520字节,多半是握手时差了一个40字节的TCP Timestamp选项,减去后协商出来520字节,或者是中间链路有隧道协议导致MTU变小了。
怎么验证?直接在Wireshark里找到这个TCP流的Syn和Syn-Ack包,展开TCP Options,里面有MSS的值,一看就明白了。TCP层显示“520字节数据”是正常的协议栈行为,不是抓包工具漏数据,很多新手在这里纠结半天,其实是被表象迷惑了。真正要注意的是有没有TCP重传、乱序、快速重传这类异常标识,这些才说明网络有问题。
3.5 命令行场景下的另类选择:TraceEagle的轻量路线
如果说上面四款工具是“重型武器”,那TraceEagle就是一把随身小刀。它的优势场景在于:服务器上不方便装图形界面、只需要确认某个端口有没有流量、某个协议有没有连通性问题。TraceEagle打开后直接捕获报文,不需要配置代理、不需要装证书,输出也足够直观。
举个例子,你在服务器上排查“为什么这台机器连接数据库特别慢”,用TraceEagle抓一下MySQL的3306端口,看看TCP连接建立的时间花费、三次握手有没有重传、认证包有没有异常,基本一分钟就能定位是不是网络层面的问题。同样的需求,你用Wireshark得先解决远程桌面的繁琐,用tcpdump得熟悉命令参数,TraceEagle在“快速看两眼”这个需求上成本最低。
我自己的习惯是,服务器端临时抓包用TraceEagle,然后用Wireshark做深入分析——TraceEagle负责“找到问题范围”,Wireshark负责“看清问题细节”。这种组合打得很快,也省去了很多重复配置的精力。
4. 常见问题与排查技巧实录
这部分把我这些年被问到最多、自己踩过的坑整理一份速查表。每一类问题都附上了排查思路,遇到问题别慌,照着查就行。
| 现象 | 根本原因 | 解决方案 |
|---|---|---|
| 手机设置了代理但Charles/Fiddler抓不到任何包 | Wi-Fi代理没生效或端口被封 | 确认代理IP和端口,检查电脑防火墙放行8888端口,用手机浏览器访问chls.pro/ssl验证连通性 |
| 装了证书但HTTPS内容仍是密文 | 证书没被“完全信任” | iOS去 设置 → 通用 → 关于本机 → 证书信任设置 开启开关;Android确认是系统级证书而非用户级 |
| App能连网但Charles里看不到App的HTTPS请求 | App做了证书锁定 | 无法通过代理型工具解密,换Wireshark看TLS元数据,或改用SSLKeyLog方式解密浏览器流量 |
| Wireshark里只看到“520字节数据” | TCP分段+MSS协商值较小 | 看TCP握手包的MSS值,确认是协议行为还是MTU问题 |
| Fiddler卸载后电脑上不了网 | 系统代理残留 | 打开系统代理设置,关掉代理开关;清除注册表代理残留(HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings) |
| Charles打开后浏览器访问所有网站均报证书错误 | 根证书未在系统“始终信任” | macOS在钥匙串里找到Charles证书,设为始终信任;Windows在证书管理里导入并信任 |
| 抓包工具一开,App直接断网 | 证书校验失败或App安全策略 | 确认证书安装环境,尝试关闭抓包工具的SSL代理看网络恢复,判断是哪个环节拦截 |
| Proxyman抓iPhone包时部分请求丢失 | iOS版本低或代理配置文件冲突 | 确认使用描述文件完整安装,不要在Wi-Fi代理页面手动关掉代理开关 |
这里重点说两个“经典老坑”。
第一个是“Fiddler卸载后上不了网”。很多人卸载Fiddler后没有把系统代理恢复,Fiddler的代理设置会写进Windows系统代理,卸载时如果没有触发恢复操作,系统代理就一直指向一个已经消失的端口,网络请求自然直接失败。遇到这种情况,打开Windows设置 → 网络和Internet → 代理,把“使用代理服务器”开关关掉就好了。如果还是不行,再用注册表编辑器检查Internet Settings下面的ProxyEnable和ProxyServer键值,手动清理。
第二个是“Charles抓不到代理手机的包”。排查思路按顺序来:先用另一台设备验证当前配置能否连通,确认不是代理配置问题;再确认目标设备访问外网时有数据经过代理,可以用Charles的Access Control设置,看是否有连接记录;然后检查证书是不是装好了、信任了;最后绕回到App本身的网络安全配置。绝大多数情况下,问题是出在证书信任或者App的网络安全配置这两环,而不是Charles本身坏了。
5. 我的日常组合建议与上手路线
用了这么多年抓包工具,我形成了一套比较稳定的组合:开发调试主力用Charles,底层协议分析用Wireshark,临时排查用TraceEagle,iOS开发场景用Proxyman。这不是说某一个工具无敌,而是它们的优势场景恰好互补。Charles的断点和Mock能力目前还是最强;Wireshark的协议深度分析没有对手;Proxyman在macOS上最漂亮流畅;TraceEagle在“顺手看一下”的场景最不碍事。
如果你是刚入行,我的建议是这样的:先别贪多,选一款代理型工具专注练一练,推荐从Charles上手,教程多、资料全、跨平台,遇到问题搜一下基本都有答案。先把HTTP和HTTPS的请求结构弄明白,再学会配置证书、看Headers和响应体、理解Cookie和Session的传递过程。这阶段别碰Wireshark,容易劝退。等你在应用层调试顺手了,再打开Wireshark去学TCP/IP协议,那时候配合Charles看到的现象,能帮助你更快理解底层状态。
最后分享一个我自己觉得挺重要的习惯:抓包不要开着所有抓包开关一把梭。日常开发我通常只在Charles里配置需要关注的域名,勾选Include某个host,其他流量不去追。这样既不影响电脑上其他应用的网速,也让抓包结果不杂乱。排查问题时,先想“我到底要看什么类型的数据”,再开对应的抓包能力。这比抓一堆包回来再用过滤器筛,要高效得多。
抓包这个技能,本质上是“看见别人看不见的东西”。工具只是介质,真正值钱的是你在背后理解了网络是怎样一层层把数据从一端搬到另一端的。希望这篇内容能帮你少走点弯路,早点把抓包变成自己的日常技能。