3、MAC层效率优化:CSMA/CA开销与帧聚合技术
好,咱们进入第三讲。这一讲我要聊的是MAC层的效率问题。说白了,WiFi芯片的物理层速率再高,如果MAC层拖后腿,实际吞吐量照样上不去。我在做双频芯片项目时,就遇到过物理层跑到1.2Gbps,但实际测速只有600Mbps的情况。问题出在哪?就出在MAC层的接入机制上。
3.1 CSMA/CA机制带来的信道接入开销
CSMA/CA,载波监听多点接入/碰撞避免。这个名字听起来很学术,其实原理不复杂。每个设备在发数据前,先听一听信道是不是空的。如果是空的,等一个随机时间再发。为什么要等?就是为了避免多个设备同时发送,撞在一起。
但这个机制有个致命问题——开销太大。
我给你们算一笔账。假设一个数据帧本身只有1500字节,但在发送之前,设备需要经历:
- DIFS(分布式帧间间隔):大约34微秒
- 退避时间(Backoff):平均67.5微秒
- 发送RTS/CTS握手(可选):大约100微秒
- SIFS(短帧间间隔):16微秒
- ACK确认帧:大约44微秒
你想想看,真正传数据的时间可能只有几十微秒,但前前后后的开销加起来,轻松超过200微秒。这就是为什么WiFi的理论速率和实际速率差距那么大。
关键数据:在802.11n/ac标准下,MAC层效率通常只有50%-70%。也就是说,物理层1Gbps的速率,到MAC层就只剩500-700Mbps了。
我在调试一款双频芯片时,曾经用抓包工具看过信道占用情况。结果发现,在低速率场景下,信道接入开销占比高达40%以上。嗯,这个数字让我印象很深。
3.2 帧聚合技术原理:A-MSDU与A-MPDU
怎么解决这个问题?业界想出的办法就是——帧聚合。把多个小帧打包成一个超大帧,一次发出去。这样,信道接入的开销就被分摊了。
帧聚合有两种主流方式:A-MSDU和A-MPDU。我分别讲一下。
3.2.1 A-MSDU(聚合MAC服务数据单元)
A-MSDU是在MAC层之上做的聚合。它把多个MSDU(也就是上层的IP包)拼在一起,共用一个MAC头。这样做的好处是,每个子帧只需要一个很短的子帧头(14字节),开销很小。
但有个限制——所有子帧必须发往同一个接收端。而且,如果其中任何一个子帧出错,整个A-MSDU都要重传。嗯,这是它的软肋。
我的经验:A-MSDU适合信道质量好的场景。我在做室内覆盖项目时,近距离场景下用A-MSDU,吞吐量能提升30%以上。但一旦距离远了,误码率上来,A-MSDU反而会拖后腿。
3.2.2 A-MPDU(聚合MAC协议数据单元)
A-MPDU是在MAC层做的聚合。它把多个MPDU(也就是完整的MAC帧)拼在一起,每个子帧都有自己的MAC头和FCS校验。这意味着,即使某个子帧出错,其他子帧仍然可以正确接收。
A-MPDU配合Block ACK(块确认)机制,接收端可以一次性回复所有子帧的接收状态。发送端只需要重传出错的子帧,而不是整个聚合帧。
我个人更倾向于A-MPDU,因为它更健壮。在大多数实际场景中,A-MPDU的表现都比A-MSDU好。
| 特性 | A-MSDU | A-MPDU |
|---|---|---|
| 聚合层级 | MAC上层 | MAC层 |
| 子帧头开销 | 14字节(小) | 36字节(大) |
| 错误恢复 | 全帧重传 | 选择性重传 |
| 适用场景 | 信道质量好 | 信道质量一般 |
| 最大聚合大小 | 7935字节(HT) | 65535字节(HT) |
3.3 如何调整聚合大小和BA窗口
知道了原理,接下来就是实操了。怎么调参数才能让吞吐量最大化?我分享几个经验。
3.3.1 聚合大小的选择
聚合大小不是越大越好。为什么?因为信道是动态变化的。
- 聚合太大:一旦信道变差,整个聚合帧出错概率大增,重传代价很高。
- 聚合太小:信道接入开销占比大,效率上不去。
我建议的做法是:动态调整。根据当前的信号强度(RSSI)和误码率(PER),实时调整聚合大小。
经验公式:当PER低于5%时,可以尝试增大聚合大小;当PER超过15%时,应该减小聚合大小。我在一个项目中,用这个策略把平均吞吐量提升了18%。
3.3.2 BA窗口的配置
BA窗口,就是Block ACK窗口大小。它决定了发送端可以连续发送多少个MPDU而不需要等待ACK。
窗口越大,发送端越能连续发送,效率越高。但窗口太大也有问题:
- 接收端需要更大的缓冲区来存储乱序到达的子帧
- 一旦出错,重传延迟会变大
我曾经在一个项目中,把BA窗口从32调到64,结果发现吞吐量反而下降了。排查了半天,发现是接收端的缓冲区不够,导致丢包。嗯,这个坑我踩过。
避坑指南:调整BA窗口前,一定要确认接收端的处理能力。我曾经在调试一款低端WiFi芯片时,发现它的BA窗口最大只能支持32。强行设成64,结果芯片直接挂死。
3.3.3 实际调优步骤
如果你正在做双频芯片的MAC层优化,我建议按这个步骤来:
- 先测基线:在干净信道下,测出不同聚合大小的吞吐量曲线。
- 再测干扰:在有干扰的场景下,观察PER的变化。
- 动态调整:根据PER和RSSI,动态调整聚合大小和BA窗口。
- 验证效果:在真实场景下跑24小时,看平均吞吐量是否提升。
说白了,MAC层优化没有银弹。每个场景都有自己的最优参数。你需要做的,就是让芯片学会自适应。
好,这一讲就到这里。下一讲我会讲物理层的速率适配和MCS选择,到时候再聊。