2、MAC层性能基础:CSMA/CA机制详解、DCF与PCF模式对比、退避算法对性能的影响

说到WiFi性能,很多人第一反应是看信号强度、看频宽。但说实话,真正决定吞吐量上限的,往往是MAC层那套看不见摸不着的协议机制。我做了这么多年无线调优,见过太多“信号满格但速度上不去”的案例,最后查来查去,问题都出在MAC层。

这一章,咱们就扎进MAC层最核心的三个东西:CSMA/CA怎么工作的、DCF和PCF到底差在哪、退避算法又是怎么影响你实际体验的。搞懂这些,你才算真正入了WiFi性能调优的门。

2.1 CSMA/CA:WiFi的“礼貌”规则

CSMA/CA,全称是载波侦听多点接入/冲突避免。名字挺长,说白了就是一句话:先听再说,避免撞车。

有线以太网用的是CSMA/CD,冲突了再检测、再重传。但无线环境不一样——你发信号的时候自己根本听不到别人在发,因为收发共用一根天线。所以WiFi选择了“避免冲突”,而不是“检测冲突”。

核心逻辑:每个站点在发数据前,必须先侦听信道。如果信道忙,就等;如果信道空闲,还要再等一个随机时间,确认没人抢,才真正开始发。

我刚开始调WiFi的时候,总觉得这个“等”太浪费了。后来在一个人口密集的公寓楼做测试,20多个AP挤在2.4G频段上,要不是CSMA/CA这套机制,整个信道早就被冲突淹没了。你想想看,没有规则的世界,谁都发不出去。

CSMA/CA的完整流程,我习惯分成四步:

  1. 物理载波侦听:检查信道能量是否超过阈值(通常-82dBm)。超过就认为信道忙。
  2. 虚拟载波侦听(NAV):通过RTS/CTS帧中的Duration字段,告诉其他站点“我要占用信道多久”。其他站点更新自己的网络分配向量(NAV),在这段时间内闭嘴。
  3. 帧间间隔(IFS):不同优先级的帧等不同时长。SIFS最短(优先级最高),DIFS次之,EIFS最长。
  4. 退避算法:如果信道从忙变空闲,站点不能立刻发,必须再等一个随机退避时间。

我的经验:在实际调优中,NAV机制经常被忽略。我曾经遇到一个场景,某个老旧网卡不解析RTS/CTS的Duration字段,导致它无视别人的NAV设置,疯狂抢信道。最后只能把那个网卡换掉。所以,虚拟载波侦听不是所有设备都实现得一样好,测试时一定要验证。

2.2 DCF与PCF:两种调度哲学

802.11标准定义了两种MAC工作模式:DCF(分布式协调功能)和PCF(点协调功能)。

DCF是默认模式,也是我们日常用的最多的。每个站点自己决定什么时候发数据,没有中心调度器。说白了就是“自由竞争”。

PCF则是由AP充当“交通警察”,轮询各个站点,问“你有没有数据要发?有就现在发,没有就下一个”。PCF需要AP发送Beacon帧来同步,并且使用PIFS(比DIFS更短的帧间间隔)来抢占信道控制权。

我实际项目中几乎没见过PCF在生产环境大规模使用。为什么?因为PCF虽然能提供无竞争周期,但实现复杂,而且轮询开销在站点多的时候反而降低效率。我记得有一次在实验室搭PCF环境做对比测试,8个站点同时跑VoIP,PCF的延迟抖动确实比DCF好,但吞吐量下降了30%以上。嗯,这就是代价。

对比维度 DCF PCF
调度方式 分布式,站点自主竞争 集中式,AP轮询调度
冲突概率 高(竞争窗口内随机退避) 低(无竞争周期内无冲突)
延迟抖动 大(退避时间随机) 小(轮询周期固定)
实现复杂度 低,所有WiFi设备都支持 高,AP和STA都需要额外逻辑
实际部署 99%的场景都在用 极少,仅部分工业/语音场景
吞吐量效率 高(无轮询开销) 低(轮询帧占用信道时间)

