一. 概述
1. 本文主要对802.11n协议的MAC层做一个简单记录,主要是描述其在吞吐量提升方面的措施,包括如下内容:
1) 聚合;
2) 块确认;
3) 与传统设备的保护机制;
4) 20/40MHz共存模式;
2. 随着PHY的速率不断提高,11n最高已经达到600Mbps了,但实际吞吐量(MAC层)的增加确越来越低,《下一代无线局域网–802.11n的吞吐量、强健性和可靠性》书中提到两组数据:
1) 40MHz 2×2 PHY速率为270Mbps情况下,MAC层只能得到约92Mbps的吞吐量,MAC层的效率大约为1/3;
2) 40MHz 4×4 PHY速率为540Mbps情况下,MAC层的吞吐量和上者是一样的;
3. 造成MAC层效率非常低的原因:随着PHY速率增加,前导码和帧间距的固定开销越来越大:
1) 有效载荷相对较短的情况下,前导码和帧间距占用了更大比例的传输时间;
2) 更多的空间流,需要的前导码也更长,使得系统开销比例也升高了;
下图是一个1500B大小的帧,在不同PHY速率下,前导码的系统开销占比:
Note:1500字节的帧尚且如此,如果有效载荷更短,比如只有50B,那系统开销的占比将更加惊人;
4. 为了提升效率,802.11e(前面两点)和802.11n(后面两点)均在以下几个方面进行改进:
1) TXOP内进行数据突发:即一次空口竞争,发送多个报文,减少了空口竞争过程的开销;
2) 理解块确认:发送方每次发送完数据,接收方不再马上进行ACK确认,而是发送方先连续发送多个数据帧,然后再与接收方进行沟通确认(BAR、BA);
3) 缩小帧间间距:使用比SIFS更短的间距RIFS;
4) 数据聚合:将进行聚合到一起,共用一些系统开销(如前导码、802.11 MAC头);
二. 专业术语
本小节对一些专业术语进行一个简要的说明,如下:
1. LLC:Logic Link Control,逻辑链路控制子层;
2. MAC:介质访问控制子层;
3. PLCP:Physical Layer Convergence Procedure,物理层会聚协议;
4. PMD:Physical Medium Dependent;
5. MSDU:MAC Service Data Unit,当网络层数据传到LLC子层,会在网络层数据前添加LLC头,其中包括加密信息等,此时数据包被称作MSDU,但需要注意的是:控制帧、管理帧和数据帧中,只有数据帧才会在LLC中形成MSDU,一般MSDU的最大size是2304(不含加密信息部分);
6. MPDU:MAC Protocol Data Unit),MSDU移交到MAC层的时候,会加上MAC头部信息和尾部FCS校验信息,这时就形成了一个802.11无线帧,也就是我们平常无线抓包所看到的帧,此时数据包就称作MPDU;
7. PSDU:PLCP Service Data Unit,当MPDU传到PLCP子层,数据包就换名字了,虽然是同一个东西,但此时就叫PSDU了;
8. PPDU:PLCP Protocol Data Unit,当PSDU到达PLCP子层后,会加上前导同步码(PLCP Preamble Code)和PHY头部(PLCP Header),此时数据包就称作PPDU;
三. 聚合
1. 为什么要聚合
从上文概述章节不难发现,提升效率的4种方式中,前3种虽然也能提升一定的效率,但是相对于占百分之73%的前导码开销而言,效果还是非常微小的。因此,802.11n迫切需要一种功能,它能够将占比最大的前导码等系统开销比例将低,一般也就两种方式:
1) 减小前导码的长度:这个显然不行,要么就有兼容性问题,要么数据部分无法解码;
2) 增加数据部分的长度:多个不同的数据帧共用一些系统开销,间接稀释前导码的占比;
共用哪些系统开销,对于无线来说,主要是两种,分别对应了两种聚合的方式:
1) 前导码:A-MPDU;
2) 前导码+802.11 MAC头:A-MSDU;
聚合的优点:
1) 共用一些系统开销(如前导码、802.11 MAC头),降低系统开销比例;
2) 类似于TXOP内进行数据突发,减少了空口竞争过程的开销;
3) 类似于缩小帧间间距,帧之间的间隙直接缩短为0;
4) 减少了大量的ACK报文;
2. A-MPDU
A-MPDU
1) 共用的系统开销:PLCP Preamble + PLCP Header;
2) 聚合的这些报文必须属于同一个接收端,并且具有相同的通信标识符TID;
3) A-MPSDU结构
4) MPDU分隔符
a) 总长度未32bit(4B);
b) MPDU长度字段:12bit,用于描述接下来的MPDU有多长;
c) CRC:8bit,用于校验4bit长的保留字段和12bit长的MPDU长度字段;
d) 特征签名字段:8bit,为了有助于软件实现定界,被设置为ASCII字符“N”;
e) 填充:每个MPDU要求32字节对齐(不足通过padding进行填充);
5) A-MPDU接收方通过解析MPDU分隔符来依次取出MPDU;
6) 当MPDU分隔符损坏(长度不合法、无效的签名字段、CRC错误)时,接收方可以在32bit边界上扫描寻找下一个合法的MPDU分隔符,从而跳过损坏的MPDU;
7) 能接收的A-MPDU最大长度:在HT cap里面进行声明,如下所示:
最大A-MPDU长度编码主要有4个值:
a) 0:8191B(8KB);
b) 1:16383B(16KB);
c) 2:32767B(32KB);
d) 3:65535B(64KB);
最小MPDU起始间距(为了适应接收机中处理每个MPDU的定长时间),有8个值:
a) 0:无限制;
b) 1:0.25us;
c) 2:0.5us;
d) 3:1us;
e) 4:2us;
f) 5:4us;
g) 6:8us;
h) 7:16us;
如果发送方在组装一个A-MPDU时,发现不满足最小MPDU起始间距,一般有两种处理方式:
a) 使用A-MSDU来创建更大的MPDU;
b) 插入空的MPDU分隔符(MPDU长度字段为0);
3. A-MSDU
A-MSDU在A-MPDU基础之上,聚合度更高了,802.11 MAC Header都共用了,它的特点包括:
1) 共用的系统开销:PLCP Preamble + PLCP Header + 802.11 MAC Header;
2) 聚合的这些报文必须属于同一个接收端,并且具有相同的通信标识符TID;
3) A-MSDU结构
4) 能接收的A-MSDU最大长度:在HT cap里面进行声明,如下所示:
主要有俩个值:
a) 3839:每个A-MSDU分配4KB的缓冲区,其中257B预留给特定实现;
b) 7935:每个A-MSDU分配8KB的缓冲区,其中257B预留给特定实现;
5) Qos优先级:与同样TID的MSDU的MPDU相同;
6) A-MSDU的每个子帧要求32字节对齐(不足通过padding进行填充);
相比A-MPDU,A-MSDU多共用了802.11 MAC Header,这虽然进一步提高了效率,但因为FCS校验信息在802.11 MAC Header中,一旦A-MSDU发发生了CRC错误,接收方无法判断具体是哪个子帧有问题,所以发送方必须重新发送整个A-MSDU,这种情况在干扰相对严重的情况是非常常见的,此时,A-MSDU将无法实现预想的效率提升。
因此,各个芯片厂商实际使用A-MSDU的条件非常苛刻,我们很少在有干扰的开放环境下抓到这种类型的聚合报文。
4. A-MPDU与A-MSDU
A-MPDU与A-MSDU可以同时使用,需要双方协商好,同时使用的效果可能在某些场景不明显,与单独使用A-MPDU的效果相当;
在一些特殊的场景,比如大量的小MSDU,单独使用A-MPDU很容易达到聚合的上限(64个MPDU),因为都是很短的报文,即使聚合了64个也无法将TXOP全部使用完,这种情况下同时使用可以充分利用TXOP,从而提高传输效率;
Note:另外,在PHY速率非常高的场景下,即使MSDU很大,也可能出现即使聚合了64个也无法将TXOP全部使用完的情况;
四. 块确认(Block Ack)
1. 块确认最初是在802.11e协议中引入的,该特性允许用一个BA帧来确认以正确数据帧的传送(替代ACK),从而提升了效率;
2. 802.11e协议最初定义了两种类型:立即块确认、延迟块确认,如下所示:
1) 块确认是基于特定的通信标识符TID的,不同的TID需要建立不同的块确认会话;
2) 块确认是有方向的,只被用于从发起方向接收方单向数据传输;
3) 块确认会话建立:发起方发送一个ADDBA req,接收方收到后回复一个ADDBA rsp;
4) 块确认会话删除:发起端或接受端发送一个DELBA req,对方收到后回复一个ACK即可删除会话;
5) 立即块确认&延迟块确认的区别:BAR和BA帧的处理不一样:
a) 立即块确认:发送方发送BAR,接收方立即回复一个BA;
b) 延迟块确认:发送方发送BAR,接收方先回复一个ACK确认,然后再重新竞争空口发送BA,发送方对BA也回复一个ACK确认;
3. 802.11n协议中对以上两种块确认均进行了加强,配合聚合功能,以及使用更高的速率等,加强后的块确认称为:HT立即块确认、HT延迟块确认;
1) 对聚合的支持:类似用ACK机制,通过BA代替ACK进行帧确认(隐式BA),如下图所示:
Note:这种方式不需要BAR,但并不意味这BAR完全不使用,如果发起端一直没有收到某一个MPDU的BA,发起端这边会将这个超时的MPDU丢弃,此时发起端就需要发送一个BAR,以便接收端将后面收到的MPDU送到上层(如果不发送BAR,接收端可能一直不会把数据送给上层),如下所示:
2) 压缩块确认
a) 802.11e协议定义的BA帧中使用一个128B(64 x 16 x 8 bit)计分板,来支持64个MSDU的接收,每个MSDU可被分成最多16个分片;
b) 802.11n协议的BA只为每个MPDU保留1个bit,计分板的大小变成了8B(64 bit),这样既减轻了传输负担,也减少了接收端的内存要求;
3) 802.11n引入了部分状态块确认,之前802.11e定义的则被称为全状态块确认,他们的区别:
a) 全状态块确认:接收端为每个会话都维护一个状态计分板,需要的内存比较多(128B),可以通过ADDBA rsp中的“缓冲区大小”参数来减小内存使用;
b) 部分状态块确认:状态内存作为缓存,用于存储最近活跃会话的状态,相当于不同的块确认会话共同使用一个状态内存,在这个共享的状态内存上创建最近活跃的会话所需的状态计分板;
4) HT延迟块确认在802.11n协议是可选的一个特性,在HT cap里面进行声明
五. 保护机制
1. 存在802.11b用户时
这种情况的保护机制和802.11g ERP协议保持一致:
1) 使用实际:beacon或者probe rsp中的ERP信息元素总use protection设置为1时,如下所示:
2) 保护方式
a) RTS/CTS交互;
b) CTS-to-self;
3) RTS/CTS、CTS-to-self的编码格式:DSSS/CCK;
4) 40MHz频宽时,RTS/CTS、CTS-to-self在主信道上发送;
2. 存在802.11g或802.11a用户时,保护机制包括:
1) RTS/CTS交互;
2) CTS-to-self;
3) 要求使用HT-MF模式;
4) L-SIG TXOP保护:利用L-SIG中的并不使用的length、datarate字段,将L-SIG时长值的设置至少可以覆盖HT PPDU的时长,其它站点可以通过这个L-SIG时长更新其NAV;
3. HT-GF模式保护
1) 终端可以通过设置HT cap元素中的配置来标识其不能接受HT-GF模式,如下图示所示:
2) AP关联了不支持HT-GF的终端后,会在beacon的HT info元素中进行标注,如下所示:
3) 如果有non-HT的终端关联了AP,则AP会在beacon的HT info元素中将HT protection标注为3,如下所示:
4) 如果AP对以上两个字段进行了标注,其关联的终端必须对HT-GF模式的PPDU进行保护;
六. 20/40MHz共存与信道切换管理
1. HT的信道与频宽
这个信息在beacon帧里面的HT info中,如下所示:
1) primary channel:主信道号;
2) STA channelwidth:可以用来向STA发送的频宽(AP所支持的频宽):
a) 0:使用20MHz;
b) 1:使用所支持的频宽中任意一种;
3) 2ed channel offset:相对于主信道,辅信道的偏移:
a) 0:无辅信道;
b) 1:辅信道高于主信道;
c) 2:保留;
d) 3:辅信道低于主信道;
2. 禁止使用20/40MHz共存的情况
1) 使用前先扫描相邻信道的BSS,如果在辅信道检测到完全、部分重叠的BSS,则不能使用20/40MHz共存;
2) 终端可以设置“40MHz不容许”配置,从而阻止AP使用40MHz;
Note:“40MHz不容许”配置:
a) 该配置只使用在2.4G频段,5G频段这个参数固定设置为0;
b) 该配置并没有详细规定何时使用,终端可以以任何理由进行设置;
c) 当设置“40MHz不容许”配置的终端与AP断开关联后,在经过一定时间后,需要从20MHz恢复到20/40MHz共存模式;
3) 终端可以设置“20MHz BSS宽度请求”配置,从而阻止AP使用40MHz;
3. 20/40MHz BSS NAV
只根据主信道上的PPDU更新NAV,对于辅信道上20MHz的帧,不更新其NAV;
4. 信道切换管理
802.11n加强了802.11h协议的信道切换,AP为了通知sta即将变换信道,在管理帧中(如beacon)加入对应的CSA IE字段,告知sta以下信息:
1) 切换模式:标识信道切换前的传输限制,设置为1时表明sta在信道切换前应该停止参数数据,设置为0则不限制sta的数据传输;
2) 频宽:新信道使用的是20MHz还是40MHz;
3) 新信道号:即将切换的目标信道号;
4) 切换计数:发送当前帧到切换,所需要发送的beacon数量(通过beacon数目来计数);
七. 参考资料
1. 《IEEE 802.11n-2009》;
2. 《IEEE 802.11-2016》;
3. 《下一代无线局域网–802.11n的吞吐量、强健性和可靠性》;