IEEE 802.11 分片机制

分片标识、发送时序、加密与抓包识别

Posted by Yvain Zhang on December 8, 2024 主题:技术

空口抓包中的分片和聚合都涉及帧的组织方式,但处理的数据单位不同:

  • 分片:把一个超长的大帧(MSDU)拆分成多个小片段(Fragments / MPDUs)独立发送,核心目标是抗干扰与提升可靠性;
  • 聚合:把多个数据单元打包成一个超大物理帧(A-MSDU / A-MPDU)一次性发出,核心目标是摊薄信道竞争开销、提升吞吐量。

下面以传统 MAC 分片为例,说明帧头标识、传输时序和抓包特征。


1. 为什么需要 802.11 MAC 层分片?

在存在误码或干扰的信道上,长帧可能需要重传更多数据。分片把一次重传的范围缩小到单个片段,同时增加帧头和确认开销。

如果一个 1500 字节的 IP 报文在空中传输时最后几个字节遭遇干扰出错:

  • 未分片场景:接收端 CRC 校验(FCS)失败,整帧被丢弃,发送端必须重新退避并重传整整 1500 字节;
  • 分片场景:若将其拆为 3 个 500 字节的片段,即使第 3 个片段损坏,前 2 个片段已经成功 ACK 确认,发送端只需重传最后 500 字节。

是否值得分片,需要比较减少的重传量与新增的协议开销,不能仅凭信号弱或频段拥挤就判断收益。


2. 帧头格式与分片标识字段

802.11 MAC 帧头通过以下字段精确控制和识别分片:

+-------------------+-------------------+------------------------+
| Frame Control (2B)| Duration/ID (2B)  | Address Fields (6B*3/4)|
+-------------------+-------------------+------------------------+
| Sequence Ctrl(2B) | QoS Control (2B)  | Frame Body (0-2304B)   |
+-------------------+-------------------+------------------------+
| FCS (4B)          |
+-------------------+

2.1 序列控制字段 (Sequence Control)

序列控制字段占用 2 字节(16 位),明确划分了两级编号:

 15                                4 3            0
+-----------------------------------+--------------+
|       Sequence Number (12 bits)   | Frag Num(4b) |
+-----------------------------------+--------------+
  1. 序列号 (Sequence Number, 12 位):
    • 标识属于同一个上层 MSDU 的所有分片。一个原始报文拆出的所有分片共享完全相同的序列号(0 ~ 4095 循环)。
  2. 片段号 (Fragment Number, 4 位):
    • 标识当前片段在该报文中的序号。从 0 开始单调递增,下一个片段为 1,依此类推。
    • 理论分片上限:由于片段号只有 4 位,一个 MSDU 最多只能被拆分为 16 个片段(0~15)。

2.2 更多分片标志 (More Fragments)

在 2 字节的 Frame Control 字段中,第 2 字节包含 More Fragments 标志位(第 13 位):

  • More Frag = 1:表明后续还有属于本序列号的后续分片;
  • More Frag = 0:表明当前片段是该报文的最后一个片段(或者未分片报文)。

3. SIFS 连续突发与信道保护机制

802.11 的分片突发传输(Fragmentation Burst)允许连续片段通过 SIFS 间隔发送,减少重复竞争信道的开销:

发送端: [ 片段 0 ] ──SIFS──>                [ 片段 1 ] ──SIFS──>
           │                                    │
           ▼                                    ▼
接收端:             <──SIFS── [ ACK 0 ]                   <──SIFS── [ ACK 1 ]
  1. SIFS 短帧间间隔抢占:
    • 片段 0 发送完毕后,接收端在等待一个 SIFS(Short Interframe Space,通常为 10~16µs)后立即回复 ACK 0;
    • 发送端收到 ACK 0 后,无需重新执行 DIFS 和随机 Backoff,仅等待一个 SIFS 即可直接发送片段 1;
    • SIFS 短于 DIFS/AIFS,让连续分片优先于重新开始竞争的节点发送。
  2. NAV(网络分配向量)虚拟载波监听:
    • 片段 0 的 Duration 字段会提前将覆盖到 ACK 0 + 片段 1 + ACK 1 的空中时间写入,更新周围所有监听节点的 NAV,防止被第三方节点抢占信道。

