很多人在学习网络分析时,第一个装的工具就是 Wireshark,但很多人装了之后就停在"能抓包、不会看包"的水平。我自己的体会是,网络问题只要愿意抓包,基本就没有玄学。一次我们的服务接口偶发超时,前端说后端慢,后端说请求没到,两边吵了一下午。我打开 Wireshark 抓了两分钟包,发现三次握手正常,Request 发出去之后服务器迟迟不回 ACK,问题定位到网关,前后端立刻就不吵了。Wireshark 就是这样一个工具,它能把进出网卡的每一个数据包完整还原出来,大到 TCP 连接怎么建立,小到某个 HTTP 请求带了什么 Cookie,都能看得一清二楚。这篇文章是我多年使用 Wireshark 的实战经验整理,覆盖安装、界面、过滤器、HTTP/TCP 分析、手机模拟器抓包、无线蓝牙 USB 进阶,以及 tshark + Python 的半自动化分析,新手可以直接跟着上手,老手也能在异常排查部分找到共鸣。
1. 抓包前必须搞懂的底层逻辑:网卡、驱动与数据包
1.1 普通网卡为什么"看不见"别人的包
很多人第一次接触抓包,都会有一个疑问:为什么我用 Wireshark 抓到的包,全是发给自己的?这其实不是 Wireshark 的问题,而是网卡的默认行为决定的。
普通网卡在被操作系统接管之后,工作方式是"挑拣模式":网卡硬件会检查每个经过它的以太网帧,如果目标 MAC 地址不是自己,就直接丢弃,不会上报给协议栈。这样设计是为了省资源,毕竟一台电脑不需要处理整个局域网里所有设备的广播和通信。
Wireshark 抓包要做的,就是让网卡进入一种"来者不拒"的状态,也就是所谓的混杂模式(Promiscuous Mode)。混杂模式下,网卡会把经过自己的每一个帧都拷贝一份,交给上层分析程序。要实现这个能力,光靠 Wireshark 自己是不够的,它必须借助操作系统底层的抓包驱动。Windows 上,这个驱动就是Npcap;Linux 上则是内核提供的AF_PACKET套接字。
你可以把网卡想象成一个小区门口的快递柜,普通模式只收自己家的包裹,混杂模式则相当于快递员把每个经过柜子的面单都复印一份放在旁边供你查看。Wireshark 干的事情,就是蹲在快递柜旁边,把这些复印件按时间顺序整理成册。
1.2 Npcap 驱动、版本和管理员权限
安装 Wireshark 时,安装向导会提示你安装 Npcap,这一步务必选中。有人图快直接一路"Next",结果打开软件发现"找不到接口(No interfaces found)",根本没法抓包。Npcap 继承了老一代 WinPcap 的职责,但已经全面替代了它,WinPcap 早在几年前就停止维护了,不要再倒退回去装。
这里有几个容易踩的细节:
- 如果电脑上曾经装过 WinPcap,建议先去控制面板卸载干净,再装 Npcap。两个驱动的底层钩子容易冲突,典型症状是 Wireshark 能启动,但点击开始抓包后立刻报"Error opening adapter"。
- Npcap 安装时有一个"Support raw 802.11 traffic"的选项,如果你未来想抓无线空口流量,建议勾上。默认不勾其实也行,但刚需的人会后悔。
- Wireshark 建议用管理员权限运行。尤其在 Windows 上,普通权限打开后虽然能选接口,但开始捕获时经常提示权限不足,原因就是你没有权限将接口置入混杂模式。我工作电脑常年"以管理员身份运行",省了很多脏事。
版本方面,热搜里很多人在搜"Wireshark win64 3.0.0",这其实已经是 2019 年左右的老版本了。新装机器我建议直接去官网下最新的稳定版,4.x 系列对 Npcap 兼容性更好,界面和过滤语法也保持了向下兼容。除非你维护的旧系统是 Win7 且驱动锁死,否则没必要执着于 3.0.0。
1.3 选对网卡接口,不然抓到天荒地乱
打开 Wireshark 主界面,会列出当前设备所有可用接口:以太网、WLAN、蓝牙、Loopback(回环)、虚拟网卡等等。很多人抓不到包,不是因为工具坏了,而是接口选错了。
有线的请求,要选"以太网"或对应物理网卡;WiFi 的请求,要选"WLAN";访问本机服务、调试本地联调接口,要选Loopback: lo0(Windows 上一般叫 Npcap Loopback Adapter)。用虚拟机或模拟器时,还会出现虚拟交换机接口,比如雷电模拟器有时会虚拟出一个以太网适配器。
我习惯在抓包前做一步确认:打开终端 ping 一下路由器地址,比如ping 192.168.1.1,同时看 Wireshark 对应接口上有没有刷新的 ICMP 包。一分钟内没看到,基本就是接口选错了,而不是流量不存在。
2. 第一次上手:界面认知、ICMP 抓包与阅读顺序
2.1 主界面五个区域分别负责什么
Wireshark 主界面的排版十几年来变化不大,核心就五块:
- 菜单栏和主工具栏:包含开始/停止捕获、打开文件、保存、撤销等常用动作;
- 显示过滤器栏:输入过滤表达式,筛选当前已捕获的数据包;
- 数据包列表(Packet List):每一行是一个包,显示序号、时间、源地址、目标地址、协议、长度和简要信息;
- 数据包详情(Packet Details):点中列表里的某个包,这里会以树状结构解析每一层协议字段;
- 字节视图(Packet Bytes):以十六进制和 ASCII 展示原始报文内容。
大多数人一打开就被密密麻麻的列表吓住了。其实不用慌,凡是做协议分析,都是从外面往里面读:列表选包,详情看解析,字节对原文。
还有一个建议:初次使用的人先把时间显示格式改掉。默认情况下,时间列是从捕获开始算起的相对秒数,比如12.345678,这种格式适合看间隔,但不适合对时间。要改成"绝对时间",点击菜单View -> Time Display Format -> Date and Time,这样每行都能看到具体的几点几分几秒,排查线上问题的时候对日志方便得多。
2.2 用 ping 制造第一批 ICMP 数据包
第一次抓包,最稳妥的做法不是直接去抓浏览器的流量,而是先制造一批"确定性的流量"。我推荐用过 ICMP,因为协议结构简单、特征明显,非常适合练手。
操作流程如下。
- 以管理员身份打开 Wireshark;
- 在接口列表里选中你的 WLAN 或以太网接口,双击进入捕获;
- 打开 cmd,执行
ping 192.168.1.1 -n 5(换成你的网关地址即可); - ping 结束后回到 Wireshark,点击工具栏的红色方块停止捕获;
- 在显示过滤器栏输入
icmp,回车。
这时候你看到的就是 5 对 ICMP 报文,一对是Echo (ping) request,一对是Echo (ping) reply。这就是抓包的第一个小目标:你能清楚看到请求发出去了、回应也回来了,时间和序号一目了然。如果 ping 网关通了但 Wireshark 里看不到 ICMP,那大概率又是接口选错了。
2.3 看懂一个包从 Frame 到 Payload 的拆解过程
双击列表里的任意一个 ICMP 包,Packet Details 面板里会展开这样的层级:
- Frame:整个帧的元信息,包括抓包时间、帧长度、抓包接口;
- Ethernet II:链路层,包含源 MAC、目标 MAC、上层协议类型(0x0800 表示 IPv4);
- Internet Protocol Version 4:网络层,包含源 IP、目标 IP、TTL、标识符;
- Internet Control Message Protocol:传输以上的负载部分,里面是 ICMP 的类型、代码、校验和以及填充数据。
这个层级本身就是 OSI 模型的一个活教材。读包一定要养成"自下而上"的习惯,先看 Frame 是不是你要的那个流量,再看 MAC 和 IP 判断通信双方是不是你预期的设备,最后看协议字段本身。
我还经常遇到一种情况:列表里协议列显示的是TCP,但点开详情发现里面嵌套了 HTTP 数据。这说明 Wireshark 已经做了协议解码,你只需要继续往下展开Hypertext Transfer Protocol就能看到请求详情。如果协议列显示的是TCP而 HTTP 没有自动解码,通常是端口不在常用列表里,右键该包 →Decode As,手动把端口指定成 HTTP 即可。
3. 摆脱全量抓包:捕获过滤器与显示过滤器的组合打法
3.1 捕获过滤器和显示过滤器,到底差别在哪
Wireshark 里有两套过滤器,很多人从头到尾只用显示过滤器,甚至不知道捕获过滤器存在。两者的本质差异在于过滤发生的位置和时机。
捕获过滤器(Capture Filter)在抓包驱动层面就把包拦掉了,不满足条件的包根本不会进入 Wireshark,也不占内存和磁盘。它的优势是性能好、抓出来的文件干净,缺点是你没法事后找回被过滤掉的流量。显示过滤器(Display Filter)则是在所有包都已经进到 Wireshark 之后,只在界面上做一个"视图筛选",文件里其实还留着全部数据,随时可以改条件。
我的经验是分场景用:流量巨大、只关心某台主机某个端口的交互,就提前用捕获过滤器把范围缩小;如果流量可控,或者你需要反复从不同角度看同一批数据,就保持全量捕获,用完显示过滤器慢慢筛。比如你排查一个 App 的登录问题,最好全量抓,然后把http、tls、dns分别筛一遍,才能看清完整链路。
3.2 BPF 捕获过滤器:常用原语与组合逻辑
捕获过滤器使用的是BPF(Berkeley Packet Filter)语法,这个语法和显示过滤器完全不同,网上常说的"host、port、net"就是这一套。
举几个高频写法:
- 只抓某台主机的流量:
host 192.168.1.100 - 只抓某个网段:
net 192.168.1.0/24 - 只抓 80 端口:
tcp port 80 - 同时抓 DNS 和 Web:
tcp port 80 or udp port 53 - 指定方向和端口:
src host 192.168.1.100 and dst port 443
组合逻辑支持and、or、not,还可以用括号分组。注意,BPF 里src/dst能限定方向,这在排查"谁在主动发包"的问题时非常有用。
写捕获过滤器时我不建议一开始就写复杂的,可以用tcp port 443这种简单条件跑通,等确认能抓到目标流量,再逐步加网段和主机限制,以免一下过滤太严什么都看不到。
3.3 显示过滤器:字段表达式与右键生成技巧
显示过滤器是 Wireshark 的使用频率最高的功能,语法是"协议名.字段名 + 运算符 + 值",比如:
- 只看 ICMP:
icmp - 看指定 IP:
ip.addr == 192.168.1.100 - 看指定端口:
tcp.port == 443 - 看特定请求方法:
http.request.method == "GET" - 看 SYN 包:
tcp.flags.syn == 1 && tcp.flags.ack == 0 - 看 DNS 查询包含某个域名:
dns.qry.name contains "example.com"
字段名不用背。我更推荐一个高效做法:在数据包列表或详情面板中找到你感兴趣的字段,右键 →As Filter→Selected,Wireshark 会自动生成正确的过滤表达式。比如在详情里选中Sequence Number后再生成过滤器,你就不用纠结字段名是tcp.seq还是TCP.payload了。
显示过滤器还允许matches用正则、contains做子串匹配,以及用&&、||、!做逻辑组合,这一套吃透了,基本可以应对绝大多数分析场景。
3.4 一个最容易踩的坑:ip.addr 的双向匹配
新手特别容易在ip.addr == 1.2.3.4上栽跟头。这个表达式看着是"等于某个 IP",实际上等价于ip.src == 1.2.3.4 or ip.dst == 1.2.3.4,也就是只要这个包的任何一端是目标 IP,都会过滤出来。这在大多数情况下是好事,但如果你只想看"以这个 IP 作为源"的包,就要写成ip.src == 1.2.3.4。
还有一个相关的小坑:过滤器里写tcp.port == 80,会同时匹配源端口和目的端口,想限定方向同样要写tcp.srcport或tcp.dstport。方向限定是排查流量是否"主动外联"的关键手段,建议从第一次实战就养成使用 src/dst 的习惯。
4. HTTP 与 TCP 分析实战:从三次握手到请求耗时拆解
4.1 用 SYN、SYN-ACK、ACK 读完整连接建立
TCP 是绝大多数网络问题绕不开的协议。抓包看 TCP,第一件事就是看三次握手。
在浏览器访问任意一个 HTTP 网站,然后筛选tcp.port == 80,你会看到头三个包:
- 第 1 个包:客户端发起连接,Flags 里
SYN置位,seq是一个随机的初始序号; - 第 2 个包:服务器回应
SYN + ACK,既有对客户端 seq 的确认,也有自己的初始序号; - 第 3 个包:客户端回
ACK,连接建立完成。
为什么是三次而不是两次?最经典的解释是防止历史过期连接请求突然延迟到达,导致服务器误以为新连接建立、白白浪费资源。客户端收到 SYN-ACK 后确认"我的请求没问题,你也确实想连接",服务器收到 ACK 后确认"对方收到了我同意连接的应答",双方才真正达成一致。同时,TCP 的 seq 序号采用随机初始值,而不是从 0 开始,主要是为了防止伪造报文和连接串扰,这也是抓包时你能看到 seq 是一串大数的原因。
实际排查中,三次握手缺失往往意味着流量被拦截,多出现重传则意味着网络丢包,这些都可以在 Wireshark 的列表里直接看到。
4.2 HTTP 过滤与请求、响应、状态码的高效查看
在 Wireshark 里看 HTTP,最常用的过滤是http或http.request。展开详情后,能看到请求行(Method + URI + HTTP Version)、Headers、消息体三个部分。响应则能看到状态行、状态码和响应头。
很多人手动翻包看请求很费眼,其实 Wireshark 提供了一个统计视图:Statistics -> HTTP -> Requests。这个表格会按时间顺序列出所有 HTTP 请求的请求方法、URI、状态码,以及服务器响应第一个字节的时间。我排查接口慢问题时,第一眼就看这个表格,能把"某个请求卡了 3 秒"直接定位出来。
如果是查看整个会话的载荷内容,更粗暴的方法是右键任意 HTTP 包 →Follow -> TCP Stream,Wireshark 会把同一 TCP 流里的所有数据组合成连续文本,左边是客户端上行、右边是服务器下行,接口联调时两边传了什么参数,一眼就能看完。这个方法比逐一翻包高效得多,是我用得最多的功能之一。
4.3 HTTPS 解密:SSLKEYLOGFILE 这台"打开保险箱的钥匙"
HTTPS 的包在 Wireshark 里默认是密文,TLS 层下面就是加密数据,看不到明文。要让 Wireshark 解密,最正规、最常用的方法,是让浏览器或客户端把每次 TLS 会话的密钥写到一个日志文件里,Wireshark 读取这个文件后自动解密。这就是SSLKEYLOGFILE机制。
具体步骤:
- 在系统里新建一个环境变量:
SSLKEYLOGFILE,值设为某个路径,比如C:\Users\me\keys.log; - 重启浏览器或应用程序(确保它读取了新环境变量);
- 在 Wireshark 里点击
Preferences -> Protocols -> TLS,在(Pre)-Master-Secret log filename里填上同一个文件路径; - 重新抓包访问 HTTPS 网站,TLS 层下面就会多出 Decrypted 数据,HTTP 明文清晰可见。
这个机制不是 Wireshark 的漏洞,而是 TLS 规范里为了调试而预留的接口,浏览器官方也支持。日常调试自己的客户端和测试环境完全够用。不建议讨论任何通过伪造证书实现的中间人破解方案,一是容易触碰合规红线,二是现在很多 App 都做了证书固定,强行绕过既违法又费力,正规做法是让应用开发团队在 debug 包里放开关。
4.4 重传和 RTT:快速判断是网络不行还是应用慢
TCP 最直观的故障信号是重传(Retransmission)。Wireshark 会把重传包在列表里灰显,并用[TCP Retransmission]标注。如果一次请求里出现大量重传,基本可以断定链路有丢包,可能是网络拥塞、数据包过大、或者上游防火墙随机 drop。这时候不要急着查应用,先解决网络层。
另一个指标是 RTT(Round Trip Time),也就是从发送一个包到收到确认之间的时间。Wireshark 在 TCP 详情里有[Timestamps]和iRTT字段。如果 RTT 普遍 1ms-10ms,网络非常健康;如果动辄几百毫秒,说明链路或中间设备有问题。
我常用的判断顺序是:先看有没有 SYN 重传,有的话是握手上游连接都不通;再看已经建立连接的数据段重传比例,高的话网络丢包;如果重传很少,但应用层迟迟不返回数据(客户端 Request 发出去之后,服务器 ACK 回来的时间和 Server response 的间隔拉得很大),那问题多半在应用逻辑或数据库查询,不在网络。这条判断顺序能帮你避免把时间浪费在错误的方向上。
5. 手机 App 与模拟器抓包:从环境搭建到失败排查一条龙
5.1 为什么手机流量不经过电脑网卡
很多人刚学抓包时会困惑:我手机用着同一个 WiFi,为什么电脑上 Wireshark 看不到手机的流量?原因很简单,手机流量根本不会出现在你电脑的网卡上。普通 Wi-Fi 网络中,数据包从手机到路由器,再从路由器到服务器,电脑如果不在转发路径上,网卡就碰不到这些帧。
要让手机流量"路过"电脑,最常用的方式是把电脑变成一个 HTTP/HTTPS 代理,让手机把需要调试的流量先发给电脑,电脑再用 Wireshark 抓取。这也是 Fiddler、Charles 这类工具站在 Wireshark 旁边的原因——Wireshark 善于看底层包,代理工具善于解密和修改请求。
5.2 雷电模拟器抓包:网卡选择与代理配置
模拟器抓包比真机简单,但也更容易翻车。以雷电模拟器为例,安装并启动后,Windows 上通常会出现一个新的虚拟以太网适配器。你在 Wireshark 的接口列表里可能会看到它,名字类似"Ethernet instance 0"或带雷电字样的虚拟网卡。选中它抓包,就能看到模拟器里的网络流量。
如果你希望抓 HTTP/HTTPS 明文,更舒服的做法是,在模拟器的系统设置里进入 Wi-Fi 设置,把代理指向宿主机的 IP 和代理端口(比如 Fiddler 默认 8888,Charles 默认 8888)。宿主机在跑代理工具的同时再开着 Wireshark,就能既看到原始 TCP 包,又能用代理看解密后的应用层数据。
雷电模拟器抓不到包,常见原因有三个:一是选错了网卡接口,选成了物理机主网卡,自然抓不到虚拟机的流量;二是代理端口被防火墙拦截,Windows 弹窗时直接取消了,可以在入站规则里放行对应端口;三是模拟器重启后网卡名称变化,导致过滤了对错了接口,重新看一下接口列表即可。
5.3 手机真机远程抓包与证书信任
真机抓包的核心就是三步:同一局域网、把手机 WiFi 代理指向电脑、装证书。
先在电脑上跑一个代理工具(Fiddler 或 Charles),记下电脑在局域网里的 IP,比如192.168.1.10:8888;然后在手机 WiFi 设置里修改代理,填上这个 IP 和端口。这时候手机上的 HTTP 流量已经能通过电脑转发了,Wireshark 里能看到 TCP 包,代理工具里能看到 HTTP 明文。
HTTPS 流量如果没有额外处理,在代理工具里会显示为"CONNECT 隧道",看不到内容。正常流程是在手机浏览器里访问http://抓包工具的IP:端口,下载并安装代理工具的 CA 根证书。Android 7.0 之后有一个非常重要的变化:默认情况下,App 不再信任用户安装的 CA 证书,只信任系统证书。这意味着你即使装了证书,很多 App 的 HTTPS 包照样报证书错误。
遇到这种情况,千万不要去搜什么 Hook 绕过方案,那属于攻击手法,合规风险极高。正规的开发调试姿势是:让应用团队的 debug 包在 AndroidManifest 中声明networkSecurityConfig,允许信任用户证书;或者把测试环境的 App 装上系统证书(需要 root 或刷机方案,且仅限公司测试机)。一句话,超纲的别碰,调试口径的可以谈。
另外,现在的开发调试工具已经更新换代了,比如Reqable可以在 PC 端直接辅助调试小程序和部分桌面 App 的流量,whistle在 macOS 上做代理规则配置也很方便。这些工具和 Wireshark 不是替代关系,而是互补关系:Wireshark 提供最底层的证据,代理工具提供最友好的交互。
5.4 抓包失败的常见原因与处理清单
抓包失败的问题,我在各种技术群里见过太多次。这里整理一个高频原因表,可以直接对着查。
| 现象 | 可能原因 | 处理办法 |
|---|---|---|
| 手机代理后无法上网 | 手机和电脑不在同一网段,或防火墙拦截了代理端口 | 确认同一局域网,放行电脑端口 |
| HTTPS 全是 CONNECT 隧道 | 未安装根证书,或 App 不信任用户证书 | 安装根证书;或协调 debug 包开启调试开关 |
| 模拟器抓不到任何包 | 选错网卡/代理未设置 | 选虚拟网卡接口,正确设置 Wi-Fi 代理 |
| 打开网卡时报权限错误 | Wireshark 未以管理员运行 | 右键管理员身份启动 |
| 切到新接口后无流量 | 接口隔离/网卡混淆 | 按接口逐一测试,ping 制造流量确认 |
| 抓包文件巨大卡顿 | 全量抓包未过滤 | 重新用捕获过滤器缩小范围,分批保存 |
还有个小经验,抓包之前先在手机上做一个"确定性操作",比如打开 App 后点击"设置"页面,让流量在某个特定时机产生。这样抓完后在 Wireshark 里按时间排序,能快速定位到目标流量,比抓五分钟乱七八糟的推送消息高效得多。
6. 进阶过程中的高频疑问:中文乱码、无线、蓝牙与 USB
6.1 中文为什么显示成"....":字符编码与 Follow Stream 解决
很多人在 Wireshark 的字节视图里看到中文变成了一排点,第一反应是"抓包工具是不是对中文不友好"。其实不是,这是字节视图默认按 ASCII 解码造成的。中文字符的 UTF-8 编码是连续的多字节,大部分字节落在 ASCII 可显示范围之外,因此被显示成点号。
最直接的解法:找到数据包详情里对应的字符串字段(比如 HTTP 消息体里的 JSON 字符串),右键该字段 → 可以看到 Wireshark 已经将很多字段按 UTF-8 正确解码了,直接看详情面板里的值即可。如果你非要看原始字节里的满屏中文,可以用Follow TCP Stream,然后在弹窗底部的"Show data as"下拉框里选择"UTF-8",中文就能正常显示了。
顺带提一句,在 Wireshark 里查看十六进制字节时,不要只看右侧的 ASCII 区域。真正要核对的往往是十六进制的原始内容本身,比如某个魔数、某个编码后的 Token,这时把关注点放到 Hex 列反而更准确。
6.2 无线网卡抓包:AX210 为什么那么难
想抓无线空口流量(也就是看别人设备的 WiFi 包),普通无线网卡默认做不到。无线网卡在普通模式下,和有线网卡一样,只处理发给自己端口的帧。要让 Wireshark 看到整个信道的帧,需要无线网卡进入监听模式(Monitor Mode)。
这里有个现实问题:Intel AX210 是一块非常适合日常使用的 WiFi 网卡,但 Windows 官方驱动不支持监听模式。你在 Windows 的 Wireshark 里选中 AX210 抓包,只能看到自己这台设备收发 WiFi 流量对应的逻辑包,抓不到附近设备的管理帧和空口广播。想真正抓无线空口,常见做法是在 Linux 环境下用工具把网卡切换进监听模式,或者在硬件层面选择支持监听模式的 USB 无线网卡。这也是为什么老鸟常推荐"抓 WiFi 用外置网卡 + Linux 虚拟机"的组合。
很多人在热搜里搜"ax210 抓包",如果只是抓自己设备的流量,那不需要监听模式,Windows 下直接选 WLAN 接口即可。如果目标是分析邻居设备的设备发现行为,要在 Linux 下进行监听模式配置,再配合 Wireshark 解析 802.11 帧,保存时默认会包装成 Radiotap 头,字段里可以看到信号强度、信道、速率等信息。
6.3 蓝牙 BLE 抓包:不只看数据,还要看广播
蓝牙 BLE 的流量不在 WiFi 网卡上,Wireshark 是通过蓝牙适配器的 HCI 接口来捕获的。Windows 下如果安装了蓝牙驱动,启动 Wireshark 后,捕获接口里可能出现蓝牙相关的接口;Linux 下更常用btmon或通过 socat 桥接 HCI 日志。
BLE 流量分两类:广播(Advertising)和连接数据(Connection Data)。广播包不需要建立连接,设备周期性地在小范围信道上广播自己的设备地址、服务 UUID 和服务数据,这也是很多物联网设备做设备发现的方式。Wireshark 中 BLE 协议的展示字段一般是btle开头的,比如你要只抓某个 MAC 地址的 BLE 广播,可以用显示过滤器btle.advertising_address == 00:11:22:33:44:55,注意以你当前版本里右键字段生成表达式为准。
抓 BLE 包里比较实用的字段是广播数据里的Flags、Complete Local Name以及服务 UUID。我曾经调试一个智能手环,App 连不上设备,抓包后立刻发现广播包里没有预期的服务 UUID,设备的固件配置压根没加载,问题直接指向硬件固件,而不是手机兼容性。
6.4 USB 抓包与 VLAN 标签的解析思路
USB 抓包是个相对小众但关键时刻救命的需求。Windows 下 Wireshark 通过USBPcap驱动抓取 USB 总线上的帧。安装 Wireshark 时勾选 USBPcap 组件,机器重启后 Wireshark 的接口列表里就能看到 USB 总线接口。抓 USB 包之前,注意要选对应的 Host Controller 接口,并在设备接入状态下抓取,你才能看到设备的枚举过程 URBs。
USB 抓包最适用的场景是开发 HID 设备、调试 USB 转串口乱码、以及排查 U 盘无法识别等驱动底层问题。Wireshark 里会解析出usb.capdata等字段,配合过滤可以看到具体传输的数据内容。
另一个进阶问题是 VLAN。当你在交换机 Trunk 口或者端口镜像上抓包,数据包在以太网帧头之后会多出一段 802.1Q VLAN 标签,Wireshark 会把它解析成 VLAN ID 和优先级。过滤 VLAN 用vlan.id == 10即可。初级工程师看到 VLAN 标签可能会误以为包坏了,其实这是镜像端口没有做 VLAN 剥离导致的,属于正常现象。如果只想看某个 VLAN 的流,在显示过滤器里加vlan.id就行,不用重新抓包。
7. 半自动化分析:tshark 与 Python 让抓包沉淀成工具
7.1 tshark 命令行:没有图形界面也能抓包
Wireshark 带了一个命令行兄弟叫tshark,安装 Wireshark 时会一并安装。在没有图形界面的服务器上,或者想批量处理大量 pcap 文件时,tshark 比 GUI 高效得多。
常用命令我贴几个。
抓包接口上抓 100 个包后自动停止:
tshark -i eth0 -c 100从已有 pcap 文件里过滤出 HTTP 请求,并提取源 IP 和 URI:
tshark -r trace.pcapng -Y "http.request" -T fields -e ip.src -e http.request.uri查看 TCP 会话统计:
tshark -r trace.pcapng -z conv,tcp在服务器上排查问题时,我通常直接tshark -i eth0 -c 10000 -w /tmp/online.pcapng先落盘,再把文件传到本地用 Wireshark 图形界面慢慢看。服务器上不装图形界面也能完整抓包,这本身就是一个很实用的能力。
7.2 Pyshark 常见问题:Python 2.7 与路径不兼容
热搜里有一条"python2.7+pyshark 无法抓包问题",这是典型的老环境受害者。现在 pyshark 早就抛弃了 Python 2.7,最低要求是 Python 3.6 以上,所以如果你的机器还是 Python 2.7 环境,装不上、用不了,非常正常。
除了版本,pyshark 最常见的两个坑:
- 找不到 tshark 可执行文件:pyshark 不是自己解析 pcap,而是调用 tshark 再把结果转成 Python 对象。如果安装后报
Could not find tshark binary,要设置环境变量TSHARK_PATH指向 tshark 的绝对路径; - 权限不足:使用
LiveCapture抓实时流量时,在 Linux 上需要 root 权限,否则没有权限打开网络接口。当然你也可以单独给 python 进程附加cap_net_raw能力,但在开发环境里直接 sudo 跑最简单。
Windows 上还要注意 pyshark 依靠 npcap,如果 npcap 没装好,会报Npcap is required。装好之后再用pyshark.LiveCapture(interface='WLAN')就能跑通。
7.3 一个小脚本:自动提取 URL 与状态码
写了一个很实用的 Python 脚本,可以把一个 pcap 文件里所有 HTTP 请求的 Method、Host、URI 和响应状态码全部整理出来,帮助快速预览整个抓包文件的 HTTP 交互记录。
import pyshark cap = pyshark.FileCapture( 'web.pcapng', display_filter='http', use_ek=True ) for pkt in cap: try: http = pkt.http method = http.request_method uri = http.request_uri host = http.host if hasattr(http, 'host') else '' status = http.response_code if hasattr(http, 'response_code') else '' print(f'{method} http://{host}{uri} -> {status}') except AttributeError: continue注意,FileCapture里的display_filter='http'本质还是生成一次 tshark 过滤调用。如果你在程序里大量读取包,建议处理完一个包就手动释放,避免内存被 pcap 文件撑爆。pyshark 在数据量大的时候性能和 tshark 直接处理有差距,但胜在能用 Python 做后续的逻辑判断,适合写自动化巡检脚本。
这篇文章里提到的操作,我基本上都踩过对应的坑。抓包这件事,核心不是背熟所有过滤语法,而是想清楚自己到底要证明什么、排除什么。先用确定性流量确认环境通了,再用过滤器缩小范围,最后用协议字段给出结论。这套思路配合 Wireshark 的界面和命令行能力,能解决绝大部分网络层和应用层的疑难杂症。顺手再分享一个习惯:每次抓包前,我都会在手机或终端做一个"已知结果"的动作,比如 ping 一次、刷新一次页面,然后在 Wireshark 里快速找到那个时间点。这样做的好处是分析时永远有一个锚点,不至于面对一堆协议字段无从下手。抓包只是手段,定位问题才是目的,希望这篇文章能让你少走几段我走过的弯路。