参考资料
[1] 罗浪. 无线局域网CSMA/CA协议的研究与实现[D].成都理工大学,2016.
为了更好地描述CSMA/CA协议,稍微介绍无线局域网的背景知识,阅读时可选择性跳过。
802.11 标准是个非常丰富的无线网络标准。它规定无线局域网为星型拓扑结构,其中心点称作接入点 AP(Access Point),并把基本服务集 BSS(Basic Service Set)作为其最小构件。一个 BSS 又由一个固定基站和若干移动终端组成,其中固定基站就是上文所提到的接入点 AP。在 AP 被建立的同时,也必须为该服务集分配一个通信信道和一个服务集标识符(Service Set Identifier)(32 字节以内)。
移动站点要和中心接入点建立关联可通过两种方式:一种是移动站点被动的等待接入点定期发出的探测帧(beacon frame);另一种是移动站点主动的试探性的向接入点发送请求帧,然后等待接入点的响应。全部的移动站点在自身所处的服务集内都能够直接相互传输数据,然而若要和其他服务集的移动站点互传数据,就只能够通过所处服务集的接入点 AP。一个基本服务集中全部移动站点所发射出的无线电波的覆盖区域就决定了该服务集的最大服务区域,并把这个区域称作为该服务集的基本服务区 BSA(Basic Service Area)。基本服务区 BSA 的范围一般不会太大,半径在 50 米以内。
一个独立的基本服务集 BSS 是可以进行扩展的。要领即是利用本 BSS 的接入点 AP 使其连接到一个分配系统 DS(Distribution System)上,然后再连接到另一个基本服务集的接入点,这样就把两个相互独立的 BSS 相互连接起来了,从而构成了一个扩展的服务集ESS(Extended Service Set)。并且正是由于
DS 的存在,使其看起来就仿佛一个BSS 一样。值得提醒的是,这两个基本服务集接入点之间是通过有线连接起来的。
IEEE802.11 的基本服务集 BSS 和扩展的服务集 ESS 如图 2-1 所示:
802.11 局域网的 MAC 层被制定得非常特别。该层处于物理层之上,包含分布协调功能 DCF(Distribute Coordination Function) 和 点协调功能 PCF(Point Coordination Function) 两个子层。如图2-2 所示:
基本服务集 BBS 中的移动站不能随意的占用信道,必须通过 MAC 层中的协调功能(coordination function)来决定其在某特定时间是否有使用信道进行数据发送或接收的权利。
DCF (刘乃安,2008;王秉钧,2010)协议规定了网络各站点必须通过争用的方式获得信道,进而获得数据发送和数据接收的权利。在每一个站点采用载波监听多点接入的分布式接入算法,即 CSMA/CA 协议的退避算法。 该机制适用于传输具有随机性的数据。DCF 是 MAC 层中必需的也是最主要的功能。
PCF 子层位于 DCF 层之上,该层不是必须的。在 PCF 功能下各站点不必争用信道,而是交由接入点 AP 集中协调控制,按照特定的方式把享用信道的权利轮番赋予每个站点,以此杜绝碰撞的发生。由于接入点AP在自组网络中并不存在,因此在自组网络的MAC层中没有PCF子层。
相比于 DCF 机制,PCF 机制目前使用较少,一般只使用于对实时性要求较高的业务。但两种机制可以交替配合使用。
802.11 局域网的 MAC 帧结构(IEEEstd802.11, 2012)如图 2-3 所示,该图说明了 802.11 局域网 MAC 帧的主要字段。
由上图可以知道,802.11 MAC 帧主要包括了以下几个部分:
(1)MAC 帧首部,共 30 字节。
(2)帧主体,即帧的主要内容部分,变长,可以是 2312 字节内的任意长度。
(3)帧尾部,用于存储帧校验序列 FCS(Frame Check Sequence),共 4 字节。
MAC 帧首部的序号控制字段占 16 位,该字段用来区分新发送的帧和因出差错而重新发送的帧。序号控制字段又包含一个序列号字段和一个分片号字段。其中序列号字段占 12 位,初始值为 0,每新发送一个帧就加 1,直至 4095 再重置为 0。分片号字段占 4 位,若无分片,则分片号为 0;若有分片,则该帧的序列号保持不变,但分片号从 0 开始,逐一增大,最大到 15。重新发送的帧这两个字段值均保持不变。
MAC 帧首部的持续期字段占 16 位,该字段的用途是将需要占用信道的时间记录起来,以微秒为单位。以此告知其他移动站在持续期时间结束之前信道会一直被占用,不能进行通信。
MAC 帧首部的帧控制字段又总共分为 11 个字段,如图 2-4:
其中类型和子类型两个字段主要用于区分帧的类型。802.11 局域网根据MAC 帧功能的不同,共将其分为三种类型的帧:控制帧,数据帧和管理帧,每一种帧类型又会细分为各种子类型。比如,控制帧就包含请求发送 RTS(Request To Send)帧,允许发送 CTS(Clear To Send)帧和确认帧 ACK (ACKnowledgment)等几种不同功能的控制帧。
在上一节中介绍到,两个基本服务集可通过将接入点连接到分配系统 DS 而构成一个扩展的服务集。而且站点间的通信是分步进行的,每个步骤都对应了不同的发送地址和接收地址。MAC 帧首部的“到 DS”(到分配系统)和“从 DS”(从分配系统)两个字段就是为标明数据帧的发送方向(韩笑,2014)。
“到 DS”和“从 DS”两个字段各占 1 位,可分别取值“0”或者“1”,因此(“到 DS”,“从 DS”)总共可构成(0,0)、(0,1)、(1,0)、(1,1)四种数值组合。不同的数值组合就决定了在 MAC 帧首部中“地址 1”、“地址 2”、“地址 3”、“地址 4”四个地址字段的内容。其中,(0,0)、(1,1)两种并不常用。
4 个地址字段也不并不是每一个都必须使用,而是可供选择分别用于不同的帧中。“地址 1”标明接收地址,适用于所有帧中;“地址 2”标明发送地址,适用于除 ACK 帧和 CTS 帧以外的所有帧中;“地址 3”标明目的地址或源地址,只能用于数据帧和管理帧中;“地址 4”只能用于自组网络。
现在我们假设有站 A 正在向站 B 发送数据帧,那么将分两步进行:A 先把MAC 帧发给接入点 AP,再由 AP 发给 B。第一步,“到 DS=1”,“从 DS=0”,即构成(1,0)组合,表示数据帧是来自移动站 A、发往 DS 的,那么发送地址就是移动站 A 的 MAC 地址,接收地址就是 AP 的 MAC 地址,目的地址是移动站 B 的 MAC 地址。第二步,帧控制字段中的“到 DS=0”,“从 DS=1”,即构成(0,1)组合,表示数据帧是来自 DS、发往移动站 B 的,那么发送地址是 AP 的 MAC 地址,接收地址是移动站 B 的 MAC 地址,源地址是移动站 A 的 MAC 地址。
为尽可能的避免冲突,802.11 局域网还要求,各站点不能无间断的一直发送,每发完一帧都得经过一个特定的时长才能继续发送下一帧。并把这个特定的时长称作帧间间隔 IFS(Inter Frame Space)。802.11 共规定了四种长度的帧间间隔,分别是 SIFS(Short Inter Frame Space)、PIFS(PCF Inter Frame Space)、DIFS(DCF Inter Frame Space) 和 EIFS(Extended Inter Frame Space),它们之间的长度关系如图 2-5 所示:
(1)SIFS,即短帧间间隔,是最短的 IFS,它主要用于隔离开一次通信中的各个帧。例如用于请求发送 RTS 帧和允许发送 CTS 帧之间、允许发送 CTS 帧和 DATA 帧之间、DATA 帧和确认帧 ACK 之间(将在下一节中介绍)。
(2)PIFS,点协调功能帧间间隔,比 SIFS 长一个时隙时间(slot time)。它主要用于在刚开始使用 PCF 功能时,使站点能够尽快得到发送权,但是只能够工作于 PCF 模式。
(3)DIFS,即分布协调功能帧间间隔,比 PIFS 长一个时隙时间,主要用在每次通信中的第一帧之前。
(4)EIFS,扩展的帧间间隔。EIFS 是最长的 IFS,主要在站点接收到坏帧时使用。
在 CSMA/CA 协议中,根据本站下一帧的功能和类型来确定 IFS 的类型。高优先级帧享有优先发送的权利,因此要选择长度较短的 IFS。可是低优先级帧就必须要选择长度相对长的 IFS。这样在低优先级帧间隔时间未结束时,高优先级帧已被发送到信道,且信道变为忙态,所以低优先级帧只好退避等待。这样就可以尽量避免碰撞的发生。所以,站点当前所使用的 IFS 的类型就直接表明了即将要发送的帧的优先级别:即 SIFS>PIFS>DIFS>EIFS。若当前等待时间为 SIFS,说明即将发送的帧优先级最高,享有优先发送的权利;若当前等待时间为 EIFS,说明即将发送的帧具有最低的优先级,必须等其他站点的帧发送完成后才能发送。
为尽可能的避免冲突,802.11中CSMA/CA协议采用了两种载波监听机制:物理载波监听(Physical Carrier Sense) 机制和 MAC 层的 虚拟载波检测(Virtual Carrier Sense) 机制。
物理载波监听是物理层的直接载波监听,通过接收到的电信号来判断信道状态。它规定站点在建立通信之前必须先侦听信道状态,“听到”信道处于忙态的时候不能发送数据,除非信道空闲。
虚拟载波监听是让源站点在所发送的数据帧首部中的“持续期字段”中写入一个时间值,以微秒为单位,表示在持续期时间内会占用信道。持续期时间包括ACK 的传输时间。这是因为无线信道的通信质量远不如有线信道的,且不采用碰撞检测,因此站点在一次通信中要收到目的站响应的 ACK 帧后才表示本次通
信就此顺利完成。这叫做链路层确认。其他站点在检测到信道上数据帧中的“持续期”字段时,就重设自身的网络分配向量 NAV(network allocation vector)。NAV指出了信道忙的时间长度,这样站点就在知道接下来 NAV 时间内信道被占用,不能发送数据。“虚拟载波监听”之所以有“虚拟”二字,是因为实际上其他站点并没有监听信道,而只是由于这些站点被告知了信道忙才退避等待,表现得就好像都监听了信道一样。
因此,当这两种机制中的任何一种机制“听到”信道忙,都表示信道忙,否则表示信道空闲。
CSMA/CA 协议包括了两种通信方式:一种是基本通信方式(basic access method),另一种是 RTS/CTS 通信方式。
基本通信方式,实际上是一个“我问你答”的简单交互机制,整个通信过程只对发送站数据帧 DATA 和接收站确认帧 ACK 两个 MAC 帧进行传输。该机制又称为“两次握手”机制。发送站在通信之前会先检测信道,若“听到”信道空闲,那么等待一个 DIFS ,若是在这一个 DIFS 结束时信道状态依然空闲,则立即发送 DATA 帧。接收站接收到该 DATA 帧后会回送一个 ACK 帧,以此告知源站数据已被接收。当源站正确接收到 ACK 帧时,就表示本次传输过程就此顺利完成。如果“听到”信道忙,就执行 CSMA/CA 的退避算法,只能等到退避结束后才能进行通信。基本通信方式的通信过程如图 2-6:
大家知道,在无线局域网当中,各移动站所发射的电磁波可以辐射到任意方向,但是其辐射覆盖的范围是非常有限的,特别是当电磁波在传播路程中存在阻碍物体的时候,其传播的距离就会大大缩短,因此并不是所有的站点都能够探测到其他站点的存在。这样的话 CSMA/CA 协议在采用基本访问方式时就会出现隐蔽站问题(hidden station problem)(于宏毅,2011)和暴露站问题(exposed station problem)。接下来通过具体的例子来说明。
图 2-7 中包含 A、B、C、D 四个站点,并且假定每个站点所发射的电磁波的覆盖区域都是以本站点为圆心的一个圆形区域(实际上是一个不规则的区域)。如图中所示 A 和 C 都希望与 B 建立通信连接,但 A 和 C 的相距较远,双方都超出了对方电磁波能到达的区域(都分别处于对方的盲区),于是 A 和
C 相互都不知道对方的存在。于是,当 A 和 C 均“听到”信道空闲时,就都和站点 B 进行通信,结果导致了冲突的产生。这种“听不到”其他站点电磁波信号的问题就叫做隐蔽站问题。当站点之间有障碍物的时候也有可能会出现这样的问题。例如,三个站点 A,B 和 C 彼此距离差不多,就好像分别位于一个等边三角形的三个顶点。但 A 和 C 之间有一个障碍物,导致 A 和 C 彼此都不知道对方的存在。同样
当 A 和 C 都“听到”信道空闲时,就都和 B 进行通信,结果也会导致冲突产生。
图 2-8 中展现出了另一个问题。在 B、A 正在进行通信时,C 想和 D 通信,但是由于 C “听到”信道忙,于是 C 就退避等待。但事实上 B、A 通信根本不能对 C 和 D 的通信产生任何干扰。这就是暴露站问题。
由此可以看出,在无线局域网中,在互不干扰的前提下,是可以有多对站点同时通信的。但是不排除有检测错误的情况发生,检测到的信道状态可能和实际的状态存在差别。
RTS/CTS 通信访问方式是可选的。在这种方式下,发送站在正式发送数据前需要对信道进行预约,预约成功后才能发送数据。这种方式又被称为“四次握手”机制,主要用于解决 CSMA/CA 协议基本访问方式中存在的隐蔽站问题和暴露站问题。
在 RTS/CTS 通信方式中,当站点需要传输数据时:
(1)在发送之前必须先确定信道状态。若信道空闲,会先等待一个 DIFS,若是在这一个 DIFS 结束时信道状态依然空闲,那么以广播形式发送一个请求发送 RTS 控制帧,在这个帧当中写入了源站地址、目的站地址和此次通信过程将要占用信道的时间。这里信道空闲时再等待一个 DIFS 的原因是:若是其他站点有高优先级帧要发送,则让其他站有机会优先发送,而本站将退避等待,延后发送。
(2)目的站接收到此 RTS 帧时,若信道空闲,同样以广播形式给源站回送一个允许发送 CTS 帧,并且会将 RTS 帧中的“持续期”字段值复制到 CTS 帧中。当其他站收到 RTS 帧时,就会读取其中的时间值,并将自身的网络分配向量 NAV定时器的值进行比较,取两者中较大的值重新设置为 NAV 的值。设置之后,在该定时器时间之内不能使用信道。
(3)源站正确收到此 CTS 帧时,就表示信道预约成功,再等待一个 SIFS就开始发送 DATA 帧。其他站收到此 CTS 帧时,同样会读取其中的时间值,并设置其 NAV。
(4)目的站收到 DATA 帧后,会给源站点响应一个 ACK 帧,以此告知源站数据已被接收。当源站正确接收到 ACK 帧时,就表示对方接收完毕,本次传输过程就此顺利完成。
这样的过程就是所谓的 RTS→CTS→DATA→ACK 四次握手机制。RTS/CTS通信方式的通信过程如图 2-9:
值得说明的是,由于源站点和目的站点电磁波的传播范围有差别,所以在除这两个站以外的其他所有站点中,有一些只能收到 RTS 帧,还有一些只能收到CTS 帧,另一些则 RTS 帧和 CTS 帧都能收到。
如图 2-10(a)中,C 在 A 的信号辐射区域内,但不在 B 的信号辐射区域内;D 在 B 的信号辐射区域内,但不在 A 的信号辐射区域内;E 既在 A 的信号辐射区域内,又在 B 的信号辐射区域内。当 A 请求和 B 进行通信时,C 能够接收到A 广播发送的 RTS 控制帧,但收不到 B 发出的 CTS 这个回应帧。这样的话就表示在 A 和 B 进行通信时,C 也可以与其他站点进行通信, B 并不会受到影响。这样就解决了暴露站问题。
同样地,D 虽然“听不到”从 A 发出的 RTS,却可以“听到”从 B 发出的 CTS,这样的话 D 就明白了接下来 B 要和 A 通信,因此只能等待,不会影响 B和 A 之间的通信。这样就解决了隐蔽站问题。
对于 E 站点,不管是 A 发出的 RTS 帧,还是从 B 发出的 CTS 它都能收到,因此 E 和 D 一样,在
A 和 B 正在通信时 E 只能等待。
由于使用了 RTS 帧和 CTS 帧,因此该方式会降低网络传输的效率。但它们长度分别为 20 字节和 14
字节,与 DATA 帧的两千多字节相比网络消耗可忽略不计,并且能有效解决隐蔽站点带来的碰撞问题。相反,如果不是采用这种方式,很容易因为上面提到的暴露站和隐蔽站问题而不断产生冲突,这样会导致站点在不停的重发数据帧上花费成倍的时间,网络效率也会更低。
然而,虽然采用 RTS/CTS 方式能有效避免碰撞,但并不意味着就绝对不会再产生冲突。例如,B 和
C 有可能在同一时间“听到”信道空闲,然后两个站点都立即发出一个请求 RTS 帧给 A,于是冲突就不可避免地产生了。当冲突产生后,B 和 C 立即执行 CSMA/CA 的退避算法,延后发送。
CSMA/CA 协议规定,站点在进行通信之前,必须先监听信道状态:
(1)若检测到信道空闲,则再等待一个 DIFS 后(如果这段时间内信道一直是空闲的)就开始发送 DATA 帧,并等待确认。
(2)目的站若正确收到此帧,则在等待一个 SIFS 后,就向源站发送确认帧ACK。当发送站收到 ACK 帧就表示本次传输过程完成。
(3)另外,在站点发送数据帧时,所有其他的站点都已经设置好了网络分配向量 NAV,在这整个通信过程完成前其他站点只能执行 CSMA/CA 的退避算法,随机选择一个退避时间,推迟发送。
退避时间的选择方法如下:
为了减少各个站点选择相同的退避时间的概率,802.11 标准规定,第 i i i 次退避的退避时间是在时隙个数 { 0 , 1 , . . . , 2 2 + i − 1 0,1, ... , 2^{2+i}-1 0,1,...,22+i−1} 中随机地选择一个,并把 2 2 + i − 1 2^{2+i}-1 22+i−1 称之为竞争窗口 C W ( C o n t e n t W i n d o w ) CW(Content Window) CW(ContentWindow)。由此可见,退避时间就等于所选择的时隙个数乘以时隙时间,是时隙时间的整数倍。当发生第一次退避时,也就是 i = 1 i=1 i=1,退避的时隙个数是在区间 { 0 , 1 , … , 7 0,1,…,7 0,1,…,7} 中随机地选择一个;当发生第二次退避时,也就是 i = 2 i=2 i=2,退避的时隙个数是在区间{ 0 , 1 , … , 15 0,1,…,15 0,1,…,15}中随机地选择一个;以此类推,当时隙个数达到 255,也就是进行到第 6 次退避时,竞争窗口不再增大。也就是说,竞争窗口 C W CW CW 的值只能是{ 7 , 15 , 31 , 63 , 127 , 255 7,15,31,63,127,255 7,15,31,63,127,255} 中的一个。一般地,把 C W m i n CW_{min} CWmin 称之为最小竞争窗口, C W m i n = 7 CW_{min}=7 CWmin=7 ;把 C W m a x CW_{max} CWmax称之为最大竞争窗口, C W m a x = 255 CW_{max}=255 CWmax=255; C W m i n ≤ C W ≤ C W m a x CW_{min}≤ CW ≤ CW_{max} CWmin≤CW≤CWmax。
(4)站点选择好退避时间就等效于设定好了一个退避计时器(backoff timer)。于是在计时器减小到零之前,站点会每经历一个时隙时间就检测一次信道状态。若检测到信道忙,则暂停倒计时;若检测到信道空闲,就表示先前的通信过程已完成,这时其他站点设置的 NAV 时间也就结束了。再经过一个 DIFS,争用窗口到来,退避计时器就从暂停处重新开始倒计时,在每个时隙的起始时刻减一,一旦退避计时器的时间减小到零就代表可以进行通信了,就开始发送整个数据帧。
在争用窗口期间,由于可能不止一个站点要执行退避算法,因此争用信道的情况比较复杂。CSMA/CA 协议的退避机制如图 2-11 所示。
以上就是 CSMA/CA 协议及其退避算法的全部内容,情况很复杂,现作如下归纳:
(1)如果站点最初要进行通信(而不是通信冲突后再进行重传),且发现信道是空闲的,在等待一个
DIFS 后,就开始通信。
(2)如果站点最初要进行通信、但发现信道忙,或者站点一次通信完成后要再继续通信的,再或者站点通信冲突要重传的,则站点执行 CSMA/CA 的退避算法,各自进行第 i i i 次退避。只要发现信道忙,就暂停倒计时;只要信道空闲,就继续倒计时。
(3)站点退避计时器时间只要减少到零(这个时候信道一定是空闲的),就立即开始通信并等待确认。
(4)发送站若收到确认,就表示通信过程顺利完成。这时如果想要继续通信,就再从步骤(2)开始。
(5)若发送站没有收到确认,那么就要重传此帧。因此也要从步骤(2)开始,直到收到确认。除非已经超过重传次数的上限值,只能放弃重传。
值得说明的是,当一个站最初想要建立通信连接,并且发现信道是空闲的,那么就直接开始通信,而不需要退避。除此以外的任何情形都得要执行退避算法。
[1] 罗浪. 无线局域网CSMA/CA协议的研究与实现[D].成都理工大学,2016.