序言
802.11e是802.11协议中,一个阶段性的改良版本。我们目前绝大部分802.11协议用到的MAC层接入机制,都是基于802.11e时期开始定义的。在802.11初期,仅有的PCF和DCF两种机制,不能够满足网络不同业务的增长,所以才有了802.11e诞生。在此之后,关于QoS问题也俨然成为802.11中的一个典型问题被进一步讨论,在实现上有ATF,在协议上还有802.11aa和802.11ae等相关版本,都是针对QoS而言的。
本文针对802.11e的相关功能做一份阐述。之前我们有一篇关于《802.11协议精读21:802.11e的优先级》阐述了802.11协议中的QoS映射关系,本文着重讨论的就是802.11中的协议规则,也就是当给数据包标记后,如何为其在无线端口提供QoS保障的功能。
Remark:以下几篇有关802.11e的文章,参考《802.11 QoS Overview》 by Philippe Klein,该资料笔者也备份如下,802.11e slide (Philippe Klein)。
802.11e和WMM
802.11e于2004年正式通过,是802.11协议中关于QoS的一份重要补充。802.11协议最初是为了数据的无线通信,而针对于语音等相关有QoS需求的业务没有考虑。所以随着802.11发展的越来越快,比如基于Wi-Fi的语音设备也就诞生了。不过由于初始的802.11协议没有QoS功能,所以都是厂家自己实现一些QoS机制,我们可以看《802.11权威指南》中给出的一个事例:
翻译如下:
可见,实际上在802.11初期,随着业务的需求,已经有个别公司开始进行QoS的设计。但是由于协议的限制,其只能够采取一种非常特殊的设计,也就是“零退避机制”。由于大部分的业务厂家都没有涉及的IC层面,此时芯片上只能设置一个种非常特殊的backoff初始值,也就是CWmin=CWmax=0,通过这样的设置,可以保证backoff本来所选择的随机数一定是0,因此如果节点这样选择,代表不再进行802.11的竞争,直接可以发送。这种基本本来存在是为了发送802.11的beacon帧的,beacon帧的发送机制实际上就是“零退避机制”,然而如果滥用这种机制的话,虽然可以提供更高的优先级,但是这会对于该网络内其他节点的传输造成影响,所以其不再是兼容802.11的。
因此,在2004年时候,802.11e的协议指定让这个问题可以从协议上直接解决。协议上主要在MAC层引入了EDCA和HCCA的工作模式,同时为了优化网络性能,还引入了Block-ACK等相关机制。
另外,我们在这里还需要谈谈WMM和802.11e的关系。其实Wi-Fi联盟也有一份关于QoS的协议,WMM(Wi-Fi-WMM-Specification)和WMM-PS,笔者这里提供一份该协议1.2版本的(Wi-Fi-WMM-Specification-v1.2.0),大家可以对比下WMM协议和802.11协议的区别。
可以简单而言,WMM就是802.11e的一份工程性更好的子集(主要是包含了EDCA和U-ASPD机制,分别对应WMM协议和WMM-PS协议)。为什么会出现WMM呢,在802.11权威指南里面说过,WMM和802.11e的关系类似于WPA和802.11i的关系,主要是802.11e在制定当时,迟迟没有定案,所以产业界提取了其中最需要的部分,形成了WMM。WMM基本对应了EDCA,WMM-PS基本对应了ASPD。
现在我们在设备上可以控制的,通常还是叫做WMM,而没有称呼为802.11e技术。
如上图所示(额,最近手头就一个DD-WRT的了,就拿这个截图了),这是DD-WRT里面关于WMM的设置,目前绝大多数的路由都可以设置WMM。上图中,我们可以看到一些可以设置的参数,比如说NO-ACK,CWmin,CWmax,AIFSN等等,这些都是与802.11e的技术有关。802.11e中包含了多个技术功能,比如说EDCA,HCCA,Block-ACK,TXOP,TDLS,ASPD等等,以下我们逐个进行一个介绍。
EDCA和HCCA(概略)
EDCA和HCCA是802.11协议中,对于MAC层技术的改进。在早期的802.11中,仅仅只有DCF和PCF两种接入模式。在802.11e中,为了引入QoS的考量,新引入了两种接入模式,HCCA(HCF Controlled Channel Access)和EDCA(Enhanced Distributed Channel Access)。
参考:802.11-2016参考上图,在802.11-2016版本的总章中。在标准的802.11MAC层协议中(目前协议除了标准的802.11以外,还有DMG,即802.11ad),其在物理层以上,首先是基于DCF接入模式。在DCF接入模式以上,还包含了PCF,HCCA,EDCA和MCCA。其中PCF是802.11协议最初就包含的,HCCA和EDCA是802.11e中所包含了,目的是为了解决QoS问题,MCCA是在Mesh模式下提出的。
在HCCA和EDCA中,最重要的元素就是TXOP。HCCA相比EDCA较为简单点,其实际上是PCF+TXOP的一个版本。而EDCA也支持TXOP,在此基础上,由于EDCA是支持竞争的协议,所以在竞争过程时还引入了AIFS和CW优先级相关元素。因此,我们首先整理TXOP的相关内容,在分别讨论两种接入模式。
TXOP与ACK模式
Transmission Opportunity(TXOP),在CWNA中文版上,将此翻译为竞争传输机会。
- 在802.11e之前的协议中,都是“竞争一次,传输一个帧”,用协议的说法,即是“length based transmission”,length指的就是每个帧的长度,当节点竞争成功后,其就传输其对应数据帧的长度,也就是获得单个数据帧的信道传输时间。
- 单个帧(非TXOP)的传输是通过物理载波监听来保证的。
- 在802.11e中引入的TXOP,实际上是“竞争一次,获得一段传输时间”,协议的说法为,“duration based transmission”,即节点竞争成功后,其获得了一段信道使用时间,在这段时间内,其可以传输多个数据帧。这种传输方式也经常用“Burst ”这个词描述。
- TXOP的传输时间是通过虚拟载波监听来保证的。
Remark:有关虚拟载波监听和物理载波监听,可以参考802.11协议精读2:DCF与CSMA/CA中的描述。
在TXOP之前,也有一种传输方式类似于TXOP的机制,不过也有区别,其就是静态分片的传输模式(802.11协议精读25:静态帧分片(Frame Fragment)机制)。该模式也是可以做到单个节点竞争成功后,连续发送帧的。但是其目的和TXOP不同,TXOP目的是发送多个帧,而帧分片是将单个帧(MSDU)切分成多个片段,然后一次性传输。
参考:Cambridge.Next Generation Wireless LANs.802.11n如上图描述的是两次TXOP的传输,STA1是第一次TXOP的发送者,STA2是第二次TXOP的发送者,第三行为两次传输的接收者(图例中再次标注STA2实际有点问题)。当STA1竞争成功信道后,其发送一个QoS Data开启一段QoS时间,该时间足够传递三个数据帧。在该TXOP时间内,STA1逐个发送Data,当发送完一个Data后,如果接收方反馈了ACK,那么就发送。此TXOP时间实际仅仅改变了802.11中一次竞争一次传输的规则,现在可以一次竞争多次传输了。并且每一次TXOP传输时间内,实际采用的物理层速率是不同的。那么意味着在该TXOP时间内,究竟能够传递多少个数据包是不等的,如上图所示,在第一个TXOP时间内传递了3个Data,在第二个TXOP时间内,传递了2个Data。
在TXOP中,通常开启是采用四种帧,分别是:
- 1)Qos_Data,利用普通QoS数据帧起始TXOP时间,
- 2)QoS_Null,有PHY_Header和MAC_Header,没有MAC层的SDU,
- 3)QoS(+)_CF-Poll,用于HCCA中的TXOP机制,
- 4)RTS/CTS,多功能的控制帧。
然后对应TXOP的传输模式(ACK模式),其实都是与ACK有关的,分别是
- 1)Normal ACK:一个包一个ACK反馈,
- 2)无ACK反馈,
- 3)无显示的ACK反馈,这个比如PCF里面会用到的多功能帧,ACK+Poll这样的组合帧,
- 4)突发传输(Burst Transmission),Block ACK反馈,。其实我们一开始看到的DD-WRT下面可以设置的无ACK也是基于802.11e的特性。
这个ACK反馈的字段设置是在QoS Control field里面。下图是参考cambridge书里面的,由于协议里面关于Qos-Control的内容与subtype有联系,所以内容很多就没有直接用协议的图。
参考:cambridge 802.11n的书根据不同的ACK策略,导致在TXOP传输时的形式会不同。比如下图所示:
参考:cambridge 802.11n的书图a显示了节点以RTS/CTS开启一段TXOP时间,然后节点发送数据帧,这种就是一种突发传输(Burst Transmission),在802.11n里面还引入了PIFS可以缩减突发传输的帧间隔。而且在此时候,突发传输就演变成了帧聚合,最大化提升无线传输效率。
在TXOP传输过程中,不一定要在本TXOP时间内获取ACK的反馈,比如上图STA1在第一个TXOP传输结束后,没有立刻要求回复ACK,其在第二个传输时间结束后,才通过BAR申请ACK的反馈。
TXOP的冲突问题:通常normal ACK的情况和普通802.11的差不多,影响不大。但是如果是burst的传输模式下,当节点竞争到信道后,其就会在整个txop时间内做突发传输,这个时候如果有冲突的话,那么就是冲突整个TXOP时间。所以上图中,才会起始用RTS/CTS保护。不过如果不用RTS/CTS,也可以在第一个数据帧时候做DATA_ACK的交换,本质上和RTS/CTS是相同的。
块会话(ADDBA)和块确认(Block_ACK,BA)
本节我们讨论Block_ACK机制,在TXOP Burst传输模式里面,可以用Block_ACK代替传统的Normal ACK模式,一次性回复多个帧的ACK,从而提升资源利用率。在802.11里面,Block_ACK是有连接形式的会话。如下图所示:
参考:802.11-2016,10.24 Block acknowledgment (block ack)会话一共有三个过程:1)会话建立(Setup),2)数据传输(Data & Block ACK),3)会话关闭(Teardown),以下我们分别说明下:
由ADDBA Request和ADDBA Response帧的握手,发起一个会话。Block ACK对应的会话是单向的。需要注意的是,ADDBA Request和Response在协议中都是管理帧,具体是以Action帧的形式存在。管理帧是需要通过ACK确认的,而且每一个管理帧发送前都需要经过Backoff竞争信道。所以ADDBA的握手过程流程是ADDBA Request,ACK,然后ADDBA Response,ACK。Remark:其实ADDBA这个名字会很让人不适应,为什么不起一个类似于Inital开头的名字,这样可以见名识意。ADDBA的全称就是ADD Block Acknowledgment,中文笔者还没有想到一个很好的翻译,有时间再思考。
我们这里可以抓包看一下这个ADDBA的握手过程。(这里抓包解析的参考CWAP – 802.11 : Block Ack,虽然我也抓过ADDBA的过程,但是上下报文比较多,没有这写的清晰)
上图中,序号284就是ADDBA Request帧,具体如下:
其中标识了该帧是一个Action类型的ADDBA帧。然后其包含的参数有:
- Dialog token:该会话的ID号,应该是随机的。
- A-MSDUs:代表该会话是否支持帧聚合。
- Block Ack Policy:代表ACK反馈是立即反馈,还是延迟反馈。
- Traffic Identifier:用来标识会话对应流量的TID。
- Number of Buffers:代表帧缓存区的大小,用来做帧重组用的。
- Block Ack Timeout:用来代表会话的超时设置,如果该位有设置时间,代表如果多少时间没有数据交换,则该会话失效。该参数Request和Response里面都有,以Response的为准。
- Fragment:代表是否有分片,不过这个功能笔者没有很研究。
- Staring Sequence Number:代表会话起始数据帧的序列号。
这里ADDBA还有一点要注意的是,ADDBA的request和response是连在一起出现的。中间没有参杂别的帧抢占信道。但是前面我们提到这两个帧都是Action帧,所以要不然是按照VO最高优先级反馈response(这点是猜测是类似于延迟ACK时候的BA反馈),或者就是在ADDBA Request中设置的Duration参数进行保护。从我目前的抓包记录而言,我估计是Duration保护机制生效的。
不过这个保护时间不一定准,这个保护时间是发送者根据自己的物理层速率进行评估的,但是接收者反馈的时候,物理层速率不一定会与发送者相同。如下图记录,是一个重传帧,这里的Duation参数就与物理层速率有关了。
而且上图我们还可以看到,ADDBA如果有重传,那么也是直接重传,没有BEB过程。猜测的能够实现的原因也应该可以前面的类似了。
然后是序号286的ADDBA Response,如下图
该帧也是一个Action类型的帧,类型可以看出来是Add Block ACK Response,Status code说明这个会话被成功建立。然后就是具体的参数了Block Ack Parameters,其实这些参数是和ADDBA response是一样的。这里有一个参数我们第二个阶段要说明,即Block Ack Policy,Block_ACK的反馈是立即反馈还是延迟反馈。
以上就是ADDBA的一个握手过程,握手完成后就可以开始第二个阶段,数据传输。
- 2)第二个阶段是数据传输的部分,这一块需要结合我们之前说明的TXOP机制来理解。在传输阶段时,数据按照TXOP进行突发传输(802.11e),或者是按照帧聚合形式传输(802.11n以后),当数据传输结束后,需要进行Block_ACK(BA)反馈。
此时Block_ACK反馈有两种机制,一种是立即ACK反馈,另外一种是延迟ACK反馈。
我们下面分别说明下两种Block_ACK反馈机制。
A. 立即Block_ACK反馈。
我们结合这两张图来看。前面已经解释过了Block_ACK的场景,在802.11e中,由于可以在TXOP时间内进行帧的突发传输。此时如果在该TXOP内部,把整个会话内的数据都传输完的话,那么在最后一个QoS Data传输后,会话发起的节点会发送BAR(Block ACK Request),此时节点会立刻反馈Block ACK(BA)。这里的BAR和BA帧都是作为控制帧存在的,所以其可以直接构成一个握手。也就是BAR之后,接收方会在SIFS时间后反馈BA。
在802.11n以后,协议中还有一种立即块回复的模式,叫做隐式的BAR(Implicit BAR)。也就是在发送方发送完最后一个QoS Data后,节点直接可以反馈BA,而不需要BAR的请求。如下图所示,不过这种隐式BAR是应用在帧聚合模式下的,我们本文关注于802.11e模式下的Block ACK机制,对于帧聚合模式下的,也即是HT模式下的Block ACK不加以展开。
A. 延迟Block_ACK反馈。
如上图所示,是一个延迟的BA反馈。如果在本TXOP时间内,发送者已经发送了BAR请求BA帧,但是接收者还没有重组或者校验好,那么其可以先回复一个ACK,代表其接收到了发送者请求的BAR。然后过了一段时间后,其会发送BA跟发送者确认,此时发送者也需要反馈ACK。从而以上实现了延迟Block Ack的反馈。需要注意的是,在延迟反馈的时候,BA会被按照最高优先级安排。
那么我们现在看下BAR和BA这两个帧:
BAR是一个控制类型的帧,其内容不是很多,包含了BAR的ACK策略,这个需要注意下,BAR是可以反馈ACK确认的,也就是我们前面在延迟模式下,需要用ACK确认,也可以不用ACK确认的,这个就可以通过BAR Ack Policy控制,这里的ACK Policy指的是针对于BAR帧的,而不是ADDBA会话的。其他还有是不是有多个TID(Multi-TID),压缩Bitmap(这个是在802.11n里面Block ACK的改进),后面主要就是一个Starting Sequence Numebr,用以请求范围。
对应的BA反馈中大部分控制信息和BAR相同,主要就是多了一个Block Ack Bitmap,这里是直接显示的解析结果,里面显示了有部分帧是没有收到的。关于BA/BAR具体的确认机制,由于后期其都兼容到了HT模式下的Block ACK机制,所以我们在HT模式,也就是802.11n的时候在进一步讨论。
- 3)第三个阶段就是Block ACK确认完成,此时可以关闭这个块确认会话了。
这个部分比较简单,就是ADDBA会话的起始者发送一个DELBA帧给接收者,然后反馈ACK即可。这个帧比较难抓,参考Aruba的Blog,找到一张别人抓的图
以上就是Block ACK的大致机制,不过Block ACK的内容实际上还有不少,主要关于其计分板bitmap策略,以及其和帧聚合的结合。这是因为在802.11e初次定义Block ACK之后,在802.11n里面进一步完善,我们目前通常用到的Block ACK机制都是基于802.11n时候定义的了。802.11n后来定义的我们叫做HT模式下的Block ACK机制,这是向前兼容的,我们后面在讨论802.11n的时候再补充。
我们本文主要整理了TXOP和Block ACK,下面文章再继续进一步整理EDCA和HCCA。
本文为原创文章,如需转载须注明出处和原文链接。
欢迎大家关注我们的微信公众号:无线技术大讲堂,请搜索公众号(must_wireless)。
来源:oschina
链接:https://my.oschina.net/u/4290521/blog/3209431