转载归纳自:
产生原因
虽然CSMA/CD协议已成功地应用于使用有线连接的局域网,但无线局域网能不能也使用CSMA/CD协议呢?
显然,这个协议的前一部分CSMA能够使用。在无线局域网中,在发送数据之前先对媒体进行载波监听。如发现有其他站在发送数据,就推迟发送以免发生碰撞。这样做是合理的。但问题是“碰撞检测”(CD)在无线环境下却不能使用。理由如下:
- 碰撞检测”要求一个站点在发送本站数据的同时,还必须不间断地检测信道。一旦检测到碰撞,就立即停止发送。但由于无线信道的传输条件特殊,其信号强度的动态范围非常大,因此在802.11适配器上接收到的信号强度往往会远远小于发送信号的强度(信号强度可能相差百万倍)。如要在无线局域网的适配器上实现检测到碰撞,在硬件上需要的花费就会过大。
- 更重要的是,即使我们能够在硬件上实现无线局域网的碰撞检测功能,我们仍然无法避免碰撞的发生。这就表明,无线局域网不需要进行碰撞检测。
问题
“无线局域网不需要进行碰撞检测”是由无线信道本身的特点决定的。我们知道,无线电波能够向所有的方向传播,且其传播距离受限。当电磁波在传播过程中遇到障碍物时,其传播距离就会受到限制。如图9-4所示的例子表示了无线局域网的特殊问题。图中给出两个无线移动站A和B,以及接入点AP。我们假定无线电信号传播的范围是以发送站为圆心的一个圆形面积。
- 图9-4(a)表示站点A和C都想和B通信。但A和C相距较远,彼此都听不见对方。当A和C检测到信道空闲时,就都向B发送数据,结果发生了碰撞。这种未能检测出信道上其他站点信号的问题叫做隐蔽站I}}题(hidden station problem) o 当移动站之间有障碍物时也有可能出现上述问题。例如,三个站点A, B和C彼此距离都差不多,相当于在一个等边三角形的三个顶点。但A和C之间有一个座山,因此A和C彼此都听不见对方。若A和C同时向B发送数据就会发生碰撞,使B无法正常接收。
- 图9-4(b)给出了另一种情况。站点B向A发送数据。而C又想和D通信。但C检测到信道忙,于是就不敢向D发送数据,其实B向A发送数据并不影响C向D发送数据(如果这时不是B向A发送数据而是A向B发送数据,则当C向D发送数据时就会干扰B接收A发来的数据)。这就是暴露站问题((exposed station problem)。在无线局域网中,在不发生干扰的情况下,可允许同时多个移动站进行通信。这点与有线局域网有很大的差别。
由此可见,无线局域网可能出现检测错误的情况:检测到信道空闲,其实并不空闲;而检测到信道忙,其实并不忙。
CSMA/CD的问题
我们知道,CSMA/CD有两个要点,一是发送前先检测信道,信道空闲就立即发送,信道忙就随机推迟发送;二是边发送边检测信道,一发现碰撞就立即停止发送。因此,偶尔发生的碰撞并不会使局域网的运行效率降低很多。
但无线局域网不能使用碰撞检测,只要开始发送数据,就一定把整个帧发送完毕。由此可见,如果在无线局域网的发送过程中,一旦发生了碰撞,那么整个信道资源在这段时间就白白浪费了。因此,无线局域网应当尽量减少碰撞的发生。
CSMA/CA基本原理
为此,802.11局域网就使用CSMA/CA协议。CA表示Collision Avoidance,是碰撞避免的意思,或者说,协议的设计是要尽量减少碰撞发生的概率。
802.11局域网在使用CSMA/CA的同时,还使用停止等待协议。这是因为无线信道的通信质量远不如有线信道的,因此无线站点每通过无线局域网发送完一帧后,要等到收到对方的确认帧后才能继续发送下一帧。这叫做链路层确认。
MAC
我们在进一步讨论CSMA/CA协议之前,先要介绍802.11的MAC层
802.11标准设计了独特的MAC层(图9-5 )。它通过协调功能(Coordination Function)来确定在基本服务集BSS中的移动站,在什么时间能发送数据或接收数据。802.11的MAC层在物理层的上面,它包括两个子层。
- 分布协调功能DCF (Distributed Coordination Function). DCF不采用任何中心控制,而是在每一个结点使用CSMA机制的分布式接入算法,让各个站通过争用信道来获取发送权。因此DCF向上提供争用服务。802. I 1协议规定,所有的实现都必须有DCF功能。
- 点协调功能PCF (Point Coordination Function)。PCF是选项,是用接入点AP集中控制整个 BSS内的活动,因此自组网络就没有PCF子层。PCF使用集中控制的接入算法,用类似于探询的方法把发送数据权轮流交给各个站,从而避免了碰撞的产生。对于时间敏感的业务,如分组话音,就应使用提供无争用服务的点协调功能PCF。
间隔
为了尽量避免碰撞,802. 11规定,所有的站在完成发送后,必须再等待一段很短的时间(继续监听)才能发送下一帧。这段时间通称为帧间间隔IFS (InterFrame Space)。帧间间隔的长短取决于该站要发送的帧的类型。高优先级帧需要等待的时间较短,因此可优先获得发送权,但低优先级帧就必须等待较长的时间。若低优先级帧还没来得及发送而其他站的高优先级帧已发送到媒体,则媒体变为忙态,那么低优先级帧就只能再推迟发送了,这样就减少了发生碰撞的机会。至于各种帧间间隔的具体长度,则取决于所使用的物理层特性。 下面解释最常用的两种帧间间隔的作用(参考图9-6 ):
- SIFS,即短(Short)帧间间隔,长度为28 us。 SIFS是最短的帧间间隔,用来分隔开属于一次对话的各帧。在这段时间内,一个站应当能够从发送方式切换到接收方式。使用SIFS的帧类型有:ACK帧、CTS帧(在后面“对信道进行预约”中介绍)、由过长的MAC帧分片后的数据帧气以及所有回答AP探询的帧和在PCF方式中接入点AP发送出的任何帧。
- DIFS,即分布协调功能帧间间隔,它比SIFS的帧间间隔要长得多,长度为128 }s。在DCF方式中,DIFS用来发送数据帧和管理帧。
CSMA/CA协议的工作原理可用图9-6来说明。
要发送数据的站先检测信道。在802.11标准中,规定了在物理层的空中接口进行物理层的载波监听。通过收到的相对信号强度是否超过一定的门限数值,就可判断是否有其他的移动站在信道上发送数据。当源站发送它的第一个MAC帧时,若检测到信道空闲,则在等待一段时间DIFS后就可发送。
为什么信道空闲还要再等待一段时间DIFS呢?就是考虑到可能有其他的站有一高优先级的帧要发送。如有,就要让高优先级帧先发送。
现在假定没有高优先级帧要发送,因而源站发送了自己的数据帧。目的站若正确收到此帧,则经过时间间隔SIFS后,向源站发送确认帧ACK。若源站在规定时间内没有收到确认帧ACK(由重传计时器控制这段时间),就必须重传此帧,直到收到确认为止,或者经过若千次的重传失败后放弃发送。
由此可见,802.11无线局域网采用的停止等待协议,是一种可靠传输协议。发送力一必须等待对力一的确认帧。但802.3有线局域网的传输是不可靠的,发送方把数据发送出去就不管了(当然若检测到碰撞是必须重传的),如果需要可靠传输则由高层负责。 802.11标准还采用了一种叫做虚拟载波监听(Virtual Carrier Sense)的机制,这就是让源站把它要占用信道的时间(包括目的站发回确认帧所需的时间)及时通知给所有其他站,以便使其他所有站在这一段时间都停止发送数据,这样就大大减少了碰撞的机会。“虚拟载波监听”是表示其他站并没有监听信道,而是由于其他站收到了“源站的通知”才不发送数据。这种效果好像是其他站都监听了信道。所谓“源站的通知”就是源站在其MAC帧首部中的第二个字段“持续时间”中,填入了在本帧结束后还将要占用信道多少时间(以微秒为单位),包括目的站发送确认帧所需的时间。
当一个站检测到正在信道中传送的MAC帧首部的“持续时间”字段时,就调整自己的网络分配向量NAV(Network Allocation Vector)。 NAV指出了必须经过多少时间才能完成数据帧的这次传输,才能使信道转入到空闲状态。因此,某个站认为信道处于忙态就有两种可能,一种可能是由于其物理层的载波监听检测到信道忙,另一种可能就是由于MAC层的虚拟载波监听机制指出了信道忙。
图9-6指出,当信道从忙态变为空闲时,任何一个站要发送数据帧时一,只要不是要发送的第一个帧,不仅都必须等待一个DIFS的间隔,而且还要进入争用窗口,并计算随机退避时间,以便再次重新试图接入到信道。请读者注意,在以太网的CSMA/CD协议中,要发送数据的站,在监听到信道变为空闲就立即发送数据,同时进行碰撞检测。如果发生了碰撞,就执行退避算法。但在802.11标准的CSMA/CA协议中,因为没有像以太网那样的碰撞检测机制,所以,在信道从忙态转为空闲时,各站就要执行退避算法。这样做就减少了发生碰撞的概率。802.11标准也是使用二进制指数退避算法,但具体做法稍有不同。这就是:第i次退避就在2^2+i个时隙中随机地选择一个。这就是说,第1次退避是在8个时隙(而不是2个)中随机选择一个,而第2次退避是在16个时隙(而不是4个)中随机选择一个。
当某个要发送数据的站,使用退避算法选择了争用窗口中的某个时隙后,就根据该时隙的位置设置一个退避计时器(backoff timer)当退避计时器的时间减小到零时,就开始发送数据。也可能当退避计时器的时间还未减小到零时而信道又转变为忙态,这时就冻结退避计时器的数值,重新等待信道变为空闲,再经过时间DIFS后,继续启动退避计时器(从剩下的时间开始)。这种规定有利于继续启动退避计时器的站更早地接入到信道中。
例子
为了更好地了解802. I 1的退避机制,下面用个例子来说明(图9-7 ) 。
图9-7表示当A正在发送数据时,B, C和D都有数据要发送(用向上的箭头表示)。由于这三个站都检测到信道忙,因此都要执行退避算法,各自随机退避一段时间再发送数据。802. I 1标准规定,退避时间必须是整数倍的时隙时间。 前面己经讲过,第i次退避是在时隙{0, 1, ..., 2 ^2+i}中随机地选择一个。这样做是为了使不同站点选择相同退避时间的概率减少。因此,第1次退避(i=1)要推迟发送的时间是在时隙{0, 1,…,7}中(共8个时隙)随机选择一个,而第2次退避是在时隙{0, 1,…,15}中(共16个时隙)随机选择一个。当时隙编号达到255时(这对应于第6次退避)就不再增加了。这半决定退避时间的变量,称为退避变量。
退避时间选定后,就相当于设置了一个退避计时器(backoff timer)。站点每经历一个时隙的时间就检测一次信道。这可能发生两种情况:若检测到信道空闲,退避计时一器就继续倒计时;若检测到信道忙,就冻结退避计时器的剩余时间,重新等待信道变为空闲并再经过时间DIFS后,从剩余时间开始继续倒计时。如果退避计时器的时间减小到零时,就开始发送整个数据帧。
从图9-7可以看出,C的退避计时器最先减到零,于是C立即把整个数据帧发送出去。请注意,A发送完数据后信道就变为空闲。C的退避计时器一直在倒计时。当C在发送数据的过程中,B和D检测到信道忙,就冻结各自的退避计时器的数值,重新期待信道变为空闲。正在这时E也想发送数据。由于E检测到信道忙,因此E就执行退避算法和设置退避计时器。
当C发送完数据并经过了时间DIFS后,B和D的退避计时器又从各自的剩余时间开始倒计时。现在争用信道的除B和D外,还有Eo D的退避计时器最先减到零,于是D得到了发送权。在D发送数据时,B和E都冻结其退避计时器。
以后E的退避计时器比B先减少到零。当E发送数据时,B再次冻结其退避计时器。等到E发送完数据并经过时间DIFS后,B的退避计时器才继续工作,一直到把最后剩余的时间用完,然后就发送数据。
冻结退避计时器剩余时间的做法是为了使协议对所有站点更加公平。
总结
根据以上讨论的情况,可把CSMA/CA算法归纳如下:
- 若站点最初有数据要发送(而不是发送不成功再进行重传),且检测到信道空闲,在等待时间DIFS后,就发送整个数据帧。
- 否则,站点执行CSMA/CA协议的退避算法。一旦检测到信道忙,就冻结退避计时器。只要信道空闲,退避计时器就进行倒计时。
- 当退避计时器时间减少到零时(这时信道只可能是空闲的),站点就发送整个的帧并等待确认。
- 发送站若收到确认,就知道已发送的帧被目的站正确收到了。这时如果要发送第二帧,就要从上面的步骤(2)开始,执行CSMA/CA协议的退避算法,随机选定一段退避时间。
若源站在规定时间内没有收到确认帧ACK(由重传计时器控制这段时间),就必须重传此帧(再次使用CSMA/CA协议争用接入信道),直到收到确认为止,或者经过若干次的重传失败后放弃发送。
应当指出,当一个站要发送数据帧时,仅在下面的情况下才不使用退避算法:检测到信道是空闲的,并且这个数据帧是它想发送的第一个数据帧。
除此以外的所有情况,都必须使用退避算法。具体来说,以下几种情况都必须使用退避算法:
(1)在发送第一个帧之前检测到信道处于忙态。
(2)每一次的重传。
(3)每一次的成功发送后再要发送下一帧。