Ay's Blog@CNSSUESTC

[导入]Wireless Fundamental(1) -- 802.11MAC入门科普篇

作者:__ay 

参考书目是 《802.11 无线网络权威指南 第二版影印版》  中文版翻译的太恶心了。


在无线网络通信中,MAC层的工作细节和有线网络差的实在是太大了……

这里仅仅谈论无线MAC层的通信机制,MAC以上的有线无线都一样~~


1. 神马是RTS/CTS??


那么说起无线网路,我们其实最最首先考虑通信的可靠性问题,要知道有线网络的传输环境比无线网络封闭多了,但是其可靠性也比无线网络高多了,最最起码有线网络不要考虑可能的微波,手机信号等因素的干扰。正是由于考虑到其它电子设备比如手机,微波炉等有发射微波功能电子产品,我们空气中的无线信号受到的干扰远远比有线信号的要强的多。所以在无线通信时,要考虑到可能的干扰性,所以需要对每一个发送出去的帧进行确认。过程就如下图所示。

 

但是,出现一个问题一个棘手的问题。就是说如何处理所谓的隐藏节点的问题,那啥是隐藏节点咧?


在上一个图中我们可以yy一种特殊情况: 2号机可以接收到1号和3号的信号,但是1号机无法发现3号机。

那么在1,3号同时发送帧给2号机的时候,2号机没法回应这2个帧,因为帧冲突了。在无线网络里,所有主机都公用一个空气媒介,也就是说在一个主机发送数据的时候其它主机必须保持沉默。那么上述这种情况显然违背了这个规则,造成的结果就是2号机根本没法收到数据。

所以这里就又引出一个以太网类似的另一个问题:冲突避免

那么对于这种情况我们则需要有个协调机制,协调谁先发,谁后发

这就引出了2个功能帧 

RTS: Request to Send

CTS: Clear to Send

在1号机传送数据之前,首先发送一个RTS帧给2号机,那么所有接收到RST帧的机器则会保持沉默

但是3号机收不到丫~~

所以2号机会回应1号机一个CTS帧,3号机收到CTS,则保持沉默(这样所以可能干扰到1/2号机通信的主机都沉默了),然后整个无线网络媒介就可以被空出来给1号机用来传送数据帧给2号机了

这就是RTS/CTS机制 发送过程大致如下


但是对于这个机制的使用会消耗额外的计算资源,那么有一个折中的做法就是设置一个RTS的阀值,当网络数据包长度超过这个阀值的时候就启用RTS/CTS机制,否则保持自由发送模式。(我发现老外很喜欢中庸之道~)。当然这个机制可能有些人说无法保证没有冲突,应为可能1,3主机可能同时发送2个RTS包给2号机。这里会有个冲突回避问题,原理和以太网类似,都是遇到发送冲突,那么就随机选择回避。这个就是下面要讨论的一个问题了。


2 WLAN的冲突回避


无线网络通信另一个主要的问题就是协调问题,就是如何协调区域内的各个主机进行通信,当然RTS/CTS是一种解决机制,但是这只是个小部分,到底如何让无线区域内的主机“流畅”的通信,就得涉及到一系列冲突回避策略等问题上了。

首先说一下协调模式:

在以太网中用的是CSMA/DA的方法,所有主机自由发送报文,若冲突了退避一段时间在发就是了。

而在无线网中则有3种协调模式

DCF (Distribution Coordination Function)

区域内的主机传输,但是跟以太网的冲突避免一样,在检测到冲突后则进行退避。不过需要提的是有时候DCF会采用RTS/CTS机制来减少冲突。这个机制自由性比较强。

PCF (Point Coordination Function)

这个机制依赖于ACCESS POINTS,既需要通过一台指定的无线主机来协调通信。所以这个机制可以为主机提供无竞争服务,因为AP可以指定谁先发数据谁后发数据,没有传输冲突,真和谐,就是开销要高一些。 

HCF (Hybird Coordination Function)

这个机制是以上两个机制的折中,一方面提供一个尽力而为的服务,但是又对于通信的步骤要求又不如PCF那么严格。这个模式通过维护多个服务队列,然后再决定为怎样的主机提供怎样的服务。


 

我们以后的讨论情景是基于DCF下的。特别在DCF过程中,他的退避算法和以太网的算法很相似。也是随即退避,随着发送失败的次数增加,退避时间的选择范围会进行指数增长。当检测到信道空闲后,要发送数据的主机需要等待DIFS时间间隔后然后进入竞争状态下,所谓的竞争状态就是说所有主机会在自己的竞争窗口中随即选择一个等待时间,这个等待时间过后则开始发送数据。

首先来说几个定义:

1.时隙(原文是slot,我们暂且称之为时隙吧):这个是退避时间的最小单位,在以太网中退避时间单位是毫秒还是微秒来着我忘了,这个时隙就是无线网络中的时间单位,这个时隙是根据情况而定的。在高速网络(网卡处理性能越好)中时隙会越短。时隙可能是2微秒,也可能是4毫秒,反正是在不同网络中时隙可能不同,这个可以看成退避时间的最小单位。

