3. Wireshark 基础操作与过滤语法
Wireshark 这工具,做无线抓包的人基本天天见。但说实话,我见过不少同事用了好几年,还只会点一下「开始捕获」然后看个热闹。真正遇到问题的时候,面对满屏的包,完全不知道从哪下手。
这一章,我就带你把它摸透。不是那种「菜单功能逐个讲」的说明书式教学,而是从实战出发,告诉你哪些功能真正有用,哪些可以跳过。
3.1 Wireshark 界面布局:别被吓到
第一次打开 Wireshark,很多人会被它的界面唬住。其实核心就四个区域,搞清楚了就很简单。
| 区域 | 名称 | 作用 |
|---|---|---|
| 1 | 包列表窗格 | 显示所有捕获到的数据包,一行一个 |
| 2 | 包详情窗格 | 选中某个包后,这里展示协议栈的逐层解析 |
| 3 | 包字节窗格 | 原始十六进制数据,和详情窗格联动 |
| 4 | 过滤栏 | 输入过滤表达式的地方,核心中的核心 |
我个人习惯,一上来先把包列表窗格拉宽,把「Info」列放到最大。为什么?因为大部分时候,你靠 Info 列的信息就能判断这个包在干什么,不需要点进去看详情。
Ctrl + + 可以快速放大字体,按 Ctrl + - 缩小。调试时盯着屏幕看一天,字体太小眼睛受不了。
3.2 捕获过滤器 vs 显示过滤器:别搞混了
这是新手最容易踩坑的地方。两个过滤器名字像,但用法完全不同。
捕获过滤器,是在抓包之前设置的。它决定「哪些包进到 Wireshark 的内存里」。一旦设了,没被过滤掉的包就永远丢了,再也找不回来。
显示过滤器,是在抓包之后用的。它只是把你不关心的包「藏起来」,数据还在内存里,随时可以恢复。
我举个例子你就明白了。你想想看,在一个繁忙的蓝牙环境中,每秒可能有上千个包。如果你只关心某个特定设备的广播包,用捕获过滤器直接把它筛进来,内存占用小,界面也清爽。但如果你不确定要抓什么,那就先全抓,再用显示过滤器慢慢分析。
| 对比项 | 捕获过滤器 | 显示过滤器 |
|---|---|---|
| 设置时机 | 抓包开始前 | 抓包开始后任意时刻 |
| 语法 | BPF(类 tcpdump) | Wireshark 专有语法 |
| 是否丢包 | 是,未匹配的包不捕获 | 否,只是隐藏 |
| 典型场景 | 高流量环境减少数据量 | 事后分析、逐步排查 |
3.3 常用过滤表达式:实战三板斧
过滤表达式是 Wireshark 的灵魂。下面这三个协议,是我们做无线 MCU 开发最常碰到的。
3.4.1 Bluetooth Low Energy (btle)
BLE 的过滤,核心是理解它的链路层结构。每个 BLE 包都有一个接入地址(Access Address),广播包的接入地址固定是 0x8E89BED6。
# 只看 BLE 广播包
btle.advertising_address == 00:11:22:33:44:55
# 只看某个连接的数据包
btle.access_address == 0x12345678
# 只看 BLE 广播信道(37/38/39)
btle.channel == 37 || btle.channel == 38 || btle.channel == 39
# 综合:看某个设备在广播信道上的所有包
btle.advertising_address == 00:11:22:33:44:55 && (btle.channel == 37 || btle.channel == 38)
嗯,这里要注意。BLE 的广播地址分两种:公共地址和随机地址。如果你发现过滤不出来,先看看地址类型对不对。
3.4.2 Zigbee (zbee)
Zigbee 的过滤,核心是 PAN ID 和短地址。我调试 Zigbee 网络时,最常用的就是下面这几个。
# 只看某个 PAN 网络
zbee.pan_id == 0x1A2B
# 只看某个设备的入网包
zbee.src64 == 00:12:4b:00:12:34:56:78
# 只看 Zigbee 信标帧
zbee.frame_type == 0
# 只看数据请求(设备轮询父节点)
zbee.frame_type == 1 && zbee.dst == 0x0000
zbee.frame_type == 1 && zbee.dst == 0x0000 过滤后发现,设备发送数据请求的频率异常高,导致父节点来不及响应。调整了轮询间隔后,问题解决。
3.4.3 Wi-Fi (wlan.addr)
Wi-Fi 的过滤相对简单,核心就是 MAC 地址。但要注意,Wi-Fi 包里有三个地址字段:源地址、目的地址、BSSID。
# 只看某个设备发出的包
wlan.addr == 00:11:22:33:44:55
# 只看某个 AP 下的所有包
wlan.bssid == aa:bb:cc:dd:ee:ff
# 只看 Probe Request(设备扫描)
wlan.fc.type_subtype == 4
# 只看 Beacon 帧
wlan.fc.type_subtype == 8
说白了,wlan.addr 是个「偷懒」的写法,它会同时匹配源地址和目的地址。如果你只想看某个设备发出的包,用 wlan.sa;只想看发给它的,用 wlan.da。
3.4 知识结构总览
下面这张图,把本章的核心知识点串起来了。你可以把它当作一个快速索引。
3.5 实战建议
最后,给你几个我自己的习惯,希望能帮你少走弯路。
- 先全抓,再过滤。 除非你非常确定要抓什么,否则别用捕获过滤器。数据抓多了可以删,抓少了就得重来。
- 过滤栏会变色。 输入过滤表达式时,背景变绿色表示语法正确,变红色表示有错误。别硬着头皮点 Apply。
- 善用右键。 在包列表里右键某个字段,可以直接生成过滤表达式。这是最快的学习方式。
- 保存过滤模板。 常用的过滤表达式,可以保存到 Wireshark 的过滤模板里,下次直接选。
Ctrl + E 可以快速开始/停止捕获。按 Ctrl + R 可以重新开始捕获。这两个快捷键我每天按几十次。