随机访问:CSMA/CA
CSMA/CA 与 CSMA/CD 同属 3.5.2,另起一页。它是 CSMA/CD 搬到无线环境后被迫做的改造:检测不了冲突,就只能尽量避开冲突,再用确认来发现失败。
真题的考点很集中:确认机制(2011)、信道预约(2018)、三种帧间间隔(2020)、NAV 的计算(2024)。每一个都能从”为什么无线不能检测冲突”推出来。
机制
为什么无线局域网不能用冲突检测
CSMA/CD 协议已成功用于有线连接的局域网,但无线局域网不能简单地搬用 CSMA/CD。无线局域网仍然使用 CSMA,但无法使用冲突检测,主要有两个原因:
- 适配器接收到的信号强度往往远小于发送信号的强度,且在无线介质上信号强度的动态变化范围很大,因此若要实现冲突检测,则硬件上的花费会过大。——自己正在发送时,本机的强信号会淹没远处传来的弱信号,边发边听听不见。
- 在无线通信中,并非所有站点都能够听见对方(但能产生冲突),即存在”隐蔽站”问题,从而使得冲突检测机制并不能检测到所有的冲突。
为此,802.11 标准定义了广泛用于无线局域网的 CSMA/CA 协议,它对 CSMA/CD 协议进行修改,将冲突检测改为冲突避免(Collision Avoidance,CA)。“冲突避免”并不是指协议可以完全避免冲突,而是指协议的设计要尽量降低冲突发生的概率。因为 802.11 无线局域网不使用冲突检测,一旦站点开始发送一个帧,就会完全发送该帧,但冲突存在时仍发送整个帧(尤其是长数据帧)会严重降低网络的效率,所以要采用冲突避免技术来降低冲突的概率。
确认:用停止-等待发现失败
因为无线信道的通信质量远不如有线信道,所以 802.11 标准使用链路层确认/重传(ARQ)方案,即站点每通过无线局域网发送完一帧,就要在收到对方的确认帧后才能继续发送下一帧(2011 年考过 CSMA/CA 的确认机制)。可见,802.11 标准无线局域网采用的停止-等待协议是一种可靠传输协议——这与有线链路”只检错、不确认”形成对照(3.1.5)。
检测不了冲突,确认就成了发现冲突的唯一手段:没收到 ACK,就当作失败重传。
帧间间隔:用等待时长排优先级
为了尽量避免冲突,802.11 标准规定,所有站检测到信道空闲后,还要等待一段很短的时间(继续监听)才能发送帧。这段时间称为**帧间间隔**(InterFrame Space,IFS)。帧间间隔的长短取决于站点要发送的帧的类型(2020 年考过):
| IFS | 长度 | 用途 |
|---|---|---|
| SIFS(短 IFS) | 最短 | 分隔属于一次对话的各帧:ACK 帧、CTS 帧、分片后的数据帧、所有回答 AP 探询的帧 |
| PIFS(点协调 IFS) | 中等 | 在 PCF 方式中使用 |
| DIFS(分布式协调 IFS) | 最长 | 在 DCF 方式下发送数据帧和管理帧 |
等待时间越短,优先级越高:一次对话进行中(刚收到数据要回 ACK、刚收到 RTS 要回 CTS),应答方只等 SIFS 就发,别的站还在等 DIFS,根本插不进来。这就是用时长排优先级的道理。
(802.11 标准定义了两个 MAC 子层:分布式协调功能 DCF 不采用任何中心控制,各站通过争用信道获得发送权;点协调功能 PCF 使用 AP 集中控制,用类似探询的方法将发送权轮流交给各站,向上提供无争用服务。DCF 是默认方式,必须实现;PCF 是可选方式,实际中很少使用。)
虚拟载波监听
802.11 标准规定各站在发送数据之前必须监听信道,只要监听到信道忙,就不能发送数据。802.11 标准还规定各站采用虚拟载波监听机制,即让源站将它要占用信道的持续时间(包括目的站发回 ACK 帧所需的时间)及时通知给所有其他站,以便使所有其他站在这段时间内都停止发送,这样就大大减少了冲突的概率。“虚拟载波监听”表示其他站并未监听信道,而是因收到了源站的通知才不发送数据,这种效果就像是其他站都监听了信道。
退避:什么时候不退避
当信道从忙态转为空闲时,任何一个站要发送数据帧,不仅要等待一个 DIFS 的间隔,还要进入争用窗口,计算随机退避时间以便再次试图访问信道(避免多个站同时发送),因此降低了冲突发生的概率。
当且仅当检测到信道空闲且这个数据帧是要发送的第一个数据帧时,才不使用退避算法;其他所有情况都必须使用退避算法,具体为:①在发送第一个帧之前检测到信道忙;②每次重传;③每次成功发送后要发送下一帧。
CSMA/CA 的退避算法与 CSMA/CD 稍有不同:第
CSMA/CA 算法归纳如下:
flowchart TD S["有数据帧要发送"] --> Q{"最初有数据要发送<br/>且检测到信道空闲?"} Q -- "是" --> W["等待 DIFS 后<br/>发送整个数据帧"] Q -- "否" --> B["执行退避算法,选取随机退避值<br/>信道忙:计时器保持不变<br/>信道空闲:计时器倒计时"] B --> Z["计时器减至 0<br/>(此时信道只可能空闲)"] Z --> W2["发送整个帧并等待确认"] W --> ACK{"规定时间内<br/>收到 ACK?"} W2 --> ACK ACK -- "是:发送下一帧" --> B ACK -- "否:重传" --> B classDef k fill:#dbeafe,stroke:#2563eb class B k
- 若站点最初有数据要发送(而非发送不成功再进行重传),且检测到信道空闲,那么在等待时间 DIFS 后,就发送整个数据帧。
- 否则,站点执行 CSMA/CA 退避算法,选取一个随机退避值。一旦检测到信道忙,退避计时器就保持不变;只要信道空闲,退避计时器就进行倒计时。
- 当退避计时器减至 0 时(这时信道只可能是空闲的),站点就发送整个帧并等待确认。
- 发送站若收到确认,就知道已发送的帧被目的站正确接收。这时要发送第二帧,就要从步骤 2 开始,执行 CSMA/CA 退避算法,随机选定一段退避时间。
若发送站在规定时间(由重传计时器控制)内未收到确认帧 ACK,就必须重传该帧,再次使用 CSMA/CA 协议争用该信道,直到收到确认,或经过若干次重传失败后放弃发送。
处理隐蔽站:RTS 与 CTS
站 A 和站 B 都在 AP 的覆盖范围内,但 A 和 B 相距较远,彼此都听不见对方。当 A 和 B 检测到信道空闲时,都向 AP 发送数据,导致冲突发生,这就是隐蔽站问题。为了避免该问题,802.11 标准允许发送站对信道进行预约(2018 年考过信道预约的方法):
sequenceDiagram participant S as 源站 participant AP as 目的站(AP) participant O as 其他站 Note over S: 监听到信道空闲<br/>等待 DIFS S->>AP: RTS(源地址、目的地址、通信所需的持续时间) Note over AP: 等待 SIFS AP->>S: CTS(通信所需的持续时间) AP-->>O: CTS 被其他站听到 → 设置 NAV,推迟访问 Note over S: 等待 SIFS S->>AP: DATA Note over AP: 等待 SIFS AP->>S: ACK
- 源站发送数据之前,先监听信道,若信道空闲,则等待时间 DIFS 后,广播一个请求发送 RTS(Request To Send)控制帧,它包括源地址、目的地址和这次通信所需的持续时间。
- 若 AP 正确收到 RTS 帧,且信道空闲,则等待时间 SIFS 后,广播一个允许发送 CTS(Clear To Send)控制帧,它也包括这次通信所需的持续时间。
- 源站收到 CTS 帧后,再等待时间 SIFS,就可发送数据帧。
- 若 AP 正确收到了源站发来的数据,则等待时间 SIFS 后就向源站发送确认帧 ACK。
AP 覆盖范围内的其他站听到 CTS 帧后,将在 CTS 帧中指明的时间内抑制发送。CTS 帧有两个目的:①给源站明确的发送许可;②指示其他站在预约期内不要发送。
两个帧里填写的持续时间不一样(NAV 值的分析 2024 年考过):
- 源站在 RTS 帧中填写的,是从收到 RTS 帧后到目的站最后发送完 ACK 帧为止的时间,即 SIFS + CTS + SIFS + 数据帧 + SIFS + ACK。
- AP 在 CTS 帧中填写的,是从收到 CTS 帧后到目的站最后发送完 ACK 帧为止的时间,即 SIFS + 数据帧 + SIFS + ACK。
虽然站 B 检测不到站 A 发送给 AP 的 RTS 帧,但却能检测到 AP 发送给站 A 的 CTS 帧,站 B 根据 CTS 帧中的持续时间设置自己的网络分配向量(NAV)。NAV 指出了信道忙的持续时间,意味着站 A 和 AP 以外的站点都不能在这段时间内发送数据。这正是 CTS 必须由 AP 广播的原因:隐蔽站听不见源站,但一定听得见 AP。
使用 RTS 帧和 CTS 帧会使网络的通信效率有所下降,但这两种控制帧都很短,与数据帧相比开销不算大;相反,若不使用这种控制帧,一旦发生冲突而导致数据帧重发,浪费的时间会更多。信道预约不是强制性规定,各站可自行决定使用或不使用;或只有当数据帧长超过某个数值时才使用 RTS 帧和 CTS 帧,这样就更为划算。
此外,数据帧也可携带本次通信所需的持续时间,这些都属于虚拟载波监听机制。站点只要监听到 RTS、CTS 或数据帧中的任何一个,就能知道信道将被占用的持续时间,而不需要真正监听信道上的信号,因此虚拟载波监听机制能减少隐蔽站带来的碰撞问题。持续时间写在 802.11 帧首部的”持续期”字段里,见 3.6.3。
计算模板:NAV
- 看是谁的帧设置了 NAV:听到 RTS 的站按 RTS 的持续时间设,听到 CTS 的站按 CTS 的持续时间设。
- RTS 的持续时间 = SIFS + CTS + SIFS + DATA + SIFS + ACK;CTS 的持续时间 = SIFS + DATA + SIFS + ACK。
- DATA 的传输时延 = 帧长 ÷ 带宽;DIFS 不计入(它发生在 RTS 之前)。
例(2024 真题,王道 3.5.4 第 43 题):DIFS = 128μs,SIFS = 28μs,RTS、CTS、ACK 的传输时延分别为 3μs、2μs、2μs,忽略传播时延。主机 A 向 AP 发送 1998B 的数据帧,带宽 54Mb/s,隐蔽站 B 收到 AP 发送的 CTS 帧时设置的 NAV 值是?
数据帧传输时延
例(2020 真题,第 41 题):主机 H 与 AP 按 RTS、CTS、DATA、ACK 的顺序交互,四个帧前的帧间间隔 IFS1~IFS4 中最长的是?H 发 RTS 前等的是 DIFS,其余三个都是 SIFS,最长的是 IFS1,选 A。
边界
“冲突避免”不是”没有冲突”。 CSMA/CA 只能降低冲突概率,无线信道上的冲突无法完全避免;也正因为可能冲突,CSMA/CA 同样需要退避算法(王道 3.5.5 第 23 题)。
错题复盘:CSMA/CA 的主要特点是发送后等待确认、超时重传;检测到空闲还须等 DIFS,预约信道不是强制的
王道 3.5.4 第 24 题:CSMA/CA 协议的主要特点是(A. 发送前先检测信道,信道空闲就立即发送,信道忙就随机推迟发送 B. 边发送边检测信道,一旦发现冲突就立即停止发送 C. 发送前先预约信道,获得信道授权后再发送 D. 发送后等待确认帧,在规定时间内未收到确认帧就重传)。答案 D。
A 错在”立即发送”:若检测到信道空闲,CSMA/CA 规定还必须等待 DIFS 的时间才能开始发送。B 是 CSMA/CD 的特点,CSMA/CA 不会进行冲突检测。C 错在把预约当成了必经步骤:预约信道并不是 CSMA/CA 的强制规定,在普通模式下不进行预约。只有 D 是 CSMA/CA 无论如何都要做的事——既然检测不了冲突,就只能靠确认来发现失败。
CSMA/CA 与 CSMA/CD 的退避不是一回事。 CD 在检测到冲突之后才退避;CA 在”不是信道空闲时的第一个帧”的所有情况下都要先退避。CD 的上限是 1023,CA 是 255。
二进制指数退避不是信道预约的方法。 2018 年真题问 CSMA/CA 进行信道预约的方法,答案是交换 RTS 与 CTS 帧;发送确认帧是为了可靠传输,二进制指数退避是 CSMA/CD 的冲突处理方式(第 39 题)。
无线局域网不用 CSMA/CD,理由是”难以实现冲突检测、存在隐蔽站和暴露站问题”。 暴露站的例子:B 向 A 发送,C 想向 D 发送,C 检测到信道忙而不发,其实 C 发给 D 并不会影响 B 到 A。“所有站点都能听见对方”是 CSMA/CD 的前提,无线环境下不成立(第 22 题)。
确认帧在 CSMA/CA 里不是”可选的可靠性增强”,而是协议的一部分。 2011 年真题问”对正确接收到的数据帧进行确认的 MAC 协议”,四个选项 CSMA、CDMA、CSMA/CD、CSMA/CA 中只有 CSMA/CA(第 34 题)。
口径差异:真实 Wi-Fi 的退避窗口与 RTS/CTS
教材口径:第
次退避在 个时隙中选取,最大到 255;RTS/CTS 按需使用。 工程口径:实际 802.11 的争用窗口参数随物理层标准而不同(从一个最小值起逐次翻倍,上限一般为 1023);家用 Wi-Fi 通常默认只对超过某个长度阈值的帧启用 RTS/CTS,与教材”只有当数据帧长超过某个数值时才使用”的说法一致。
考试按教材口径作答。
对照速查
| CSMA/CD | CSMA/CA | |
|---|---|---|
| 介质 | 总线形以太网(有线) | 802.11a/b/g/n(无线) |
| 对冲突 | 检测冲突,但无法避免 | 避免冲突,但无法检测 |
| 检测方式 | 电缆中的电压变化 | 能量检测、载波检测、能量载波混合检测 |
| 发送前 | 空闲(且过 9.6μs 帧间隔)即发 | 空闲后还要等 DIFS;非首帧还要退避 |
| 发送中 | 边发边听,冲突即停 | 一旦发送就发完整个帧 |
| 确认 | 无(链路层不确认) | 有,停止-等待 |
| 退避上限 | 1023 | 255 |
教材的一句话总结:CSMA/CA 在发送数据帧之前先广播告知其他站点,让其他站点在某段时间内不要发送数据帧,以免发生冲突;CSMA/CD 在发送数据帧之前监听,边发送边监听,一旦发生冲突,就立即停止发送。
| 说法 | 对错 |
|---|---|
| CSMA/CA 中接收方收到数据帧后要返回确认帧 | ✅ |
| CA 表示冲突避免,因此此类网络不会出现冲突 | ❌ |
| CSMA/CA 检测到信道空闲后立即发送 | ❌(还要等 DIFS) |
| CSMA/CA 不需要退避算法 | ❌ |
| SIFS < PIFS < DIFS | ✅ |
| 隐蔽站根据收到的 RTS 帧设置 NAV | ❌(隐蔽站听不到 RTS,按 CTS 设置) |
考点
- 无线不能用冲突检测的两个原因:收发信号强度悬殊、隐蔽站
- CSMA/CA = 冲突避免,只降低概率;链路层确认 + 停止-等待,是可靠传输协议(2011)
- IFS:SIFS 最短(ACK、CTS)< PIFS < DIFS 最长(数据帧、管理帧)(2020)
- 首帧且信道空闲才不退避;退避中信道忙则计时器冻结
- RTS/CTS 信道预约(2018);CTS 让隐蔽站设置 NAV;预约非强制
- NAV:RTS 填 SIFS+CTS+SIFS+DATA+SIFS+ACK,CTS 填 SIFS+DATA+SIFS+ACK(2024)
链接
- 🏠 返回总览:计算机网络第 3 章:数据链路层总览
- ⬅️ 同节前:3.5.2 随机访问:ALOHA、CSMA 与 CSMA/CD
- ➡️ 下一节:3.5.3 轮询访问:令牌传递协议
- 🔗 3.6.3 802.11 无线局域网(持续期字段与三个地址)
- 📖 名词库:第 3 章名词库