基于延迟的网络拥塞控制
2018-10-31张健
张 健
(国家计算机网络与信息安全管理中心 黑龙江分中心, 哈尔滨 150001)
引言
一个好的端到端拥塞控制协议必须能达到公平的高吞吐、低延迟传输。虽然过去了三十多年,但现有协议依然在朝着这个方向演进。其中的一个原因就是网络技术随着时代不断发展。自从十年前TCP cubic提出来改善TCP reno在高带宽延迟及链路性能开始,链路的速率得到了明显的改善,并且无线链路也变得更加普遍,并且互联网已经变得更加全球化并且高RTT现象得到有效改善。更快的链路速率意味着许多数据流开始和停止更快,与这些链路共同存在的是那些视频流、大块文件传输的数据流。在这样一个长数据流、短数据流共存的网络中,数据流对于网络的要求并不相同(高吞吐vs低延迟)。大的带宽延迟积链激化了bufferbloat问题。一个更加广阔的互联网导致了不同传输延迟的数据流共享共同的瓶颈。
同时,用户和应用对延迟的敏感程度也在进化。体验质量(QoE)被用来作为网络体验的度量。许多公司投入大量的财力物力改进其服务的QoE。在这样的背景下,作为传输层核心协议的TCP,其拥塞性能的改进对于用户和应用的QoE改进来说是至关重要的。
对于拥塞的研究,自从Reno开始,分为几个脉络。第一个从Reno开始,扩展到Cubic和Compound,依赖于丢包(或者ECN)作为基本的拥塞信号。这些方法通过牺牲了延迟表现来达到更高的吞吐性能。这也使得这些在低延迟数据流混合高吞吐长时间数据流的时候性能堪忧。为了解决这一问题,一些协议,如Vegas、Fast使用延迟而不是丢包作为拥塞信号。不幸的是,这些模式更加倾向于高估延迟,次高延迟是因为ACK压缩、网络抖动以及链路低利用率。并且这些模式与基于丢包的算法同时运行的时,其性能无法保障,因为基于丢包的算法往往会将网络缓存统统填满。第三个脉络是从十年前开始,主要集中在特殊的网络环境和负载情况,而不是针对广义网络进行协议设计。过去几年初见端倪的拥塞控制算法被用在数据中心、蜂窝网络、Web应用、视频流、车载WiFi等。这些特定情况下的拥塞控制往往优于一般的广义TCP拥塞控制协议。第四种脉络是开始于最近,为端到端拥塞控制,这种研究认为拥塞控制的信号和动作空间对于人类工程来说太过于复杂,并且算法相比人类能够做出更好的决策。这些方法定义一个目标函数来引导控制动作收敛到目标函数上。
在许多情况下这些基于目标函数的优化算法性能优于广义的窗口更新的算法。这一类算法的缺点在于,其在线的规则通常难于被人们所理解(比如一个简单的Remy控制器具有200条规则)。在线优化测量相应的网络参数作为优化算法的输入。那么,有没有一种控制算法,即能达到高吞吐、低延迟、保证公平的速率分配、易于被理解、能应用在广义的网络环境和负载下,并且至少与已有的特殊情况下的算法一样好。
本文提出一种端到端的TCP拥塞控制,这种控制算法根据RTT估算TCP遭遇的队列延迟。将网络中的效用建模为优化问题,带入延迟求出最优吞吐。根据该吞吐调整拥塞窗口,直到实际吞吐收敛于最优吞吐。
1 系统建模及算法
在网络中,通常需要数据传输具有高吞吐、低延迟特点。一个好的拥塞控制算法能够在高吞吐的情况下有效避免队列的bufferboat问题,队列有效增加了网络的吞吐,但是同样会引入丢包、延迟等问题。如何控制网络传输过程中的队列长度问题,受到了研究者的关注。在本文中,网络的效用问题定义为max (logλ+εlogd),其中,队列延迟d可以通过网络测量得出,ε为吞吐和延迟之间的权重因子。通过调整ε来调整吞吐和延迟的重要性。
1.1 算法
首先测量队列排队延迟d,然后根据该延迟计算出最优的吞吐λ。如果速率大于当前拥塞窗口支持的速率,降低拥塞窗口,并观察延迟,直到速率降低到λ为止;如果小于当前拥塞窗口支持速率,增加拥塞窗口,规模为1,并观测延迟,直到速率增加到λ为止。
1.2 延迟测量
TCP通信过程中,3个窗口决定速率:发送窗口、拥塞窗口、接收窗口。发送窗口即发送端的可用发送缓存大小;接收窗口为接收端的可用接收缓存大小;拥塞窗口为网络中最多可注入的数据包个数。对于每个ACK,发送者估计当前速率为β=cwnd/RTTs,其中,RTTs是在上一个时间窗τ观测到的最小RTT大小。τ=srtt/2,srtt(smoothedRTT)通过公式SRTT=(β*SRTT) + ((1-β)*RTT)进行计算。用dq=RTTs-RTTmin来估计队列延迟。
2 实验评估
实验评估在Linux系统下进行。在当前版本的Linux中默认拥塞控制函数为Cubic。通过tcp_cong.c中api接口进行调度。在本文中同样通过API的方式调度设计的调度算法,通过sys_ctl命令设置启用。为了理解流到达和离开的行为,本文设置链路参数为:100Mbit/s,20ms RTT和1 BDP缓存,队列机制用fq_codel (一种默认的基于队列延迟的队列调度算法)。编写的TCP发生函数用来产生相应参数的TCP数据流,对应的TCP接收程序接收发送过来的数据,并统计吞吐以及延迟。每个数据流在前10 s每秒都到达,下个十秒数据流离开。统计10个数据流的流量情况,其均值和方差如图2所示。对比实验中对比对象为TCP Cubic算法,其中Tim是本文中设计的算法。
图1 Linux内核中TCP拥塞控制
图2 10个链路吞吐的平均值与偏差
从图2中可以看出Tim的吞吐优于Cubic,特别是方差相对cubic更加稳定。
3 结束语
本文实现了一种基于队列延迟的端对端TCP拥塞控制算法,该算法以最大化网络效用为目标,通过拥塞窗口调整TCP数据流的速率向优化速率方向调整。实验结果显示,本文设计的算法在均值和方差方面具有一定的改善。