介质访问控制(Media Access Control, MAC)

ZaynPei Lv6

我们之前讨论的可靠传输、流量控制等,大多是针对点对点 (Point-to-Point) 链路的,即链路上只有两个节点。但在很多网络中,多个节点需要共享同一条通信信道,这种信道被称为广播信道 (Broadcast Channel)。

例如早期的总线型以太网(所有计算机共享一根同轴电缆),现在的无线局域网 Wi-Fi(所有设备共享同一频段的空口)。

在广播信道上,如果两个或两个以上的节点同时发送数据,它们的信号就会在信道中混合、相互干扰,导致所有数据都变得无法识别,这种现象称为冲突 (Collision)。

介质访问控制 (MAC) 的任务就是制定一套规则,来协调各个节点对共享介质的访问,决定“下一个谁可以发送数据”,从而尽可能地避免或解决冲突问题。MAC协议通常被认为是数据链路层的一个子层(MAC子层)。

MAC协议主要分为三大类:信道划分、随机访问和轮询访问。其中前者是静态分配,后两者是动态分配。

信道划分介质访问控制 (Channel Partitioning)

这类协议的核心思想是“资源预留”。它将共享的信道资源(如时间、频率)从物理上分割成多个互不干扰的子信道,然后为每个节点分配一个专用的子信道。

优点:一旦分配,节点就可以在自己的子信道上自由通信,绝不会发生冲突。网络负载高时,性能稳定且有保障。

缺点:效率低下,资源浪费。如果一个节点被分配了子信道,但它大部分时间都没有数据要发送,那么这个子信道的容量就被白白浪费了。这对于流量具有突发性的计算机网络来说,尤其不划算。

其主要是通过复用技术来实现的,所谓复用,就是将多个信号合并在一起传输,然后在接收端再将它们分离开来。

alt text

频分多路复用 (FDMA - Frequency Division Multiple Access)

核心思想是按频率划分信道。类似于不同的广播电台使用不同的频率播出节目,互不干扰。

alt text

如图所示,频分多路复用将总带宽划分多个频段 (Channel),每个节点被分配到一个独立的频段进行通信。同一时刻不同节点使用不同的频段,因此不会发生冲突。

时分多路复用 (TDMA - Time Division Multiple Access)

时分多路复用按时间划分信道。将时间划分为一个个时隙,每个节点被分配到固定的时隙才能发送数据,这样的时隙称作 TDM 帧。如图,每个用户在自己的时隙内发送数据,不同用户的时隙互不重叠,因此不会发生冲突。

alt text

波分多路复用 (WDM - Wavelength Division Multiplexing)

波分多路复用实际上就是光纤网络中的频分复用,按光的波长来划分信道。

码分多路复用 (CDMA - Code Division Multiple Access)

码分多路复用按码片序列划分信道。每个节点被分配一个唯一且相互正交的码片序列 (Chipping Sequence),用来对数据进行编码

所有节点可以在同一时间同一频率发送数据,但由于使用了不同的码片序列,因此不会发生冲突。接收方利用相同的码片序列,可以从混合的信号中分离出自己想要的数据。

CDMA 的技术基石是正交性 (Orthogonality):
- 任何码片序列 S 与其自身的规格化内积结果为 +1
- 两个不同用户的码片序列 ST,其规格化内积结果为 0
- 任何码片序列 S 与其反码的规格化内积结果为 −1

例如,A 节点被分配了码片序列 S = (−1, −1, −1, 1, 1, −1, 1, 1),这里的 −11 分别表示二进制的 01

这意味着,A 节点如果发送比特 1 就是发送该用户原始的码片序列 S;发送比特 0 就是发送该用户码片序列的反码(所有 +1−1−1+1)。

B 节点也要传输信息,分配码片 T = (−1, 1, −1, −1, 1, −1, 1, 1)(此码片与 S 正交)。

假设 A 发送比特 1,B 发送比特 0,则它们同时在信道中发送的信号为:
S + (−T) = (−1, −1, −1, 1, 1, −1, 1, 1) + (1, −1, 1, 1, −1, 1, −1, −1) = (0, −2, 0, 2, 0, 0, 0, 0)
接收端 C 节点接收到了这个混合信号 (0, −2, 0, 2, 0, 0, 0, 0)

C 节点现在可以利用码片序列从混合信号中分离出它想听的信号:

解码 A 站的信号:
C 站用 A 站的码片 S 与混合信号进行内积运算。

解码结果:

根据规则:S ⋅ S = 1,而

解码结果:
1 + 0 = 1

