郑涛,王菲,姜胜明
(上海海事大学信息工程学院,上海 201306)
在以移动自组织网络为代表的无线多跳网络中,其网络信道质量往往较差,存在着大量的非拥塞型丢包,传统TCP的拥塞控制乃至拥塞判断的方法,均不再适用。基于这种情况而提出的Semi-TCP改变了对网络拥塞状况判断的依据,不再简单地使用传输层ACK的数量进行估测[1],改用数据链路层的缓存占用情况作为评判标准,从而在非拥塞型丢包状况严重的无线多跳网络中也能做出正确的拥塞判断[2]。
但是,Semi-TCP和传统TCP使用不同的拥塞判断标准和拥塞处理方法,当二者共存于同一条通信链路时,截然不同的两种拥塞控制算法无法与对方进行沟通转换,势必会造成网络整体性能的下降[3]。在仿真软件EXata中,当中间节点采用了不同的传输层协议,那么发送节点和接收节点之间的数据有时无法正常传输,这取决于Semi-TCP的具体实现方法。当一条通信链路同时包含有线和无线两部分,且二者传输层分别使用传统TCP和Semi-TCP协议时,本文提出一种方法,在协议交界面对两种拥塞控制算法进行转换。
另外,还有其他思路进行拥塞控制,例如TCPAP[4],他根据网络拥塞状况在发送方自适应地调整发送速率,本文在EXata上对该协议也进行了实现,并与Semi-TCP设置平行实验进行对比。
拥塞控制对提高网络吞吐量具有重要作用,理想的拥塞控制能够随着负载的提高逐渐提高网络的吞吐量,直到某一最大值。实际的拥塞控制很难达到该最大值,并且由于拥塞控制需要付出相应的代价,所以会在网络未发生拥塞或者轻度拥塞时,反而会降低网络的吞吐量。但若不进行拥塞控制,一旦网络发生拥塞,吞吐量会随着负载的增加大幅降低,当负载达到一定程度时,网络会无法工作,进入死锁状态[5]。
图1 拥塞控制的作用
(1)传统TCP协议:滑动窗口机制
TCP协议自最初的Tahoe开始,到目前为止已经有较多版本,例如 Reno、SACK、New Reno,其中 New Reno是目前无线网络中应用最多的一种。本文所述的传统TCP协议即以New Reno为例。传统TCP的滑动窗口用于暂存通信用数据[6],每台计算机都有用于发送和接收的两个滑动窗口[5]。传统TCP通过窗口的滑动来调节传输速率,并进行流量控制。
图2 发送缓存和发送窗口
图3 接收窗口和接收缓存
发送窗口win的大小取决于拥塞窗口cwnd和接收窗口rwnd的较小者,即win=min(rwnd,cwnd),使得发送速率能够根据拥塞状况进行调节,起到一定的拥塞控制作用。每当发方收到一个确认,就把拥塞窗口cwnd加1。每当发方检测到拥塞发生,就降低拥塞窗口。
传统TCP是在超时重传和快速重传之后进行的拥塞处理,也就是说,传统TCP对拥塞判定的主要依据是发方能否在传输层及时地收到相应数据包的确认ACK。
(2)Semi-TCP协议:MAC层缓存占用率
在以链路不稳定、信道质量差、节点移动为特点的MANET网络中,传统TCP的拥塞处理机制频繁地被非拥塞原因触发[7],错误地降低发送速率,导致传统TCP在无线网络中性能下降。针对无线场景的关于TCP协议的改进思路有很多,其中Semi-TCP认为,网络拥塞是传输层之下的网络层和数据链路层的概念,传输层只能采用估计的形式进行拥塞判断,这才导致传统TCP在无线网络中经常发生拥塞的误判。所以,Semi-TCP提出将拥塞控制功能转到MAC层来实现。
目前已有两种Semi-TCP的实现方式,基于RTS/CTS握手机制实现的Semi-TCP和基于MAC层确认机制实现的Semi-TCP。考虑到RTS/CTS握手机制主要应用于大文件传输的场景,其使用范围受到更多地限制,故而本文所做的兼容性研究与优化都是以后者为基础的。
基于确认机制实现的Semi-TCP,根据自身MAC缓存占用率对自身拥塞情况做出定量的判断,并根据一跳内的邻居节点广播的拥塞信息对邻居节点的拥塞状况进行记录。为避免ACK对MAC层缓存的占用可能引起拥塞的误判,还将MAC层缓存细分为两部分:发送缓存和接收缓存[8]。
拥塞判据:如图4,假设接收缓存容量的最大值为L1,CT1为其拥塞门限,即当接收缓存内数据包个数N1≥CT1时,节点判定自身为拥塞状态;L2为发送缓存容量的最大值,CT2为其拥塞门限,当传输层有数据要发送,且当前发送缓存中数据包个数N2满足N1+N2<CT2时,将数据直接送往发送缓存,否则,暂时不将数据送往发送缓存,以此来控制传输层的发送速率[9]。
(3)TCP-AP协议:速率自适应
Elrakabawy等人提出的 TCP-AP(TCP with Adap⁃tive Pacing),是一种应用于无线网络的基于速率自适应的拥塞避免算法。TCP-AP[10]通过在发方调节发送间隔来实现对发送速率的控制,间隔的计算依赖于发方检测到的RTT,通过RTT的变化来判定网络当前的负载程度,并在每次接收到ACK后,重新计算发送间隔,从而实现发方根据网络状况对发送速率的自适应调节。该协议能够避免传统TCP协议在无线网络中容易产生突发流量的问题,但其计算公式非常复杂,很容易受到网络中节点计算能力的限制,且其对无线多跳网络吞吐量的提高也很有限[11]。
图4 节点内缓存的划分
传统TCP协议使用滑动窗口机制进行拥塞控制,使用拥塞窗口对拥塞信息进行表征,当拥塞发生,即发方在规定时间内没有收到对某一数据包的确认或者收到超过三次以上对某一数据包的重复确认时,通过主动减小拥塞窗口来间接地减小发送窗口,以此降低发送速率,减轻网络拥塞。传统TCP的拥塞控制是一种端到端的全局拥塞管控,只在通信两端对拥塞进行检测和处理,无法得知是在通信链路中何处发生拥塞。
Semi-TCP协议属于逐跳拥塞控制,使用节点内MAC层缓存占用率对拥塞信息进行表征,当节点检测到自身缓存占有率到达某阈值,即判定自身处于拥塞状态,并向上游节点反馈自身拥塞状况,当上游节点收到拥塞信息反馈时,就降低发送速率,以此实现拥塞的检测和处理[7]。Semi-TCP舍弃了传输层的拥塞控制功能,通过MAC层缓存占用率来表示和检测网络拥塞状况,能够精确地检测到拥塞发生在通信过程中的哪个节点,进行局部拥塞管控。
TCP-AP是一种透过表象做反应的协议,它使用最近一次往返时间RTT的大小来表征网络拥塞信息。当RTT较大时,说明当前网络负载严重,需要降低发送速率。发送速率的控制则依赖于两次数据发送的间隔,当需要降低发送速率时,就将该间隔增大。
图5 端到端通信中TCP与Semi-TCP共存现象
如图5,传统节点是使用传统TCP协议的节点,Semi节点是使用Semi-TCP协议的节点,两端分别是传统节点和Semi节点的节点称为协议交界面,在协议交界面对两种协议的兼容问题进行解决。假设①的左侧均为传统节点,称为传统区,②的右侧均为Semi节点,称为Semi区。二者使用不同的拥塞控制机制,具有不同的拥塞判断标准,①和②之间如果不做拥塞信息的转换,势必会对网络整体性能造成负面影响。
(1)协议交界面的确定
在TCP连接的建立阶段,确定协议交界面,具体做法如下:
选择帧结构中的某一空闲位作为flag,并修改Semi-TCP协议,使得只要是由Semi节点生成或者转发的信息,就对该flag做置位操作,传统节点不对flag进行检测和置位。一条通信链路如果只存在一个协议交界面,则该交界面必然是所有节点中唯一一个既能接收到未被置位信息,又能接收到被置位信息的Semi节点。
图6 仿真场景
传统节点虽然也能接收到具有两种flag状态的消息,但本文只对Semi-TCP协议进行修改,因此传统节点不会检测flag,更不可能被设置为协议交界面。另外,这里仅考虑通信链路中仅存在一个协议交界面的情况。当一条通信链路中存在多个协议交界面时,上述检测算法仅能检测出图5中最左边的协议交界面。
(2)协议交界面的功能
被设置为协议交界面的节点,在收发双方建立TCP连接时,会在传输层创建与传统节点匹配的虚拟发送/接收/拥塞窗口,以及与Semi节点相匹配的MAC层缓存,整个节点被分为图5中的①和②两部分,网络拥塞控制也被划分为传统区和Semi区两部分。
在协议交界面,所有消息都会被上传到本节点的传输层,再根据flag位判断信息来源,根据数据发送方向做相应的处理,具体流程如下:
1)数据发送方向:传统节点->Semi节点
传统节点将数据发往协议交界面,①接收到来自传统节点的消息(Data)后,按照滑动窗口机制保存数据并修改接收窗口,只不过数据不再上传至更高层,而是交给②,之后按照Semi-TCP的方式转发该数据;Semi节点正确接收该报文后,回复ACK;当②接收到来自Semi节点的消息(ACK)后,根据②的缓存占用率判断当前节点是否拥塞,若拥塞,则延迟适当时间后再将该确认包交给①,这样,本应更早到达传统节点的ACK,没有那么早到达,作为数据发送方的传统节点就会因等待ACK而延迟发送下一个数据,从而实现发送速率的降低。
2)数据发送方向:Semi节点->传统节点
Semi节点将数据发往协议交界面,②接收到来自Semi节点的消息(Data)后,发给①,由①保存并决定何时转发出去;传统节点正确接收到该数据后,回复ACK;当①接收到来自传统节点的消息(ACK)后,按照滑动窗口机制更新拥塞窗口等信息,并将该ACK转发给②,由②按照Semi-TCP协议的方法进行转发。
本章将具体介绍传统TCP协议与Semi-TCP协议共存于同一条通信链路时的性能测试,以及本文算法在EXata平台上的实现与测试,主要是在考虑路由重建以及不考虑路由重建两种情况下对优化前后的混合场景的网络吞吐量进行对比。
本文使用软件EXata进行所有的仿真实验,EXata是美国SNT公司针对新型无线通信技术设计开发的网络仿真系统,支持TCP/IP协议栈的标准层间接口,允许客户对其核心代码进行修改以实现并测试客户自身实现的协议,由于采用先进的并行算法,其精确程度可以和真实网络媲美。
吞吐量是评价一个网络性能高低的重要参数,在对本文所提出的算法进行性能测试时所使用的评价标准就是网络吞吐量。在本文进行的所有测试中,除了传输层所选用的协议以及节点移动性设置以外,包括节点位置信息在内的所有参数均不再变化。表1给出了几项相对重要的仿真场景的参数,这些参数的设置在所有实验中均不改变:
(1)静态场景测试
在图6的仿真场景中,所有节点均不移动,仅改变传输层所使用的协议。当所有节点的传输层均使用NewReno协议时,多次重复实验表明其网络吞吐量维持在185.6kbps;当传输层协议换成基于确认机制实现的Semi-TCP协议时,网络吞吐量维持在49.9kbps;当节点1-4使用NewReno作为传输层协议,而5-9节点使用Semi-TCP协议时,实验结果各不相同,网络吞吐量在49.9kbps到185.6kbps之间波动,多次仿真结果中从未出现高于185.6kbps的情况,但偶尔会低于49.9kbps,这证实了本文的猜想:当一条通信链路中的节点在传输层使用不同的拥塞检测标准和拥塞解决方法时,如果不加以处理,其吞吐量会大大降低。这里取8次重复实验的平均值作为混合场景的网络吞吐量。
表1 场景固定参数
图7 不考虑路由重建时各场景吞吐量对比(bps)
由仿真结果可以发现,在不考虑路由重建时,Ne⁃wReno协议是传输层更好的选择,使用Semi-TCP协议的网络吞吐量较低。在混合场景中,网络吞吐量会受到Semi-TCP/ACK的限制,使得网络吞吐量较之New Reno场景降低了43.6%,当使用本文方法进行中间节点的设置及优化后,较之优化前,网络吞吐量提高了39.0%。
(2)动态场景测试
较之图6的仿真实验,这里设置所有节点具有随机移动的属性,其他参数均不改变,仿真结果如图8所示。
在动态场景中,节点移动会导致路由信息的丢失,NewReno协议的吞吐量大幅降低,而Semi-TCP/ACK的吞吐量则大幅提高,原因在于实验设置的仿真场景中节点的数量较少,而且为了保证实验场景中仅存在一个中间节点,节点初始位置的选择都不是随机设置而导致的。
图8 考虑路由重建时各场景吞吐量对比(bps)
混合场景的性能在这里受到了NewReno协议的限制,原因在于其对拥塞的误判使得发送窗口频频降低,浪费了网络带宽资源。优化前的混合场景在吞吐量方面较之Semi-TCP降低了48.1%,而在优化后的场景中,吞吐量有所提高,较之Semi-TCP仅降低了25.9%。
由于TCP-AP是在TCP发送方检测RTT变化来调整发送速率,因此其性能不会受到通信链路中其他节点传输层所设置的协议种类的影响。
本文对一条通信链路中,当节点传输层使用不同的拥塞检测标准及拥塞解决方法时所产生的影响进行分析,针对传统TCP协议和Semi-TCP协议的共存情况提出一种解决方法,方法能够在不改变传统TCP协议的情况下检测出中间节点。在静态与动态场景的仿真分析中均验证了使用不同拥塞检测标准会导致网络性能下降,并且,当在中间节点进行优化处理时,网络性能会得到提高。本算法在不改变原有传统TCP协议的情况下,使得配置了Semi-TCP协议的节点能够检测出中间节点,并在中间节点对不同发送方向的数据进行适当的延迟发送,提高了混合场景的吞吐量。