2. WiFi广播的底层机制:802.11 MAC层广播帧格式、无ACK机制、无RTS/CTS保护、竞争窗口(CW)行为
大家好,我是老周。今天我们来聊聊WiFi广播的底层机制。说实话,很多工程师对单播抓得门儿清,但一碰到广播就懵了。为什么?因为广播在802.11 MAC层的行为,跟单播完全是两码事。
我当年刚做WiFi协议栈的时候,就踩过一个坑:产品在实验室测得好好的,一上客户现场就疯狂丢包。查了三天,最后发现是广播帧的ACK机制搞的鬼。嗯,从那以后,我再也不敢小看广播了。
2.1 802.11广播帧格式:到底长什么样?
先看帧格式。广播帧和单播帧在MAC头部结构上基本一致,但有两个关键区别。
| 字段 | 单播帧 | 广播帧 |
|---|---|---|
| Frame Control | To DS / From DS 按需设置 | To DS=0, From DS=0 (通常) |
| Duration/ID | 设置NAV值 | 固定为0 |
| Address 1 (RA) | 目标站点的MAC | FF:FF:FF:FF:FF:FF |
| Address 2 (TA) | 发送方MAC | 发送方MAC |
| Address 3 | BSSID或源MAC | BSSID |
| Sequence Control | 递增序列号 | 递增序列号 |
| FCS | CRC校验 | CRC校验 |
看到没?Address 1填的是广播MAC地址FF:FF:FF:FF:FF:FF。这意味着什么?意味着所有在同一个BSS内的站点,都必须接收这个帧。
还有个细节——Duration字段固定为0。我解释一下:广播帧不需要预留信道时间,因为它没有后续的ACK或CTS。你想想看,如果广播帧也设NAV,那整个网络都得等它,效率就太低了。
核心要点:广播帧的Address 1 = FF:FF:FF:FF:FF:FF,Duration = 0。这两个字段决定了广播帧在MAC层的全部行为。
2.2 无ACK机制:广播的致命伤
这是广播丢包最根本的原因。802.11协议明确规定:广播帧不等待ACK。
单播的流程是:发送方发数据帧 → 接收方回ACK → 发送方收到ACK才算成功。如果没收到,就重传。
广播呢?发送方把帧扔出去,就不管了。接收方收到也好,没收到也好,都不会有任何反馈。
为什么会这样?我个人的理解是:如果每个接收方都回ACK,那信道就炸了。假设AP下面挂了30个终端,一个广播帧出去,30个ACK同时涌回来,冲突概率几乎是100%。
但这也带来了问题——发送方根本不知道广播帧有没有被正确接收。我在项目中遇到过这样的情况:AP明明发了DHCP Offer广播,但终端就是没收到。查了半天,发现是信道干扰导致帧损坏了,但AP完全不知情,也不会重传。
避坑指南:我曾经在部署无线投屏系统时,发现广播帧丢包率高达30%。后来定位到是2.4G频段干扰太严重。因为广播没有ACK,丢一个就真丢了,不会重传。解决方案是切换到5G频段,并开启广播帧的MCS降级。
2.3 无RTS/CTS保护:隐藏节点问题加剧
RTS/CTS机制,说白了就是“先问后发”。发送方先发一个RTS(Request to Send),接收方回一个CTS(Clear to Send),告诉周围所有站点:“我要发数据了,你们都别抢”。
但广播帧不走这个流程。为什么呢?因为RTS/CTS的目标地址是单播地址,广播帧没法用。你想想看,如果广播帧发RTS,那CTS该谁回?所有站点都回?那又回到ACK冲突的老问题了。
没有RTS/CTS保护,隐藏节点问题就特别突出。什么叫隐藏节点?就是两个站点互相听不到对方,但都能听到AP。比如站点A和站点C都在AP的覆盖范围内,但A和C之间隔了一堵墙,互相感知不到。
这时候如果A发广播帧,C也在发广播帧,两者在AP处就会碰撞。因为A和C都听不到对方,不会做退避,碰撞概率极高。
我的经验:在密集部署场景(比如会议室、教室),隐藏节点是广播丢包的头号杀手。我建议开启AP的广播帧速率控制,把广播帧的发送速率降低到6Mbps或更低,这样能提高接收灵敏度,减少碰撞概率。
2.4 竞争窗口(CW)行为:广播的退避策略
广播帧也参与信道竞争,但它的退避行为和单播不一样。我们来看一下CSMA/CA的流程。
单播的退避流程:
- 检测到信道空闲,等待DIFS
- 进入退避阶段,在[0, CW]范围内随机选一个退避计数
- 每过一个空闲时隙,退避计数减1
- 计数到0,发送数据
- 等待ACK
- 如果ACK超时,CW翻倍(直到CWmax),重传
广播的退避流程:
- 检测到信道空闲,等待DIFS
- 进入退避阶段,在[0, CW]范围内随机选一个退避计数
- 每过一个空闲时隙,退避计数减1
- 计数到0,发送广播帧
- 不等待任何确认,直接结束
- CW不翻倍,保持原值
看出区别了吗?广播帧发送完成后,CW不会翻倍。这意味着什么?意味着如果连续发送多个广播帧,每次的竞争窗口大小都一样,不会因为碰撞而增大。
我解释一下为什么协议这么设计。单播的CW翻倍是为了在网络拥塞时自动降低发送速率。但广播帧没有ACK,发送方无法判断是否发生了碰撞。如果盲目翻倍CW,反而可能导致信道利用率下降。
但这也带来了问题——广播帧的发送频率不会自适应调整。在网络拥塞时,广播帧和单播帧的碰撞概率会急剧上升,但广播帧的CW始终不变,相当于它一直在“硬闯”。
关键数据:802.11n/ac/ax中,广播帧的初始CWmin通常为15,CWmax也是15(因为不翻倍)。而单播的CWmin=15,CWmax=1023。这意味着广播帧的退避窗口永远只有15个时隙,竞争能力极强,但也更容易碰撞。
2.5 广播帧的完整发送流程
我把整个流程画了一张图,方便你理解。
这张图把广播帧的完整生命周期画清楚了。你注意看第4步和第5步——没有ACK等待,没有CW翻倍。这就是广播帧“快但不可靠”的本质。
2.6 广播帧的速率选择
还有一个容易被忽略的点:广播帧的发送速率。
单播帧可以使用很高的MCS速率(比如MCS7、MCS9),因为接收方会回ACK,如果速率太高收不到,发送方可以降速重传。
但广播帧不行。因为没有ACK,发送方无法知道接收方是否解调成功。所以协议规定:广播帧必须使用基本速率集(Basic Rate Set)中的速率发送。
基本速率集是什么?就是所有站点都支持的速率。在802.11g/n中,基本速率通常是1Mbps、2Mbps、5.5Mbps、11Mbps(可选)。在802.11ac/ax中,基本速率通常是6Mbps。
我个人的习惯是:在配置AP时,把广播帧的强制速率设到6Mbps或12Mbps。太低的话,广播帧占用的信道时间太长;太高的话,边缘站点可能收不到。6Mbps是个不错的平衡点。
| 速率 | 调制方式 | 广播帧适用性 | 我的建议 |
|---|---|---|---|
| 1 Mbps | DSSS | 兼容性好,但占用信道时间长 | 仅用于信标帧 |
| 6 Mbps | OFDM | 平衡覆盖和效率 | 推荐 |
| 12 Mbps | OFDM | 效率高,但覆盖范围缩小 | 密集部署场景可用 |
| 24 Mbps+ | OFDM | 覆盖范围太小,不推荐 | 不推荐用于广播 |
小技巧:如果你用的是Cisco或Aruba的AP,可以在CLI中设置broadcast-rate参数。比如broadcast-rate 6000就是把广播帧强制设为6Mbps。这个参数能显著改善广播帧的可靠性。
2.7 总结:广播帧的三大特征
好了,我们把这一章的核心内容串一下。广播帧在802.11 MAC层有三个根本特征:
- 无ACK:发送方不等待确认,丢包了也不知道,不会重传
- 无RTS/CTS:不解决隐藏节点问题,碰撞概率高
- CW不翻倍:退避窗口固定,不会自适应调整
这三个特征加在一起,就决定了广播帧的可靠性远低于单播帧。你想想看,单播有ACK、有RTS/CTS、有CW自适应,还有重传机制,而广播什么都没有。所以广播丢包不是“会不会”的问题,而是“丢多少”的问题。