4. 802.11帧结构:帧格式详解
抓包分析这件事,说白了就是跟帧打交道。你连帧长什么样都不清楚,那抓下来的数据就是一堆乱码。今天咱们就把802.11帧的底裤扒干净,看看它到底是怎么组织的。
核心认知:802.11帧就像一封信——信封(帧头)告诉你谁发的、发给谁、怎么发的;信纸(帧体)才是真正要传的数据;最后的签名(FCS)用来验证信有没有被篡改。
4.1 帧结构总览
一个标准的802.11帧由三部分组成:帧头(MAC Header)、帧体(Frame Body)和帧校验序列(FCS)。帧头是固定的,帧体长度可变,FCS是4字节的CRC32校验。
我刚开始学的时候,总觉得帧头那30个字节记不住。后来发现,你只要抓住几个关键字段,其他都是辅助信息。下面这张图把帧的整体结构画清楚了:
4.2 Frame Control 字段详解
Frame Control是帧头里最重要的2个字节。它决定了这个帧是什么类型、怎么处理。我习惯把它拆成10个位字段来看:
| 位域 | 长度(bit) | 说明 |
|---|---|---|
| Protocol Version | 2 | 协议版本,目前固定为00 |
| Type | 2 | 帧类型:00=管理帧,01=控制帧,10=数据帧 |
| Subtype | 4 | 子类型,具体区分帧的功能 |
| To DS | 1 | 发往分布式系统(上行) |
| From DS | 1 | 来自分布式系统(下行) |
| More Frag | 1 | 是否还有后续分片 |
| Retry | 1 | 重传标志 |
| Pwr Mgt | 1 | 省电模式标志 |
| More Data | 1 | AP缓存更多数据 |
| Protected Frame | 1 | 加密标志 |
| Order | 1 | 严格顺序服务 |
实战技巧:抓包时,我第一眼就看Type和Subtype。比如看到Type=00, Subtype=1000,那就是Beacon帧。这个习惯帮我快速过滤掉99%的无关流量。
To DS和From DS这两个位很有意思。它们组合起来能判断帧的流向:
| To DS | From DS | 含义 | 典型场景 |
|---|---|---|---|
| 0 | 0 | IBSS内通信 | Ad-hoc网络 |
| 0 | 1 | AP→STA | 下行数据 |
| 1 | 0 | STA→AP | 上行数据 |
| 1 | 1 | WDS桥接 | 无线中继 |
4.3 Duration/ID 字段
这个字段身兼两职。大多数时候它表示NAV(Network Allocation Vector)时间,单位是微秒。NAV是802.11的虚拟载波检测机制——说白了就是告诉其他站点:「我要占用信道多久,你们先别说话」。
但有一种特殊情况:当帧类型是PS-Poll时,这个字段存放的是AID(Association ID)。AID是AP给关联站点分配的编号,范围1-2007。
我曾经踩过的坑:有一次分析一个Wi-Fi性能问题,发现某个站点频繁丢包。抓包一看,它的Duration字段总是设成32767(最大值)。这意味着它每次发送都声称要占用信道32ms,但实际上数据包很小。其他站点被它「吓」得不敢发数据,整个网络性能就崩了。这就是典型的NAV滥用攻击。
4.4 Address 字段
802.11帧最多可以有4个地址字段,每个6字节(MAC地址)。但大多数帧只用3个。地址的排列规则取决于To DS和From DS的值:
| To DS | From DS | Addr1 | Addr2 | Addr3 |
|---|---|---|---|---|
| 0 | 0 | DA(目的) | SA(源) | BSSID |
| 0 | 1 | DA(目的) | TA(发送者) | SA(源) |
| 1 | 0 | RA(接收者) | TA(发送者) | DA(目的) |
| 1 | 1 | RA(接收者) | TA(发送者) | DA(目的) |
你想想看,为什么需要这么多地址?因为无线网络里,数据包可能经过AP转发。比如你的手机发数据给AP,AP再转发给路由器。这时候源地址是你的手机,目的地址是路由器,但接收地址是AP。三个地址各司其职。
4.5 帧类型:管理帧、控制帧、数据帧
802.11定义了三种帧类型,每种都有自己的使命。我习惯用一句话概括:管理帧负责「谈情说爱」,控制帧负责「维持秩序」,数据帧负责「干正事」。
4.5.1 管理帧(Type=00)
管理帧是无线网络中最常见的帧类型。它们负责建立和维护连接。常见的子类型有:
- Beacon(1000):AP定期广播的信标帧,包含SSID、支持速率、信道等信息。抓包时,Beacon帧是定位AP的「灯塔」。
- Probe Request(0100)/ Probe Response(0101):站点主动探测AP,AP回复自己的能力信息。
- Association Request(0000)/ Association Response(0001):站点关联AP的过程。
- Authentication(1011)/ Deauthentication(1100):认证和解除认证。
- Disassociation(1010):解除关联。
实战案例:我记得有一次排查一个Wi-Fi频繁断连的问题。抓包发现,客户端每隔几秒就收到一个Deauthentication帧,但发送者不是AP,而是一个伪造的MAC地址。这就是典型的Deauth攻击。解决方案是在AP上开启管理帧保护(802.11w)。
4.5.2 控制帧(Type=01)
控制帧辅助数据帧的传输,它们不携带上层数据。常见的子类型:
- RTS(1011)/ CTS(1100):请求发送/允许发送,用于信道预约。
- ACK(1101):确认帧,收到数据帧后回复。
- PS-Poll(1010):省电轮询,站点从省电模式唤醒后向AP取数据。
- CF-End(1110)/ CF-End+CF-Ack(1111):无竞争周期结束。
控制帧有个特点——帧头只有Frame Control、Duration和Address1三个字段,没有帧体。所以控制帧非常短,通常只有14字节左右。
4.5.3 数据帧(Type=10)
数据帧承载真正的上层数据(IP包、ARP等)。子类型包括:
- Data(0000):普通数据帧。
- Data+CF-ACK(0100):带确认的数据帧。
- Data+CF-Poll(1000):带轮询的数据帧。
- Null(0100):空数据帧,没有帧体,用于省电模式状态通知。
抓包技巧:在Wireshark中,你可以用过滤表达式快速筛选:wlan.fc.type == 0(管理帧)、wlan.fc.type == 1(控制帧)、wlan.fc.type == 2(数据帧)。我个人习惯先过滤掉Beacon帧(!wlan.fc.type_subtype == 8),因为Beacon帧太吵了。
4.6 帧校验序列(FCS)
帧尾的4字节FCS是CRC32校验值。发送端计算整个帧(从Frame Control到帧体末尾)的CRC,接收端重新计算并比对。如果不一致,直接丢弃。
嗯,这里要注意:FCS校验失败不代表数据一定错了,也可能是抓包工具本身的问题。比如网卡驱动bug、USB抓包器信号干扰等。我遇到过好几次,抓包文件里大量FCS错误,但实际网络通信正常。后来换了块抓包网卡就解决了。
4.7 本章小结
802.11帧结构是无线抓包分析的基石。记住三个核心点:
- Frame Control 告诉你帧的类型和流向,是解析的起点。
- Duration/ID 控制信道占用,是理解无线介质访问的关键。
- Address字段 的排列规则取决于To DS/From DS,搞混了就会分析错方向。