4. 802.11帧结构:帧格式详解

抓包分析这件事,说白了就是跟帧打交道。你连帧长什么样都不清楚,那抓下来的数据就是一堆乱码。今天咱们就把802.11帧的底裤扒干净,看看它到底是怎么组织的。

核心认知:802.11帧就像一封信——信封(帧头)告诉你谁发的、发给谁、怎么发的;信纸(帧体)才是真正要传的数据;最后的签名(FCS)用来验证信有没有被篡改。

4.1 帧结构总览

一个标准的802.11帧由三部分组成:帧头(MAC Header)、帧体(Frame Body)和帧校验序列(FCS)。帧头是固定的,帧体长度可变,FCS是4字节的CRC32校验。

我刚开始学的时候,总觉得帧头那30个字节记不住。后来发现,你只要抓住几个关键字段,其他都是辅助信息。下面这张图把帧的整体结构画清楚了:

802.11 帧结构总览 MAC Header(帧头)—— 30字节 Frame Body(帧体) FCS Frame Control Duration/ID Addr1 Addr2 Addr3 SC QC HT 关键说明: • Frame Control(2字节):帧类型、协议版本、标志位等核心控制信息 • Duration/ID(2字节):NAV设置或PS-Poll中的AID • Address 1-3(各6字节):接收地址、发送地址、BSSID等 • SC(2字节):序列控制,用于去重和排序

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帧结构是无线抓包分析的基石。记住三个核心点:

  1. Frame Control 告诉你帧的类型和流向,是解析的起点。
  2. Duration/ID 控制信道占用,是理解无线介质访问的关键。
  3. Address字段 的排列规则取决于To DS/From DS,搞混了就会分析错方向。