在无线通信中,有两个典型的问题,即隐藏终端和暴露终端问题。在802.11中,这些问题也是存在,同时也衍生出了一些新类型的隐藏和暴露终端问题。在前面描述DCF模式中,我们已经谈论了的隐藏终端问题。
实际上,隐藏终端和暴露终端都是由于CSMA/CA中所采用的LBT机制所引起。隐藏终端是由于监听到的信道空闲而不是真的空闲,故引发冲突。而暴露终端是由于监听到的信道忙而不是真的忙,故其可以传输而不传输。
在这里,综合之前的论述,我们对一般性的隐藏终端和暴露终端做一个简单的整理。
隐藏终端问题可以简单定义为:节点之间无法互相监听对方。但当其不可以同时传输时,其同时传输,从而导致冲突发生。隐藏终端在单个AP(或者单个Receiver)时就有可能发生。
我们基于以上拓扑讨论基本的隐藏终端问题,在该拓扑中,STA 1与STA 2为两个节点,这两个节点都是关联在AP身上。图中蓝色虚线代表STA 1的发送范围,绿色虚线代表STA 2的发送范围。
由于图中STA 1与STA 2发送范围无法互相覆盖,即无法通过物理载波监听的方法,探测对方是否有发送数据。从而STA 1与STA 2可能会误以为信道空闲,从而同时发送,继而造成冲突。
如上图所述,根据DCF中CSMA/CA的工作机制,STA 1与STA 2在等待DIFS之后,分别选取一个随机数进行Backoff。STA 2由于随机数选择较少,从而首先倒数至0,并发送数据。当STA 2发送数据后,由于STA 1监听不到STA 2已经占用信道,其依旧误以为信道是空闲的,从而继续进行backoff。当STA 1的随机回退计数值倒数至0时,STA 1也会发送数据。
由于STA 1与STA 2的同时发送,即AP接收时存在重叠区域,即也是发生了冲突,最终这一轮传输失败。当这一轮传输失败之后,STA 1与STA 2采用BEB算法重新选择随机数进行回退,但后续过程中两者依旧无法互相监听,所以很容易再次出现同时传输的现象。在隐藏终端的情况下,网络是近似瘫痪的,换言之,STA 1与STA 2的吞吐量都趋近于0。
暴露终端问题可以简单定义为:节点之间能够互相监听对方。但其可以同时传输时,其不传输,从而造成浪费。暴露终端在多个AP(或者多个Receiver)时才有可能发生。
我们基于以上拓扑讨论基本的隐藏终端问题,在该拓扑中,STA 1与STA 2为两个节点,其中STA 1关联在AP1上,STA 2关联在AP2上。图中蓝色虚线代表STA 1的发送范围,绿色虚线代表STA 2的发送范围。
图中AP1处于STA 1的覆盖范围内,而不再STA 2的覆盖范围内。AP2处于STA 2的覆盖范围,而不在STA 1的覆盖范围内。换言之,AP1只能接受到STA 1的数据,AP2也只能接收到STA 2的数据。当STA 1与STA 2同时发送时,接受节点AP1或者AP2处均不会发生冲突,故其是可以同时传输的。但是由于这样的拓扑特殊性以及DCF中CSMA/CA的工作机制,造成STA 1与STA 2无法同时传输,该问题则是暴露终端问题。
在CSMA/CA中,接入是遵守LBT(Listen Before Talk)机制的。我们在DCF的介绍中所述,每一个节点在接入信道之前需要进行backoff。在该过程内,若信道空闲,则每经过1个slot,随机倒数计数器进行一次倒数。若信道非空闲,则节点不会对随机倒数计数器进行倒数,并对其进行悬挂。只有当其倒数至0时,才可以发起传输。其中信道空闲与否是通过载波监听机制进行判断的,而在DCF中,存在物理载波监听和虚拟载波监听两种模式,这两种监听方式都有可能引起暴露终端问题,以下我们分两种情况进行讨论。(有关DCF的接入过程,详细内容请查阅之前的文档)
如上图所示,由于STA 1与STA 2可以互相监听。由于STA 2选择了较小的随机数进行倒数,从而其最先倒数至0,并进行发送。当STA 2首先发送数据包给STA 2后,STA 1监听信道为忙状态,从而无法发送信息。故根据拓扑而言,STA 1是可以传数据给AP1的,但是由于监听STA 2正在传输,导致信道忙,故STA1悬挂随机倒数计数器,无法继续倒数,从而无法传输。
这里实际上我们还可以更深入了解一下,实际上STA1为什么需要在别人传输的时候,悬挂自己的随机倒数计数器。在CSMA/CD中,实际上是没有悬挂过程的,只有在CSMA/CA中才存在。在CSMA/CD中,若信道忙,节点就不停的去监听信道,一旦发现空闲就传输。而在CSMA/CA中,节点在中间实际上不是监听信道,而是接收数据。其主要原因在于,STA 1在检测到STA 2正在传输造成信道忙时,其立刻开始接收该STA 2的数据,因为STA 1不知道该数据是否是发给自己的。只有当完整接收数据,CRC校验通过后,STA 1才可以检查帧MAC头部所对应的目的BSSID地址,看是否是自己的数据包,若不是才可以丢包。换言之,CSMA/CA中,悬挂实际上是为了接收,从而导致的现象是悬挂而已。
如上图所示,在暴露终端场景中,若STA 2不仅选择了较小的随机数进行优先倒数,并且其发送的数据包是RTS数据包。当STA 1识别到该RTS数据包后,其就会被设置为NAV状态,无法在后面的过程主动竞争信道,进而无法传输。与之前描述用RTS/CTS解决隐藏终端问题时不同,在解决隐藏终端问题中,NAV是由AP所反馈的CTS帧所进行保护。而这里由于STA 1与STA 2能够互相监听,换言之,在暴露终端情况下,STA 1的NAV是被STA 2所发送的RTS帧进行保护的。在STA 1被NAV保护后,其也无法传输,最终导致暴露终端问题。