3. 802.11 帧结构:管理帧、控制帧、数据帧的区别与作用
做无线抓包这么多年,我见过太多工程师对着抓到的报文一脸茫然。说白了,看不懂 802.11 帧结构,你就没法跟空口通信「对话」。这一章咱们就把帧结构拆开揉碎,讲清楚三类帧的区别,以及帧头里那些关键字段到底在说什么。
3.1 三类帧:管理、控制、数据
802.11 定义了三种帧类型,你可以把它们想象成网络世界里的三种「信使」:
- 管理帧:负责建立和维护连接。比如 Beacon、Probe Request/Response、Association Request/Response。
- 控制帧:负责协调信道访问。比如 RTS、CTS、ACK、Block ACK。
- 数据帧:负责承载上层数据。就是我们真正要传的 IP 包。
我记得刚入行时,有个老工程师跟我说:「你抓包先看 Frame Control 字段的前两位,00 是管理帧,01 是控制帧,10 是数据帧。」这句话我一直记到现在。
| 类型 (Type) | 子类型 (Subtype) | 帧类型 | 常见例子 |
|---|---|---|---|
| 00 | 1000 | 管理帧 | Beacon |
| 01 | 1011 | 控制帧 | RTS |
| 01 | 1100 | 控制帧 | CTS |
| 01 | 1101 | 控制帧 | ACK |
| 10 | 0000 | 数据帧 | Data |
wlan.fc.type == 0 只看管理帧,或者 wlan.fc.type == 2 只看数据帧。控制帧是 type 1。
3.2 帧头各字段解析
一个标准的 802.11 帧头有 24 字节(不含可选字段)。咱们挑几个最重要的字段来讲。
3.2.1 Frame Control(2 字节)
这个字段是整个帧的「身份证」。它包含了协议版本、类型、子类型、To DS、From DS、More Fragments、Retry、Power Management、More Data、Protected Frame、Order 等标志位。
我个人习惯先看 To DS 和 From DS 这两个位。它们决定了帧的流向:
- To DS=0, From DS=0:IBSS(Ad-hoc)模式,或者管理帧/控制帧。
- To DS=1, From DS=0:从 STA 发往 AP。
- To DS=0, From DS=1:从 AP 发往 STA。
- To DS=1, From DS=1:WDS 桥接模式。
3.2.2 Duration(2 字节)
Duration 字段用来设置 NAV(Network Allocation Vector)。说白了,就是告诉其他站点:「我要占用信道多久,你们在这段时间内别发数据。」
这个字段在控制帧里特别重要。比如 RTS 帧的 Duration 会覆盖整个数据交换过程(RTS + CTS + Data + ACK + 三个 SIFS)。CTS 帧的 Duration 则是 RTS 的 Duration 减去一个 SIFS 和一个 CTS 传输时间。
嗯,这里要注意:有些抓包工具会把 Duration 显示为微秒值,但实际在帧里是以 1 微秒为单位的整数。
3.2.3 Address 字段(4 × 6 字节)
802.11 帧最多可以有 4 个地址字段,分别是:
- Address 1:接收地址(RA)
- Address 2:发送地址(TA)
- Address 3:BSSID 或目的地址(DA)
- Address 4:仅在 WDS 模式下使用
你想想看,为什么需要这么多地址?因为无线帧在空口传输时,中间可能经过 AP 转发。比如一个 STA 发数据给另一个 STA,帧头里会同时包含源 MAC、目的 MAC、以及 AP 的 BSSID。
3.2.4 Sequence Control(2 字节)
这个字段包含两部分:
- Fragment Number(4 位):分片编号,范围 0-15。
- Sequence Number(12 位):序列号,范围 0-4095。
序列号是抓包分析里最常用的字段之一。每个发出的数据帧都会分配一个递增的序列号。如果抓到的报文里序列号出现跳变或重复,说明空口有问题。
我记得有一次排查一个 Wi-Fi 通话卡顿的问题,发现序列号经常出现大于 100 的跳变。这说明 AP 在大量丢帧,导致重传队列里的帧被跳过。后来发现是 AP 的 CPU 过载了。
3.3 三类帧的典型交互流程
咱们用一张图来展示 STA 连接 AP 时的帧交互过程:
从这张图你能看到,连接建立阶段全是管理帧。数据开始传输后,每个数据帧后面都跟着一个 ACK 控制帧。如果 ACK 没收到,发送方就会重传。
3.4 实战:如何通过帧结构定位功耗问题
功耗问题跟帧结构有什么关系?关系大了。我举两个例子:
- 过多的管理帧:如果 STA 频繁发送 Probe Request(比如每 30 秒一次),Wi-Fi 模块就会频繁唤醒,导致待机功耗飙升。我曾经在客户项目里看到,某个手机在息屏状态下每小时发送 120 次 Probe Request,直接导致待机功耗多了 15mA。
- 重传导致功耗增加:数据帧的 Retry 位被置 1 时,说明发生了重传。每次重传都要消耗额外的发射能量。如果重传率超过 5%,功耗就会明显上升。
3.5 小结
这一章咱们把 802.11 帧结构的核心内容过了一遍。三类帧各有分工,帧头里的 Duration、Address、Sequence Control 字段是抓包分析的关键。记住:管理帧管连接,控制帧管协调,数据帧管传输。下次抓包时,先看 Frame Control,再看序列号,你就能快速判断空口状态了。