介质访问控制
共享介质
在介绍 MAC 概念之前,必须要说明一下共享介质的概念。
在一个网络环境中,多个设备可能需要同时访问同一个物理介质来发送数据,这个介质可以是电缆、光纤或者无线信道。
当设备发送数据时,数据包会在整个介质上传播,所有连接到该介质的设备都可以接收到数据包。如果多个设备同时发送数据,介质上的数据信号就会相互冲突进而导致错误。
所以 MAC 协议确保了 共享介质上的 有效、公正且有序的数据传输。
MAC 方式总结
介质访问控制(MAC,Media Access Control)可以分为 信道划分 以及 随机访问 两种大方向。
信道划分 介质访问控制:也叫做多路复用,在一条传输介质上同时传输多个不同种类的信号(种类可以根据不同的参数进行划分),这样不同的设备可以发送特定类型的信号,并且不同信号之间相互不干扰,信道划分 访问控制可以分为以下几种:
- FDM:频分多路复用
- TDM:时分多路复用
- WDM:波分多路复用
- CDM:码分多路复用
随机访问 介质访问控制是指多台设备共享同一个通信介质时,它们可以随机地尝试发送数据,而不需要事先协调,当发生冲突后再做后续的协调,以保证不会接收到错误的数据。
- ALOHA
- CSMA
- CSMA/CD
- CSMA/CA
多路复用
多路复用(Multiplexing)是一种技术,用于在同一传输介质上同时传输多个信号,包含频分多路复用(FDM)、时分多路复用(TDM)、波分多路复用(WDM)和码分多路复用(CDM)四种。
FDM
频分多路复用(FDM)将可用带宽划分为若干个不重叠的频段,每个信号占用一个频段。各个信号可以同时传输,但彼此之间不会干扰,因为它们占用不同的频率。
FDM 在传统的模拟电话系统和广播中广泛使用。
TDM
时分多路复用(TDM)将时间划分成若干个时隙,每个信号在不同的时隙中传输。所有信号在时间上轮流使用同一传输介质。
TDM 常用于数字通信系统,如数字电话网络。
WDM
波分多路复用(WDM)是 FDM 的一种应用,主要用于光纤通信。它将光纤的可用带宽划分为多个波长(颜色),每个信号占用一个波长。
WDM 技术可以大幅增加光纤的通信容量,广泛应用于长距离和高速光纤网络。
CDM
码分多路复用(CDM)使用不同的编码来区分各个信号。所有信号可以在同一频带上同时传输,但通过使用不同的编码序列来避免相互干扰。
虽然 CDM 的概念可以用在许多不同的传输系统中,但在实践中,它主要作为 码分多址(CDMA,Code Division Multiple Access) 的基础技术。
在 CDMA 中,每一个比特时间划分为 m 个短的时间槽,称为码片(chip),每个站被指派一个惟一的 m bit 码片序列(chip sequence) 。
- 如果发送比特 1,则发送自己的 m 位码片序列。
- 如果发送比特 0,则发送该码片序列的二进制反码。
简单理解就是,A 站向 C 站发出的信号用一个向量来表示,B 站向 C 站发出的信号用另一个向量来表示,两个向量要求相互正交。向量中的分量,就是所谓的码片。
当两个或多个站点同时发送时,各路数据在信道中线性相加。为了从信道中分离出各路信号,要求各个站点的码片序列相互正交。
令向量 $S$ 表示站 S 的码片向量,令 $T$ 表示其他任何站的码片向量。两个不同站的码片序列正交,就是向量 $S$ 和 $T$ 的规格化内积(inner product)都是 0:
$$S \cdot T = \frac{1}{m} \sum_{i=1}^{m}{S_i T_i} = 0$$
任何站的码片向量和该码片反码的向量的规格化内积都是-1:
$$S \cdot \overline{S} = \frac{1}{m} \sum_{i=1}^{m}{S_i \cdot \overline{S_i}} = 0$$
举个实际的例子来说明。令向量 $S$ 表示 A 站的码片向量,$T$ 表示 B 站的码片向量。假设 A 站的码片序列被指派为 00011011,则 A 站发送 00011011 就表示发送比特 1,发送 11100100 就表示发送比特 0。为了方 便计算,将码片中的 0 写为-1,将 1 写为+1,因此 A 站的码片序列是(-1 -1 -1 +1 +1 -1 +1 +1)。
令 $T$ = (-1 -1 +1 -1 +1 +1 +1 -1),可以观察到,不管是 $T$ 还是 $\overline{T}$,都有四个码片的值与 $S$ 相反,所以 $S \cdot T = 0$。
当 A 站向 C 站发送数据 1 时,就发送了向量 (-1 -1 -1 +1 +1 -1 +1 +1)。
当 B 站向 C 站发送数据 1 时,就发送了向量 (+1 +1 -1 +1 -1 -1 -1 +1)。
两个向量在公共信道上叠加,实际上是线性相加,得到 $S + \overline{T}$ = (0 0 -2 2 0 -2 0 2)。
ALOHA 协议
ALOHA 协议是一种早期开发的随机访问协议,用于在共享信道上传输数据。ALOHA 有两种基本类型:纯 ALOHA 和时隙 ALOHA。
- 纯 ALOHA:用户可以在任何时间发送数据包。由于没有时间同步,数据包之间容易发生冲突。
- 时隙 ALOHA:时间被分成离散的时隙,用户只能在时隙的开始发送数据包。这种方法通过同步发送时间,减少了冲突的概率。
纯 ALOHA
纯 ALOHA(Pure ALOHA)是一种简单的随机接入协议,允许用户在任意时刻发送数据包,而无需对时间进行任何同步或分时。 由于用户可以在任何时间发送数据包,数据包之间可能会发生冲突。
工作原理:
- 用户随时发送数据包。
- 如果数据包成功到达接收端,则传输完成。
- 如果发生冲突(即两个或多个用户同时发送数据包),相关用户需要等待随机的时间后重传。
时隙 ALOHA
时隙 ALOHA(Slotted ALOHA)在纯 ALOHA 的基础上引入了时间同步,将时间划分为一系列等长的时隙。用户只能在时隙的开始发送数据包。
工作原理:
- 时间被划分为等长的时隙。
- 用户在时隙的开始时发送数据包。
- 如果一个时隙内只有一个用户发送数据包,则传输成功。
- 如果多个用户在同一时隙发送数据包,发生冲突,相关用户等待随机时间后重传。
CSMA 协议
CSMA(Carrier Sense Multiple Access)的中文叫做 载波监听多路访问,理解 CSMA 的关键在于理解它的名称中的两个部分:载波监听 以及 多路访问:
- 载波监听(Carrier Sense):因为 CSMA 是随机访问介质控制的一种方式,所以在发送数据前,必须确定当前通信介质中没有其他设备正在发送数据。所以载波监听可以被理解为以太网口内部芯片自带的一种功能,具体而言就是一种可以监听 信道在当前位置是否有数据传输的 的一种功能。
- 多路访问(Multiple Access):多个设备可以访问同一个通信介质。这意味着在任何给定时间,任何设备都可以尝试发送数据。
所以 CSMA 可以理解为 通过 载波监听 避免冲突,进而实现共享介质上的 多路访问。
以下图为例,A、B、C、D 分为是连接到同一共享介质上的不同设备,当 A 开始发送数据时,B、C、D 分别会在不同的时刻监测到信号,具体的时刻为 设备与 A 之间的距离 / 信号传播速度
。
这里需要深入理解 传播时延和传输时间 这两个概念:
- 传输时延(propogation time) = 距离 / 信号传播速度
- 传输时间(transmission time) = 数据大小 / 数据传输速率
CSMA 的问题在于它无法处理碰撞,当一个设备监听到当前介质中无信号时,它就可以发送数据,但监听得到的结果可能是 “假结果”。因为有可能其他设备已经发送信号了,只是信号由于传播时延还没有到达当前设备。
所以假设当前设备监听得到了 “假结果”,那么此时发送数据后介质上就会发生冲突。比如假设 C 在 A 的信号到来之前检测得到假结果,然后发送帧,这个时候信道中就会出现冲突:
那么 CSMA 如何处理冲突呢?(了解即可)
如何处理冲突
CSMA 不具备碰撞处理的功能,冲突处理是 CSMA/CD 的功能。 这意味着在 CSMA 中,设备不会主动检测到碰撞。
但是 CSMA 也具备一定冲突处理的功能,这依赖于超时和重传机制。
在 CSMA 中,发送设备在传输数据后会等待确认响应(如 ACK,Acknowledgment 确认帧)。如果发生碰撞,接收设备无法正确接收数据,因此不会发送确认帧。 发送设备在等待一段时间后没有收到确认响应,推断可能发生了数据丢失(可能由于碰撞)。
这个知识了解即可,目的是帮助大家理清 CSMA 和 CSMA/CD 的区别。下文通过一个实例说明 CSMA 的冲突处理功能:
假设有两个设备 A 和 B,它们都使用 CSMA 协议并共享同一个信道:
- 初始状态:信道空闲,设备 A 和 B 都准备发送数据。
- 监听信道:A 和 B 都监听信道,发现信道空闲。
- 发送数据:A 和 B 几乎同时开始发送数据,由于没有碰撞检测机制,它们不知道发生了碰撞。
- 碰撞发生:A 和 B 的数据在信道上发生冲突,接收设备无法解码出有效数据,因此不会发送确认帧。
- 等待确认:A 和 B 等待一段时间,发现没有收到确认帧,推断可能发生了碰撞。
- 重传尝试:A 和 B 各自等待一个随机时间(不同的随机时间),然后重新尝试发送数据。
CSMA 也 根据其在信道空闲时的行为分为三种类型,如下所示:
特征 | 1-persistent CSMA | Non-persistent CSMA | p-persistent CSMA |
---|---|---|---|
信道空闲时的行为 | 立即开始传输数据 | 立即开始传输数据 | 根据概率 p 决定是否传输数据 |
信道忙时的行为 | 立即开始传输数据 | 等待一个随机时间后重新监听 | 根据概率 p 决定是否重新监听 |
碰撞的可能性 | 高(当多个设备同时监听信道) | 低(等待随机时间片段) | 中等(取决于 p 的值和竞争情况) |
等待时间 | 无等待 | 随机等待时间片段 | 随机等待时间片段 |
适用性 | 适用于低碰撞概率,高速局域网 | 适用于高碰撞概率,低速局域网 | 适用于中等碰撞概率和速率的局域网 |
CSMA/CD 协议
CSMA/CD (CSMA with Collision Detection,载波监听多路访问/碰撞检测) 是 CSMA 的一种拓展,在了解这个知识之前,请确保你已经理解了什么是 CSMA 中的 CS(Carrier Sense 即 载波监听),以及什么是 CSMA 中的 MA(Multiple Access 即 多路访问)。
CSMA/CD 比 CSMA 多出一个 CD(Collision Detection 即 碰撞检测)的功能。 在上文中我们提到,CSMA 中监听到信道空闲可能是 “虚假的”,所以在 CSMA 发送数据后介质中也许会发生冲突,但 CSMA 只能依靠非常原始的方案处理冲突。
CSMA/CD 就高级一些,在发送数据期间,我们刚刚提到的 监测器件(Carrier,就是 CSMA 中 C 的简称)会一直监听有没有冲突发生, 如果有冲突的话,就等待一段随机的时间,然后重试以上过程,并且发送一个特殊信号告诉其他设备发生了冲突。
以上图为例,假设 A 向 D 发送一段数据,C 向 A 发送一段数据,我们可以观察到:冲突发生的时间点 和 设备检测到冲突的时间点是不同的。 当 A 和 C 检测到冲突发生时,它们会立即停止发送,并且发送信号通知其他设备该次碰撞:
流程
CSMA/CD 的工作流程如下:
- 准备发送:适配器从网络层获得一个分组,封装成帧,放入网络适配器缓存准备发送。
- 检测信道:监听信道是否空闲,若信道空闲,则开始发送该帧;若信道忙,则持续检测直至信道空闲。
- 在发送过程中,适配器仍然持续检测信道。这里只有如下两种可能。
- 发送成功:在争用期内一直未检测到冲突,该帧肯定能发送成功。
- 发送失败:在争用期内检测到冲突,此时立即停止发送,并且广播碰撞通知信号。接着适配器执行指数退避算法, 等待一段随机时间后返回到步骤 2。若重传 16 次仍不能成功,则停止重传并向上报错。
限制条件
CSMA/CD 可以使用的限制条件:帧的传输时延至少要两倍于信号在总线上的传播时延
为了在一个帧的发送过程中检测到冲突,发送站必须在整个帧发送完毕之前收到冲突信号。如果一个站点在发送完整个帧后才能检测到冲突,那么冲突的数据就已经在网络上传输完毕了,这样无法避免数据的损坏。
这种机制是基于这样一个事实:冲突的信号需要在网络上传播并被发送站检测到,发送站才会知道发生了冲突。因此,如果帧的传输时延太短,发送站可能在信号冲突返回之前就已经发送完毕了帧,导致无法检测到冲突。为了确保冲突能够被检测到,必须要求帧的传输时间足够长,以便在帧发送结束前,冲突信号能够返回到发送站。
CSMA/CA 协议
CSMA/CD 适用于以太网(使用有线连接的局域网),但在无线局域网(WLAN,Wireless LAN)中无法直接使用 CSMA/CD,主要有以下原因:
- 无线设备不能同时“听”和“说”:无线收发器在发送数据时,无法同时监听信道来判断是否发生碰撞。
- 信道干扰比有线环境严重:无线信号受环境干扰更大,误判空闲或碰撞的概率更高。
- 隐蔽站问题:假设 A 和 C 两台无线设备都想给 B 发送数据,但 A 和 C 彼此“看不到”,只看到 B 是空闲的。结果就是 A 和 C 同时给 B 发送,发生碰撞,但它们却以为没事。
为此,802.11 标准定义了广泛用于无线局域网的 CSMA/CA 协议,它对 CSMA/CD 协议进行修改,将冲突检测改为冲突避免(Collision Avoidance,.CA)。“冲突避免”并不是指协议可以完全避免冲突,而是指协议的设计要尽量降低冲突发生的概率。
流程
- 侦听信道(Carrier Sense):当一个设备想要传输数据时,它首先侦听信道,检查信道是否忙碌。如果信道被其他设备使用,当前设备会等待一段随机的时间再次检测信道是否空闲。这是为了避免同时尝试发送数据而导致碰撞。
- 发送请求(Request to Send,RTS):如果信道在一段时间内保持空闲,设备可以选择发送一个 RTS 帧,该帧包含了将要传输的数据的信息。这个 RTS 帧通知其他设备,该设备打算发送数据,以防止其他设备在此期间发送数据。
- 清除发送请求(Clear to Send,CTS):如果其他设备接收到 RTS 帧并且信道仍然空闲,它会发送 CTS 帧作为响应。CTS 帧确认了该设备的数据传输请求,并告诉发送设备可以开始传输数据。
- 数据传输:一旦设备收到 CTS 帧,它可以开始传输实际的数据帧。其他设备会侦听传输,以确保不会干扰正在传输的设备。
- ACK 帧(Acknowledgment):接收设备在成功接收到数据后发送一个 ACK 帧,以通知发送设备数据已被成功接收。如果发送设备没有收到 ACK 帧,它会假定数据包已丢失,然后根据需要重新传输数据。
IFS
由于无线信道的可靠程度不如有线网络,所以 802.11 标准使用 停等方案,即站点每通过无线局域网发送完一帧,就要在收到对方的确认帧后才能继续发送下一帧。
为了尽量避免冲突,802.11 标准规定,所有站完成发送后,必须等待一段很短的时间(继续监听)才能发送下一帧。这段时间称为帧间间隔(InterFrame Space,IFS)。帧间间隔的长短取决于该站要发送的帧的类型。802.11 标准使用了下列三种 IFS:
- SIFS(Short IFS):当设备发送一个数据帧后,它会等待 SIFS 时间,以便快速发送另一个数据帧或发送 ACK(确认)帧作为响应。
- DIFS(Distributed IFS):当设备想要发送数据时,它首先侦听信道,如果信道被其他设备占用,则等待一个 DIFS 的时间,然后再次侦听信道。
- PIFS(Point Coordination IFS):中心协调器使用 PIFS 来在其他设备竞争前抢占信道。