结论:结果为正,代表站点 A 发送了比特 1

解码 B 站的信号:
C 站用 B 站的码片 T 与同一个混合信号进行内积运算。

解码结果:

根据规则:S ⋅ T = 0,而

解码结果:
0 + (−1) = −1

结论:结果为负,代表站点 B 发送了比特 0

如果结果为零,说明该站点没有发送任何数据。

这种技术实际上就是扩频通信 (Spread Spectrum Communication) 的基础。它通过将原始信号扩展到一个更宽的频带上进行传输,从而提高抗干扰能力和安全性。

甚至即使码片序列中的少数几位因为干扰而出错,经过整个序列的“民主投票”(内积运算),最终的结果仍然能非常可靠地判断出原始比特是1还是0

随机访问介质访问控制 (Random Access)

这类协议的核心思想是“先到先得”。节点在任何时候,只要有数据要发送,就可以立即尝试在信道上发送数据。如果发生冲突,节点会通过某种机制来检测到冲突,并在稍后重新尝试发送, 因此, 协议的核心是如何处理不可避免的冲突 (Collision) 问题。


ALOHA 协议

ALOHA 协议是最早的随机访问协议,思想极其简单,也因此效率很低。它是后续更复杂协议的思想源头。

纯 ALOHA (Pure ALOHA): “想发就发,完全随性”, 任何节点只要有数据要发送,就可以立即发送。

发送后,节点会监听信道,等待一个确认 (ACK)。如果在规定时间内没有收到ACK,就认为发生了冲突。发生冲突后,节点会等待一个随机的时间,然后重新发送。

假设发送一帧需要时间 TD。如果 A 站在 t0 时刻开始发送,那么任何其他站只要在区间 [t0 − TD, t0 + TD] 内开始发送数据,都会与 A 站发生冲突。也就是说,冲突窗口的长度为 2TD,范围非常大,因此纯 ALOHA 的信道利用率较低。

这里的 TD 指的是发送一帧所需的时间从开始发送到该帧最后一个比特发送完毕所经历的时间

分隙 ALOHA (Slotted ALOHA): “统一行动,只在整点发”, 将时间划分为一个个等长的时隙 (Slot),每个时隙的长度刚好够发送一帧。

节点不再是随时可以发送,而是必须等到下一个时隙的开始时刻才能发送。如果多个节点在同一个时隙内发送,仍然会发生冲突。

此时冲突只可能发生在多个节点选择同一个时隙发送的情况下。冲突窗口从 2TD 缩小到 TD,信道利用率有所提升。


CSMA 协议 (载波侦听多路访问)

CSMA 协议是对ALOHA协议的重大改进,引入了载波侦听 (Carrier Sense) 的机制。核心思想: “先听再说 (Listen Before Talk)”.

一个节点在发送数据之前,会先侦听信道,检查信道是否空闲。如果信道空闲,则发送数据; 如果信道正忙,节点会等待,直到信道变为空闲。

尽管这样, 冲突仍然可能发生, 因为信号在信道上传播需要时间(传播时延 TP)。可能A站在侦听到信道空闲后立即发送,但其信号还没传播到B站,此时B站也可能侦听到信道空闲并开始发送,从而导致冲突。

根据“监听到信道忙后怎么办”,CSMA又分为三种:

  • 1 - 坚持 CSMA: 监听到信道忙,就持续监听,一旦空闲立即发送。缺点是如果多个节点都在等待,信道一空闲它们会同时发送,导致冲突概率大。

  • 非坚持 CSMA: 监听到信道忙,就放弃监听等待一个随机时间后再回来重新尝试。缺点是可能导致信道空闲了也没人立即使用,利用率降低。

  • p - 坚持 CSMA: 只适用于时分复用信道. 监听到信道空闲,以概率 p 发送,以概率 1−p 推迟到下一个时隙。这是前两者的折中。若监听到信道忙,则持续监听(监听到下一个信道)。

CSMA/CD 协议 (载波侦听多路访问/冲突检测)

CSMA/CD 协议是在 CSMA 的基础上,增加了冲突检测 (Collision Detection) 的机制。核心思想: “边说边听,冲突即停 (Talk and Listen Simultaneously, Stop on Collision)”. 这是有线以太网 (Ethernet) 采用的经典协议.

它继承了CSMA的“先听再说”。最重要的改进是,节点在发送数据的同时,会持续不断地监听信道。如果在发送过程中,节点监听到信道上的信号与自己发送的信号不一致,就说明发生了冲突。

