第 4 章:802.11n(Wi-Fi 4)— 立交桥时代
"当单车道的路堵到极限时,唯一的出路就是建立交桥。"
本章导读
2009 年,IEEE 正式发布了 802.11n(也称为 HT,High Throughput)——这是 WiFi 历史上最大的一次技术飞跃。它引入了 MIMO(Multiple Input Multiple Output,多输入多输出)技术,用多条天线同时传输不同数据,把多径衰落从"敌人"变成了"朋友"。加上 40 MHz 信道绑定、帧聚合、Block ACK 等机制,理论速率从 54 Mbps 一跃提升到 600 Mbps。
本章你将学到:
- MIMO 的核心原理:如何在同一条路上同时跑多辆车
- 空间流(Spatial Stream):立交桥的每一层
- 波束成形(Beamforming):定向绿灯 + 专用车道
- 信道绑定(Channel Bonding):把两条路合并成一条
- 帧聚合(A-MSDU / A-MPDU):一辆大卡车代替十辆小车
- Block ACK:批量签收确认
- MCS 0-31(及特殊 MCS 32):调制编码方案的完整体系
- 这一代暴露了什么新缺陷
1 为什么需要 MIMO?—— 单天线的物理极限
1.1 Shannon-Hartley 定理:速率的天花板
无线信道的最大容量由 Shannon-Hartley 定理给出:
1 | C = B × log₂(1 + SNR) |
其中 C 为容量(bps),B 为带宽(Hz),SNR 为信噪比。
以 20 MHz 带宽、30 dB SNR 为例:
1 | C = 20×10⁶ × log₂(1 + 1000) ≈ 200 Mbps |
单天线系统已经接近这个理论极限。要继续提升速率,唯一的出路是增加维度——时间、频率、或空间。
1.2 MIMO 的核心思想:空间维度
MIMO 利用空间维度来提升容量:多条天线同时发射不同的数据流。
关键突破:MIMO 把多径传播从问题变成了优势。在传统系统中,信号通过不同路径到达接收端会导致衰落(某些频率被抵消)。但在 MIMO 中,这些不同路径恰恰提供了额外的"空间信道"——每个路径可以独立传输一份数据。
交通比喻:想象一个十字路口,传统 SISO 只有一条单车道的路。MIMO 就像建了一座立交桥——上层跑东向西的车,下层跑西向东的车,互不干扰。如果天线更多(比如 4×4),就像建了 4 层立交桥,每层独立通行。
1.3 空间流(Spatial Stream)
空间流是 MIMO 的基本单位——每个空间流携带一份独立的数据。
| 配置 | 空间流数 | 理论速率(20MHz, MCS 7) |
|---|---|---|
| 1×1 SISO | 1 | 65 Mbps |
| 2×2 MIMO | 2 | 130 Mbps |
| 3×3 MIMO | 3 | 195 Mbps |
| 4×4 MIMO | 4 | 260 Mbps |
空间流数的限制:空间流数 ≤ min(发射天线数, 接收天线数)。所以 4×4 MIMO 最多 4 个空间流,2×2 最多 2 个。
空间流就像立交桥的层数。4 层立交桥(4×4 MIMO)可以同时跑 4 路车(4 个空间流)。但如果你只有 2 个入口(2 个发射天线),最多只能用 2 层。
1.4 MIMO 与天线的关系
802.11n 支持最多 4 条空间流,但实际设备中:
- 手机/笔记本:通常 1-2 条空间流(2×2 或 1×1)
- AP/路由器:通常 2-4 条空间流(2×2 到 4×4)
- 理论最大:4×4 MIMO,4 条空间流
2 波束成形(Beamforming)— 定向绿灯
波束成形是 MIMO 的高级功能:通过调整多条天线的信号相位,把能量集中在特定方向。
无波束成形就像十字路口中间的路灯——照亮四面八方。波束成形就像定向绿灯——知道目标车辆在哪,把信号集中照过去。具体映射:调整多条天线的信号相位,就像转动一排定向路灯的灯头,让所有灯头同时对准目标车辆,光在同一个方向叠加;获取 CSI 反馈,就像车辆实时报告自己的位置,路灯才知道该朝哪个方向照——显式反馈回传的压缩 CSI,就像车辆定期寄回的「位置报告单」,路灯照着报告单上的方位转灯头。这样在同样功率下,目标方向的信号更强,覆盖更远。
802.11n 的波束成形:
- 标准定义了波束成形的框架
- 但没有规定具体的实现方式——不同厂商的实现不兼容
- 这导致 802.11n 的波束成形在实际中很少被使用
- 802.11ac 后来引入了显式反馈机制,解决了这个问题
波束成形生效的前提是发射端知道信道状态信息(CSI),获取 CSI 有两条路。隐式反馈依赖信道互易性——上下行同频、信道对称,发射端用接收端的探测帧反向估计信道,省去回传开销;但真实射频链路增益不对称需校准,各厂商校准算法不统一——校准不统一使上下行链路增益不对称,信道互易性被破坏,隐式反馈测得的 CSI 失真,波束方向随之偏移,因此难以互通。显式反馈则让接收端把测得 CSI 量化后封装进反馈帧回传。802.11n 虽定义了显式反馈框架,却没规定统一量化格式——各厂商各做各的,反馈无法被对端解析,这正是"框架已定义却互不兼容"的根源。
3 信道绑定(Channel Bonding)— 把两条路合并成一条
3.1 40 MHz 信道
802.11n 引入了 40 MHz 信道绑定:把两个相邻的 20 MHz 信道合并成一个 40 MHz 信道。
20 MHz 就像一条双向两车道的路。40 MHz 就像把两条相邻的路合并成一条双向四车道的大路——车道翻倍,通行能力翻倍。
3.1.1 子载波数量:不是简单翻倍
40 MHz 用 128 点 FFT(20 MHz 是 64 点),子载波翻倍了吗?没有——实际总子载波是 114,不是 56×2=112。
| 参数 | 20 MHz | 简单×2 | 40 MHz 实际 |
|---|---|---|---|
| FFT 点数 | 64 | 128 | 128 |
| 总子载波 | 56 | 112 | 114 |
| 数据子载波 | 52 | 104 | 108 |
| 导频子载波 | 4 | 8 | 6 |
40 MHz 为什么不是简单翻倍?因为合并时"省"下了中间的隔离带,但也多了一点开销:
- 边缘保护带省了:HT 20 MHz 左右共留 7 个空子载波当保护带,两个 20 MHz 就是 2×7=14 个;40 MHz 合并后中间交界处是连续频谱,只需 11 个保护子载波,省下 3 个可以用来传数据。
- DC null 反而多了一个:20 MHz 各需 1 个 DC 空子载波,40 MHz 合并后要 3 个(中心 -1/0/+1),比 2×1=2 多出 1 个。
一省一多,净多出 3−1=2 个子载波(114 vs 112)。所以 40 MHz 的子载波利用效率略高于"简单翻倍"——FFT 点数加倍,但浪费的子载波没有加倍。
两条路合并时,中间的隔离带和两侧路肩不需要重复建——省下的空间可以多画一条车道。所以实际车道数比 2×2=4 还多一点。
3.2 信道绑定的挑战
在 2.4 GHz 频段,只有 3 个不重叠的 20 MHz 信道(1/6/11)。使用 40 MHz 信道绑定后,整个 2.4 GHz 频段只能容纳 1 个 40 MHz 信道!这在密集环境中几乎不可用。
在 5 GHz 频段,最多有 25 个不重叠的 20 MHz 信道,使用 40 MHz 绑定后仍有 12 个不重叠信道,情况好得多。
| 频段 | 20 MHz 信道 | 40 MHz 信道 | 实用性 |
|---|---|---|---|
| 2.4 GHz | 3 | 1 | 低(干扰严重) |
| 5 GHz | 25 | 12 | 高 |
此外,40 MHz 在混合 20/40 环境下还需额外保护机制:L-SIG TXOP Protection 用 L-SIG 的 duration 字段向旧 20 MHz 设备通告本次 TXOP(Transmission Opportunity,传输机会)时长,让它们设 NAV 静默。旧设备之所以能读到这个 duration,是因为 40 MHz 的 HT-Mixed 前导码会把 L-SIG(连同 L-STF/L-LTF 等兼容字段)在两个 20 MHz 子信道上各复制一份——无论旧设备停在主信道还是副信道,都能解出 duration 字段并设 NAV。设备还可置 40 MHz Intolerant 位声明「无法容忍 40 MHz」,AP 看到后须退回 20 MHz。这些保护开销会吃掉一部分信道绑定的实际增益。
4 帧聚合 — 一辆大卡车代替十辆小车
帧聚合是 802.11n 提升吞吐量的另一个关键机制。先看看没有帧聚合时,普通发送是什么样的:
报文类型:Data(Type=10, Subtype=0000),ACK(Type=01, Subtype=1101)。
每帧独立竞争信道、独立等待确认——大量时间浪费在"等红灯"上。802.11n 引入了两种聚合方式来解决这个问题。
4.1 A-MSDU(聚合 MAC 服务数据单元)
A-MSDU 把多个 MSDU(MAC Service Data Unit)聚合到一个 MPDU 中。下图左侧展示了 A-MSDU 的组装流程,右侧用"装大箱子"的比喻说明其工作原理:
注意:A-MSDU 只产生一个 MPDU,因此只需普通 ACK 确认即可。这也是它和 A-MPDU 的关键区别之一——A-MPDU 包含多个独立 MPDU,才需要 Block ACK 配合逐帧确认。
4.1.1 A-MSDU 的最大长度:7935 从哪来?
文档中经常出现的 7935 Bytes 并非凭空而来,它由协议直接定义。IEEE 802.11-2024 中,A-MSDU 的最大长度由 HT Capability Information 字段中的 Maximum A-MSDU Length 子字段(1-bit)决定:
| 编码 | 最大 A-MSDU 长度 | 对应最大 MPDU 长度 | 差值 |
|---|---|---|---|
| 0 | 3839 Bytes | 3895 Bytes | 56B |
| 1 | 7935 Bytes | 7991 Bytes | 56B |
可以看到,A-MSDU 最大长度 = MPDU 最大长度 - 56 字节。这 56 字节是 A-MSDU 之外的 MPDU 开销,由 MAC Header + FCS + 安全封装组成,由协议直接定义,而非某个公式推导的结果。
注意:当 A-MSDU 放入 A-MPDU 时,受 Delimiter 的 MPDU Length 字段限制(HT 为 12-bit,最大 4095),即使设备声明支持 7935 的 A-MSDU,在 HT A-MPDU 中实际只能用到 4095 字节以内。
4.2 A-MPDU(聚合 MAC 协议数据单元)
A-MPDU 把多个 MPDU 聚合到一个 PHY 帧中,每个 MPDU 有独立的 FCS。
A-MPDU 的优势:
- 每个 MPDU 有独立的 FCS,可以单独确认
- 如果某个 MPDU 损坏,只需重传那个 MPDU
- 配合 Block ACK,效率极高
A-MPDU 就像组一支车队——4 辆货车各装一批货,组成编队一起出发,只派一辆领队车(PHY Preamble)开路,只等一次红灯(DIFS+Backoff)。到了目的地,老板拿一张清单(Block ACK)一次性签收:A 到了、B 到了、C 丢了、D 到了——只需补发 C,不用重跑整个车队。
下图左侧展示了 A-MPDU 的完整组装流程(MSDU → 加 MAC 头 → 加 Delimiter → 聚合填充 → 加 PHY 头 → Block ACK),右侧用交通比喻展示了从"4 辆车各跑一趟"到"组成车队一趟送完"的变化:
报文类型:图中涉及的帧——Data(Type=10, Subtype=0000),Block ACK(Type=01, Subtype=1001)。
不过,车队不是想组就组的——要让接收方按 Block ACK 的方式「只补发一辆车」,双方得先立个规矩。
4.2.1 使用 A-MPDU 前要先"办证"——ADDBA 协商
A-MPDU 不能直接使用,通信双方必须先通过 Block ACK 会话协商:
- 发送方发 ADDBA Request(Action 帧):告诉接收方"我要开始用 A-MPDU 了"
- 接收方回 ADDBA Response:同意并约定参数(BA 窗口大小、超时时间等)
- 协商完成后才允许发送 A-MPDU
就像车队出发前要先跟目的地报备——"我们 5 辆车要一起过来",对方同意了才出发。没报备就直接开过去,对方不认。
4.2.2 ADDBA 协商的具体内容
ADDBA Request 和 ADDBA Response 都是 Block Ack 类别的 Action 帧(IEEE 802.11-2024 §9.6.4),核心字段如下:
ADDBA Request 帧(Table 9-466):
| 字段 | 说明 |
|---|---|
| Category | Block Ack(值 3) |
| Block Ack Action | ADDBA Request(值 0) |
| Dialog Token | 非零值,用于匹配 Request/Response |
| Block Ack Parameter Set | 核心参数(见下表) |
| Block Ack Timeout Value | 超时时间(TU),0 = 不超时 |
| Block Ack Starting Sequence Control | 本次协议下第一个 MSDU/A-MSDU 的序列号 |
ADDBA Response 帧(Table 9-467) 在 Request 基础上多一个 Status Code(同意/拒绝),其余字段相同。
4.2.3 Block Ack 参数详解(§9.4.1.13 / §9.4.1.14)
这是 ADDBA 协商中最关键的参数字段,共 2 字节:
| 子字段 | 位数 | 说明 |
|---|---|---|
| A-MSDU Supported | 1-bit | 1 = 本协议下允许使用 A-MSDU |
| Block Ack Policy | 1-bit | 非 DMG STA 固定为 1 |
| TID | 4-bit | Traffic ID——指定哪条业务流(0-15) |
| Buffer Size | 10-bit | 接收方可缓存的 MPDU 数量(0-1023) |
- TID(Traffic Identifier):对应 802.11e 的 4 个 AC(Access Category),每个 TID 独立协商一个 Block ACK 协议。比如语音(TID 6)和视频(TID 4)各自有自己的 Block ACK 窗口
- Buffer Size:接收方在 ADDBA Response 中声明自己能同时缓存多少个 MPDU。发送方的发送窗口不能超过这个值——否则接收方缓存溢出会丢帧
- A-MSDU Supported:如果为 1,表示该 Block ACK 协议下可以使用 A-MSDU in A-MPDU 双重聚合;为 0 则只允许普通 MPDU
紧随其后的 Block Ack Timeout Value(§9.4.1.14)也是 2 字节,单位是 TU(Time Unit,1 TU = 1024 µs):如果在这段时间内没有任何使用该 Block ACK 协议的帧交换,协议自动终止——设为 0 表示不超时(协议一直有效直到手动删除),典型值如 5000 TU ≈ 5.12 秒。Block Ack Starting Sequence Control 则告诉接收方"我的第一个数据帧的序列号是多少",让接收方知道从哪个序号开始构建 bitmap。
交通比喻总结:ADDBA 协商就像车队出发前填写的报备单——
- TID:走哪条专线(货运/客运/急救)
- Buffer Size:目的地仓库能同时收多少辆车的货
- Timeout:报备有效期多久
- Starting Sequence:车队第一辆车的编号
- A-MSDU Supported:每辆车上能不能再装大箱子(A-MSDU)
双方签字(ADDBA Response)后,协议生效,车队才能出发。
协议还定义了 DELBA 帧(Table 9-468),用于主动终止已建立的 Block ACK 协议——就像车队取消报备,后续恢复逐帧发送+逐帧确认的模式。
协商管的是「这一批帧怎么确认」,但 A-MPDU 帧本身在物理上是怎么拼起来的?这就要看每个 MPDU 前夹着的分隔符了。
4.2.4 Delimiter 的结构
每个 A-MPDU 的 4 字节 Delimiter 包含以下字段:
- Reserved(4-bit):保留位。802.11ac/ax 中,其中 2 位被用作 MPDU Length High,把长度字段扩展到 14-bit,最大 16383 字节
- MPDU Length(12-bit):记录后续 MPDU 的长度,最大 4095 字节。A-MPDU 的结束由最后一个 MPDU Length = 0 的 Delimiter 标记
- CRC(8-bit):校验 Reserved 和 MPDU Length 字段是否损坏
- Delimiter Signature(8-bit):固定为 ASCII 'N'(0x4E),用于在 Delimiter 出错后重新定位后续 Delimiter 的边界
MPDU Length 就像车队每辆车的"货物重量标签",接收方先看标签知道这辆车装了多少货,再决定怎么处理。最后一个 Length = 0 的 Delimiter 就像车尾灯——看到它就知道车队到此结束。
Delimiter 用 MPDU Length 字段标定了每个 MPDU 的边界,顺着这个长度字段往下,自然引出下一个问题:单个 MPDU 本身最多能有多长?
4.2.5 单个 MPDU 的最大长度
除了 A-MPDU 总长度有限制,单个 MPDU 也有最大长度。这个长度由三个因素共同决定:
1. 协议标准规定(IEEE 802.11-2024 Table 9-313)
VHT/HE/EHT 的 Maximum MPDU Length 能力字段(2-bit)编码三种 MPDU 最大长度(802.11n HT 没有这个字段):
| 编码 | 最大 MPDU 长度 | 适用标准 |
|---|---|---|
| 0 | 3895 Bytes | HT / VHT / HE |
| 1 | 7991 Bytes | HT / VHT / HE |
| 2 | 11454 Bytes | VHT / HE / EHT |
| 3 | Reserved | — |
注意:这个 2-bit 字段是 VHT/HE/EHT 的能力,802.11n(HT)没有定义它——HT 的单个 MPDU 受 Delimiter 12-bit 字段限制在 4095 字节以内,只能靠聚合多个 MPDU 组成更大的 A-MPDU。VHT/HE/EHT 设备通常声明 7991 或 11454 字节。
2. Delimiter 的 MPDU Length 字段容量
- 802.11n:12-bit → 最多记录 4095 字节(超出 4095 的 MPDU 只能作为非聚合单帧发送)
- 802.11ac/ax/be:14-bit → 最多记录 16383 字节
3. 接收方的 Buffer 能力
接收方通过 HT Capabilities 元素的 A-MPDU Parameters 字段(不是 ADDBA Response)声明自己的聚合接收能力:
- Maximum A-MPDU Length Exponent:指数值(802.11n 取值 0-3),实际最大长度 = 2^(13+exponent) - 1
- exponent=3 → 最大 2^16 - 1 = 65535 Bytes
- exponent=7 → 最大 2^20 - 1 = 1048575 Bytes(1 MB,802.11ac 及之后)
- Buffer Size:在 ADDBA Response 的 Block Ack Parameter Set 中声明,接收方能同时缓存的 MPDU 数量(在 Block ACK 窗口内)
交通比喻:目的地仓库(接收方)会在车队出发前告诉发送方——"我的仓库最多能同时接收 64 辆车的货"(Buffer Size)和"单件货物不能超过 10 公斤"(Maximum MPDU Length)。发送方必须按这个限制来装车。
4.3 A-MSDU vs A-MPDU
| 特性 | A-MSDU | A-MPDU |
|---|---|---|
| 聚合层次 | MSDU 级别 | MPDU 级别 |
| FCS | 整体一个 FCS | 每个 MPDU 独立 FCS |
| 错误处理 | 一个出错,全部重传 | 只重传出错的 MPDU |
| 开销 | 更低(更少的帧头) | 稍高(每个 MPDU 有分隔符) |
| 最大长度 | 7935 字节 | 65535 字节 |
| 实际使用 | 较少 | 更常用 |
两种聚合在出错时的重传策略也完全不同:A-MSDU 只有一个 FCS,无法定位是哪个子帧出错,只能整体重传;A-MPDU 每个 MPDU 有独立 FCS,配合 Block ACK bitmap 精确标记,只重传出错的 MPDU。
交通比喻:A-MSDU 像一个大箱子——封箱胶带(FCS)验出问题,不知道是哪件货坏了,只能整箱退回重发。A-MPDU 像车队——每辆车有自己的货物清单(FCS),到了目的地逐辆核对,哪辆坏了只重发哪辆。
聚合得越多,单次传输占用的信道时间也越长——聚合的上限不只看长度字段,还受信道占用时间约束。实际聚合数量还受 TXOP 限制——发送方能占用信道的最大时间:DCF 模式下没有严格的 TXOP 限制,但 EDCA(QoS)模式下每个 AC 有最大 TXOP;聚合帧太大 → 占用信道时间太长 → 其他 STA 饥饿。因此厂商通常会在聚合数量和信道公平性之间取平衡。
交通比喻:就像车队不能无限长——你占着路不让别人走,交警(AP)会让你先让一让。
既然 A-MPDU 和 A-MSDU 一个赢在灵活、一个赢在省开销,能不能把两者叠起来用?
4.3.1 A-MSDU in A-MPDU:双重聚合
"组合使用"指的是:A-MPDU 的每个 MPDU 内部包含的是 A-MSDU,而不是普通的单个 MSDU。
- 外层 A-MPDU:多个 MPDU,各自独立 FCS → 只重传出错的 MPDU
- 内层 A-MSDU:每个 MPDU 里塞多个 MSDU → 减少 MAC 头开销
- 效果:兼顾了 A-MSDU 的低开销和 A-MPDU 的灵活重传
车队里每辆卡车不是只装一件货,而是装了一个大箱子(A-MSDU),箱子里打包了好几件小包裹。这样既减少了车队里的车辆数(MPDU 数),又保留了"哪辆车坏了只重发那辆"的灵活性。
4.3.2 最多能聚合多少个包?
聚合上限由最大聚合长度和单个包大小共同决定:
| A-MSDU | A-MPDU | |
|---|---|---|
| 802.11n 最大长度 | 7935 Bytes(通常 3839) | 65535 Bytes |
| 802.11ac | 11454 Bytes | 1048575 Bytes(1 MB) |
| 802.11be | 11454 Bytes | 4194304 Bytes(4 MB) |
以 1500 Bytes MSDU(典型以太网 MTU)为例:
- A-MSDU:每个子帧 = 6(SA)+ 6(DA)+ 2(Len)+ 1500(Data)= 1516B(4B 对齐)→ 7935 ÷ 1516 ≈ 5 个
- A-MPDU:每个 MPDU ≈ 36(MAC头)+ 1500(Data)+ 4(FCS)+ 4(Delimiter)= 1544B → 65535 ÷ 1544 ≈ 42 个
| 包大小 | A-MSDU(11n) | A-MPDU(11n) | A-MPDU(11ac) |
|---|---|---|---|
| 1500B | ~5 个 | ~42 个 | ~600+ 个 |
| 100B | ~50+ 个 | ~300+ 个 | 数千个 |
实际中受限于 TXOP 时间、信道条件和厂商实现,一般不会用满上限。
4.4 实战:如何在 Sniffer 中区分?
在 Wireshark 抓包时,可以通过以下方法判断帧是否经过聚合、以及是哪种聚合:
| 判断方法 | A-MSDU | A-MPDU |
|---|---|---|
| QoS Control bit 7 | = 1(A-MSDU Present) | = 0 |
| HT Control bit | — | = 1(A-MPDU Present) |
| MPDU 数量 | 1 个 MPDU | 多个 MPDU(每个有独立 FCS) |
| Payload 结构 | 单个 MPDU 内部有多个 SA+DA+Len 子帧 | 多个 4B Delimiter + MPDU 组合 |
| 确认方式 | 普通 ACK | Block ACK |
| Wireshark 显示 | 1 个帧,内部嵌套多个 "Subframe" 条目 | 多个独立的 "802.11 QoS Data" 帧 |
最快速的判断方法:看确认帧类型——后面跟 Block ACK 的就是 A-MPDU,跟普通 ACK 的大概率是 A-MSDU(或普通单帧)。
5 Block ACK — 批量签收确认
传统的 ACK 每收到一个帧就回复一次确认。Block ACK 允许一次确认多个帧:
报文类型:ACK(Type=01, Subtype=1101),Block ACK Request/BAR(Type=01, Subtype=1000),Block ACK(Type=01, Subtype=1001)。
交通比喻:传统 ACK 就像每辆车到了收费站都要停一下确认。Block ACK 就像车队到了目的地后,一次性核对整个车队的货物清单——哪些到了,哪些丢了。
5.1 Block ACK 与 A-MPDU 的关系
Block ACK 不是只能配合 A-MPDU,但两者在不同协议版本中的绑定关系不同:
| 协议版本 | Block ACK 是否需要 A-MPDU | 说明 |
|---|---|---|
| 802.11e(2005) | 不需要 | Block ACK 最初为 QoS 设计,可配合逐帧发送 |
| 802.11n(2009) | 必须 | HT immediate Block ACK 强制使用 A-MPDU |
| 802.11ac/ax/be | 必须 | 延续 HT 的规定 |
5.1.1 802.11e 时代:Block ACK 可以不用 A-MPDU
802.11e 引入 Block ACK 时,A-MPDU 还不存在。此时的工作方式是:
报文类型:图中 ADDBA Request/Response 都是 Action 帧(Type=00, Subtype=1101),类别为 Block Ack(Category=3)。BAR(Type=01, Subtype=1000),Block ACK(Type=01, Subtype=1001),Data(Type=10, Subtype=0000)。
交通比喻:4 辆货车各走一趟(每趟都要等红灯),但到了目的地后不需要每辆都签收——等最后一辆到了,老板拿清单一次性核对。省了逐辆签收的时间,但"等红灯"的时间没省。
这种模式的局限:每帧仍然独立竞争信道(DIFS + Backoff),Block ACK 只省掉了"每帧等 ACK"的间隔(SIFS),信道竞争的开销没减少。
5.1.2 为什么接收方不逐帧回 ACK?
你可能会问:协议规定收到数据帧后等一个 SIFS 就要回 ACK,为什么接收方能"忍住"不回?
关键在于 ADDBA 协商:
- 发送方和接收方先通过 ADDBA Request/Response 建立 Block ACK 协议
- 协商完成后,接收方知道这是 Block ACK 会话 → 主动抑制逐帧 ACK
- 发送方连续发送多个帧,帧间只隔 SIFS(不等 ACK)
- 发送方发完后,发送一个 BAR(Block ACK Request):"请给我 Block ACK"
- 接收方收到 BAR 后,回复 Block ACK(bitmap 逐帧确认)
交通比喻:就像提前跟仓库报备——"接下来 4 辆车会连续过来,你不用每辆都签收,等我最后发一张清单请求,你再一次性核对。"仓库收到报备后,就"忍住"不逐辆签收了。
如果没有 ADDBA 协商就直接连续发帧,接收方会按默认规则逐帧回 ACK——但 ACK 和后续数据帧会在空中碰撞,导致混乱。所以 ADDBA 协商是 Block ACK 的前提。
5.1.3 802.11n 之后:Block ACK 必须配合 A-MPDU
802.11n 规定:在 HT immediate Block ACK 协议下,所有数据帧必须以 A-MPDU 形式发送,即使只有一个 MPDU 也要包在 A-MPDU 里——这种只有一个 MPDU 的 A-MPDU 称为 S-MPDU(Single MPDU A-MPDU)。
交通比喻:即使只有一件货,也必须装上车队的"领队车+一辆货车"的编队出发——不能单独骑摩托车送。
5.1.4 为什么这样设计?
| 对比项 | 无 A-MPDU 的 Block ACK | 有 A-MPDU 的 Block ACK |
|---|---|---|
| 信道竞争 | 每帧独立竞争 | 只竞争一次 |
| PHY 头 | 每帧一个 | 只有一个 |
| 确认间隔 | 每帧等 ACK(SIFS) | 只等一次 Block ACK |
| MAC 效率 | ~40-50% | ~80% |
交通比喻:没有 A-MPDU 的 Block ACK = 4 辆车各走一趟,到了目的地才一次性签收——省了签收时间,但路上的红灯没省。有 A-MPDU 的 Block ACK = 4 辆车组成车队一趟出发,只等一次红灯,到了一次性签收——红灯和签收都省了。
5.1.5 Block ACK 的 Bitmap 机制
Block ACK 帧中包含一个 bitmap(位图),每一位对应一个序列号的 MPDU:
- 1 = 该 MPDU 接收成功
- 0 = 该 MPDU 丢失或校验失败
发送方根据 bitmap 只重传标记为 0 的 MPDU,不用重传整个 A-MPDU。
交通比喻:老板拿着清单逐辆核对——A 到了(打勾)、B 到了(打勾)、C 丢了(打叉)、D 到了(打勾)——只需补发 C,不用重跑整个车队。
5.1.6 Bitmap 有上限:一次最多确认多少个?
Block ACK 帧的 bitmap 长度是有限的,不同变体能确认的 MPDU 数量不同(IEEE 802.11-2024 §9.3.1.8):
Compressed BlockAck(802.11n/ac/ax 最常用的变体,Table 9-38):
| Fragment Number 编码 | Bitmap 长度 | 能确认的 MSDU/A-MSDU 数 |
|---|---|---|
| B0=0(无分片), B2-B1=00 | 8 字节(64 bit) | 64 个 |
| B0=0(无分片), B2-B1=10 | 32 字节(256 bit) | 256 个 |
| B0=1(有分片), B2-B1=00 | 8 字节 | 16 个(每个 4 分片) |
| B0=1(有分片), B2-B1=10 | 32 字节 | 64 个(每个 4 分片) |
Extended Compressed BlockAck(802.11ax 引入):固定 8 字节 → 64 个,外加 1 字节 RBUFCAP 报告接收方剩余缓冲区。
Multi-STA BlockAck(802.11ax 上行 MU 用):每个 Per AID TID Info 的 bitmap 可以是 0/4/8/16/32 字节 → 单用户最多 256 个。
注意「有分片」那两行:此时 bitmap 的每一位对应一个 fragment(分片),而不是一个完整 MSDU——一个 MSDU 切成 4 片就要占 4 位,所以 8 字节(64 bit)在有分片时只能确认 16 个 MSDU、32 字节(256 bit)只能确认 64 个 MSDU。
Bitmap 从 Starting Sequence Number(SSN) 开始,每一位按序列号递增顺序对应一个 MPDU。802.11 的序列号是 12-bit(0-4095 循环),所以:
- 如果发送方连续发了超过 bitmap 长度的帧但一直没发 BAR,超出部分无法被确认——bitmap 覆盖不到
- 发送方必须在 bitmap 范围内发 BAR,拿到 Block ACK 后滑动窗口前移,才能继续发送
- ADDBA 协商中的 Buffer Size 正是约束这个窗口大小的参数
交通比喻:老板的清单只有 64 个格子(8 字节 bitmap)。如果车队有 100 辆车,不能等 100 辆全到了再签收——必须在第 64 辆到了之后先签一次(发 BAR → 收 Block ACK),清单腾出空间,再继续收后面的 36 辆。这就是"滑动窗口"机制——窗口大小由 Buffer Size 和 bitmap 长度共同决定。
6 Short GI — 缩短车间距
802.11n 引入了 Short Guard Interval(短保护间隔),将 OFDM 符号间的保护间隔从 800 ns 缩短到 400 ns。
| 参数 | Long GI | Short GI |
|---|---|---|
| 保护间隔 | 800 ns | 400 ns |
| 符号时长 | 4.0 µs | 3.6 µs |
| 速率提升 | — | ~11% |
交通比喻:Long GI 就像车与车之间保持较大的安全车距——防止前车急刹时追尾(符号间干扰)。Short GI 就像缩短了车距——路况好(信道质量高)时能提升通行效率;但雨天路滑(多径效应严重)时车距太近容易追尾,符号间干扰随之上升。
7 MCS 0-31:调制编码方案的完整体系
7.1 速率怎么算出来的?
802.11n 的数据速率由一个公式决定(IEEE 802.11-2024 §19.5):
1 | Data Rate = N_SD × N_BPSCS × R × N_SS / T_SYM |
| 符号 | 含义 | 取值 |
|---|---|---|
| N_SD | 数据子载波数 | 20 MHz: 52;40 MHz: 108 |
| N_BPSCS | 每子载波每空间流的编码比特数 | BPSK: 1, QPSK: 2, 16-QAM: 4, 64-QAM: 6 |
| R | 编码率 | 1/2, 2/3, 3/4, 5/6 |
| N_SS | 空间流数 | 1, 2, 3, 4 |
| T_SYM | OFDM 符号时长(含保护间隔) | Long GI: 4.0 µs;Short GI: 3.6 µs |
注意:N_SD 是数据子载波数(不含导频)。802.11n 的 20 MHz 有 52 个数据子载波 + 4 个导频 = 56 个可用子载波;40 MHz 有 108 个数据子载波 + 6 个导频 = 114 个可用子载波。相比 802.11a 的 20 MHz(48 数据 + 4 导频 = 52),HT 回收了部分边缘子载波。
7.1.1 手算示例:MCS 7(20 MHz, Long GI)
MCS 7 = 64-QAM(N_BPSCS=6)× 编码率 5/6 × 1 空间流:
1 | Rate = 52 × 6 × (5/6) × 1 / 4.0 µs |
7.1.2 手算示例:MCS 15(40 MHz, Short GI)
MCS 15 = MCS 7 × 2 空间流,40 MHz:
1 | Rate = 108 × 6 × (5/6) × 2 / 3.6 µs |
7.2 MCS 0-7:单空间流的 8 个等级
每个空间流有 8 种 MCS(0-7),调制方式从低到高:
| MCS | 调制 | N_BPSCS | 编码率 | 20MHz Long GI | 20MHz Short GI | 40MHz Long GI | 40MHz Short GI |
|---|---|---|---|---|---|---|---|
| 0 | BPSK | 1 | 1/2 | 6.5 | 7.2 | 13.5 | 15.0 |
| 1 | QPSK | 2 | 1/2 | 13.0 | 14.4 | 27.0 | 30.0 |
| 2 | QPSK | 2 | 3/4 | 19.5 | 21.7 | 40.5 | 45.0 |
| 3 | 16-QAM | 4 | 1/2 | 26.0 | 28.9 | 54.0 | 60.0 |
| 4 | 16-QAM | 4 | 3/4 | 39.0 | 43.3 | 81.0 | 90.0 |
| 5 | 64-QAM | 6 | 2/3 | 52.0 | 57.8 | 108.0 | 120.0 |
| 6 | 64-QAM | 6 | 3/4 | 58.5 | 65.0 | 121.5 | 135.0 |
| 7 | 64-QAM | 6 | 5/6 | 65.0 | 72.2 | 135.0 | 150.0 |
(单位:Mbps)
7.3 MCS 8-31:多空间流的线性扩展
802.11n 的 MCS 索引编码规则很简单:MCS = (空间流序号 - 1) × 8 + 该流内的 MCS 0-7。
| MCS 范围 | 空间流数 | 20MHz 最高速率(Long GI) | 40MHz 最高速率(Long GI) |
|---|---|---|---|
| MCS 0-7 | 1 | 65 Mbps | 135 Mbps |
| MCS 8-15 | 2 | 130 Mbps | 270 Mbps |
| MCS 16-23 | 3 | 195 Mbps | 405 Mbps |
| MCS 24-31 | 4 | 260 Mbps | 540 Mbps |
多空间流的速率 = 单流速率 × N_SS——因为公式中 N_SS 是乘数,线性增长。
7.3.1 速率的"齿轮比":编码率 × 调制阶数
观察 MCS 0-7 的编码率变化,你会发现它们不是随意选的,而是精心设计的"齿轮比":
| MCS | 调制 × 编码率 | 每子载波有效比特 | 递增比 |
|---|---|---|---|
| 0 | BPSK × 1/2 | 0.5 | — |
| 1 | QPSK × 1/2 | 1.0 | ×2 |
| 2 | QPSK × 3/4 | 1.5 | ×1.5 |
| 3 | 16-QAM × 1/2 | 2.0 | ×1.33 |
| 4 | 16-QAM × 3/4 | 3.0 | ×1.5 |
| 5 | 64-QAM × 2/3 | 4.0 | ×1.33 |
| 6 | 64-QAM × 3/4 | 4.5 | ×1.125 |
| 7 | 64-QAM × 5/6 | 5.0 | ×1.11 |
调制阶数越高(BPSK→QPSK→16-QAM→64-QAM),每子载波装的比特越多,但对信道质量(SNR)要求也越高。编码率越低(5/6→1/2),纠错能力越强,但有效吞吐越低。这套调制×编码率的组合并非任意搭配——高调制阶数必须配高码率来平衡星座点密度与纠错冗余:BPSK 只配 1/2,64-QAM 只配 2/3、3/4 或 5/6。MCS 0-7 就是在速率和可靠性之间找平衡的 8 个档位。
7.4 MCS 32:特殊的重复模式
MCS 32 是一个特殊值——它只在 40 MHz 模式下使用,用 20 MHz 的 MCS 0 参数在 40 MHz 的两个 20 MHz 子信道上重复发送同一份数据,速率仅 6.0 Mbps。目的是在 40 MHz 信道条件极差时提供最可靠的连接(相当于用冗余换可靠性)。
7.5 自动速率选择(Rate Adaptation)
实际设备不会固定用一个 MCS——速率自适应算法会根据信道质量动态切换:
| 条件 | 策略 | 交通比喻 |
|---|---|---|
| 信号强、干扰少 | 用高 MCS(如 7) | 路况好,开快车 |
| 信号弱、干扰多 | 用低 MCS(如 0) | 路况差,降速慢行 |
| 丢包率突然升高 | 降一级 MCS 重试 | 前方事故,临时减速 |
常见算法:ARF(Auto Rate Fallback)、AARF(Adaptive ARF)、Minstrel(Linux 默认)、RalinkProprietary 等。
交通比喻:MCS 等级就像汽车的档位——MCS 0 是 1 档(慢但稳),MCS 7 是 5 档(快但要求路况好)。速率自适应就是自动变速箱——根据路况(信道质量)自动换档。
8 其他 802.11n 新特性
8.1 LDPC(Low Density Parity Check)
802.11n 的 Data 字段支持两种前向纠错编码(FEC)(§19.3.11.4):
| 编码方式 | 类型 | 802.11n 支持 | 说明 |
|---|---|---|---|
| BCC | 卷积编码 | 必须支持 | 802.11a/g 就有的老方案 |
| LDPC | 低密度奇偶校验码 | 可选 | 802.11n 新增,性能更优 |
BCC(Binary Convolutional Coding) 是传统的编码方式——先用 1/2 码率的卷积编码器编码,再通过"打孔"(puncturing)去掉部分冗余比特来实现更高的码率(2/3, 3/4, 5/6)。当 PHY 速率超过 300 Mbps 时,BCC 会使用两个并行编码器来提高处理速度。
LDPC 的核心思想完全不同——它用一个稀疏校验矩阵 H 来编码:
- 编码时:根据 H 矩阵计算校验比特,附加到数据后面
- 解码时:接收方用迭代译码算法(Belief Propagation),反复在 H 矩阵的校验节点和变量节点之间传递"置信度",逐步逼近正确码字
- 每次迭代都能纠正更多错误,直到收敛或达到最大迭代次数
LDPC 相比 BCC 的优势:
| 指标 | BCC | LDPC |
|---|---|---|
| 编码增益 | 基准 | +2-3 dB |
| 高 SNR 下的表现 | 接近理论极限 | 更接近 Shannon 极限 |
| 解码延迟 | 固定(Viterbi) | 可变(迭代次数) |
| 实现复杂度 | 低 | 较高 |
交通比喻:BCC 就像传统快递——每件货附一张手写清单(校验比特),到了对照一下,错了就退。LDPC 就像智能快递——每件货上贴了多个交叉校验标签(稀疏校验矩阵),到了之后系统自动交叉比对,哪里不对可以自动修正,不用整件退回。
使用条件:接收方必须在 HT Capabilities 中声明支持 LDPC(dot11LDPCCodingOptionActivated = true),发送方才能使用。否则只能用 BCC。
8.2 STBC(Space Time Block Coding)
STBC 是一种分集技术——当发射天线数多于空间流数时,把同一个数据流在不同天线和不同时刻上编码发送,接收方合并后获得分集增益(§10.16)。
典型场景:设备有 2 根天线但只有 1 条空间流(2×1 MISO)。此时可以启用 STBC:
- 天线 1 在时刻 t 发送符号 S₁
- 天线 2 在时刻 t 发送符号 S₂
- 天线 1 在时刻 t+1 发送 -S₂*(共轭取反)
- 天线 2 在时刻 t+1 发送 S₁*
这就是经典的 Alamouti 编码(2×1 STBC)——用 2 个时隙传 2 个符号,速率不变,但获得了 2 副天线的分集增益,等效于把信道从"快衰落"变成了"慢衰落"。接收端把两路信号合并,等效信噪比翻倍;只有两路同时深衰落才会丢符号,丢符号概率从 p 降至 p²。
| 配置 | 无 STBC | 有 STBC |
|---|---|---|
| 2Tx, 1 空间流 | 1 流,无分集 | 1 流,2 重分集 |
| 可靠性 | 一般 | 提升(对抗深衰落) |
| 速率 | 不变 | 不变 |
| 接收方复杂度 | 低 | 需要合并译码 |
交通比喻:STBC 就像同一件货同时走两条不同的路——即使一条路堵了,另一条路还能到。代价是需要两条路的资源(两个天线),但货物总量(速率)没变。
使用条件:发送方和接收方都必须在 HT Capabilities 中声明支持 STBC(Tx STBC / Rx STBC 子字段)。
8.3 Greenfield 模式
802.11n 定义了两种前导码(Preamble)格式(§19.3.9):
8.3.1 HT-Mixed Mode(默认,兼容旧设备)
前导码分为两部分——前半段用 802.11a/g 的格式(L-STF, L-LTF, L-SIG),后半段才是 HT 专用字段。旧设备收到 L-SIG 后能算出帧 duration,知道要"安静多久"(虚拟载波侦听),不会在 HT 帧传输期间发送干扰。
8.3.2 HT-Greenfield Mode(效率优先,不兼容旧设备)
省掉了 L-STF, L-LTF, L-SIG 这些兼容字段,直接用 HT 专用格式,前导码缩短约 12 µs。
8.3.3 两者对比
| 特性 | HT-Mixed Mode | HT-Greenfield Mode |
|---|---|---|
| 兼容 802.11a/g | 是 | 否 |
| 前导码开销 | 较大(~36 µs) | 较小(~24 µs) |
| 效率 | 较低 | 较高(节省 ~33% 前导码) |
| 单空间流可用 Short GI | 是 | 否(协议禁止) |
| 实际使用 | 主流 | 极少使用 |
交通比喻:HT-Mixed Mode 就像新修的高速路保留了旧的收费站——老车也能过(旧设备能识别帧),但新车要排队等(额外开销)。HT-Greenfield 就像专用车道——只让 HT 车辆走,省掉了旧收费站,效率更高,但老车上不去。
为什么 Greenfield 实际很少用? 因为现实环境中几乎不可能是纯 802.11n 网络——总有旧设备(手机、IoT、访客)需要兼容。Mixed Mode 虽然有开销,但换来了向下兼容性,是绝大多数场景的唯一选择。
8.3.4 HT Capabilities 字段速查表
回顾一下,HT Capabilities 元素是 802.11n 设备在关联时声明自身能力的地方——本章散落出现的各能力开关,其实都集中在这个元素里:
| 字段 / 子字段 | 声明内容 | 取值与含义 |
|---|---|---|
| Maximum A-MSDU Length(1-bit) | A-MSDU 最大长度 | 0 = 3839 B,1 = 7935 B(§4.4.1) |
| A-MPDU Parameters → Maximum A-MPDU Length Exponent | 最大 A-MPDU 长度 | 0-3:2^(13+exp)-1,最大 65535 B(§4.4.2) |
| LDPC Coding Capability | 是否支持 LDPC | 置位才可用 LDPC,否则退回 BCC(§4.8.1) |
| Tx STBC / Rx STBC | 是否支持 STBC 收发 | 双方都置位才可用 STBC(§4.8.2) |
| HT-Greenfield | 是否支持 Greenfield 前导码 | 置位才可用 Greenfield 前导码(§4.8.3) |
| 40 MHz Intolerant | 是否无法容忍 40 MHz | 置位后 AP 须退回 20 MHz(§4.3.2) |
这些字段一起决定了两个 HT 设备之间「能开哪些 802.11n 特性」——每个特性都要双方声明支持才能真正生效。
9 缺陷分析:下一代需要解决什么?
| 缺陷 | 具体问题 | 影响 |
|---|---|---|
| 波束成形未标准化 | 厂商实现不兼容 | 波束成形几乎未被使用 |
| 仅 5 GHz 支持 40 MHz | 2.4 GHz 无法有效使用 40 MHz | 2.4 GHz 速率提升有限 |
| 无下行 MU-MIMO(Multi-User Multiple Input Multiple Output,多用户多输入多输出) | 每次只服务一个用户 | 密集场景效率低 |
| 最高 64-QAM | 调制阶数有限 | 高 SNR 下速率有天花板 |
| 4 空间流上限 | 天线数有限 | 速率上限 ~600 Mbps |
| 20/40 MHz 共存开销 | 混合 20/40 环境需保护机制(L-SIG TXOP Protection / 40 MHz Intolerant) | 绑定增益被保护开销抵消 |
10 本章总结
802.11n 是 WiFi 的一次革命性升级:
| 特性 | 效果 | 交通比喻 |
|---|---|---|
| MIMO | 空间复用,多流并行 | 多层立交桥 |
| 40 MHz | 带宽翻倍 | 合并两条路 |
| 帧聚合 | 减少开销 | 大卡车代替小车 |
| Block ACK | 批量确认 | 车队一次性签收 |
| Short GI | 效率提升 11% | 缩短车间距 |
关键认知:
- MIMO 把多径从敌人变成朋友——不同路径 = 不同空间流
- 信道绑定在 2.4 GHz 不实用——只有 5 GHz 能有效使用 40 MHz
- 帧聚合是提升实际吞吐量的关键——减少协议开销比提升物理速率更重要
下一章将讲述:256-QAM 如何把每辆车装更多货?下行 MU-MIMO 如何同时服务多个用户?80/160 MHz 信道如何进一步拓宽道路?