避坑指南:我曾经在给一家医院做无线语音方案时,厂商推荐用PCF模式来保证VoIP质量。结果部署后发现,只要AP关联的站点超过12个,PCF轮询周期就拉长到50ms以上,语音出现明显断续。最后我们换回了DCF + WMM的EDCA优先级方案,反而更稳定。所以,不要迷信PCF,它只适合站点少、对延迟抖动极其敏感的场景。

2.3 退避算法:看不见的“性能杀手”

退避算法,是CSMA/CA里最影响性能的环节。它的规则很简单:每次冲突后,站点从一个竞争窗口(CW)中随机选一个数,等这么多时间槽(Slot Time)再尝试发送。

但细节决定成败。802.11标准用的是二进制指数退避(BEB):

  • 第一次冲突:CW = 15(802.11b)或 7(802.11a/g/n/ac/ax)
  • 第二次冲突:CW翻倍,直到最大值CWmax(1023或255)
  • 发送成功后:CW重置为最小值CWmin

这个机制的好处是,冲突越频繁,大家等的越久,信道自然就缓和了。但坏处也很明显——不公平。你想想看,一个站点连续成功发送,它的CW一直很小,抢信道就快;另一个站点连续冲突,CW越来越大,越来越抢不到。这就是所谓的“捕获效应”。

性能影响:退避算法直接决定了信道利用率和公平性。CWmin太小,冲突率高;CWmin太大,空闲等待时间长。802.11ac把CWmin从15降到了7,就是为了在高吞吐场景下减少空闲等待。

我做过一个实验:两个站点同时向AP发大文件,一个用默认CWmin=15,另一个手动改成CWmin=31。结果呢?CWmin=15的站点吞吐量是另一个的2.3倍。这就是退避参数对公平性的真实影响。

下面这张图,是我自己总结的退避流程,你可以对照着理解:

CSMA/CA退避算法流程图 CSMA/CA 退避算法流程 信道空闲? 否 等待DIFS 是 等待DIFS(空闲后) 生成随机退避时间 退避计数器递减 计数器为0? 否 继续递减 是 发送数据 说明: CWmin=7/15,CWmax=255/1023 每次冲突CW翻倍 成功后CW重置为CWmin

2.4 退避参数对性能的量化影响

光说理论不够,咱们看点实际数据。我在802.11ac环境下做过一组对比测试,单AP、5个站点同时下载,只改CWmin这一个参数:

CWmin CWmax 总吞吐量(Mbps) 单站最大/最小吞吐量比 冲突率
7 255 432 3.8:1 12.3%
15 255 398 2.1:1 8.7%
31 255 356 1.4:1 5.2%
63 255 287 1.1:1 2.1%

看到没?CWmin=7时总吞吐量最高,但站点间极不公平(最大站是最小站的3.8倍)。CWmin=63时公平性最好,但总吞吐量掉了三分之一。这就是调优的难点——你必须在效率和公平之间找平衡。

我的调优建议:

  • 高密度场景(>20个站点):适当增大CWmin到31或63,减少冲突,提升整体稳定性。
  • 低密度场景(<5个站点):保持默认CWmin=7,追求极限吞吐。
  • 混合场景:可以考虑开启802.11e的TXOP和A-MSDU,减少退避次数,变相提升效率。

2.5 实际调优中的“坑”

最后聊几个我踩过的坑,希望能帮你少走弯路。

坑1:我曾经在调优时,把CWmin改成了1,想着“减少等待时间,提升吞吐”。结果呢?信道冲突率飙升到40%以上,实际吞吐量反而下降了60%。退避时间不是越短越好,CWmin至少要为站点数的2倍以上,这是我个人的经验值。

坑2:有些厂商的驱动,退避算法实现有bug。我遇到过一款网卡,在CW翻倍到CWmax后,不会重置,而是继续翻倍——结果CW变成了2047、4095……站点几乎永远抢不到信道。排查了三天才发现是驱动问题。所以,调优前先用抓包工具确认退避行为是否正常。

坑3:别忘了RTS/CTS对退避的影响。开启RTS/CTS后,RTS帧本身也会参与退避竞争。如果RTS阈值设置太低,小包也发RTS,退避次数翻倍,性能反而下降。我一般建议RTS阈值设在1500字节以上,只对大包启用。