隐藏终端和暴露终端隐藏终端隐藏终端是指在接收节点的覆盖范围内而在发送节点的覆盖范围外的节点。隐藏终端由于听不到发送节点的发送而可能向相同的接收节点发送分组,导致分组在接收节点处冲突。冲突后发送节点要重传冲突的分组,这降低了信道的利用率。隐藏终端又可以分为隐发送终端和隐接收终端两种。在单信道条件下,隐发送终端可以通过在发送数据报文前的控制报文握手来解决。但是隐接收终端问题在单信道条件下无法解决。当A要向B发送数据时,先发送一个控制报文RTS;B接收到RTS后,以CTS控制报文回应;A收到CTS后才开始向B发送报文,如果A没有收到CTS,A认为发生了冲突,重发RTS,这样隐发送终端C能够听到B发送的CTS,知道A要向B发送报文,C延迟发送,解决了隐发送终端问题。对于隐接收终端,当C听到B发送的CTS控制报文而延迟发送时,若D向C发送RTS控制报文请求发送数据,因C不能发送任何信息,所以D无法判断时RTS控制报文发生冲突,还是C没有开机,还是C时隐终端,D只能认为RTS报文冲突,就重新向C发送RTS。因此,当系统只有一个信道时,因C不能发送任何信息,隐接收终端问题在单信道条件下无法解决。暴露终端暴露终端是指在发送接点的覆盖范围内而在接收节点的覆盖范围外的节点。暴露终端因听到发送节点的发送而可能延迟发送。但是,它其实是在接收节点的通信范围之外,它的发送不会造成冲突。这就引入了不必要的时延。暴露终端又可以分为暴露发送终端和暴露接收终端两种。在单信道条件下,暴露接收终端问题是不能解决的,因为所有发送给暴露接收终端的报文都会产生冲突;暴露发送终端问题也无法解决,因为暴露发送终端无法与目的节点成功握手。当B向A发送数据时,C只听到RTS控制报文,知道自己是暴露终端,认为自己可以向D发送数据。C向D发送RTS控制报文。如果是单信道,来自D的CTS会与B发送的数据报文冲突,C无法和D成功握手,它不能向D发送报文。在单信道下,如果D要向暴露终端C发送数据,来自D的RTS报文会与B发送的数据报文在C处冲突,C收不到来自D的RTS,D也就收不到C回应的CTS报文。因此,在单信道条件下,暴露终端问题根本无法得到解决!隐藏终端和暴露终端问题产生的原因由于adhoc网络具有动态变化的网络拓扑结构,且工作在无线环境中,采用异步通信技术,各个移动节点共享同一个通信信道,存在信道分配和竞争问题;为了提高信道利用率,移动节点电台的频率和发射功率都比较低;并且信号受无线信道中的噪声、信道衰落和障碍物的影响,因此移动节点的通信距离受到限制,一个节点发出的信号,网络中的其它节点不一定都能收到,从而会出现“隐藏终端”和“暴露终端”问题。隐藏终端和暴露终端问题对adhoc网络的影响“隐藏终端”和“暴露终端”的存在,会造成adhoc网络时隙资源的无序争用和浪费,增加数据碰撞的概率,严重影响网络的吞吐量、容量和数据传输时延。在adhoc网络中,当终端在某一时隙内传送信息时,若其隐藏终端在此时隙发生的同时传送信息,就会产生时隙争用冲突。受隐藏终端的影响,接收端将因为数据碰撞而不能正确接收信息,造成发送端的有效信息的丢失和大量时间的浪费(数据帧较长时尤为严重),从而降低了系统的吞吐量和容量。当某个终端成为暴露终端后,由于它侦听到另外的终端对某一时隙的占用信息,而放弃了预约该时隙进行信息传送。其实,因为源终端节点和目的终端节点都不一样,暴露终端是可以占用这个时隙来传送信息的。这样,就造成了时隙资源的浪费。隐藏终端和暴露终端问题的解决方法解决隐藏终端问题的思路是使接收节点周围的邻居节点都能了解到它正在进行接收,目前实现的方法有两种:一种是接收节点在接收的同时发送忙音来通知邻居节点,即BTMA系列;另一种方法是发送节点在数据发送前与接收节点进行一次短控制消息握手交换,以短消息的方式通知邻居节点它即将进行接收,即RTS/CTS方式。这种方式是目前解决这个问题的主要趋势,如已经提出来的CSMA/CA、MACA、MACAW等。还有将两种方法结合起来使用的多址协议,如DBTMA。对于隐藏发送终端问题,可以使用控制分组进行握手的方法加以解决。一个终端发送数据之前,首先要发送请求发送分组,只有听到对应该请求分组的应答信号后才能发送数据,而是收到此应答信号的其他终端必须延迟发送。在单信道条件下使用控制分组的方法只能解决隐发送终端,无法解决隐藏接收终端和暴露终端问题。为此,必须采用双信道的方法。即利用数据信道收发数据,利用控制信道收发控制信号RTS-CTS握手机制RTS(RequesttoSend,请求发送)、CTS(CleartoSend,清除发送).RTS/CTS机制是对CSMA的一种改进,它可以在一定程度上避免隐藏终端和暴露终端问题。采用基于RTS/CTS的多址协议的基本思想是在数据传输之前,先通过RTS/CTS握手的方式与接收节点达成对数据传输的认可,同时又可以通知发送节点和接收节点的邻居节点即将开始的传输。邻居节点在收到RTS/CTS后,在以后的一段时间内抑制自己的传输,从而避免了对即将进行的数据传输造成碰撞。这种解决问题的方式是以增加附加控制消息为代价的。从帧的传输流程来看,基于RTS/CTS的多址方式有几种形式,从复杂性和传输可靠性角度考虑,可采用RTSCTS-Data-ACK的方式。具体做法是:当发送节点有分组要传时,检测信道是否空闲,如果空闲,则发送RTS帧,接收节点收到RTS后,发CTS帧应答,发送节点收到CTS后,开始发送数据,接收节点在接收完数据帧后,发ACK确认,一次传输成功完成。如下图所示。如果发出RTS后,在一定的时限内没有收到CTS应答,发送节点执行退避算法重发RTS。RTS/CTS交互完成后,发送和接收节点的邻居收到RTS/CTS后,在以后的一段时间内抑制自己的传输。延时时间取决于将要进行传输的数据帧的长度,所以由隐藏终端造成的碰撞就大大减少了。采用链路级的应答(ACK)机制就可以在发生其它碰撞或干扰的时候,提供快速和可靠的恢复。RTS-CTS握手机制RTS-CTS握手机制的缺陷1、不同节点发送的RTS和控制信息发生冲突2、多个CTS信息被不同的邻居节点收到,从而导致冲突。RTS-CTS握手机制中的退避算法在CSMA系列的接入技术中,当报文产生冲突时,发送者要执行退避算法,延迟一段随机时间后再次尝试发送。实行退避的目的是为了减小重发时在此发生冲突的可能性。在ADHOC网络中,为了解决隐藏终端和暴露终端问题,引入了RTS-CTS握手机制。RTS和CTS控制报文之间可能会发生冲突。发生冲突时,发送者超时,等不到CTS,要执行退避算法,延迟一段随机时间后重发RTS。产生这个随机时间的“种子”叫做退避计数器。退避计数器的值直接影响着产生的延迟时间的长短。显然,节点退避计数器的值越短,它抢占信道的能力就越强,反之,它抢占信道的能力就越弱。也就是说,退避计数器的值反映了节点抢占接入信道的能力。所以,维护退避计数器的值是非常重要的。退避算法通常退避算法包括二进制指数退避算法、倍数增线性减算法。1.二进制指数退避算法(BEB,BinaryExponentialBackoff)BEB算法的Finc和Fdec函数如下:其中,COUNTER是退避计数器的值,MAX和MIN分别指退避计数器的最大和最小取值,每次发生冲突时,退避计数器的值加倍;每次交互成功时,退避计数器降至最小值MIN。Finc=min(2×COUNTER,MAX),Fdec=MIN;BEB有两个缺点:1)当一次交互成功时,退避计数器的值就降到最低值,不能正确反映信道的争用状况;2)BEB会带来不公平现象,一次交互成功后,节点的退避计数器值降为最小,而其他不成功的节点的退避计数器的值较大,在后续的竞争中,退避计数器值小的节点在竞争中获胜的可能性大。2.倍数增线性减算法(MILD)倍数增线性减(MILD,MultiplicativeIncreaseLineDecrease)算法是对BEB算法的改进,该算法的Finc和Fdec函数如下:Finc=min(α×COUNTER,MAX);Fdec=max(COUNTER-β,MIN);α和β是两个可调节的参数在MILD中,退避计数器的值是线性递减的,一次交互成功后,计数器的值减小β,如果β取值合理,COUNTER并不会像BEB算法一样急剧减小,在后续的竞争信道中,所有节点获胜的机会几乎均等,实现了公平接入。发生冲突时,退避计数器增加α倍,如果α取值合理,COUNTER也不会急剧增加。但MILD也没有完全消除不公平现象。