目录
Bitmap Control和Partial Virtual Bitmap字段示例
背景
无线设备,特别是移动设备如笔记本电脑、智能手机和平板电脑等,通常都是由电池供电的。在无线通信过程中,设备的无线接口是电源消耗的主要部分。通过节电模式,设备可以在不需要传输或接收数据时关闭其无线接口,从而显著延长电池寿命,提升用户体验。
因此IEEE802.11制定了一系列措施来降低电量消耗。
如何节电
正所谓“知己知彼百战不殆”,想要有效节电又不影响WiFi的正常使用,那就要研究WiFi都在什么情况下在消耗电量。
WiFi主要处在下面是四个状态:
-
Sleep :STA进入休眠状态,关闭接收和发送,能耗最低;
-
Rx idle:接收空闲状态,其实这个是CCA检测状态,并未进行数据的接收;
-
RX:接收状态,STA检测到要发送给自己的数据,对数据进行接收;
-
TX:发送状态,就是发送数据。
Sleep状态本身就已经在节电了,而RX和TX都是在做有用功,无线设备正在繁忙工作且有实际产出,只有Rx idle虽然在工作消耗电量但是却没有实际产出,因此这部分功耗是要节省出来。节电的主导思想就是尽可能降低Rx idle状态的时间而增加Sleep状态的时间。
当然有时候STA距离AP比较近,TX不需要那么大功率,此时可以动态降低TX功率从而降低电量消耗。另外像WiFi6开始引入的OFDMA机制也可以通过降低带宽来降低TX的功率,从而也达到节电的目的。这都是另外一个维度了,这里暂时先不讨论。
传统节电(Legacy Power Save)
进入节电状态
无线设备在不需要传输或接收数据时,可以进入节电模式,此时设备会通过发送一个带有Power Management位设置为1的帧(例如:Null帧或Data帧)来通知AP。这个Power Management位在802.11帧的控制字段(Frame Control Field)中。Power Management位如下图所示:
无线空口抓包如下所示:
需要注意的是,STA要更改电源管理模式,必须基于一次成功的帧交换,目的是让AP明确知道STA改变了电源管理模式。因此STA可以发送数据帧,也可以是管理帧。比如一个PS-Poll帧可能得不到ACK回复,所以不能够使用该帧来通知AP改变节能状态。
AP行为
当AP接收到这个帧后,AP就知道无线设备已经进入节电模式,那么此时就会会开始缓存所有发送给这个设备的数据。
STA进入节电模式之后就进入了休眠状态,而所有发向该STA的数据帧都缓存在了AP的内存中,那么STA是如何知道AP有数据要发给自己呢?
TIM
TIM是在AP的Beacon帧中包含的一个字段,用于告诉在节能模式下的STA是否有缓存的数据帧等待传输。如果TIM字段指示有数据帧,那么STA将会唤醒并与AP进行通信以接收这些数据帧。
TIM在Beacon中,那么STA也要打开接收机监听Beacon,何时会打开接收机监听Beacon呢?
Listen Interval
Listen Interval是由STA设置的,用于告诉AP多久唤醒一次来监听Beacon。这个值通常在设备与AP建立关联时进行设置。例如,如果设备设置了一个Listen Interval为10,那么设备将每10个Beacon周期唤醒一次来检查是否有缓存的数据帧。Listen Interval的设置可以帮助设备进一步节省电源。
如下图所示,STA在AssocReq中设置的Listen Interval为1,代表每个Beacon周期都会醒过来监听是否缓存有发送给自己的数据。
AP回复给STA的AssocRep中有一个Association ID(AID),这个就是AP分配给每个STA的ID,后续AP如果有缓存了该STA的数据,那么就在在TIM字段中指示该AID有数据缓存。
如下图所示,此时AP已经缓存了该STA的数据,在Beacon的TIM字段中进行了指示。
具体TIM字段是如何告知该STA,这个字段的规则是什么?
详解TIM字段
帧结构
Element ID
该字段的值为5
Length
长度
DTIM Count
DTIM周期内的计数器,用于提醒客户端下一个DTIM的到来。如果DTIM为0表示该TIM就是DTIM。
DTIM Period
DTIM周期,定义了DTIM Beacon的频率,通常大于普通Beacon的周期。
DTIM是AP在Beacon中发送的一个特别的TIM,用于告诉STA有组播数据帧等待传输。DTIM周期是由AP设置的,例如,如果DTIM周期设置为3,那么每3个Beacon,AP就会发送一个包含DTIM的Beacon。如果DTIM周期设置为1,那么每个Beacon都会发送DTIM。
在接收到包含DTIM的Beacon后,所有的设备,无论是否在节能模式下,都必须唤醒以接收组播数据帧。
Bitmap Control
Traffic Indicator:当DTIM为0且当前AP已经缓存了组播数据时,该bit位要置1,否则为0。该Bit也对应着AID=0。
Bitmap Offset:该字段指示了数据帧位图在TIM中的偏移量。具体来说,它指示了位图相对于TIM的开始位置的偏移量,以字节为单位。Bitmap Offset一共7位,代表的偏移量就是:
例如Bitmap Offset为1,代表偏移了两个字节。
Partial Virtual Bitmap
这个位图表明了哪些STA有待发送的数据帧,也就是在AP处缓存的数据帧。
在Partial Virtual Bitmap中,每个STA由一个位表示,如果该位为1,表示AP有缓存的数据帧待发送给这个STA;如果该位为0,表示没有数据帧需要发送。因此,STA可以通过检查这个位图,来确定是否需要从AP接收数据。
注意,这个位图被称为"Partial",是因为它可能并不包含所有STA的信息,而仅包含一部分。具体包含哪些STA的信息,取决于Bitmap Offset的值。这样可以精简TIM字段的长度,减少Beacon的发送时长,提升Beacon的发送成功率。
Bitmap Control和Partial Virtual Bitmap字段示例
802.11-2020中给出了一些TIM字段的示例,下面一起来看一下。
示例1:
该示例中Bitmap Control为0x00,B0位为0表示没有组播数据待发送数据,Btimap Offset为0表示没有偏移,那么Partial Virtual Bitmap就从第一个字节出开始,AID=1的STA就位于Partial Virtual Bitmap的B1位置。
Partial Virtual Bitmap的B0表示AID=0,以此类推,示例中B2位和B7位为1,表示AID=2以及AID=7的STA有缓存数据待发送,这两个STA可以醒过来接收数据。
示例2:
该示例中Bitmap Control中B0位为1,表示本次缓存了组播数据待发送。Btimap Offset为0表示没有偏移,那么Partial Virtual Bitmap就从第一个字节出开始,AID=1的STA就位于Partial Virtual Bitmap的B1位置。
Partial Virtual Bitmap的B0=1对应着Bitmap Control的B0=1,表示有组播数据待发送,后面紧接着B2/B7/B22/B24位都为1,表示AID为2/7/22/24的四个STA又缓存数据待发送,这四个STA可以醒过来接收数据。
示例3:
该示例中Bitmap Control中B0位为1,表示本次缓存了组播数据待发送。Btimap Offset为1表示偏移量为2个字节(2 x BitmapOffset),那么Partial Virtual Bitmap就要从第二个字节开始,AID=1~AID=7就没有直接在TIM字段体现出来,实际上也间接说明了这7个STA没有缓存数据待发送。从上可以看出AID=24这个STA有缓存的数据待发送,这个STA可以醒过来接收数据
代码:
802.11-2020 Annex L.3还给出了TIM字段的C代码示例,有兴趣可以去研究一下。
抓包示例:
该STA就是前文贴图AID=2的设备,从抓包可以看出此时该设备没有数据发送,准备进入休眠状态,发送了一个帧控制中Power Management位为1的QoS Null数据帧给AP告知要进入休眠状态。
AP收到STA的休眠信息之后便缓存了发送给该STA的数据帧,然后在Beacon的TIM字段通知STA有数据缓存,当STA接收到AP的Beacon中的TIM信息并进行解析之后,就知道AP缓存了自己的数据帧待发送。
STA此时已经知道了AP缓存有数据帧待发送给自己,那么STA如何去让AP把数据帧发给自己呢?
STA获取AP缓存数据
先看看802.11-2020给出的一个整体流程:
当STA从TIM字段中知道AP缓存了要发送给自己的数据帧之后,STA向AP发送一个PS-Poll帧以便让AP把缓存的BU发过来。当AP从处于PS模式的STA接收到PS-Poll帧时,它应该向STA发送一个缓存的BU,如果AP还没有把缓存的BU发完,那么AP应该把帧控制字段的More Data位置1。当STA发现AP的More Data位为1之后,会继续发送PS-Poll帧,以这种“乒乓”的方式获取所有缓存的BU,直到AP的More Data位为0为止。当然这个过程需要遵守信道接入的流程。
当AP被告知STA已切换到Active模式时,AP应立即将(如果有)缓存的BU发送给该STA,而不需要等待PS-Poll帧。
存在某一些异常情况:AP已经通过TIM告知STA有缓存的BU,但是STA总是没有主动来获取这些缓存的BU,那么AP将如何处理?这种情况下持续下去会导致AP的缓冲区溢出,此时就要主动丢弃这些缓冲的BU,具体的策略可能会是老化函数和可用缓冲区,具体的AP实现会有差异。
传统节电的优缺点
优点:
- 节省电力:无线设备在不活跃时可以关闭无线模块或者将其置于低功耗状态,从而显著减少电量消耗,延长电池驱动设备的工作时间。
- 灵活性:无线设备可以根据网络条件和电源状态在活跃模式和节电模式之间切换。即使设备处于休眠状态,它也可以通过发送特定的管理帧(如PS-Poll帧)来请求网络上的数据更新,实现定期唤醒接收数据,然后再次进入休眠状态。
缺点:
-
延迟增加:因为STA每次根据TIM间隔定时醒来接收AP的Beacon帧,如果AP为STA缓存数据帧,则STA开始接收,否则STA继续进入睡眠状态。因为TIM一般Beacon间距的整数倍,Beacon间距时间一般为100ms,所以STA与AP进行数据交互的时延比较大,对一般时间敏感的业务数据(如语音或视频数据)并不能很好的支持。
-
效率降低:每次设备唤醒都需要一定的时间来同步和恢复连接状态,这个过程中网络资源被占用,但实际数据传输量有限,降低了整体带宽利用率。另外,PS-Poll这种传输方式每次都要信道接入,造成大量的额外开销。
如果有错误的地方或者不详细的地方,欢迎到评论区留言交流!