Wi-Fi 提速魔法:深度解析 802.11n 的帧聚合技术(A-MSDU vs A-MPDU)
Wi-Fi 提速魔法:深度解析 802.11n 的帧聚合技术(A-MSDU vs A-MPDU)
如果你用过从单天线WiFi到双天线WiFi的升级,应该能明显感觉到网速变快了。但你知道吗?802.11n(也就是大家常说的WiFi 4)除了MIMO多天线技术之外,还有一项”隐藏功臣”对吞吐量提升贡献巨大——那就是帧聚合(Frame Aggregation)。
今天我们就来好好聊聊这个话题,拆解一下802.11n引入的两种聚合机制:A-MSDU和A-MPDU,看看它们是怎么工作的,各自适合什么场景。
为什么需要帧聚合?
在讲聚合技术之前,我们得先想明白一个问题:WiFi为什么需要聚合?
传统802.11a/b/g时代,每个数据帧都要走一遍完整流程:竞争信道 → 发送帧头 → 发送数据 → 等待ACK。每个帧都有固定的开销(PHY头、MAC头、帧间间隔IFS等)。如果你的上层数据被分成很多小帧发送,这些开销就会吃掉大量的无线带宽,实际吞吐量惨不忍睹。
给大家算笔账:假设一个PHY头需要20μs发送,数据速率600Mbps,20μs就是1500bit ≈ 188字节。如果我发一个100字节的TCP包,光是头就比数据还大,效率能高到哪去?
帧聚合的核心思想很简单:把多个小帧打包成一个大帧发送,共用一次头部开销和一次信道竞争。这样单位数据的平均开销就降下来了,吞吐量自然就上去了。
flowchart TB
subgraph "传统传输 (无聚合)"
F1[PHY HDR + MAC HDR + Data1] --> IFS1[IFS] --> ACK1[ACK]
IFS1 --> F2[PHY HDR + MAC HDR + Data2] --> IFS2[IFS] --> ACK2[ACK]
IFS2 --> F3[PHY HDR + MAC HDR + Data3]
end
subgraph "聚合传输 (一次发送多个)"
AGG[PHY HDR + MAC HDR + Data1 + Data2 + Data3] --> IFS[IFS] --> ACK[ACK]
end
style F1 fill:#f9f,stroke:#333
style F2 fill:#f9f,stroke:#333
style F3 fill:#f9f,stroke:#333
style AGG fill:#9f9,stroke:#333
802.11n定义了两种不同层次的聚合:在MAC层服务数据单元层面聚合的A-MSDU,和在MAC协议数据单元层面聚合的A-MPDU。我们一个一个来看。
A-MSDU:把多个Payload揉在一起
原理与目的
A-MSDU(Aggregated MAC Service Data Unit)是在MSDU层面进行聚合。简单来说,就是把来自同一个业务流的多个上层数据包(MSDU)拼接起来,只封装一个共同的MAC头和PHY头,作为一个整体发送出去。
它的目的很直接:减少MAC头和PHY头的重复开销,提高信道利用率。
A-MSDU 帧结构
A-MSDU的帧结构很简洁:
1 | +------------------+-------------------+-------------------+-----+------+ |
每个子MSDU都有自己的长度字段和数据承载,但是所有子MSDU共用一个PHY头、MAC头和帧校验序列(FCS)。标准规定A-MSDU最大长度是4095字节,所以一个A-MSDU最多只能聚合几千字节的数据。
A-MSDU 工作流程
A-MSDU的工作流程非常简单:
flowchart TD
A[上层: 多个小包到达] --> B[MAC层: 将多个MSDU拼接]
B --> C[MAC层: 添加统一MAC头]
C --> D[MAC层: 交给PHY发送]
D --> E[PHY层: 添加PHY头]
E --> F[接收端: 一次性收到整个帧]
F --> G[接收端MAC: 解析并拆分出各个MSDU]
G --> H[接收端MAC: 分别递交给上层]
H --> I[接收端MAC: 回复单个ACK]
整个过程就是一次发送、一次确认,操作非常简单,额外处理开销很小。
A-MSDU 的优缺点
| 优点 | 缺点 |
|---|---|
| 处理简单,额外开销极小 | 只要一个子MSDU出错,整个A-MSDU都要重传 |
| 头部开销压缩到极致 | 对误码率敏感,差信道下性能反而下降 |
| 接收端处理简单,延迟低 | 最大长度限制(4K),聚合度有限 |
| 不需要额外协议交互 | 只能聚合同一个接收地址的包 |
因为整个A-MSDU只有一个FCS校验,如果传输过程中任何一个bit出错,整个大帧都得扔掉重传。所以A-MSDU更适合信号质量好、误码率低的环境。
A-MPDU:灵活聚合,选择性重传
A-MPDU(Aggregated MAC Protocol Data Unit)是另一种聚合方式,它聚合的是已经封装好MAC头的完整MPDU。换句话说,每个子帧都有自己独立的头部和校验,错哪个就重传哪个,不用全盘重来。
原理与目的
A-MPDU的设计目标就是解决A-MSDU的痛点:它允许在一个聚合帧里包含多个独立的MPDU,每个MPDU都能独立校验、独立确认、独立重传。这样即使信道质量不好,也只需要重传出错的个别子帧,大大提高了恶劣环境下的传输效率。
A-MPDU 帧结构
A-MPDU的结构比A-MSDU稍微复杂一点:
flowchart LR
subgraph "A-MPDU 帧结构"
PH[PHY Header] --> MH[MAC Header] --> AMPDU[Aggregated MPDU] --> FCS[FCS]
end
subgraph "子帧结构"
D1["MPDU 1
┌──────────┬──────────┬───────┐
│ 分隔符 │ MPDU │ 填充 │
└──────────┴──────────┴───────┘"]
D2["MPDU 2
┌──────────┬──────────┬───────┐
│ 分隔符 │ MPDU │ 填充 │
└──────────┴──────────┴───────┘"]
Dn["MPDU n
┌──────────┬──────────┬───────┐
│ 分隔符 │ MPDU │ 填充 │
└──────────┴──────────┴───────┘"]
D1 --> D2 --> Dn
end
关键点:
- 每个子MPDU都有自己独立的MAC头和FCS
- 每个子MPDU前面都有一个4字节的分隔符(delimiter),标记长度信息
- 整个A-MPDU共用一个PHY头(外面那个MAC头其实是聚合帧的头,主要用来寻址)
- A-MPDU最大长度可以达到65535字节,比A-MSDU大得多
Block Ack 交互机制
传统的802.11每个MPDU都需要一个单独的ACK,如果你聚合了几十个MPDU,还要一个个回ACK那不就又浪费带宽了吗?所以A-MPDU配合了块确认(Block Ack, BA)机制,一次传输完成后,接收方用一个Block Ack帧一次性确认所有收到的子帧。
flowchart TD
subgraph "Block Ack 交互流程"
S1[发送端: 发送 ADDBA Request] --> S2[接收端: 返回 ADDBA Response]
S2 --> S3[BA会话建立完成]
S3 --> S4[发送端: 发送 A-MPDU]
S4 --> S5[接收端: 逐个校验每个子MPDU]
S5 --> S6[接收端: 发送 Block Ack<br/>位图指示哪些帧收到成功]
S6 --> S7{发送端检查位图}
S7 -->|有丢失帧| S8[只重传丢失的子MPDU] --> S6
S7 -->|全部收到| S9[传输完成]
end
Block Ack的核心就是那个比特位图(Bitmap)。例如,BA会话窗口大小是64,位图就有64个bit,每个bit对应一个序列号,bit为1表示对应帧收到了,0表示没收到。发送方看到0就知道这个要重传。
这样一次传输、一次确认就搞定了几十个帧的确认工作,既享受了聚合带来的开销节省,又保留了单个重传的灵活性。
A-MPDU 完整工作流程
flowchart LR
Start([开始]) --> Check{有没有已建立<br/>Block Ack会话?}
Check -->|否| Establish[发送 ADDBA 请求<br/>建立Block Ack会话] --> Send
Check -->|是| Send[聚合多个MPDU到A-MPDU]
Send --> Transmit[发送完整A-MPDU]
Transmit --> WaitBA[等待Block Ack回复]
WaitBA --> GetBA{接收Block Ack}
GetBA --> CheckLoss{检查位图<br/>有丢失吗?}
CheckLoss -->|是| Retransmit[只重传丢失的子MPDU] --> WaitBA
CheckLoss -->|无| End([传输完成])
A-MPDU 的优缺点
| 优点 | 缺点 |
|---|---|
| 每个子帧独立校验,错哪个重传哪个 | 每个子MPDU都要保留自己的MAC头,冗余比A-MSDU大 |
| 适应信道质量变化,坏环境下也能保持高效 | 需要Block Ack协议交互,逻辑更复杂 |
| 支持最大64KB聚合,聚合度更高 | 接收端需要缓存,处理复杂度更高 |
| 可以聚合不同业务流到同一接收端 | 头部分隔符还是有一定开销 |
A-MSDU vs A-MPDU:到底谁更好?
我们来做个全面对比:
开销占比对比(小数据包场景)
pie
"A-MSDU 有效数据" : 85
"A-MSDU 头部开销" : 15
"A-MPDU 有效数据" : 78
"A-MPDU 头部+分隔符开销" : 22
重传开销对比(误码率1%场景,10个帧)
pie
"A-MSDU 需重传总数据" : 92
"A-MPDU 需重传总数据" : 8
更完整的对比表格:
| 对比维度 | A-MSDU | A-MPDU |
|---|---|---|
| 聚合层次 | MSDU(Payload层) | MPDU(完整帧层) |
| 最大长度 | 4095 字节 | 65535 字节 |
| 头部开销 | 极低(所有子帧共用一个MAC头) | 较高(每个子帧都有MAC头 + 分隔符) |
| 错误处理 | 一个出错,全部重传 | 仅重传出错帧 |
| 是否需要Block Ack | 不需要 | 需要 |
| 处理复杂度 | 简单 | 复杂 |
| 对误码率敏感度 | 高 | 低 |
你可以把A-MSDU想象成用快递袋打包多个小包裹,只贴一张快递单——省包装钱,但只要其中一个包裹破了,整袋都得退回重发。
而A-MPDU就像用一个大箱子装多个已经打包好的小盒子,每个小盒子都有自己的包装——包装费贵一点,但哪个盒子坏了只需要重发那个盒子就行。
性能提升到底有多大?
帧聚合技术对802.11n的吞吐量提升到底有多明显?我们来看看实测大致范围:
| 场景 | 无聚合 | A-MSDU | A-MPDU |
|---|---|---|---|
| 小包(100字节) | ~30% 效率 | ~75% 效率 | ~65% 效率 |
| 大包(1500字节) | ~85% 效率 | ~92% 效率 | ~88% 效率 |
| 信噪比高(SNR > 30dB) | 基线 | +80~100% | +60~80% |
| 信噪比低(SNR < 20dB) | 基线 | 不稳定,常下降 | +40~60% |
在最好的情况下,配合HT40和MIMO,802.11n可以把实际TCP吞吐量从原来的~30Mbps(802.11g)提升到~300Mbps以上,这里帧聚合功不可没。
适用场景分析
两种聚合技术并不是互相取代的关系,而是互补的关系。实际上很多WiFi芯片同时支持两种聚合,甚至可以嵌套使用(A-MSDU封装后再放到A-MPDU里聚合)。
A-MSDU 最适合:
- 信号质量非常好的近距离传输:AP和STA隔得近,信噪比高,误码率几乎为零,这时候A-MSDU的低开销优势就能完全发挥出来
- 大量小包传输:比如网页浏览、物联网传感器数据上报,很多小包在一起,A-MSDU能最大程度压缩头部开销
- 低延迟要求场景:处理简单,不需要复杂的块确认和重排,延迟更低
A-MPDU 最适合:
- 一般环境下的大容量传输:下载大文件、视频流,不管信道质量如何,A-MPDU都能稳定给出好性能
- 信道环境波动大:有墙壁遮挡、移动场景,误码率不可预测,选择性重传优势明显
- 吞吐量优先场景:追求最大净吞吐率,即使增加一点处理复杂度也值得
实际应用中的组合拳
现在很多设备实际采用的方案是:A-MSDU + A-MPDU 嵌套,先把几个小包聚合成A-MSDU,然后把多个A-MSDU作为子帧放到A-MPDU里。这样既享受了A-MSDU的低开销,又保留了A-MPDU的选择性重传优势,一举两得。
flowchart TD
subgraph "嵌套聚合 (A-MSDU in A-MPDU)"
PH[PHY Header] --> MH[MAC Header] --> AMPDU[ ] --> FCS[FCS]
subgraph "AMPDU"
D1[分隔符] --> A1[A-MSDU 1<br/>多个MSDU聚合] --> D2[分隔符] --> A2[A-MSDU 2<br/>多个MSDU聚合] --> ... --> Dn[分隔符] --> An[A-MSDU n]
end
end
笔者思考:从聚合技术看WiFi设计哲学
作为一名通信芯片设计工程师,我觉得802.11n的帧聚合设计非常有意思。它反映了WiFi协议一路走来的设计思路:没有普适的设计,只看应用的场景。
A-MSDU追求极致的效率,但对错误零容忍;A-MPDU付出一点额外开销换来了鲁棒性,适应性更广。设计者没有强行二选一,而是把两种方案都放出来,让设备根据实际场景动态选择。这种”留给实现者决定”的思路在WiFi协议中非常常见。
另外有意思的一点是,帧聚合其实是对TCP/IP协议栈”分包过大”问题的一种弥补。IP协议的MTU是1500字节,TCP还会进一步分段,如果没有聚合,每个小段都单独发送,效率真的很低。WiFi在链路层把它们重新拼起来,相当于在底层做了一次”批量传输”优化——这个思路现在也被用到了很多其他协议中。
从技术演进来看,后续的WiFi 5(802.11ac)、WiFi 6(802.11ax)都延续了帧聚合的设计,并且进一步扩大了A-MPDU的最大长度,可见这个设计思路经受住了时间的考验。
总结
帧聚合是802.11n时代引入的关键技术,通过将多个小帧打包成大帧发送,显著降低了协议开销,提升了实际吞吐量。A-MSDU在链路层聚合Payload,开销极低但抗误码差;A-MPDU聚合完整帧,开销稍大但支持选择性重传,适应复杂环境。根据不同场景选择合适的聚合方式,或者组合使用两者,可以最大限度发挥无线信道的潜力。
下次你连接WiFi刷网页下电影的时候,如果想起”哦原来这里还有这么个提速魔法在工作”,那这篇文章就值了。
参考资料
- IEEE Std 802.11n-2009, Part 11: Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) Specifications Amendment 5: Enhancements for Higher Throughput
- 802.11n Frame Aggregation — Wi-Fi Planet
- A-MSDU and A-MPDU — Wireless Nets of Things


