CSMA/CA 概述

转载:http://www.cnblogs.com/tankery/archive/2011/07/07/2100247.html

嗯,这篇文章也是在之前写的(6月22日),首先发表于我们的班级博客(www.seedclass.com)。是在听完一位来自挪威的教授讲座后总结的。

现在发现一个问题,以下叙述的不是简单的CSMA/CA机制,而是加入了RTS/CTS的CSMA/CA机制,特此说明。

以下为原文:

首先,李教授说,通讯协议的几个重要的点:

  1. reliable,可信,数据传输可靠
  2. fairly,公平,网络中的节点机会合理
  3. protect,保护,传输中的节点(lucky guys)不被打扰

下面就从这几点介绍CSMA/CA协议:

CSMA/CA 概述

CSMA/CA (Carrier sense multiple access with collision avoidance) 多用于无线通讯协议,是基于IEEE的802.11协议的。他的中文名称是载波侦听多路访问/冲突避免

从名字来看,就知道它的设计思想了:

  1. 载波侦听,在特定载波频率侦听,空闲时发送
  2. 多路访问,可以在多个载波频道传输和接收数据
  3. 冲突避免,用避免冲突的方式来实现数据可靠传输

 
值得一说的是最后一点,除了冲突避免(CA)还有另一种冲突保护机制,冲突检测(CD)。冲突检测是在发送数据之前,直接检测整个网络的状态,提前检测到冲突的可能。检测整个网络,需要网络具有高速、微小衰减,这样,在世界范围内,这种全网络检测都是可能的。因此,有线网络是可以做到这点的。目前的有线网络,衰减极小,速度极快。远处的另一台发送端的数据几乎能马上被整个网络的计算机探测到。

而无线网络由于其衰减严重显然做不到这点。假设一个节点的传输距离是100m,那么下面的情况,A可以与B通讯,而无法检测C的冲突:

A  <–  100m –>  B  <– 100m –> C

所以,无线网络采用另一种冲突保护机制:冲突避免(CA)。

冲突避免,是使用一些方法来商定发送数据的顺序和时间,以避免发生冲突。
CSMA/CA中是使用“RTS-CTS握手”的方式来避免冲突:“设备欲发送帧前,先发送一个很小的RTS(Request to Send)帧給目標端,等待目標端回應CTS(Clear to Send)帧後,才開始傳送。此方式可以確保接下來傳送資料時,不會发生冲突。同時由於RTS帧与CTS帧都很小,讓傳送的无效开销變小。”(来自维基百科)

我补充一点,RTS和CTS都是携带预计时间的,非目标地址的节点收到这些信号时,将不会在这段时间内发送信号。也就是说,一旦RTS-CTS握手成功,接下来的过程将不会被打扰。

当然,RTS的发送是不能保证没有冲突的。这样的冲突就不可避免了,只能尽量减小。CSMA/CA的办法是,发送失败,则随机延时时间加倍,具体参数后文详述。

前面的握手机制,就是保证了“protect”。

另外,由于失败后的重发,就使得这个协议也具有“reliable”的特性。

最后一点,“fairly”如何保证?在介绍这个之前,我先把前面的握手介绍清楚,下面是详细的流程图:
CSMA/CA 传输流程

我一步步详细介绍。

CSMA/CA 详细详述

确认信道空闲

数据的传输是以帧为单位。传输前,先检测信道情况,若已被占用,则随机等待一段时间(Backoff time)。这段时间是以一个基本时隙为单位,在[0, CWmin - 1](协议规定CWmin = 32,可根据具体需要修改)中的线性随机分布。这个基本时隙是跟硬件响应速度,数据传输周期有关的,应该足够长来完成这些工作,否则没有意义。具体计算公式我不太清楚。

若未被占用,等待DIFS (DCF Interframe Space) 时间(DIFS = 2 * slots + SIFS)后再次检测。slots没搞清楚,估计是考虑的数据传输时间?求问。。SIFS (Short Interframe Space) 是考虑了硬件响应时间。总之,若DIFS时间后仍然未被占用,则视为信道空闲。

RTS/CTS

信道空闲后,等待一个随机时间(Random Backoff time),就开始发送RTS包。发送结束并收到CTS后,表示握手成功,可以不被打扰的传输数据了。

若没有收到CTS,则需要等待一个随机时间后重新发送,这时,需要将CW扩大一倍(比如原来是32,现在到64),以优化网络环境。减少冲突的发生。根据大量的测试数据,老师告诉我们一个数据,重传次数应该为4次,或者7次。两个值,最好。

RTS和CTS的包中,包含了目标地址的信息,以及预计的后续传输时间(相对于一个帧结束的时间)。这时,非目标地址的节点就应该自觉的中止正在进行的活动,等待这么一段携带的剩余时间。

那么,如果在发送RTS之前的Backoff time时收到其他节点的RTS或CTS怎么办?毫无疑问的要中止当前的工作,等待包中包含的剩余时间。这个过程,叫frozen。这个时间结束后,DIFS,接着,就不是随机时间了,是上一次未完成的随机时间。这样上次未完成的传输将在这次有更高的优先级。这就体现了“fairly”。

数据传输

这一轮握手成功后,基本就可以安全的传输数据了,但是怎么保证数据的可靠?CSMA/CA 规定,数据帧发送结束后,接收端需要发送一个ACK,以确认成功接收。

倘若发送端没有收到ACK,则认为发送失败,需要重发,就类似上面提到的重发RTS了,也需要扩大CW。

不过,成功发送后,CW就将减为CWmin。另外,CW的值不应该超过CWmax(一般规定为1024,刚好是32*2^5),否则延时太长。超过了,就不再重发,认为丢包了。由上层协议去处理。

综上,握手的过程如下:
RTS -> CTS -> DATA -> ACK

OK,我能记得的,基本就上面这些,都是我个人的理解,求拍砖,求指教……

posted @ 2013-04-15 14:22  Iamchritian  阅读(1785)  评论(0编辑  收藏  举报