一种改进的基于RTS/CTS的多跳无线网络拥塞控制方法
技术领域
本发明涉及无线网络(Wireless Network)、CSMA/CA协议中的RTS/CTS握手机制(RTS全称为Request-To-Send,CTS全称为Clear-To-Send)、网络拥塞控制(CongestionControl)及传输控制协议(TCP)技术领域,具体涉及基于RTS/CTS的多跳无线网络拥塞控制方法。
背景技术
多跳无线网络有着广泛的应用场景,在这类网络中,网络节点既是主机节点又是转发节点。如图1中,由于TCP源节点S和目的节点D不在一跳传输范围内,数据包必须经过节点A和节点B的转发才能到达最终的目的节点。作为互联网中非常重要的传输层协议,TCP(Transmission Control Protocol)最初是针对拓扑结构稳定,信道误比特率低的有线网络而设计的,其主要的功能是拥塞控制、流量控制和可靠性控制。传统的TCP拥塞控制算法假设所有数据包的丢失都是由于网络拥塞而引起的,并由此来判断网络的拥塞状况,调节拥塞控制窗口,达到调节发送速率的目的。然而,在多跳无线网络中,由于节点的移动性,链路层的隐藏终端和暴露终端问题,无线信道的高误比特率等原因引起丢包,反映到传输层的丢包情况并非全部是由于拥塞造成的。在这种由于非拥塞造成的丢包导致TCP拥塞窗口的减小,使得多跳无线网络中TCP的发送速率处于比较低的水平,最终降低了端到端的吞吐量。
目前,人们已经提出了许多方法来提高TCP在多跳无线网络中的性能,大致可以分为以下两类。1)通过跨层设计的方法,多个层相互协作以提高TCP发送端对网络拥塞情况的判断精度;2)基于网络中特定的层进行优化以使TCP更能适应无线多跳网络的特性;
中国发明专利申请200810029968.1公开了基于RTS/CTS机制的多跳无线网络拥塞控制方法,该方法是一种基于fCTS的拥塞控制方法,发送节点向接收节点发送RTS时,如果接收节点没有足够的缓存空间来接收发送节点请求发送的数据,则接收节点通过发回一个fCTS给RTS发送方;所述RTS发送方接收到fCTS后,按fCTS的内容所指定的条件发送数据包。如果某个节点刚刚发出所述fCTS或nCTS,又发出RTS,该RTS的接收节点周围如果没有隐藏终端,则必须向该RTS的发送方返回CTS,所述nCTS用来通知RTS的发送方不要进行数据发送。
发明内容
本发明的目的在于通过对广泛使用的RTS/CTS四次握手协议进行最小的修改,准确判断网络中的拥塞状况,并以较小的代价发布拥塞状况信息,最终实现多跳无线网络中的拥塞控制,提高TCP的吞吐量等端到端性能。
本发明与现有技术200810029968.1的不同点在于把节点的缓存划分为接收缓存和发送缓存,综合考虑节点缓存使用情况和信道竞争程度的拥塞判断方法;网络中各个节点无论是发送方还是接收方都需要发布自身的拥塞状况信息,并且拥塞控制信息的发布不需要采用新的控制帧;拥塞节点发送请求时使用带拥塞状态的请求帧RTSC(Request-To-Send with Congestion status)向目标节点发送请求;为了主动避免死锁,拥塞的目标节点在收到RTSC后,使用带拥塞状态的CTSC(Clear-To-Send withCongestion status)回复帧来接受该RTSC请求,该CTSC的接收方将在发送完数据包后,无条件接受该CTSC发送方的RTSC请求。本发明对RTS/CTS协议中RTS帧和CTS帧扩展以传递拥塞状态信息,并保持RTS帧和CTS帧原有的意义不变的方法。网络中各个节点无论是发送方还是接收方都需要发布自身的拥塞状况信息;当发送节点处于拥塞状态时,将使用带拥塞状态的RTSC请求帧向目标节点发送请求;该RTSC帧的接收节点若也处于拥塞状态并接受该请求,将发送CTSC帧,CTSC帧既表示接收节点将开始接收来自发送节点的数据包;同时,网络中各个节点通过监听和接收RTSC和CTSC帧判断相应的邻居节点的拥塞状况。
本发明通过如下技术方案实现:
一种改进的基于RTS/CTS的多跳无线网络拥塞控制方法,包括如下步骤:
(1)节点A在向节点B发送数据包之前,先核查节点B是否处于拥塞状态;如果B还处在拥塞状态,节点A就延迟本次发送;如果B不拥塞,节点A拥塞,节点A向节点B发送RTSC;如果B不拥塞,节点A不拥塞,节点A向节点B发送RTS;节点A和节点B为多跳无线网络任意两个相邻节点;所述RTSC为带拥塞状态信息的请求帧;RTS为没有携带拥塞状态信息的请求帧;
节点通过如下方式判断其自身的拥塞状况:把节点内的缓存划分为接收缓存和发送缓存,本节点产生的数据包直接进入发送缓存,中转的数据包先经过接收缓存;所述的中转是指把从其他节点发来的数据包转发到下一跳节点的操作;设T1为接收缓存的拥塞门限值,T2为发送缓存的拥塞门限值,并设N1为接收缓存内数据包的个数,N2为发送缓存内数据包的个数;当N2<T2时,中转的数据包进入发送缓存;否则,中转的数据包占据接收缓存;当N1<T1,没有拥塞,否则有拥塞;T1、T2、N1和N2都为自然数;
(2)节点B在收到来自节点A的RTS或者RTSC后,在确认自己周围没有隐藏终端的情况下,节点B判断本节点是否拥塞,如果本节点不拥塞,则回复CTS,并接收数据包;节点A收到节点B发出的CTS后,发送数据包到节点B;节点B接收完节点A发送的数据包后向A发出ACK确认帧;
(3)如果节点B判断本节点为拥塞,按如下的情况分类进行处理:1)若节点B收到的是RTS请求,节点B不对该请求做任何回复,并调整节点B的最小竞争窗口使节点B能够优先竞争到信道;2)若节点B收到的是RTSC,节点B读取其发送缓存队列的第一个数据包的目的地址,如果该包是要发给节点A的,则节点B为了避免死锁的发生,发出CTSC;否则,不予回复;所述CTSC为带拥塞状态信息的回复帧;CTS为没有携带拥塞状态信息的回复帧;
(4)节点A收到节点B发出的CTSC,就发送数据包到节点B;同时节点A在接收缓存中为节点B预留至少一个缓存空间;节点B在接收完节点A发送的数据包后,调整自身的最小竞争窗口使节点B能够优先竞争到信道,向节点A发送RTSC请求帧;节点A在收到节点B的RTSC请求帧时,判断节点B为拥塞节点并且节点B为了避免死锁,已经接收了A的数据包,节点A无条件接受节点B的RTSC请求,在确认自己周围没有隐藏终端的情况下,发送CTS给节点B;节点B在收到CTS后,发送数据包给节点A;节点A在收到来自B的数据包后,向B发出ACK确认帧。
为进一步实现本发明目的,当由于多次无法竞争到信道而造成丢包时,所丢包空出的缓存空间并不改变该节点的拥塞状态,本节点拥塞状态的解除必须由该节点成功发送数据包到其他节点的行为确定。
所述调整节点B的最小竞争窗口使节点B能够优先竞争到信道是指调整节点B的最小竞争窗口为8,使得节点B能够有足够的优先级竞争到信道。
所述在确认自己周围没有隐藏终端的情况下是指该节点在由其收到的RTS请求中的NAV域确定的一段时间内只处理该次请求,其他节点的请求不被处理;隐藏终端是指在接收接点的覆盖范围内而在发送节点的覆盖范围外的节点。
所述通信标准优选为现有的IEEE 802.11标准。
相对于现有技术,本发明具有如下优点和有益效果:
(1)本发明能加速可能形成死锁时拥塞的解除。设节点A和节点B都处于拥塞的状态且需向对方发送数据包才能解除拥塞,即死锁。现有技术中,节点A向节点B发送RTS,而节点B回复fCTS,接着节点B向节点A发送RTS,节点A回复CTS,之后才开始数据包的传输,即至少需要2次竞争到信道才能实现握手;本发明节点A向节点B发送RTSC,节点B即回复CTSC,之后就开始数据包的传输,即最少只需竞争信道1次就能实现握手。这样,本方法更快地开始了数据包的传输。
另外,现有技术中,接收了数据包的拥塞节点A,由于没有通告自身的拥塞状况,会造成其拥塞较难解除;而发明拥塞节点在同意接收数据包的同时即通告了自身的拥塞状况,拥塞的解除较容易。
(2)在拥塞状况的判断上,现有技术在一个节点接收到其他节点的发送请求后,计算自身的拥塞程度时,把队列内所有的包都计入,然而,对于网络中一个特定的流来说,流的目的节点在收到上游节点的请求时,因为接收到的数据包是传输到上层的,并不会在队列中占据位置,所以应该接收数据包,如果一个流的目的节点被本节点产生的包(比如TCP的回复包)占据而到达拥塞门限,就会拒绝上游节点的请求,这样会降低吞吐量。本发明把节点内的缓存划分成接收缓存和发送缓存。判断拥塞与否同时需同时考虑接收缓存和发送缓存。对于目的节点来说,由于收到的数据包直接上传到上层,不需占据接收缓存空间,不会增加节点的拥塞程度。另外,已有技术只以队列的长度作为判断拥塞的唯一依据;而本发明判断一个节点是否处于拥塞状态综合考虑了节点缓存内容纳的包的个数和无线信道的竞争程度,能够更全面地体现多跳无线网络的特性。
(3)已有技术需要添加特定意义的帧结构fCTS帧,对RTS/CTS协议的修改较大,且发送额外的控制帧会造成一定的开销;而发明RTSC帧和CTSC帧分别是对原RTS帧和CTS帧的功能的扩展,在原有的帧结构中,既保持原有的控制帧的意义,又通过使用空闲控制位或者使用捎带的方法实现拥塞状态信息的传递。所以本发明对现有协议的修改相对较小,实施时对设备的更新较容易。
附图说明
图1为任意两个相邻节点A和节点B的数据发送和接收示意图;
图2为原握手机制的示意图;
图3为网络节点内部结构示意图,网络层负责为每个数据包计算下一跳转发节点;链路层负责一跳内无线信道资源的分配,其设有接收缓存和发送缓存;物理层负责数据帧的传输;
图4为节点A向相邻节点B发送请求前的判断流程图,A通过其邻居表中记录的关于B的条目判断B是否处于拥塞状态;
图5为节点B收到相邻节点A的请求后的流程图;
图6为死锁问题的原理图;
图7为节点A和节点B之间避免死锁的原理图。
具体实施方式
下面结合附图和实施方式对本发明作进一步的说明,但是本发明要求保护的范围并不局限于实施方式表述的范围。
RTS/CTS握手机制已经被广泛用于解决无线网络中的隐藏终端问题。如图2所示,RTS/CTS握手机制(原握手机制)规定:节点A在向相邻节点B正式发送数据包之前,必须先向节点B发出一个RTS请求帧;节点B在接到RTS后,如果节点B认为其周围没有隐藏终端,节点B就向节点A返回CTS回复帧;否则节点B就不作任何反应;只有收到节点B返回的CTS回复帧后,节点A才能向节点B发送数据帧(DATA);而节点B在收到节点A的数据帧后,需向节点A发出回复确认帧(ACK)。本发明用以传输拥塞状态的RTSC帧和CTSC帧是通过利用现有的IEEE 802.11中RTS和CTS帧的空闲控制位实现的,包括如下步骤:
(1)如图3所示,网络节点的缓存划分为接收缓存和发送缓存。本节点产生的数据包直接进入发送缓存;从其他节点转发过来的数据包,先进入接收缓存。该数据包随后进入网络层,若网络层判断该本节点为该数据包的最终目的节点,则将其交付给上层(传输层和应用层);若该数据包需转发给其他节点(称为中转的数据包),则在网络层计算出下一跳节点地址后,按照下面规则进入链路层的相应缓存。设L1为接收缓存最大容量,T1为接收缓存拥塞门限,且0<T1≤L1;L2为接收缓存最大容量,T2为接收缓存拥塞门限,且0≤T2≤L2。N1、N2分别为自然数,是当前接收缓存和发送缓存中数据包的个数,即图2中阴影部分。若N2<T2,中转的数据包进入发送缓存,否则占据接收缓存。
(2)当一个节点成功发送数据包到下一跳节点,发送缓存空出位置,若接收缓存非空,相应数目的数据包从接收缓存进入发送缓存;而如果由于无线信道的竞争导致丢包,发送缓存空出位置,接收缓存内的数据包不进入发送缓存。
(3)当一个节点收到来自其他节点的发送请求,或者需要发送请求给其他节点时,若当前接收缓存内的数据包的个数N1≥T1,则该节点判断自身发生了拥塞;否则,不拥塞。
(4)为实现拥塞状态信息的传递,将IEEE 802.11的RTS帧和CTS帧中的一个空闲控制位定义为拥塞状态位。默认情况下,拥塞状态位为0,表示普通的RTS帧或CTS帧;若拥塞状态位为1,表示带拥塞状态信息的RTSC帧或者带拥塞状态信息的CTSC帧。
(5)为记录各个邻居节点的拥塞状态,各个节点在其内存中动态维护一个邻居表。每当本地节点侦听到一个新的邻居节点发出的数据帧或者控制帧,就在邻居表中为该邻居节点新建一个表项。如表1所示,表中各项记录相应的邻居节点发出RTSC的时刻(简称TR),发出CTSC的时刻(简称TC),该邻居节点发出RTSC或者CTSC后发出的数据包的个数(简称K)。表内各邻居节点的TR、TC、K的初始值分别为-1,-1,0。由于时间不能为负值,所以TR和TC取-1即表示该邻居节点未曾发出RTSC或者CTSC;而节点发出的数据包的个数为0即表示该节点未曾发出数据包。TR和TC的取值是一个确切的时刻值,单位必须精确到毫秒级别;而K值为一个大于或者等于0的自然数。
当节点A接收到或者侦听到邻居节点发出的RTSC、CTSC或者数据帧,即更新相应表项。如节点A在tRTSC-B时刻侦听到或者收到节点B发出的RTSC,则节点A把其邻居表内节点B的TR更新为tRTSC-B,节点B的K项更新为0。随后,一旦节点A侦听到节点B发出的数据包,就把表内节点B的K项加一。由于在标准的IEEE 802.11协议中CTS帧并没有包含发出该帧的节点的地址信息,所以只能通过接收CTSC帧实现才会更新邻居表中的TC项。又如,节点A在tDATA-B时刻侦听到或者收到节点B发出的DATA帧(数据帧),且邻居表内与B对应的行的TR或者TC值为正数,则相应的K值加一。
查找邻居表可以判断邻居节点是否处于拥塞状态或者是否为了避免死锁接收了本节点的数据包。若邻居表内一个邻居节点的TR或者TC域的值距离当前时刻(即查找邻居表的时刻)超过时间RTT或者对应的K项不为0,即认为该TR域或者TC域已经无效,并把TR域或者TC域复位为-1。RTT(Round Trip Time)是数据链路层进行一轮握手需要的时间,由使用的物理层技术确定。
表1
邻居节点ID |
发出RTSC的时刻(TR) |
发出CTSC的时刻(TC) |
拥塞后,发出数据包的个数(K) |
S |
-1 |
-1 |
0 |
B |
tRTSC-B |
tCTSC-B |
1 |
(6)节点A在向相邻节点B发送数据包之前,先计算本节点是否处于拥塞的状态,同时查看邻居表内目的节点是否处于拥塞状态。判断的过程如图4所示。如果节点B还处在拥塞状态,节点A就延迟本次发送。如果节点B不拥塞,则节点A依据本节点是否拥塞,发出RTS或者RTSC。
(7)如图5所示,节点B在收到来自A的RTS或者RTSC后,决定是否要接受请求,判断的依据包括本节点的拥塞状况和是否会发生死锁。节点B先判断本节点是否拥塞,如果本节点不拥塞,则回复CTS,并准备接收数据包;如果本节点拥塞,按如下的情况分类进行处理:若节点B(接收节点)收到的是普通的请求RTS,它不对该请求做任何回复,同时调整自己的最小竞争窗口为8(IEEE 802.11中默认的最小竞争窗口值为31,越小的竞争窗口意味着越容易抢占到信道,这里取经验值8),使得自己能够有足够的优先级竞争到信道;若接收节点收到的是RTSC,它读取自己队列中第一个包的目的地址,如果该包是要发给RTSC的发送节点的,则可能发生死锁,发出CTSC;否则,不予回复。
图6为死锁问题的原理图;所谓死锁是指两拥塞节点需向对方发送数据来解除本身的拥塞,但这两个拥塞的节点又处于相互拒绝对方的状态中。如图6所示,节点A队列内的第一个数据包需发往B;而节点B队列内一个数据包需发往A,并且A和B都拥塞。此时A和B都不能拒绝对方的请求,否者A和B的拥塞都无法解决。
(8)图7为节点A和B之间避免死锁的原理图。其中节点A和节点B都已经拥塞,并且只能通过向对方发送数据包才内解决拥塞。图中节点A先竞争到信道向节点B发送RTSC帧。节点A和节点B之间将通过RTSC和CTSC向对方传递拥塞状态。经过2轮握手,节点A和节点B互换了一个数据包。在图7中,当节点A收到节点B发出的CTS后,在经过一个SIFS时间(其值由现有的IEEE 802.11标准规定)后信道仍空闲,就发送数据包到节点B;如果节点A收到节点B发出的CTSC,A还要更新邻居表中节点B的TC值为当前时刻,节点B的K值设成0,同时要在接收缓存中为节点B预留至少一个缓存空间。并在此以后不再竞争信道,直到节点B成功发送数据到节点A。在确认自己周围没有隐藏终端的情况下是指该节点在由其收到的RTS请求中的NAV域确定的一段时间内只处理该次请求,其他节点的请求不被处理;隐藏终端是指在接收接点的覆盖范围内而在发送节点的覆盖范围外的节点。
(9)在节点B接收完节点A发送的数据并发出回复帧后,节点B调整自身的最小竞争窗口为8开始抢占信道,向节点A发送RTSC请求帧。
(10)在图7中,节点A在收到节点B的RTSC请求帧时,查看其邻居表,表中节点B的TC值不为负值,说明节点B为拥塞节点,并且节点B为了避免拥塞,已经接收了节点A的数据包,所以节点A无条件接受节点B的RTSC请求,在经过一个SIFS后信道仍空闲,节点A发送CTS回复帧给节点B,并且把邻居表中节点B的TC值设成-1。节点B在收到CTS帧后,开始发送数据帧给节点A,而A在接收到来自B的DATA帧后,要发送ACK帧确认。