当冲突发生时, 立即停止发送数据(等待一段时间后重新发送), 并发送一个简短的冲突增强信号 (Jam Signal),以确保网络上所有节点都知道发生了冲突,并丢弃已收到的不完整数据。接着执行二进制指数退避算法 (Binary Exponential Backoff):

  • 定义 k 为当前帧的重传次数。第一次冲突后,准备进行第1次重传,此时 k=1。如果再次冲突,准备进行第2次重传,此时 k=2,以此类推。
  • 在进行第 k 次重传时,从整数集合 [0, 1, …, 2k − 1] 中随机选择一个数,记为 r。同时, 为了防止等待时间的上限变得过长,算法对 k 的值进行了限制, 一般 k=min(重传次数,10)。这意味着当重传次数小于等于10时,k 就等于重传次数; 当重传次数超过10次后,k 的值不再增长,始终保持为10。因此,随机数的最大选择范围就是 [0, 1023]。
  • 等待 r 个争用期 (Contention Period) 后,重新尝试发送数据。(也就是说所有的退避等待时间都是争用期的整数倍)。
  • 如果重传次数超过了一个预设的最大值 (通常是16次),就放弃发送该帧,并向上层报告一个错误。

优点: 能在冲突发生的第一时间就检测到并停止发送,极大地减少了因冲突而浪费的信道时间和带宽。同时确保冲突的站点在不同的时间点重新尝试发送,避免再次冲突。

争用期 (Contention Period)

CSMA/CD协议中的冲突检测不是瞬时的。根本原因在于电磁波的传播速率是有限的。

alt text

上图展示了两个节点发送信息时出现冲突的情况: - t = 0: 站点A(最左端)侦听信道空闲,开始发送数据。 - t = τ - δ: A的信号即将到达最右端的站点B。就在这一瞬间,B也侦听到信道空闲并决定发送数据。(τ 是信号从A到B的单程最大传播时延,δ 是一个极小的时间)。这是可能发生冲突的最晚时刻。 - t = τ - δ/2: 冲突发生, B发出的信号与A发出的信号在B站附近立刻相撞。 - t = τ: A的信号传播了整整一个 τ 的时间,终于到达了B, 同一时刻, B检测到了冲突,并立即停止发送。 - t = 2τ - δ: 冲突的信号从B站附近一路传回,最终在 t = 2τ - δ (2倍的冲突发生时间)时刻到达A站。此时,A站才终于检测到自己之前发送的数据发生了冲突。

因此, 取极限δ->0, 从A开始发送,到A能确信自己的发送是否成功(即是否检测到冲突),最多需要经过两倍的端到端传播时延 (2τ)。而争用期 (Contention Period),也称为冲突窗口或碰撞窗口,就是指这个最长时间 2τ。

它的物理意义是:在以太网中,一个站点发送数据后,最多经过时间 2τ,就可以确定自己是否成功“占领”了信道。

如果在争用期(2τ)内没有检测到冲突,那么之后就绝不可能再发生冲突了(因为此时第一个比特已经传播到了网络中的所有角落,所有其他站点都已经能侦听到信道为“忙碌”状态)。

例如, 在10Mb/s的以太网标准中,经过精确计算和一定的工程冗余,这个争用期被规定为 51.2μs

最短帧长 (Minimum Frame Length)

现在,一个关键问题出现了:站点A必须确保在 t = 2τ 这个最晚的冲突信号返回之前,自己仍然在发送数据。否则,如果它已经发送完毕并“认为”传输成功,它就永远不会知道其实自己的帧已经在半路被毁了(认为传输成功后就不再监听信号)。

这就引出了一个必须满足的不等式:帧的发送时延 (TD) ≥ 争用期 (2τ)

我们将这个不等式展开:

即, 最短帧长≥争用期×数据传输速率

根据上述公式, 计算以太网规定最短帧长得到了64字节 (512 bits):

这个长度确保了即使发生最极端的“末端碰撞”,发送方也能在发送完成前及时检测到冲突,从而执行退避算法进行重传。

同时, 任何小于64字节的帧都被认为是无效帧,也称为“冲突碎片” (Runt Frame)。网络设备(如交换机、网卡)收到这种帧会直接将其丢弃,因为它们知道这必然是冲突后异常中止发送的残留物。

如果上层(如IP层)交下来的数据包本身很小,不足以构成一个64字节的帧(例如,只有一个ACK确认信息),那么数据链路层必须在数据字段后面填充一些额外的字节,以凑够64字节的最小长度,然后才能发送。

CSMA/CA 协议 (载波侦听多路访问/冲突避免)