2.竞争窗口,就是在发送失败后选择退避时间的集合。比如说初始的窗口大小是0-31 slots。这就表明在主机需要在0-31 slots里面随即抽取出一个值来进行等待。打个比方我们的slot设为2微秒,那么在上一次传输数据完毕后经过DIFS(下面会介绍到)间隙,我们在自己的竞争窗口(范围:0-31 slots)随即选取到了24这个值,那么我们需要等待的时间就是24 slots == 24*2 微秒 == 48 微秒。当然竞争窗口的大小会随着发送失败的次数而增加,因为发送失败次数越多表示网络负载越大,那么所有无线网主机在检测到自己发送失败了以后都要将自己的竞争窗口乘以2,然后再继续等待发送。不过当失败次数达到阀值的时候竞争窗口大小就不会增加了。当发送成功以后竞争窗口就会恢复初始值。

有图有真相,贴个图继续分析:

看到初始窗口范围是0-31,随着重传次数增加,窗口也是呈指数增长。当增长到阀值1024大小时就停止增长了,接下来如果还是重传失败的话就一直随机在0-1023 slots中挑出一个值来进行等待。


 

3 时序

再者就是时序问题了,简单来说就是如何规定无线主机什么时候该做什么。那首先先得说一下无线网络监听机制,这个和有线网络里面不太一样。有线网络里面若物理信道有数据传输的话是肯定可以监听的到的,但无线网络里面却不一定。就拿之前那个隐藏节点的例子来说,3号机可能无法通过监听物理信道来得知一二号机正在传输。所以无线网络通信中,要确定信道是否被占用,引入了虚拟载波监听。


注:载波监听和虚拟载波监听是同时在运行的,只有当这两个模块显示空闲时才表示信道空闲,若其中的一个模块显示信道繁忙都表示信道正在被占用。


关于虚拟载波监听的原理,那么得先介绍一个叫Network Allocation Vector(NAV)这个变量。这个变量会附在无线数据包内的。准备发送数据的主机通过NAV这个值通知其它沉默的主机信道要被占用多长时间来用于传输数据。每个主机都会维护一个自己的NAV值,然而这个NAV值每隔1微秒会递减1,直到递减为0的时候就表示虚拟载波监听的信道空闲。


说白了NAV就是个定时器,但是是个动态定时器,当主机沉默时会不断的收到来自无线网络中的含有NAV值的数据包,只有当数据包中的NAV值大于自己的NAV值时,主机才会更新自己的NAV值。

比如说 1号主机的NAV值是100,那么收到一个A包,它的NAV值是99,那么1号主机的NAV值就还是100不变。过了10微秒,1号主机又收到一个B包,它的NAV值还是99,但是这个时候1号主机的NAV值是90了(每隔1微秒会递减1的嘛),所以1号主机会把自己的NAV值更新为99。直到这个NAV值递减到0才说明信道可用。


接下来又回到时序问题上,在每帧发送结束后(这里指的是所有主机,特别是沉默的主机,当沉默主机检测到NAV值是0就表示传送完毕了)都会有个等待间隙。但这等待间隙类型分4种:

SIFS (short interframe space)

该类型时间间隔最短,这个类型的时间间隔主要用于高优先级别的操作。要发送RTS,CTS,ACK或者是被分片的帧(假设一个帧被分成了3块,第一部分传送完毕,等待SIFS间隔继续发送第二块,而其他要发送完整帧的主机则需要等待DIFS间隔,这样就能够确保这被分片的帧能够一次性发送完毕,也就是被分片的帧享受更高的传输优先级)的时候。


PIFS (PCF interframe space)

PIFS时间间隔其次,在传输PCF相关的管理帧的时候采用这类型的时间间隔。这种情况就是一般我们用路由器,路由器的管理帧只要等待PIFS就可以发送了。


DIFS (DCF interframe space)

DIFS时间间隔最长,所有主机要传输数据的话必须在上一次传输完毕后统一等待DIFS时隙后才能尝试发送。当然,这里说的是尝试发送,因为后面还得进入一个竞争间隔。


EIFS (extended interframe space)

这类帧的时间间隔不确定,在传输错误的时候才会用到。


所以除去EIFS,他们仨的时间关系就是  SIFS<PIFS<DIFS,SIFS等待时间最短,DIFS最长,PIFS居中

。可以发现,时间越短,发送成功率越高,这也就说明优先级越高。显而易见,RTS/CTS帧,也叫控制帧的发送间隔都是SIFS,因为这类帧的优先级要高于平常的数据传输。所以当你要发送RTS之类的帧时就采用SIFS时间间隔,这样就能够保证RTS帧能够更快比使用其它时间间隔的帧发送出去,其它帧接收到RTS报文后就开始保持沉默将不试图发送帧了。

整个过程串起来就如下图所示:


