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的流程。

单播的退避流程:

  1. 检测到信道空闲,等待DIFS
  2. 进入退避阶段,在[0, CW]范围内随机选一个退避计数
  3. 每过一个空闲时隙,退避计数减1
  4. 计数到0,发送数据
  5. 等待ACK
  6. 如果ACK超时,CW翻倍(直到CWmax),重传

广播的退避流程:

  1. 检测到信道空闲,等待DIFS
  2. 进入退避阶段,在[0, CW]范围内随机选一个退避计数
  3. 每过一个空闲时隙,退避计数减1
  4. 计数到0,发送广播帧
  5. 不等待任何确认,直接结束
  6. CW不翻倍,保持原值

看出区别了吗?广播帧发送完成后,CW不会翻倍。这意味着什么?意味着如果连续发送多个广播帧,每次的竞争窗口大小都一样,不会因为碰撞而增大。

我解释一下为什么协议这么设计。单播的CW翻倍是为了在网络拥塞时自动降低发送速率。但广播帧没有ACK,发送方无法判断是否发生了碰撞。如果盲目翻倍CW,反而可能导致信道利用率下降。

但这也带来了问题——广播帧的发送频率不会自适应调整。在网络拥塞时,广播帧和单播帧的碰撞概率会急剧上升,但广播帧的CW始终不变,相当于它一直在“硬闯”。

关键数据:802.11n/ac/ax中,广播帧的初始CWmin通常为15,CWmax也是15(因为不翻倍)。而单播的CWmin=15,CWmax=1023。这意味着广播帧的退避窗口永远只有15个时隙,竞争能力极强,但也更容易碰撞。

2.5 广播帧的完整发送流程

我把整个流程画了一张图,方便你理解。

802.11 广播帧发送流程 802.11 广播帧发送流程 1. 信道检测 (CCA) 2. 等待 DIFS (34μs) 3. 退避 [0, CWmin=15] 随机计数 4. 发送广播帧 (无ACK等待) 5. 发送完成 (CW不翻倍) ⚠ 关键差异 • 无ACK等待:发送方不等待任何确认,直接结束 • CW不翻倍:无论发送成功与否,竞争窗口始终为[0, 15]

这张图把广播帧的完整生命周期画清楚了。你注意看第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自适应,还有重传机制,而广播什么都没有。所以广播丢包不是“会不会”的问题,而是“丢多少”的问题。