802.11信道接入 -- DCF

0、概述

802.11 MAC整体架构如下图所示,图片摘选自IEEE802.11-2020
802.11 MAC层架构
PHY层上面就是MAC层,DCF是MAC层最基本的信道接入机制,HCCA/EDCA/MCCA都基于DCF。总体上来说,802.11的信道抢占原则是所有终端设备自由竞争进行信道抢占。

1、CSMA/CA

CSMA/CA(Carrier Sense Multiple Access with Collision Avoidance)的主要目标是冲突避免,尽可能降低发生冲突的概率。它的基本理论是,当介质突然从繁忙变为空闲的时候发生冲突的可能性最大,这是因为许多STA都在等待着介质从繁忙变为空闲。解决这种高可能潜在冲突的方法是随机回退机制,随机回退不能从根本上解决冲突,只是降低冲突发生的可能性。

2、NAV

CS分为物理CS和虚拟CS。物理CS就是通过PHY来检测空气中的信号和能量的强度来确定介质是否繁忙,虚拟CS就是通过MAC头的Duration字段来宣告介质繁忙的时长。虚拟CS也叫做NAV(Network Allocation Vector),一个普通的数据帧也可以执行NAV,但是通常不会直接这么做,这是因为数据帧通常会比较长,一旦发生碰撞导致重传的话带来的额外开销比较大,进而会影响系统性能。当前通常采用RTS/CTS这种开销非常小的控制帧来执行NAV,即使RTS/CTS发生碰撞重传所带来的开销也不会太大。但是需要注意的是RTS/CTS机制自身也是有开销的,只不过是用一种较小的开销来避免更大的可能开销。如果数据帧本身就很短的话,此时RTS/CTS的开销和数据帧的开销相当了,那么再使用RTS/CTS机制就没有必要了。
通过设置dot11RTSThreshold来确定在什么情况下进行RTS/CTS,如果数据帧的长度大于dot11RTSThreshold就会进行RTS/CTS,反之则不会。如果dot11RTSThreshold设置为0,那么意味着永远打开RTS/CTS。
如下图所示,图片摘选自IEEE802.11-2020
RTS/CTS和NAV设置

3、随机回退机制

随机回退也就是生成一个位于[0, CW]之间的伪随机整数,每过一个slot伪随机整数就减一,直到减到零就可以发送数据了。CW的取值范围是[aCWmin, aCWmax]。
CW的初始值是CWmin,每一次失败的传输都会使CW值变大为下一个值(前一个值乘以2再加1),一直到CWmax为止。任何一次成功的数据帧或者管理帧的传输都会使CW重置为CWmin。
如下图所示,图片摘选自IEEE802.11-2020
802.11 CW变化过程
这里也还提到了两个概念,第一个是短重传计数(STA short retry count ,SSRC),第二个是长重传计数(STA long retry count,SLRC)。短重传是指帧长度小于或等于dot11RTSThreshold的重传,长重传是指帧长度大于dot11RTSThreshold的重传。
当SSRC或SLRC按照规则重置为0的时候(这两个是单独维护的),CW也会重置为CWmin,其实这个时候也意味着发生了一次成功的传输。

4、接入流程

当STA有数据发送的时候会去检测介质是否为繁忙,如果此时介质是空闲的,那么继续在等待DIFS时长仍然空闲,那么随机回退可以设置为零,也就是可以发送数据。这里稍有差别,这个过程中STA自始至终监测到介质都是空闲的。
如下图所示,图片摘选自IEEE802.11-2020
802.11基本接入流程
实际上不同STA产生的随机回退值可能是不一样的,显然随机生成的更小的随机回退值就会优先发送数据,那么随机回退值比较大的STA该如何处理呢?可以参考下图,图片摘选自IEEE802.11-2020
802.11随机回退流程
比如STA1和STA2分别产生了随机回退值5和7,那么第一次STA1会先发送数据,此时STA2的随机回退值还剩下2。等STA1数据发送完了之后,再等待DIFS,然后STA2不会重新产生随机回退值,而是接着前一次没有回退完的随机回退值继续进行回退,那么STA2本次就会很有可能获取介质使用权。这种方式可以让每一个STA尽可能地获取到介质使用权。

5、时间关系-SIFS/PIFS/DIFS

这些时间都是如何确定的,下面这个图给出了比较易懂的解释,图片摘选自IEEE802.11-2020
802.11 SIFS/PIFS/DIFS
aSIFSTime = aRxPHYDelay + aMACProcessingDelay + aRxTxTurnaroundTime
SIFS用来快速应答,比如收到一个数据帧之后需要等待SIFS之后回复ACK,所以SIFS的时间就包含物理层接收的时间加上MAC层处理时间加上Rx到Tx的转换时间。SIFS的设计原则就是在合理的延时的情况下尽可能短,这样也能够提升系统性能。
aSlotTime = aCCATime + aMACProcessingDelay + aRxTxTurnaroundTime + aAirPropagationTime
从上面这个图可以看到aSlotTime有两个计算边界,实际上每个STA看到的slot边界确实可能存在差异,而slot的设计也考虑到了这一点。上面这个slot的边界对于发送设备来说,slot的边界就是从本次Rx转换到Tx之后开始一直到下一次Tx转换成Rx为止。下面slot边界是对于未发送的设备来说,假如该设备开始发送的时候需要先进行Rx到Tx的转换,之后还是能够跟前面的发送设备slot边界对齐。
PIFS和DIFS都是在SIFS的基础上增加几个slot时间。PIFS的一个典型应用是Beacon帧的发送。
PIFS = aSIFSTime + aSlotTime
DIFS = aSIFSTime + 2 x aSlotTime
EIFS应用于数据帧接收失败的情况,此时无法设置NAV,如果后面又接收到ACK的话则可以重新设置NAV并执行DIFS,否则就执行EIFS。下面EIFS的时长设置也包含了一个ACK的时长,考虑到了ACK正常发送却没被接收的情况。
EIFS = aSIFSTime + AckTxTime + DIFS


版权声明:本文为liweiny原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。