CSMA/CA 协议是在 CSMA 的基础上,增加了冲突避免 (Collision Avoidance) 的机制。核心思想: “先听再说,冲突前预防 (Listen Before Talk, Prevent Collision)”. 这是无线局域网 (Wi-Fi) 采用的经典协议.

无法实现冲突检测主要是因为无线信号的传播特性。无线信号在空气中传播时,信号强度会随着距离的增加而迅速衰减, 同时无线设备通常功率较低。因此, 无线设备在发送数据时难以监听到信道上的其他信号, 也就无法检测到冲突。当然, 还有下面要介绍的隐藏站问题。

这套机制主要由以下几个部分组成:

核心策略一:确认与重传 (ARQ)

由于无线信道的通信质量远不如有线信道,数据帧更容易丢失或损坏。为了保证可靠传输,802.11标准规定,所有单播的数据帧都必须得到接收方的确认 (ACK)。

802.11标准,也就是我们常说的 Wi-Fi 协议族,是由 IEEE(电气电子工程师学会)在 1997 年制定的无线局域网通信协议标准

因此发送方每发送一个数据帧,就会启动一个计时器并等待接收方回复ACK帧。如果在规定时间内收到了ACK,说明传输成功。如果超时仍未收到ACK,发送方就认为该帧已丢失或损坏(即发生了冲突),并会立即进行重传。这是一种停止-等待式的可靠传输机制。

核心策略二:帧间间隔 (IFS) - 协调信道访问优先级

为了避免多个站点在信道刚一空闲时就“蜂拥而上”导致冲突,CSMA/CA规定,所有站点在发送前都必须先侦听信道。当侦听到信道从忙碌变为空闲后,不能立即发送,而是必须再等待一段被称为帧间间隔 (InterFrame Space, IFS) 的时间。

IFS的长短决定了访问的优先级。等待时间越短,优先级越高。主要有三种IFS: - SIFS (短帧间间隔 - Short IFS): 时间最短,优先级最高。用于处理需要立即响应的、最高优先级的操作,例如发送 ACK 确认帧, 回复 CTS (清除发送) 帧, 响应接入点(AP)的轮询等。这保证了像ACK这样的重要控制帧不会因为要和其他数据帧竞争而被延迟。 - PIFS (点协调功能帧间间隔 - PCF IFS): 时间中等,优先级较高。在PCF(点协调功能,一种集中控制模式)下,供AP(无线路由器)优先抢占信道使用。 - DIFS (分布式协调功能帧间间隔 - DCF IFS): 时间最长,优先级最低。这是最常用的一种间隔。任何一个站点如果想要发送一个新的数据帧或管理帧,当它检测到信道空闲后,必须至少等待一个DIFS的时长

核心策略三:退避倒计时

这是CSMA/CA避免冲突的精髓所在。当一个站点有数据要发送,并且已经等待了一个DIFS后,它并不能立刻发送,而是要进入一个随机退避阶段(除非是第一个发送帧且信道空闲)。

启动时机: - 在发送一个新的数据帧之前(在DIFS后)检测到信道忙。 - 在每一次重传之前。 - 在每一次成功发送后,准备发送下一个新帧之前。

退避时间计算:

类似CSMA/CD协议, 但不同的是, 站点在进行第 k 次重传时,从整数集合 [0, 1, …, 2k + 2 − 1] 的范围内随机选择一个数,作为自己的退避计时器的值, 这样做扩大了随机选择的范围, 从而进一步降低冲突概率。不过, k的最大值被限制在了6, 因此最大范围是 [0, 255]。

退避倒计时过程: - 站点选择了随机的退避值后,开始倒计时。 - 倒计时器只在信道保持空闲时才会递减。 - 如果在倒计时过程中,信道被其他站点占用变为忙碌,则计时器暂停, 直到信道再次变为空闲,并经过一个DIFS后,计时器才继续从暂停处开始倒数。 - 当且仅当计时器倒数到0时,站点才能真正发送它的数据帧。

这个“暂停-继续”的机制极大地降低了冲突概率。即使多个站点在同一个DIFS后启动了退避,它们大概率会选择不同的随机值,因此倒计时到0的时刻也不同,从而实现了“错峰出行”。

