在802.11主要的版本中,总共定义了四种节能模式,本文主要关注最初始的PSM模式,对于在802.11e中添加的ASPD以及802.11n中添加的PSMP,SMPS机制,我们在下一篇再进行论述。
PSM(Power Save Mode):802.11协议中初始的节能模式,其对基础架构模式和IBSS模式下的节能机制分别进行了定义,并且在DCF和PCF模式下,其具体的MAC层工作机制也有不同。
如同我们之前的描述,802.11的节能模式基本思想是:AP缓存下行数据,只有当节点休眠结束后主动向AP请求,AP才进行下行数据的反馈。这里实际上存在一个问题,即节点不知道AP上有没有自己的缓存数据。故实际思路应该是,AP周期性向对应的节点其广播缓存区情况,从而节点可以知道自己是否被数据缓存了。在休眠结束后,被缓存数据的节点就会进行数据请求,反之就继续休眠。这样可以有效避免节点进行一些无意义的数据请求(即AP上没有缓存数据,但是节点进行数据请求)。
所以本文我们首先要回答两个问题:1)AP如何广播自己的缓存区信息(即AID,TIM与Bitmap机制),2)AP什么时候广播对应节点的缓存区信息(即TSF,TBTT,Listen Interval field与CFP repetition interval)。在此之后,我们再对协议中具体的MAC层工作机制。
PS:本篇的概念又多又繁杂,且与前面描述的DCF和PCF基本工作模式关联较大。故本篇已尽量按照先需求后设计的思路进行描述,其他不足之处,还请见谅。同时在802.11的一些分支版本中也定义了一些特定的节能模式,比如802.11v的WNM-Sleep Mode,这些我们就不进行展开了。
在802.11协议中,设计了一种用较少字段就能够广播自己缓存区信息的机制,如下图,我们首先描述其大致的思想:
实际上是AP是采用一种Bitmap结构,用来通知节点自己的buffer信息的,若将其看做一个矩阵的话,那么该矩阵的每一行有8列,最下包含1行,最大包含251行,换言之该矩阵最大的存储空间为251个By。该矩阵中每一个位置代表了一个节点,比如红色方框位置就代表了STA0,蓝色方框位置就代表STA4,紫色方框位置就代表STA24。而矩阵中具体的某一个元素则代表了Buffer的情况,若该元素为1,那么代表其对应节点有数据缓存,若元素为0,那么就没有数据缓存。AP周期广播这样一个bitmap,节点就会查看自己对应的位置是1还是0,从而再决定是否要发送PS-poll请求数据。
那么具体该矩阵中的某一个位置,对应的就是节点的关联ID(AID)。
AID的分配:当一个节点(STA)向AP发起关联请求(Association Request)后,AP会反馈的关联相应帧(Association Response)。AID也是在这个过程中被分配,并告知节点(PS:在重关联过程中,该AID也会被分配,不过这里我们并不讨论)。如下图,是一个Association Response帧格式其中就包含了Association ID这个参数。
通常AP在分配AID参数时,应该是按照从1开始,一个个下发给节点的,同时这里虽然显示的是2 Byte,也就是16位,但是为了与我们后面提到的Duration/ID字段兼容,所以其最高的两位都是置1,作为保留字段,所以范围是1~2007。因为AID的分配不像DHCP协议那样,可以设置一个失效时间,即AP不会主动回收已经分配给某些节点的AID。所以导致新的节点加入AP时,被分配的AID有的时候会比较后,后面我们分析TIM字段中的bitmap设计对此就有所考量。下图是在抓包中,具体的AID的显示:
当AID分配之后,节点就可以利用bitmap来广播自己所缓存的buffer信息,在802.11协议中,由于该buffer也是周期性的进行反馈,所以被放置在beacon帧中,作为一个字段被携带,该字段就是TIM字段。
TIM(Traffic Indication Map):流量指示图,实际上是一个基于bitmap结构的流量指示图,用以标识AP的缓存信息。其具体结构如下:
在802.11协议中,Bitmap control和Partial Virtual Bitmap是放在一起使用的,其中Bitmap control字段还分成两个部分:
我们现在关注Bitmap Offset的使用方法,前面提到,Bitmap offset是用来描述首位AID的偏移的,若该字段都为0,代表偏移值为0,所以在Partial Virtual Bitmap中是以AID=0开始计数的。现在我们描述Bitmap Offset不为0的情况,首先我们给Bitmap control每一位标注x1~x7,这里标注顺序与一般二进制表示的顺序刚好相反。每一位代表特定的偏移量,这些偏移量计算都是以8做为奇数的,若仅仅x1为1,其余都为0,那么AID起始为2*8=16,若仅仅x4为1,其余都为0,那么AID的起始为16*8=128。以下我们再举一些例子:
若没有组播/广播数据,且AID=24的节点有数据,那么Bitmap Control字段为【0 1 0 0 0 0 0 0】,Partial Virtual Bitmap为【0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0】。实际上AID=24,也就等于3*8,如果是二进制的话,那么可以分解成(2^1+2^0)*8,也就是有两位置1即可,但是由于Bitmap Offset中最小的单元是2,而不是1(可以看到,2^0也就是x0这一位实际上是被组播/广播数据提示这一位占据了,所以用不了),所以与AID=24最接近的起始位置是AID=16,从而就确定了bitmap control字段,然后Partial Virtual Bitmap按序找到AID=24的位置,进行标注即可,最后要补全一个字节。
若存在组播/广播数据,且AID=100的节点有数据,那么Bitmap Control字段为【1 0 1 1 0 0 0 0】,Partial Virtual Bitmap为【0 0 0 0 1 0 0 0】,具体计算方法和上面一样。
PS:在802.11协议中,实际上给出了Bitmap的C语言实现的demo,在07版协议的Annex L中就有给出,用兴趣可以自行阅读。
前面我们描述的是AID在AP发送的TIM字段中的应用,在节点发往AP的请求中,实际上也是用的AID参数。在节点向AP请求数据,所发送的PS-Poll帧当中,就是将Duration/ID标识为AID,下图是一个PS-Poll的帧结构:
其中Duration/ID字段直接被标识成了AID字段,其具体内容如下:
从而节点向AP发送PS-Poll帧中,直接没有包含源地址,而是采用AID作为替代,当AP接收到PS-Poll后,根据其AID,在缓存空间搜索其对应的缓存内容,进而反馈给节点。
按照之前的描述,AP是周期性的发送beacon帧,在该beacon帧中的TIM字段包含了对应缓存区的信息。但是如果每一个帧中都包含所有节点的TIM信息会有两个缺点:
限制了节点的休眠时间,由于每一个beacon帧都包含了TIM信息,所以节点需要定时醒来接收对应的beacon,这一点也是比较耗费能量的,如果让节点多休眠一会,那么会更节能
增加了TIM的信息,如果beacon帧中,并没有包含所有节点的TIM信息,那么就可以按照我们前面所述的Bitmap control和Partial Virtual Bitmap进一步压缩空间,减少beacon传输时间的浪费
所以802.11协议设计中,节点是周期性的醒来,并且AP知道节点对应的苏醒周期。当节点醒来之后,AP才会在对应beacon的TIM字段中,为其指示缓存区信息。(在实际情况下,AP除了在对应的睡眠周期到达后要醒来,同时也会计算DTIM到达时醒来,因为后者是广播信息,前者是单播信息)。
那么为了做到前面所述的需求,AP和节点之间首先要做到时间同步,然后要规定一个周期,进而完成周期性获取TIM信息这样一个需求。
上图就是beacon帧中,timestamp相应的字段,在其之后,我们可以看到一个Beacon Interval字段,该参数实际上在路由器配置中可以看到,一般被描述为Beacon时槽,且大小为100ms,即0.1s(PS:通常情况下,网速都是按照10进制进行步进的,即1kbps=1000bps这样,k是kilo的意思。而在802.11协议中,这里规定了一个时间单位TU,Time Unit,TU是少有的按照二进制进行步进的单位,1TU=1024us,这里实际上是kilo-binary的计数方法。所以一般我们设置的是0.1s,但是在实际的Beacon帧中是0.1024s,这里有一个区别),该参数与TBTT时间是一致的。
Beacon帧是按照TBTT时间进行周期性发送的,但是节点也不会是严格每一个beacon都需要监听的,为了更有效的设计节能模式,节点应该是每间隔几个TBTT周期,再监听一次beacon帧,从而就可以延长自己的休眠时间。
Listen Interval是节点通过Association Request帧发送给AP的,从而AP就知道节点的苏醒时间,在对应节点苏醒的时候,其才会在Beacon帧中,为其指示Buffer的状态。该字段一共16位,其单位是Beacon的周期间隔,也就是TBTT时间,若Listen Interval设置成2,那么代表节点每经过两个beacon周期,才苏醒一次。在抓包中,如下图所示:
在802.11时间周期这一块实际上规定的是比较繁杂的,由于我们讨论的是协议中完整的节能模式,该节能模式实际上也分DCF和PCF下不同的工作模式,所以我们还需要明白CFP repetition interval,即CFP周期和上面TBTT时间的一个关系。
最后用一张图,我们标识一下这几个调度周期之间的关系:
TBTT周期是beacon之间的周期(如图上蓝色部分),每间隔TBTT,AP就会发送一个beacon,该beacon中有可能包含TIM信息(图中红色部分),也可能包含DTIM信息(图中紫色部分),其间隔是由DTIM Period参数进行设置的。同时我们还可以关注到,beacon的发送有可能在CFP时间内,也有可能在CP时间内,其实际上就仅仅按照TBTT间隔发送即可,若在CFP时间内,beacon发送的间隔是很准确的等于TBTT,而在CP时间内,因为DCF的竞争接入机制,所以beacon的间隔会出现一些小偏差,基本是约等于TBTT时间。
CFP repetition interval是较为注意的一个间隔(图中绿色部分),CFP时间间隔是要等于TBTT时间的倍数的。实际上我们知道,CFP的NAV时间设置是通过beacon帧的NAV或者CF Parameter Set机制来完成的(具体可以查看我们之前PCF的叙述),所以CFP的起始一定会有一个beacon帧,而结束不一定。同时在CFP或者CP中,都有可能出现多个beacon帧。如上图中,第一个CFP的开始一定是一个beacon帧,而结束则不是与beacon同时的。那么CFP时间结束后,到CFP周期结束前,其剩余的就是就是CP的时间。且在这张图中,我们可以看到在第一个CFP周期内,就存在2个beacon帧。
在初始的802.11 PSM模式中,DCF和PCF模式下,还有不同的工作机制。以下我们首先叙述节点如何进入PSM模式,然后叙述DCF的工作形式,最后我们叙述PCF。(PS:至于该两个时间周期的调度关系,我们已经在前面提到过了,这里就不加以展开了。)
1、如何进入PSM模式
节点如果要工作在PSM模式下,首先要告知AP,自己将要工作在节能模式。在802.11帧中,这个信息是包含了MAC层头部中的Frame Control Field中的,也就是说,任意一个帧都可以用来进行工作模式的切换,节点可以在关联上AP的时候,就切换到PSM模式,也可以在工作状态中,切换到PSM模式。在Frame Control Field字段中,我们有两个内容需要注意,如下图:
这个两个内容即Pwr Mgt(Power Management)以及More Data。
Pwr Mgt(Power Management): 该字段用来标识在该帧过后,节点是否会进入省电模式(PSM mode)。若为1,那么就进入PSM mode,反之就保持当前工作状态。由于在基础架构模式下,AP本身有电源供给,且AP负责整个网络的核心管理,所以AP发出的下行帧中,该字段默认设置为0。
More Data:该字段是AP指示节点,是否还有该节点的缓存数据没有发送。若为1,代表AP还有对应节点的数据缓存,反之则没有。由于我们前面提到过,在PSM mode中,请求数据实际上是一种“兵乓”机制,一个请求只会有一个反馈。所以AP在反馈下行帧的时候,会不断指示节点是否还存在缓存,如果有缓存的话,那么节点会继续请求数据。只有当AP中所有对应该节点的缓存都被清空以后,那么节点才会重新进入休眠状态。
2、DCF下的PSM模式
DCF是基于竞争的工作模式,所有的节点需要接入信道需要进行竞争,包含AP以及工作在节能模式下的节点。
因为节能模式有关的参数较多,用一个图例来说明比较困难,所以我们尽量尝试说清楚,不足的地方还请见谅。
那么上图描述了1个AP,2个节能节点工作的时序图,黑色的轴所代表的是数据包发送和接收的时序,紫色的线上代表节点苏醒的情况。图中STA1的Listen Interval等于2,STA2的Listen Interval=1(为了图意简便,就没有标识在图上了)。
以上,我们描述了一个PSM-DCF的基本工作模式,这里我们还需要额外注意的一点是DTIM时间,由于绘图情况较为复杂,所以我们只能够描述一下情况。在PSM模式下,节点苏醒的条件有两个,达到其中一个其就会苏醒。
节点根据Listen interval进行苏醒,即每隔Listen interval时间,节点会苏醒一次,直到接收完AP中自己的缓存,才会转为睡眠模式。
DTIM周期,由于我们知道DTIM实际上是用来下发AP上缓存的组播/广播帧的,所以所有的节点都需要在这个时刻苏醒,并且接收这个帧。所以只要该beacon携带的是DTIM,所有的节点也会苏醒(即使不在Listen interval规定的苏醒时刻)。在节点都苏醒后,AP会首先传输其缓存的组播和广播帧,节点接收完该组播或广播帧后,同时自己又不在TIM缓存中(笔者理解,由于AP知道节点的Listen interval,所以不会每一个beacon中都会携带其的TIM信息),那么该节点就会进入sleep,直到自己规定的时刻再次苏醒。
同时这里我们并没有对上行数据做具体说明,当节点本地有数据需要发送给AP时,其经过backoff后,会主动进行数据发送。至于节点会首先发送PS-Poll还是发送本地数据,笔者并没有考究。
3、PCF下的PSM模式
PCF是基于调度的接入方式,节点的接入顺序是通过AP的轮询完成的。
实际上由于PCF的调度机制,所以一般更加设置节能方案,在上图中,我们假设STA1的Listen Interval=1,STA2的Listen Interval=1,并且我们假设DTIM period为4,并且第一个beacon,即1st beacon中携带的就是DTIM。