先分析上面的那个时间轴,RTS发送出去,收到CTS。然后间隔SIFS就开始发送数据了,这里的帧是分片的,分片的帧需要一次性传输完,所以每个帧的等待发送时间是SIFS。里面还可以看到ACK的回复时间也是需要等待SIFS的,因为这几个类型的帧对保证数据传输非常重要,所以享有更高的发送优先级,在这种情况下,其它的无线主机发送数据干扰这次传输是不可能的,因为他们需要等待DIFS时间间隔。在他们等待没完的时候RTS,CTS,ACK,分片帧的传输早都开始传输了,这些主机接收到数据传输信息后只能进入沉默。


那么下面的那个时间轴就更清晰了,这个时间轴其实可以看成是其它沉默无线主机NAV值的情况。

在刚发送第一个RTS帧的时候,其它主机收到了RTS帧中附带的NAV值,等到0号帧传送结束后各个主机开始等待DISF时间准备传输,但是这个时候发送主机由于在发送分片帧,所以只要等待SIFS时间就发送了,结果是其它主机的DISF时间还没等待完就收到了1号帧给他们的NAV值,然后再一号帧传送的这段时间他们又得只能沉默。这个时间轴上面部分表示SENDER通告给其它主机的NAV值的有效期,下面表示Reveiver通告给其它主机的NAV值有效期。


4 无线主机发送过程

综合上面的所有概念,下面贴个图来全盘分析下单个无线主机发送数据包的过程



1. 前面的busy段表示主机A监听到网络数据繁忙(这里主机A判断信号方面可能是NAV值没递减到0,也可能是物理载波监听那块检测到有数据传送,还可能是2者兼有)

2. OK,busy段结束后进入等待阶段,当然这里要发送数据而且不用RTS/CTS机制的话,那么等待时间应该是DIFS间隔的


3. 进入竞争发送阶段,所有主机在自己窗口中随机选一个时间来等待


4. 假设主机A随机到的等待时间最短,那么他就开始发送数据了,其它主机发现有数据传输了则会进入沉默状态,等待下一次数据传输完毕后进行竞争。


5 重传

刚才说到了分片,那么连带重传一起说了吧


先说说为什么要分片,什么时候分片的问题

在无线网络通信中,要知道传输时受到的干扰是多种多样的,也就是说无线网络在MAC层的稳定性是远远不如以太网般稳定的。所以在长数据帧传输的时候很容易中间被中断。为了提高稳定性,就把这个帧分片,然后再传输,显然短帧传输成功率要高于长帧。这样设计的目的是为了提高无线MAC层的可靠性。这个就跟你拿IE下一个1G的东西(一次性传长帧)和拿迅雷下同样一个1G的东西道理是一样的,显然拿迅雷下更稳定些,因为有断点续传。那么分片传输充其量就是把以前的普通IE下载升级优化成了断点续传罢了。


当数据包到指定的分片阀值的时候就对数据包进行分片,同一个帧被分片的部分也会带有一样的帧序号,也会有自己的分片编号,也会有个表示为表示这个帧是不是分片帧。这个跟IP分片设计原则是一样的,这个就不具体说了。


再者就是重传问题了,神马时候重传?

以上篇幅提到过,只有在收到ACK确认后主机才会认为自己发送帧是成功的。同样,RTS只有在收到CTS后才认为自己的RTS发送成功了。

所以这里涉及到一个问题就是发送失败如何处理?重传?对~是重传,但是一直发送失败呢?所以对于每个帧都有个重传计数器(注:竞争窗口大小就是根据这个重传计数器来决定的),失败一次就递增一,但失败到指定的上限的时候就放弃发送该帧然后向上层协议报告。

然而重传计数器有2个,分别是长帧重传计数器和短帧重传计数器。某帧当长度大于指定阀值的时候,该帧发送失败则长帧重传计数器递增1,反之亦然。这个阀值是可以设定的,重传上限也可以设定。这么设计是因为长帧会占用更多资源(内存空间,传输时间等)以便让管理员通过调整阀值和各个计数器的重传上限来优化无线网络。那么我们来YY一下(纯属YY……我比较没做过网络优化这方面的经验,只是假设下可能的场景~),比如说我希望用来传输300字节一下的帧的时间多一些,那么我就设定阀值为300,然后长帧重传计数器的上限设置低一些,短帧重传计数器上限设置高一些。


重传计数器要清零很简单,有几种情况

1 RTS帧发送出去若收到CTS帧则清零重传技术器(当然这个只可能发生在短帧计数器情况下,因为RTS数据帧一般情况下不属于长帧……当然你要把阀值设成RTS帧大小我也没话说~)

2 帧数据发送出去,收到ACK确认

3 收到广播或者多播帧(why?书里面这么写的,但没写为什么,这里的多播和广播帧是不是值通告NAV值的广播帧咧?如果是这样,那么就说得通了。待高手解释~)

OK,这一篇结束





posted on 2011-02-05 18:20 __ay 阅读(415) 评论(0)  编辑 收藏 引用 所属分类: Others


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理