空口抓包中的分片和聚合都涉及帧的组织方式,但处理的数据单位不同:
- 分片:把一个超长的大帧(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) |
+-----------------------------------+--------------+
- 序列号 (Sequence Number, 12 位):
- 标识属于同一个上层 MSDU 的所有分片。一个原始报文拆出的所有分片共享完全相同的序列号(0 ~ 4095 循环)。
- 片段号 (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 ]
- SIFS 短帧间间隔抢占:
- 片段 0 发送完毕后,接收端在等待一个 SIFS(Short Interframe Space,通常为 10~16µs)后立即回复 ACK 0;
- 发送端收到 ACK 0 后,无需重新执行 DIFS 和随机 Backoff,仅等待一个 SIFS 即可直接发送片段 1;
- SIFS 短于 DIFS/AIFS,让连续分片优先于重新开始竞争的节点发送。
- NAV(网络分配向量)虚拟载波监听:
- 片段 0 的
Duration字段会提前将覆盖到 ACK 0 + 片段 1 + ACK 1 的空中时间写入,更新周围所有监听节点的 NAV,防止被第三方节点抢占信道。
- 片段 0 的
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 - 关键特征:
- 连续几个数据帧具有相同的
wlan.seq(序列号); wlan.frag(片段号)从 0、1、2 依次递增;- 最后一个片段的
wlan.fc.more_frag == 0,其余片段均为1; - 片段之间紧跟着独立的 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 判断分片是否完整。调整分片阈值前,还要确认设备和当前传输模式是否支持;调整后对比重传量、吞吐和时延,判断减少重传的收益是否抵消了新增开销。