4. 分片与无线加密(AES-CCMP / TKIP)的交互

在启用 WPA2(AES-CCMP)或 WPA3(GCMP)的安全网络中,分片与加密是如何协同工作的?

4.1 独立封装与解密原则

IEEE 802.11 标准明确规定:分片发生在加密之前,每个片段作为独立的 MPDU 进行单独封装和加密。

[ 上层 MSDU 原文 ]
       │
       ▼ (分片)
[ 片段 0 数据 ]                 [ 片段 1 数据 ]
       │                               │
       ▼ (独立 AES-CCMP 加密)          ▼ (独立 AES-CCMP 加密)
[ CCMP头 | 密文 0 | MIC 0 ]     [ CCMP头 | 密文 1 | MIC 1 ] (Packet Number 单调递增)
  • 数据完整性保证:每个分片拥有独立的 CCMP 头部(8 字节)和消息完整性校验码(MIC,8 字节),且每个分片的包序列号(Packet Number, PN)依次递增;
  • 容错优势:接收端每收到一个片段即可立即硬件解密并校验 MIC,确认无篡改后放入重组缓存。即使某个片段中途丢失,也不会导致前面已收到的片段因无法解密而废弃。

5. 分片 vs 帧聚合(A-MSDU / A-MPDU)对比

特性维度 802.11 分片 (Fragmentation) 802.11n/ac/ax 帧聚合 (Aggregation)
主要目标 提升弱网/干扰环境下的可靠性 消除协议头部与退避开销,提升吞吐
核心机制 将大 MSDU 拆成多个独立小 MPDU 将多个 MSDU/MPDU 打包为一个超大 PPDU
确认机制 逐片独立 SIFS + 单独 ACK 块确认机制(Block ACK, BA 一次确认数十个子帧)
信道适用度 强干扰、低 SNR、高误码率信道 高信噪比、高速率(5GHz/6GHz)清洁信道
现代应用现状 默认分片阈值通常设为 2346B(几乎不触发) 现代 Wi-Fi 标配核心技术

注意:在 Wi-Fi 4/5/6 中,A-MPDU 聚合子帧与分片是互斥的,通常规范不允许对 A-MPDU 内部的子帧再次进行传统分片。


6. 实战:抓包识别与驱动配置

6.1 Wireshark 抓包特征

在 Wireshark 中过滤并定位 802.11 分片:

  • 过滤条件:wlan.fc.frag > 0 || wlan.fc.more_frag == 1
  • 关键特征:
    1. 连续几个数据帧具有相同的 wlan.seq(序列号);
    2. wlan.frag(片段号)从 0、1、2 依次递增;
    3. 最后一个片段的 wlan.fc.more_frag == 0,其余片段均为 1;
    4. 片段之间紧跟着独立的 ACK 帧(Delta Time 约等于 SIFS)。

6.2 Linux 驱动分片阈值配置

在 Linux 下可以通过 iw 或 iwconfig 调整分片阈值(frag):

# 查看当前无线网卡分片阈值
$ iwconfig wlan0 | grep -i "fragmentation"

# 将分片阈值设置为 512 字节(低于 512 字节不分片,高于则切片)
$ sudo iwconfig wlan0 frag 512

# 恢复默认不分片设置(设为最大 2346 字节或 off)
$ sudo iwconfig wlan0 frag off

7. 总结

抓包时可结合序列号、片段号和 More Fragments 判断分片是否完整。调整分片阈值前,还要确认设备和当前传输模式是否支持;调整后对比重传量、吞吐和时延,判断减少重传的收益是否抵消了新增开销。