Appearance
CSMA/CA协议
2026 大纲 三(五)2 随机访问介质访问控制(CSMA/CA 协议)。本篇讲协议机制;BSS/ESS/AP、MAC 帧格式与一轮完整传输的时序表拆解在《无线局域网(IEEE 802.11)》。
一、无线上"边发边听"根本做不到
CSMA/CD 的全部本事都建在"边发边听"上。换到无线,这一条从物理原理上就不成立:
- 自己的发射信号就在天线上,功率是接收信号的百万倍量级,物理上分辨不出叠加的微弱信号——这是原理性的,不是硬件不够好。
- 检测到"空闲"其实未必空闲——隐蔽站的信号根本传不到我这里。
- 即使硬件能检测碰撞,也检测不出隐蔽站带来的碰撞——碰撞发生在别处。
代价结构也跟着变了。 有线上撞了立刻停、只浪费一小段;无线上一旦开始发就必须把整帧发完才知道结果,一次碰撞浪费的是一整帧。代价变了,策略就得从"检测"转向"避免"——CA 就是 Collision Avoidance。
隐蔽站与暴露站:方向相反的两种误判
隐蔽站:A ←--通信范围--→ B ←--通信范围--→ C (A 和 C 互相听不到对方)
暴露站:A ←--→ B ←--→ C ←--→ D隐蔽站:A 和 C 都能与 B 通信,但彼此检测不到对方的信号。A 正在给 B 发数据时,C 监听发现"空闲"也开始给 B 发——在 B 处产生碰撞,而 A 和 C 谁都检测不到。
"隐蔽"是相互的,也不是"信号弱",而是碰撞的发生地与检测地被空间分开了。这正是载波监听失效的根源:监听的是"我这里"忙不忙,碰撞却发生在"对方那里"。
暴露站:B 正在给 A 发数据,C 听到 B 的信号判定"信道忙"而不敢给 D 发;但 C→D 与 B→A 实际互不干扰,C 白等了。
两者的方向恰好相反:隐蔽站是"该停的没停"(该判忙的判成了闲)⇒ 碰撞且无人察觉;暴露站是"不该停的停了"⇒ 信道空转。 802.11 用 RTS/CTS 处理前者,对后者没有专门机制。
CA 做的五件事
| 机制 | 性质 |
|---|---|
| 物理载波监听 | 沿用 CSMA |
| 虚拟载波监听 NAV | 替代品——替代做不成的碰撞检测 |
| 链路层 ACK | 替代品——同上 |
| 强制退避 | 预防 |
| RTS/CTS 预约 | 预防 |
其中必须逐帧链路层 ACK 这一条最本质:CSMA/CD 能自知成败故不需确认,CSMA/CA 看不到碰撞,只能靠接收方"我收到了"倒推。 这比"有线/无线"更能说明两者的分野。
二、DCF 基本接入流程
802.11 的 MAC 层用分布协调功能 DCF 实现 CSMA/CA,所有实现都必须支持。
什么时候可以不退避? 检测到信道连续空闲超过 DIFS 即可立即发送。必须退避的只有三种情况:① 要发时检测到信道忙;② 已发出的帧未收到确认要重传;③ 接着发后续数据帧(防止一个站长期垄断发送权)。
"推迟接入"不等于"退避"
这两个词在流程图里是两个分支,考试也爱在这里设坑:
- 信道忙时是推迟接入,退避计时器冻结并保留剩余值;
- 信道空闲且已过 DIFS 才是退避,计时器才倒计时。
冻结不是清零:下一轮从剩余值继续倒数。这条机制的效果是——等得越久越先发,它把"已经等了多久"变成了可继承的优先级。CSMA/CD 完全没有这个机制(它的适配器对历史碰撞无记忆)。
举个例子看清楚。站 C 和 D 在同一争用期分别随机取到退避时隙数 3 和 9(时隙
要不要重新随机取值?不要。 只有"发出的帧未收到确认、要重传"时才把争用窗口加倍并重新取值。冻结是同一次发送尝试内的暂停/继续,窗口加倍是上一次尝试失败后的重新开始——混起来会得出"D 要重新摇一个数"这种错误结论。
也正是靠这个机制,D 只需再等 6 个时隙,而任何新来的站要从
三、退避时隙数怎么取
站点在
窗口怎么变。 802.11 标准本身未规定
| 本帧已重传次数 | 退避时隙数 | 退避时间范围(时隙 | 平均退避时间 | |
|---|---|---|---|---|
| 0(首次进争用期) | 15 | |||
| 1 | 31 | |||
| 2 | 63 | |||
| 3 | 127 | |||
| ≥6 | 1023(封顶) |
⚠️ 各修订版对
和 CSMA/CD 的退避对照着记——两者都是"撞得越多退得越久",但四处不同:
| CSMA/CD 截断二进制指数退避 | CSMA/CA 争用窗口加倍 | |
|---|---|---|
| 取值集合 | ||
| 时间单位 | 争用期 | 802.11 定义的时隙(如 |
| 何时退避 | 只在碰撞之后 | 信道忙 / 重传 / 连发后续帧,三种都要 |
| 中途信道转忙 | 不冻结,一次算定 | 冻结,保留剩余值继续倒数 |
四、帧间间隔:用长度编码优先级
SIFS < PIFS < DIFS,间隔越短优先级越高。判据只有一句:接续上一次传输的等 SIFS(ACK / CTS / 分片后续帧),新发起一次传输的等 DIFS(数据帧、RTS)。
第一层:为什么 ACK 之前要有间隔。 接收方收完数据帧后不能瞬间回 ACK——它要先做 CRC 校验,无差错还要从接收状态转为发送状态,这些动作需要时间,SIFS 就是留给它们的。
第二层:为什么它必须比 DIFS 短。 接收方做校验时信道是空闲的,若不加约束,别的站会以为"信道空了"就抢着发,把即将到来的 ACK 撞掉。于是标准规定想新发起传输的站必须等满更长的 DIFS,这样在 SIFS 到 DIFS 这段差值里只有 ACK 有资格发出——"使得在这段时间(DATA + SIFS + ACK),整个信道好像是 A 和 B 专用的"。
所以 SIFS 短不是"反应快",是刻意安排的优先级。
一组具体数值(802.11g):时隙
五、RTS/CTS 与虚拟载波监听
RTS 与 CTS 的首部里写明"我将要占用信道多久",凡听到的站把这段时长写进自己的 NAV(网络分配向量),倒计时期间视信道为"虚拟忙"。常被漏掉的一条:A 随后发的 DATA 帧首部里也写了
NAV 为什么能治隐蔽站:C 听不到 A(这正是"隐蔽"的定义),但 C 与 AP 之间是通的——只要 C 能和 AP 通信,它就一定听得到 AP 发的 CTS。CTS 一发,所有能与 AP 通信的站全部沉默。
这就是"虚拟"的含义:C 没有在物理层听到任何信号,它是通过读别人帧里的一个数字判定信道忙的。物理监听回答"现在有没有人在发",虚拟监听回答"接下来会不会有人在发"。
NAV 怎么算:从本帧发完之后往后数
NAV 从"本帧发完之后"起算——本帧自身的传输时间不计入自己写的 NAV。NAV 是给旁观者设的,发送方自己知道要占多久,不需要它。
设 SIFS
RTS 里的 NAV:从 RTS 发完之后开始数,还要经过 SIFS → CTS → SIFS → DATA → SIFS → ACK,一个 SIFS 都不能漏(本例有三个):
CTS 里的 NAV:从 CTS 发完之后数,还剩 SIFS → DATA → SIFS → ACK:
两者相差
⚠️ 帧长给的是字节、速率给的是比特每秒,中间必须乘 8,这是这类题的典型失分处。
RTS/CTS 的账:为什么要设门限
RTS 20 字节、CTS 14 字节,数据帧最长 2346 字节。预约的实质是把碰撞从"长帧之间"挪到"短帧之间":撞掉一个 20 字节的 RTS 远比撞掉一个 2000 字节的数据帧便宜。
拿上面那组数算(设退避 5 个时隙、DIFS
第二式直接复用了
多花的
这就是 RTS 门限的全部理由:绝对开销固定,而它避免的损失(一次碰撞要白发一整帧)随帧长线性增长。所以标准把预约做成可选,超过门限的长帧才启用。
最后一条边界:CA 是"避免"不是"消除"。两站的退避计时器可能同时归零;没收到 RTS/CTS 的站可能中途插入撞掉 RTS 或 CTS。预约也消灭不了碰撞。
六、CSMA/CD 与 CSMA/CA 对比
| 对比项 | CSMA/CD(有线 802.3) | CSMA/CA(无线 802.11) |
|---|---|---|
| 能否检测碰撞 | 能(边发边听) | 不能(收发功率差百万倍) |
| 核心策略 | 检测到碰撞后停发 | 发送前避免碰撞 |
| 链路层确认 | 无(靠上层保证可靠) | 必须有(逐帧 ACK) |
| 退避时机 | 只在碰撞之后 | 信道忙 / 重传 / 连发后续帧 |
| 退避计时器 | 一次算定,不冻结 | 信道忙则冻结、保留剩余值 |
| 退避时槽 | 争用期 | 802.11 定义的时隙 |
| 帧间间隔 | 无 | SIFS / PIFS / DIFS,用于优先级 |
| 虚拟载波监听 / 信道预约 | 都没有 | NAV;RTS/CTS(可选,按帧长门限) |
| 关键长度约束 | 最小帧长(保证撞得到) | 无最小帧长要求;有 RTS 门限 |
最后一行值得单独看:CSMA/CD 靠"帧不能太短"保证碰撞可检测;CSMA/CA 不检测碰撞,它关心的反而是"帧够不够长,长到值得为它做预约"。两者对帧长的关切方向相反。
还有一条口径要钉死:无线用 CA、有线用 CD。"以太网使用 CSMA/CA"是错的——以太网 = CSMA/CD,Wi-Fi = CSMA/CA。
本节小结
- 无线用不了 CSMA/CD 是原理性的:发射功率是接收功率的百万倍量级、隐蔽站让"检测到空闲"不等于"信道空闲"、撞了只能把整帧发完才知道。策略于是从"检测"改成"避免",用 NAV 与逐帧链路层 ACK 顶替做不成的碰撞检测。
- DCF 的两个状态要分清:信道忙时"推迟接入"、计时器冻结保留剩余值,信道空闲过了 DIFS 才"退避"倒计时;冻结让"已经等了多久"变成可继承的优先级。退避时隙数在
中等概率随机取,只有重传才把 近似加倍(15→31→63→…→1023 封顶),成功一帧后复位。帧间间隔用长度编码优先级,保证 ACK 抢在任何新发起者之前。 - RTS/CTS 治的是隐蔽站:隐蔽站听不到发送方,但一定听得到 AP 的 CTS,据此设 NAV 作虚拟忙。NAV 从本帧发完之后起算,故 RTS 里的比 CTS 里的多
。预约把碰撞从长帧之间挪到短帧之间,开销固定而收益随帧长增长,故设门限只让长帧启用;预约仍消灭不了碰撞。
考点速记
本节在真题里被考过的形式按问法分三类,其中第三类是这几年出现最规整的计算题。
① 机制归属的单点判断(cn-2011-36、cn-2018-35)。两道都只考一句话:
- "对正确接收到的数据帧进行确认的 MAC 协议"是 CSMA/CA——逐帧链路层 ACK 是它区别于 CSMA/CD 的本质特征(后者能自知碰撞,不需要确认)。
- "CSMA/CA 进行信道预约的方法"是交换 RTS 与 CTS 帧。干扰项里的"发送确认帧"是可靠性机制不是预约,"二进制指数退避"是 CSMA/CD 的说法。
② 判断哪个帧间间隔最长(cn-2020-37)。给一张 RTS → CTS → DATA → ACK 的时序图,每段消息前标了 IFS1~IFS4,问哪个最长。用第四部分那条判据:只有 RTS 是"新发起一次传输",等的是 DIFS;后面三个都是"接续上一次传输",等的都是 SIFS。 DIFS > SIFS,所以答 IFS1。一个 DIFS 打头,其余全是 SIFS——这条形状在下一节的完整时序表里还会再用一次。
③ 时间计算(cn-2024-36、cn-2026-35)。两道题的动作相同、分岔口不同,放在一起看最清楚。
- cn-2024-36 求 NAV:DIFS=120 μs、SIFS=28 μs,RTS/CTS/ACK 传输时延 3/2/2 μs,数据帧 1998 B、链路 54 Mb/s。先算
s;隐藏站收到的是 CTS,按"从本帧发完之后往后数":
DIFS 和 RTS 都不进这个式子——它们发生在 CTS 之前。这是本题唯一的坑。
- cn-2026-35 求一轮时间:300 Mbps、DIFS=128 μs、SIFS=28 μs,忽略除数据帧以外其他帧的传输时延,1500 B 数据帧,问"从开始发送数据帧至确认接收方收到"所需时间。
s,于是
计时起点是"开始发送数据帧",所以 DIFS 不算。 干扰项 168 μs 正是把 DIFS 加进去的结果。读这类题第一件事是把计时起点圈出来——"从信道空闲起"要算 DIFS,"从开始发送数据帧起"不算,两者恰好差一个 DIFS。
易错:计时起点决定 DIFS 算不算。 "从信道空闲起算"含 DIFS,"从开始发送数据帧起算"不含。这两种问法只差几个字。
易错:NAV 从本帧发完之后起算,本帧自己的传输时间不计入。 所以 RTS 里的 NAV 比 CTS 里的多一个
。
易错:帧长是字节、速率是 bit/s,中间要乘 8。 1998 B 在 54 Mb/s 上是 296 μs 不是 37 μs。
易错:"推迟接入"与"退避"是两回事。 信道忙时计时器冻结、保留剩余值;只有重传才把争用窗口加倍并重新取值。
易错:逐帧 ACK 是 CSMA/CA 有、CSMA/CD 没有。 反过来说,最小帧长是 CSMA/CD 有、CSMA/CA 没有。
易错:以太网用 CSMA/CD,Wi-Fi 用 CSMA/CA,不能互换。 另外 CSMA/CA 是"避免"不是"消除",预约之后仍可能碰撞。
教材出处
- 谢希仁《计算机网络》(第 8 版)印刷 p413,9.1.3 节:无线不能用 CSMA/CD 的原因——"由于无线信道的传输条件特殊,其信号强度的动态范围非常大,因此在 802.11 适配器上接收到的信号强度往往会远远小于发送信号的强度(信号强度可能相差百万倍)。因此无线局域网的适配器无法实现碰撞检测";隐蔽站定义——"所谓隐蔽站,就是它发送的信号检测不到,但却能产生碰撞。这里 C 是 A 的隐蔽站,A 也是 C 的隐蔽站";三条特点(无法碰撞检测 / 检测到空闲其实可能不空闲 / 即使能检测也检测不出隐蔽站带来的碰撞);碰撞代价——"一旦开始发送数据,就一定把整个帧发送完毕;一旦发生碰撞,整个信道资源的浪费就比较严重";以及 CA 的含义"协议的设计是要尽量减少碰撞发生的概率"。
- 同书印刷 p414:链路层确认的必要性——"无线站点每通过无线局域网发送完一帧后,要等到收到对方的确认帧后才能继续发送下一帧。这就是链路层确认";DCF 的定义与 CSMA/CA 协议要点三条。
- 同书印刷 p415:SIFS 存在与"必须短于 DIFS"的推理——"B 收到数据帧后,必须进行 CRC 检验。若检验无差错,再从接收状态转为发送状态,这些动作不可能在瞬间完成";"802.11 标准定义了比 SIFS 更长的时间间隔 DIFS,并且规定,凡在空闲时间想发送数据的站点,必须等待时间 DIFS 后才能发送。这就保证了确认帧 ACK 得以优先发送。这个重要措施使得在这段时间(DATA + SIFS + ACK),整个信道好像是 A 和 B 专用的";以及虚拟载波监听与 NAV 的定义。
- 同书印刷 p416:时隙长度的定义("在下一个时隙开始时,每个站点都能检测出在前一个时隙开始时信道是否忙")、802.11g 参数("一个时隙时间为
,SIFS ,而 DIFS 应比 SIFS 的长度多两个时隙,因此 DIFS ");"推迟接入"与"退避"的区别及冻结计时器的例子(C 退避 3 个时隙、D 退避 9 个时隙,D 冻结剩余 6 个);争用窗口"802.11 标准并未规定争用窗口 CW 的初始值,但建议 CW 最小值可取为 15,最大值为 1023","每重传一次,争用窗口的数值就近似加倍地增大"。 - 同书印刷 p417:不必经过争用期的条件("当站点想发送数据、并检测到信道连续空闲时间超过 DIFS 时,即可立即发送数据,而不必经过争用期")与必须经过争用期的三种情况;RTS/CTS 预约的完整时长写法(RTS 写
,CTS 写 ,DATA 帧写 )。 - 同书印刷 p418:RTS/CTS 的开销与收益——"这两种控制帧都很短,其长度分别为 20 字节和 14 字节,与数据帧(最长可达 2346 字节)相比开销不算大。相反,若不使用这种控制帧,则一旦发生碰撞而导致数据帧重发,浪费的时间就更多了";"信道预约不是强制性规定。各站可以自己决定使用或不使用信道预约。看来,只有当数据帧的长度超过某数值时,使用 RTS 帧和 CTS 帧才比较有利";以及预约后仍可能碰撞。
相关知识
CSMA/CD 协议|无线局域网(IEEE 802.11)|ALOHA 协议|以太网与 MAC 地址