总之, CSMA/CA 算法的过程如下:
1)若站点最初有数据要发送(而非发送不成功后再进行重传),且检测到信道空闲,那么在等待时间 DIFS 后,就发送整个数据帧。
2)否则,站点执行 CSMA/CA 退避算法。选取一个随机退避时间。一旦检测到信道空闲,退避计时器就保持不变。只要信道空闲,退避计时器就继续倒计时。
3)退避计时器减为 0 后(即等待时间已被足够的时间),站点就发送整个数据帧。
4)若接收方正确接收到该数据帧(即帧的校验和正确),则发送一个确认帧 ACK。否则,发送方在超时时间后重传该数据帧。
5)若发送方没有接收到 ACK,就认为该数据帧丢失,进入重传过程。重传过程包括退避算法(即 CSMA/CA 退避算法)。重传过程重复一定次数。若连续多次发送失败,则 CSMA 协议中断该数据帧的发送,改经过上层协议的其他方式来发送。

隐藏站问题 (Hidden Terminal Problem)

隐藏站问题描述的是这样一种情况: 三个站点分布为A–B–C, 显然A和C都能和B通信,但A和C距离较远, 之间互相听不到。如果A和C在某时刻检测到信道空闲而同时向B发送数据,就会在B处发生冲突, 这里假如A是发送站, B是接收站, 那C对于A来说就是隐藏站.

为了解决“隐藏站”问题,802.11标准提出了信道预约机制和虚拟载波监听机制。

发送方在发送数据前(已经监听信道空闲并等待了DIFS),先向目的站发送一个 RTS (请求发送 - Request to Send) 帧,告诉接收方自己有数据要发送,并请求许可。接收方收到RTS后,如果信道空闲且准备好接收,在等待SIFS后就广播回复一个 CTS (清除发送 - Clear to Send) 帧,表示允许发送。

CTS帧中包含了一个持续时间字段,指示发送方和其他所有听到CTS的站点,自己将占用信道多长时间。这样, 其他站点(包括隐藏站)在听到CTS后, 都会知道信道即将被占用, 并且知道要等待多长时间才可以再次尝试发送, 从而避免了冲突。

A站在收到CTS后, 等待SIFS后就发送数据帧。B站在正确接收到数据帧后, 也等待SIFS后发送ACK确认帧, 从而成功完成了一次可靠的数据传输。

而在RTS和CTS帧中(甚至传输的数据帧也可以携带), 都附带了本次通信所要占据信道的时间, 所谓虚拟载波监听指的就是其他节点虽然不一定是这些帧的目的站, 但是可以监听并解析这些帧(MAC帧头中的 Duration 字段),这些帧中包含了本次通信预计要持续的时间。节点于是根据这个时间设置一个“网络分配向量(NAV)”,在NAV计时器归零前,即使物理信道空闲,节点也会认为信道是“虚拟”忙碌的,从而保持静默。

轮询访问 (Polling Access)

轮询访问是一种受控的访问方式,其核心思想可以概括为“依次点名,授权发言”

在这种机制下,网络中的节点不能随心所欲地发送数据。它们必须等待“授权”。这个授权的过程,就是由一个主节点或一种特殊规则,按照一定的顺序(通常是循环的)去“轮询”或“询问”每一个节点是否需要发送数据。

这种方式完全避免了随机访问中可能发生的冲突,因为在任何时刻,只有一个节点被授权使用信道。它比信道划分更灵活,因为信道是按需分配,而不是永久预留。

轮询可以由一个中心站来完成。但更常见的一种分布式是令牌传递协议,它通过传递“令牌”这个“发言权”信令,来模拟一个去中心化的轮询过程, 基本步骤如下:

  • 步骤 A - 等待令牌: 一个节点(例如A)如果有数据要发送,它必须进入监听状态,等待从其上游节点传来的令牌。
  • 步骤 B - 捕获令牌与发送数据: 当A接收到“空闲”令牌后,它会:
    • 将令牌的状态从“空闲”改为“忙碌”。
    • 将自己的数据帧附加在“忙碌”令牌之后,发送到环路中。
  • 步骤 C - 沿环传递与接收: 载有数据的帧沿着环路向下游传递。环路上的每个节点都会接收并检查该帧的目的地址。
    • 如果不是发给自己的,就简单地将该帧转发给下游节点。
    • 如果目的地址是自己(例如节点C),C就会复制一份数据帧的内容
  • 步骤 D - 释放令牌: 数据帧会继续传递,直到它绕环一周后,返回到最初的发送方A。
    • A接收到自己发出的帧后,确认它已被成功环回(可以检查帧中的状态位了解接收情况)。
    • A将该数据帧从环路中移除, 并重新生成一个新的“空闲”令牌,并将其发送给自己的下游节点。

如果一个节点收到“空闲”令牌,但它自己没有数据要发送,它会立即将这个“空闲”令牌转发给下游节点。