80211省电知识
转:https://blog.csdn.net/zwl1584671413/article/details/119034391
转:https://www.intel.cn/content/www/cn/zh/support/articles/000005615/wireless.html
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
英特尔已经确定了与某些接入点相关的很多 (互操作性) 问题, 从而降低了 Rx 数据吞吐量。在行使 uAPSD 时, 接入点停止在下行链路上进行聚合, 从而降低 Rx 数据吞吐量:
- 11n 20 MHz 通道, 约 30 mbps, 而不是高达 100 mbps。
-
11n 40 MHz 通道, 约 60 mbps, 而不是高达 200 mbps。
当禁用 uAPSD 功能时, 不会实现电源节省。
========================================================================================================
背景介绍
了解WIFI节能的机制之前,首先要了解WIFI能耗的消耗发生在什么状态下,显而易见,发送和接收肯定是消耗能量的,还有一点是要认识到的,Power Save通常是在STA端进行的,AP需要一直广播并且很多AP都是固定位置并接电源的,移动性小,所以AP的power save基本上是要求支持STA的power save,不至于STA进入省电跟AP不兼容,我当前的认识里只有2个AP是可以省电的,一个就是TPC,可以对AP进行发射功率配置;另一个是SMPS,协商选择关闭某些天线的收发来达到节能效果。回过来接着讲耗能的状态,其实一般的WIFI设备还有两个状态:sleep状态(别以为sleep status下不耗能)和接收空闲状态。下面是四个状态:
· Sleep :节点进入休眠状态,关闭接收和发送,能耗最低;
· Rx idle:接收空闲状态,其实这个是CCA检测状态,并未进行数据的接收;
· RX:接收状态,STA检测到要发送给自己的数据,对数据进行接收;
· TX:发送状态,就是发送数据。
这四种状态是可以相互转换的,譬如数sleep状态转换成RX idle,然后RX idle可以转换到RX或者TX状态。数据通信的部分都是发生在TX和RX状态下,但是为了不产生传输冲突,WIFI大部分状态是处于Rx idle下的,而且这个状态下接近于RX状态,良好的使用power save机制是可以很大限度的进行节能的。
沿着这个思路其实就是要尽量降低RX idle的时间和增加Sleep的时间,从而引出了AP的缓存技术和STA的PS机制,这里只讲PS机制。
Power save机制
省电模式的前提机制
省电模式的前提机制,AP的beacon中携带TIM(Traffic indication Map)字段,里面包含DTIM Count,DTIM Period,Bitmap Control和Part Virt Bmap字段,下文会有详细介绍,先看DTIM period,这个通常在AP的配置上可以设置,不同厂商这个DTIM周期值会不同,有配置2也有配置3的,这个值如果较大,那么对AP的缓存能力有较高要求,设置较小sta 需要频繁从sleep中唤醒,PS效果不佳,这个值的意义就在于处于PS状态下的STA会在多少个beacon帧后醒来,就是sta的唤醒周期;而DITM Count就是对period的计数,表明当前beacon是period的第几个。这种状态是sta和AP关联上之后的场景,另一个是STA并未关联上AP,此时的STA状态是不定时地去进行信道扫描,每隔一些时间扫描一次,扫描后进行sleep,周期性的从sleep中醒来再扫描一次,这是未关联时的省电方式。
传统省掉模式(Legacy Power Save)
有了上面的了解,下面说一下传统省电模式的原理,也是我们所说的乒乓模式。假设某个时间STA进入sleep,它通过发送数据帧或null-date帧来告诉AP我进入省电了,这个帧的节能位会被置1,如下图:
AP收到这个帧后就不发数据帧给处于省电模式下的STA了。然后DITM period后STA wake up,并收到AP的beacon,在beacon 中DTIM 信息元素中根据AID 来告诉sta,在你sleep的时候有发给你的数据,我替你存下了,你现在醒了,快来取吧。这个时候STA发送PS-Poll帧给AP,告诉AP我来取数据了,AP收到PS-Poll后就将对应sta的缓存数据发给STA,,如果有多个数据帧的话那就在数据帧的more data位上置1,表示后续还有缓存数据,STA继续发送PS-Poll给AP,AP再传数据帧,一来一回,一来一回,直到data帧的more date位为0,AP会给STA发一个Null-data。LPS的流程示意图:
PS-Poll帧的结构可以参考如下信息:
可以明显看到PS-poll并没有Duration/ID信息,看地址信息也只有BSSID和Transmitter,没有包含Source AD,这里多了一个AID来告诉AP,我是来取这个AID的缓存数据的。Null-data还是很正常的。
传统省电模式的不足
PS-Poll省电机制定义在802.11的协议中,这个机制存在两个不足:一是效率低,二是时延大。
1. 效率低主要是STA要获到缓存于AP中的数据,必须通过发送PS-Poll帧,完成一次完整的交互过程(PS-Poll,ACK)。每次帧交互都需要进行退避机制及信道接入,造成额外开销增多,效率比较低。
2. 时延比较大,是因为STA每次根据DTIM间隔定时醒来接收AP的广播帧,如果AP为STA缓存数据帧,则STA发送PS-Poll,否则STA继续进入睡眠状态。因为DTIM一般Beacon间距的整数倍,Beacon间距时间一般为100ms,所以STA与AP进行数据交互的时延比较大,对一般时间敏感的业务数据(如语音或视频数据)并不能很好的支持。如果STA使用传统省电机制,如果需要进行语音数据传输,一般有两种做法,一是让STA保持ACTIVE状态,二是降低DTIM间距。
快速省电模式(Fast Power Save)
快速省电模式是在L PS的基础上来的,被称为PS-NULL-Poll机制。这个PS-null-Poll的机制是当STA wake up后,解析到beacon中有自己的缓存帧,则会发送一个null data帧给AP,并将PS位置为0,表示不节能了,需要获取所以缓存的数据,AP收到这个null-data后,从缓存队列中依次取出一个缓存data帧发送给STA,直到所有的缓存数据帧发送完,当然最后一个data帧的more data位会被置0。STA收到所有缓存帧后,直接发一个null data帧 给AP,并将PS位置1,表示自己再次进入PS状态。
快速PS和LPS的区别显而易见,LPS是一个PS-poll获取一个缓存帧,一次一帧,而且ps-poll ack都不能少,而Fast PS是一次null-data表示sleep or wake状态。并获取所以缓存帧,就好比搬运货物,LPS是徒手,一次一个箱子,来回跑,而Fast PS是用传送带,建立连接后,箱子一个一个的往传送带上搬运。
快速省电模式的不足
提升了LPS的效率,但是对敏感优先级的data不友好,时延问题并未解决。
APSD(Automatic Power Save Delivery)
APSD是基于802.11e新增的PS机制,这里面包含了带有QOS属性的PS机制,其实APSD是有些类似FAST PS的,也是一次触发,多次传输。APSD有两种模式:S-APSD(基于调度的自动省电模式)和U-APSD(非排程自动省电模式)。
S-APSD(Scheduler - Automatic Power Save Delivery)
S-APSD更像一个PCF下的PS模式,大家都知道PCF是AP来轮询下面的STA是否有数据要收发,若有数据上下行,只有AP轮询到某一个STA的时候,这个STA才会进行接入信道进行数据的收发,这种模式很少见,在常用的wifi收发中用到的基本上都是U-APSD,而S-APSD实际也没啥包可抓,下图是S-APSD的一个简单的工作模式。
在S-APSD中,SP(Service Period)是预先AP调度的,在调度时间将要到来之时,QOS-AP会发送一个triger frame,同时QOS-STA也会提前醒来接受该帧,从而开启一个服务时间。该服务时间是通过管理帧中的Schedule Element字段进行调度的,所以QOS-STA可以提前知道什么时候应该醒来。在上图中,QOS-AP发送的triger就是PS-Poll,然后就开始和QOS-STA交换数据,即STA向AP反馈数据之后,AP再向STA反馈数据,这样交替切换,直到SP时间结束。
在这里,QOS-AP和QOS-STA交换数据还是上下行按序切换的。
U-APSD(Unscheduled Automatic Power Save Delivery)
U-APSD这个才像是DCF下的qos-PS模式。比较常见的一种WMM –PS模式,包很容易抓到。AP 支持省电在WMM IE 信息元素其中的一个bit位会表明是否支持WMM 省电 (即U-APSD support)。STA 支持省电在关联请求中查看WMM IE 的Qos info字段4个AC 是否支持UAPSD(即比特位为1),抓包见下图:
U-APSD 是对传统省电的改进,在客户端关联的时候双方确定了哪些AC(BE/BK/VI/VO---qos的属性
)具有发送属性,哪些AC 有触发属性,以及触发后最多允许的发送报文数量--MAX-SP;客户端在休眠的时候,发往客户端的具有发送属性的AC将缓存在发送缓存队列,客户端需要发送具有触发属性的AC 去获取缓存帧。AP收到触发报文后,按照接入时候确定的发送报文数量,发送属于发送队列的帧。没有发送属性的 AC 仍然使用802.11传统的方式来传送。
在UAPSD省电下的STA 只有两种状态 DOVE和AWAKE;AP只能在STA 在AWAKE下才能给STA发数据,AP在STA DOVE的情况下给STA 缓存数据;换个角度想STA 可以在任何的情况下向AP 发送数据,因为AP永远是awake;
UAPSD的主要设计思想在于称作U-SP(unscheduled service period)。
STA 发送触发帧(空帧或数据帧)给AP ,AP向STA回复ACK后,U-SP被启动,AP通过EDCA的方式开始向STA发送缓存数据,U-SP的长度有MAX-SP(service period)决定;MAX-SP在WMM IE 的Qos info 中被定义,用于定义发往客户端的报文数量(在关联时候就被定义)。
MAX-SP在关联和重关联的时候被定义,在U-SP期间,AP必须向STA发送至少一个数据帧,如果AP没有缓存帧,则发送一个空帧,但是不能超过最大帧数;在U-SP期间,AP收到的STA的帧数据不叫做触发帧。U-SP结束后,AP通过在Qos 控制字段里的EOSP(Eed of service period)字段置为1来结束一次U-SP(EOSP在发送的缓存帧中查看是否最后一个置为1)。STA收到这个帧后,STA 就可以进入DOVE,AP 继续为STA缓存数据直到下一个U-SP传输开始;AP通过协调帧控制字段中的More Data字段来通知STA有更多的缓存帧,如果EOSP=1,more data=1 ,在立即发起一次新的U-SP传输,如果AP 没有数据发送给STA ,则发送一个空帧给STA;
展示一个QOS-null-data的帧:
APSD省电主要应用在具备优先级的数据中,没有优先级的data还是按照传统的省电模式进行。
UAPSD省电的优缺点
UAPSD克服了PS-Poll省电机制的缺点,提升了效率,同时时延相对较小。如果STA每20ms向AP发送数据,则AP也可以每20ms向STA发送数据,因此数据时延大致为20ms, 相对PS-Poll时延为n*100ms小。UAPSD也有缺点,因为STA通过向AP发送触发帧来发起一次U-SP传输,当STA发送触发帧后,STA进入AWAKE状态,并且等待AP向STA发送数据帧或空帧,直到AP发送的帧数据中EOSP字段被置1,STA才能重新进入省电模式DOVE。 注释(必须等待AP 发的帧数据EOSP 字段被职位1 才能进去省电)。上图的EOSP位就是置1的。
PSMP(Power-Save Multi-Poll)
备注:来源于网上。
实际上从802.11e中引入TXOP,Block ACK,802.11n中引入的RIFS,帧聚合,802.11ac中引入MU-MIMO,这些技术都会导致AP的突发(burst)下行传输的效率相比上行接入效率要高。
所以从节能模式的角度而言,在APSD中,先分节点,再分上下行的传输模式,就没有先分上下行,再分节点的传输效率高,那么后者就是PSMP设计的基本想法。
PSMP(Power-Save Multi-Poll):在802.11n中新增的模式,可以理解是引入了更严格的调度机制,其首先利用一个PSMP帧来调度整个节能模式的传输周期,将其分成PSMP下行传输时段,PSMP-DTT(PSMP Downlink Transmission Time)和PSMP上行传输时段,PSMP-UTT(PSMP Uplink Transmission Time)。在PSMP-DTT过程中,AP进行突发传输,其中帧间间隔可能会更小,比如RIFS。RIFS的时间会比SIFS会更小,SIFS时间是包含了一个发送状态到接受状态的切换时间,而RIFS仅仅是两次发送状态之间的切换时间。在该过程中,节点可以不采用CCA,直接在被调度的具体时间内醒来,并接受数据,从而可以获得更多的休眠时间,从而节能。在PSMP-UTT时间内,节点仅仅会在被调度的周期内醒来,并反馈上行数据帧,从而也减少了较多的监听过程,节约了能量。在PSMP中,若AP的下行传输中存在广播/组播包,那么会在PSMP-DTT时间内,第一个数据帧进行发送,这点实际上和之前的PSM模式传输组播或者广播帧是一样的。
如下图表述了一个PSMP的时序调度:
那么AP首先发送一个PSMP帧,该帧中包含了后续时间内,下行链路和上行链路具体的调度安排。然后开始进入PSMP-DTT时间,第一个是发送本地缓存的组播/广播帧(即PSMP-DTT1时刻内),然后按序发送节点所对应的缓存单播帧,这里PSMP-DTT时间内,帧间间隔可以采用RIFS,以达到更高的效率。对于ACK的部分,由于笔者没有做详细考证,所以没有加以描述。当PSMP-DTT时间结束后,节点会依次在自己对应的上行调度周期内,发送数据帧,如STA1就在PSMP-UTT1中发送上行数据。当PSMP-UTT时间结束后,这一轮PSMP的数据交换就完成了。
通过上述过程,也可以看出PSMP基本上也是一种基于调度的PS机制,使用到新的IFS,目前我也没有见过类似的基于RIFS的PS商用产品。优缺点个人感觉是对AP的调度要求高,对于传动的基于DCF竞争机制的AP会有一定的难容性。当然技术上实现也会难一些。
SMPS(Spatial Multiplexing Power Save)
SMPS是空间复用省电机制,也是11n引入的基于多天线引入的省电机制。基于的原理很简单,当业务量很少,负载不大时,选择关闭其中部分天线的收发功能来达到省电的目的。实际上STA不好贸然关闭自己的天线,因为AP端有可能单流也可能多流,发送流大于接收流的话,会造成无法正确接收。所以STA在SMPS的机制中需要跟AP有沟通,协商并配合完成通道关闭和激活。
在SMPS中有设置中有三种,3关闭SMPS,0静态SMPS,1动态SMPS,出自802.11n-2009—page68—table 7-43j。
SMPS的能力信息位表示在HT Capability info 的SM Power Save字段上或者通过SMPS Action帧交互SMPS能力信息。如图:
备注:我抓到很多SMPS位是11,但是他表示的却是:Spatial Multiplexing enable,我表示很无奈啊。
静态SMPS的流程很简单,STA需要1根天线来进行收发时,STA发送一个ACTION帧告诉AP你要切换到单流进行发送帧,若要恢复到多流则发送一个SMPS 静态disable的ACTION帧给AP,来结束单条流的下行。下图是静态SMPS的流程图:
动态SMPS听名字就可以理解它的作用,就是根据情况在单流和多流之间切换进行下行操作。交互帧是跟静态有区别的,看下图:
其中当STA发送一个动态模式的action frame后,需要通过接收一个单流的RTS使能多接收通道;当接收到目的地地址是自己的MAC地址的时,接收者切换到对应的多个接收通道,并且在接收结束时,关闭多流模式切换回原有的模式。而在静态模式中,这个切换需要一个显示的action frame,这里需要注意一点,SMPS不能区分多流传输之前的RTS/CTS和其他RTS/CTS,所以STA收到RTS后,给CTS后就会切入到多流收发状态下。
问题:为什么要发单流的RTS 才能使能多接收通道,如何让STA知道要接收MIMO 数据?
这个用一个单播帧就可以,协议建议用RTS,当然单播数据帧也可以,看厂商实现方式了。收到发送给自己的RTS,就认为有双流数据发送给自己,就需要切换到多通道;SMPS默认只开一条天线,如果收到RTS就把所有天线都打开。
综上:
· 静态的SMPS模式下,STA仅维护一个接收通道空闲,AP不会发送MIMO数据给处于Static SMPS模式的STA。HT STA可以使用SMPS Action帧交互SMPS状态;一个非AP的HT STA 可以利用HT Capability info域中的SM Power save 字段达到相同的目的。后者,使能STA关联后立刻用单通道接收。
· SMPS使得STA在一段时间内只激活一条接收通道,若STA处于动态的SMPS,也只有当AP 发送多流数据时才会根据AP发送的RTS切换为多接收通道,从而达到节能目的;
· SMPS Frame是一种HT 管理帧,用来指示SMPS的状态改变。AP和STA可以通过该帧来交互SMPS状态;
· SMPS帧控制字段信息其中:
Category字段为7,即HT类型。
HT Action字段为1,即SMPS。
TXOP-PS(Transmit Opportunity-Power Save)
TXOP的含义,当STA需要传输MSDU时,并不会在获得接入机会的同时接入信道,而是等待一段时间后再进行发送,一个STA从其获取接入信道的机会到其开始传输的时间叫做一个TXOP。
TXOP-PS是802.11AC协议新加的一种STA测的节能机制。其思想是“尽可能的早地识别出当前接收帧是否发给自己”,如果不是,则STA可以在该帧所处的当前TXOP剩下的时间内进入TXOP节能模式,待下一个TXOP才重新醒来,通过这种方式,可以实现TXOP内的少量节能。
TXOP-PS需要AP和STA同时都支持才可以实现,并且只有VHT AP和STA才有可能支持。
在VHT Cap info域中,B21代表TXOP-PS的能力,而AP 通过 beacon 、probe response、association response帧宣告自己具有TXOP-PS能力,而STA通过probe request、association request宣称自己具有TXOP-PS 能力。
VHT 能力域中对 VHT PS 字段的定义及解析:
我以为没法抓到支持VHT-TXOP的AP,但实际上我竟然看到一个支持的AP,挺强:
问题1:在TXOP-PS中STA怎么做到识别该帧不是发给自己的,然后在剩下时间段的TXOP内进入省电?
11AC并没有引入BSS颜色(11AX才引入),而这里的其实是根据PPDU的SGI字段的信息来进行判断,先看一下11AC VHT的 物理帧格式:
其中前面的是传统的preamble信息,后面有VHT的preamble这里面还有两个信息:VHT-SGI-A和VHT-SGI-B。跟LP的定义一样,VHT preamble的信息也记录了调制方式、速率、时间同步等信息。这里面VHT-SGI-A是用来区分VHT PPDU和HT PPDU,非HT PPDU,SGI-B是用来区分不同带宽的。其同样是采用BPSK调制,以1/2速率的二进制卷积码进行传输的。下面看下SGI的结构。
这里面就包含了AID和TXOP-PS如果STA 的PHY接收到1个PPDU,解析SGI中的Partial AID跟自己的AID不一致,站点将停止后续的接收,进入TXOP-PS状态。
问题2:在TXOP-PS 阶段内,硬件会先判别终端发来的帧是否是我们的帧,如果我不是我们的帧,硬件会把包丢弃, 没有交到上层。上层是处于什么状态呢?
首先要明确TXOP-PS所处于的状态是active状态下的,上层其实是醒来的状态,这个醒可以认为就是省电状态下的醒,而TXOP-PS只是觉得,虽然我是醒的状态,但是包不是给我的,我都懒得再继续解析了;一般的醒来是还要解析到MAC头,看目的地址是不是发给我的,不是我的就丢掉,而这个是提前了。
协议上的一些信息贴在这,供学者参考。
上面来自于P802.11ac_D2.0的10.2章节。
总结&遗留问题
到这里Power save算是基本说完了,但是可能有同学有疑问,一个AP下那么多STAs,sta是通过什么机制确定AP有自己的缓存帧呢,如果STA关联上AP后一致没业务,占着茅坑不拉X怎么办,AP怎么不踢掉这样的STA呢,所以下面的内容做一下补充。
TIM域信息讲解:
AID的取值范围:0-2007
AID的分配:关联时在关联响应包中存在AID信息
AID确定后在后面sleep时可以通过AP的beacon中的TIM信息确认AP为哪个STA缓存数据。
· Element ID:元素识别码,用来标识beacon帧中所包含的不同字段。
· Length:长度,描述的是该Element的长度,实际上Element ID和Length是一般管理帧中information element必备的元素。
DTIM Count,DTIM Period:DTIM计数以及间隔的时间。在802.11协议中,我们可以看到三个概念,TIM,DTIM,ATIM。TIM是一种基本的流量指示图的结构,标准的TIM中仅仅指示AP缓存的单播信息,DTIM(Delivery Traffic Indication Map)是一种特殊的TIM,其除了缓存的单播信息,也同时指示AP缓存的组播信息。
Bitmap Control,Partial Virtual Bitmap:该字段就是Bitmap的具体字段,实际上与我们一开始描述的bitmap结构还存在一些区别。以下我们重点描述下协议中具体使用的bitmap结构。
AP是采用一种Bitmap结构,用来通知节点自己的buffer信息的,若将其看做一个矩阵的话,那么该矩阵的每一行有8列,最下包含1行,最大包含251行,换言之该矩阵最大的存储空间为251行,251*8-1=2007(除去多播标识)。
而Bitmap Control的信息代表了起AID的偏移量,假设AID=88,然后找出88号在Bitmap的哪一行,先看下Bitmap Control的位信息代表的意思:
第一位如果置1则代表缓存有多播帧,这里先讨论单播缓存的场景,第一位置0,若第二位置1,则缓存数据属于Bitmap矩阵图的第二行,若要计算此STA的AID值,首先起始值从2*8=16开始算起,然后如何确认具体AID,这个具体AID=起始AID之和+偏移量。而我们所说的偏移量就需要通过Part Virt Bmap的信息来确定。
就拿上面所说的AID=88,起始AID很容易推算出是X3位,因为X3位代表起始AID=8*8=64,而X4位是16*8=128,大于88,所有BitMap control的X3位置1,88=64+24,24介于2*8—4*8之间,所有X1位也置1,综上Bitmap control的信息位为:0 1 0 1 0 0 0 0。然后在计算具体的偏移量。
88=64+16+a,很显然可以计算a=8,所有偏移量Part Virt Bmap的值应该0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0,转化为16进制就是80.
从TIM域信息也可以反推AID的值,实际情况可以抓包验证下。
Keep-alive 机制
Keepalive机制其实就是一种保活机制,在长时间没有业务的情况下维持自己的连接状态,这个比较简单,流程一般如下:
· 使能保活机制:
1. STA关联上AP;
2. 长时间没业务,STA每隔30s (时间可以自定义)会给AP发一个QOS-null-data/Null-data数据,根据省电的模式来的,告知AP我还没走;
3. AP会回一个ACK表示我知道了;
· Disable保活机制:
1. STA关联上AP;
2. 长时间没业务,STA给AP发送任何信息,而AP会每隔5分钟会给这个sta发送一个null-data,如果AP收到ack回复,则继续上述操作,表示sta还在,如果AP没收到ACK回复,AP会发三次,也就是15分钟三个Null-data.;
3. AP三个Null-data都没有收到ACK,AP就确认这个sta掉线了,会发单播去关联给这个STA,解除关联状态;
尽管他不是省电的内容,其实在了解省电的时候可能会有这种疑问,所以就把保活放在后面,以供参考。