3. Wireshark 基础操作与过滤语法

Wireshark 这工具,做无线抓包的人基本天天见。但说实话,我见过不少同事用了好几年,还只会点一下「开始捕获」然后看个热闹。真正遇到问题的时候,面对满屏的包,完全不知道从哪下手。

这一章,我就带你把它摸透。不是那种「菜单功能逐个讲」的说明书式教学,而是从实战出发,告诉你哪些功能真正有用,哪些可以跳过。

3.1 Wireshark 界面布局:别被吓到

第一次打开 Wireshark,很多人会被它的界面唬住。其实核心就四个区域,搞清楚了就很简单。

区域 名称 作用
1 包列表窗格 显示所有捕获到的数据包,一行一个
2 包详情窗格 选中某个包后,这里展示协议栈的逐层解析
3 包字节窗格 原始十六进制数据,和详情窗格联动
4 过滤栏 输入过滤表达式的地方,核心中的核心

我个人习惯,一上来先把包列表窗格拉宽,把「Info」列放到最大。为什么?因为大部分时候,你靠 Info 列的信息就能判断这个包在干什么,不需要点进去看详情。

小技巧: 按 Ctrl + + 可以快速放大字体,按 Ctrl + - 缩小。调试时盯着屏幕看一天,字体太小眼睛受不了。

3.2 捕获过滤器 vs 显示过滤器:别搞混了

这是新手最容易踩坑的地方。两个过滤器名字像,但用法完全不同。

捕获过滤器,是在抓包之前设置的。它决定「哪些包进到 Wireshark 的内存里」。一旦设了,没被过滤掉的包就永远丢了,再也找不回来。

显示过滤器,是在抓包之后用的。它只是把你不关心的包「藏起来」,数据还在内存里,随时可以恢复。

我举个例子你就明白了。你想想看,在一个繁忙的蓝牙环境中,每秒可能有上千个包。如果你只关心某个特定设备的广播包,用捕获过滤器直接把它筛进来,内存占用小,界面也清爽。但如果你不确定要抓什么,那就先全抓,再用显示过滤器慢慢分析。

对比项 捕获过滤器 显示过滤器
设置时机 抓包开始前 抓包开始后任意时刻
语法 BPF(类 tcpdump) Wireshark 专有语法
是否丢包 是,未匹配的包不捕获 否,只是隐藏
典型场景 高流量环境减少数据量 事后分析、逐步排查
避坑指南: 我曾经在调试一个 Zigbee 网络时,设了捕获过滤器只抓某个信道的数据,结果发现设备跳信道了,关键数据全没抓到。从那以后,除非确定信道固定,否则我宁愿多抓点数据,再用显示过滤器筛。

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 知识结构总览

下面这张图,把本章的核心知识点串起来了。你可以把它当作一个快速索引。

Wireshark 基础操作与过滤语法知识结构 Wireshark 基础操作与过滤语法 界面布局 捕获过滤器 显示过滤器 包列表窗格 包详情窗格 包字节窗格 过滤栏 BPF 语法(抓包前设置) Wireshark 语法(抓包后设置) BLE (btle) Zigbee (zbee) Wi-Fi (wlan) BLE 常用过滤 btle.advertising_address btle.access_address btle.channel Zigbee 常用过滤 zbee.pan_id zbee.src64 zbee.frame_type Wi-Fi 常用 wlan.addr wlan.bssid wlan.fc 核心原则:捕获过滤器用于减少数据量,显示过滤器用于事后分析

3.5 实战建议

最后,给你几个我自己的习惯,希望能帮你少走弯路。

  • 先全抓,再过滤。 除非你非常确定要抓什么,否则别用捕获过滤器。数据抓多了可以删,抓少了就得重来。
  • 过滤栏会变色。 输入过滤表达式时,背景变绿色表示语法正确,变红色表示有错误。别硬着头皮点 Apply。
  • 善用右键。 在包列表里右键某个字段,可以直接生成过滤表达式。这是最快的学习方式。
  • 保存过滤模板。 常用的过滤表达式,可以保存到 Wireshark 的过滤模板里,下次直接选。
小技巧: 按 Ctrl + E 可以快速开始/停止捕获。按 Ctrl + R 可以重新开始捕获。这两个快捷键我每天按几十次。