加载中...
返回

TCP加速技术简述

传输控制协议(TCP)是我们的老朋友了,它力求在不可靠的IP网络上实现可靠的数据传输,也就是使得数据包有序、无丢失和不重复,因此,引入了如校验、序号、确认、重传等机制。同时,这位老朋友也是比较负责任的,在网络拥挤时,为了不使情况雪上加霜,它引入了慢启动、拥塞避免等机制。

现在的网络世界中,我们日常进行的网页浏览、游戏、视频等活动都离不开TCP。随着网络的发展,网络上面承载的数据包越来越多,在为多数人所共享的广域网上,在人们上网的高峰期,网络会存在一定的拥塞,反映到我们的上网体验上,就是延迟和丢包。加载个网页要花掉十几秒、玩个王者荣耀时不时延迟200+、看视频卡顿等,除了设备的问题,恐怕网络拥塞难辞其咎。在这样的背景之下,TCP加速技术也就产生和发展了。

实际上,TCP加速也不是一个新的概念了,十几年前就有相关的研究,但是这一理念在现今的背景下显得较有意义,我们对其进行一些学习和实践,大概不算是浪费时间的。

两种方案

TCP加速可以从几个角度来进行分类,较为常见且易懂的是从加速方案的部署位置来分。如果只在客户/服务器的某一边来部署TCP加速,就叫做 单边加速 ,如果双方都要部署,就叫做 双边加速 。两种方案一般有不同的使用场景,单边加速常部署在服务端上,这样就能透明地提升用户的访问体验;双边加速常常是双方协商好的一套加速方案,因此不能做到透明,可以用在客户端和服务端都可控的场景中,比如在个人云服务器上运行着某项服务,此时可以在自己的客户端PC和服务端都部署TCP加速,来改善访问体验。

单边加速概述

单边加速方案只需要由客户或服务端的一方来部署,比较简单,且对对方是透明的。我们首先要知道TCP是怎么工作的:在 协议规定 的运行模式下,发送方的系统 产生和处理数据把数据交给网卡 、网卡发送数据,接收方接收数据、把数据交给系统、处理数据。从这一套流程中,我们应该发现几个可以下手的地方,每个地方都尝试一下,我们对TCP加速的认识也就差不多了。

数据包处理优化

说是数据包处理优化,其实就是所谓的“网络性能优化”。这个概念跟TCP协议本身没有太多关系,主要是针对收发数据双方的硬件、操作系统等进行优化。

减少复制

按照上面说过的流程,发送方的系统要产生和处理数据,然后把数据交给网卡。这一步是一个复制的过程,也就是将数据从系统或者应用程序所在的内存空间复制了一份到网卡的内存空间。这一步是可以优化的,有下面这几种办法。

直接访问网卡存储空间 。这种方案取消了复制,而采用地址映射或直接访问的办法,相当于将网卡看作了操作系统的一部分。为了实现这种方案,网卡要具备一定的智能性,否则无法支持多应用的访问,也无法在合适的时机传递数据。

与网卡共享存储区域 。让网卡用DMA或其他什么方式来访问内核内存空间,比上面的方案简单一些,对网卡的要求少一些。

其他各种内存映射方案 。内存映射可以实现应用、网卡和内核三者的内存共享,无论是什么内存映射方案,核心都是减少复制。

减少中断

系统要把数据交给网卡,或者网卡收到数据要交给系统的时候,一般都会触发中断。操作系统处理中断是需要花费时间的,因此这一步也是可以优化的。

将异步触发变为轮询 。有些研究者将TCP/IP的处理放置到一台单独的设备上,这样,就可以将协议数据的收发处理由中断的方式改变为比较简单的系统轮询。轮询的频率是要仔细调整的,太慢则数据处理产生延迟,太快则系统负载过大。

中断合并 。中断合并就是将多个中断合并到一起处理,也就是不在每次收到数据时产生中断,而是在数据积累到一定的量时再产生一次中断。这种方案使得延迟跟报文长度有关系了,且在处理数据的时候可能一次处理了多个报文,应用程序的调度也受到一些影响。

增加单个报文的长度 。思想和中断合并是类似的,就是将报文数据积累到一定长度再发送。但这一步是交给上层协议来完成的,跟中断合并时有区别的。

报文过滤 。总会有一些报文是没意义的,比如一些广播数据、一些没用的UDP报文,这些数据直接交给网卡来过滤,就能够减少中断。

用户级传输协议

传统的协议处理是在用户空间内完成的,因此要减少复制,只能引入各种内存映射或共享的方案。人们可以在用户空间实现传输层的协议,节省了数据复制的时间。

TCP卸载引擎

将软件执行转移到硬件执行,一直是性能优化的不二法门。如果在网卡硬件上运行一些特殊的系统,使得数据处理等步骤直接由网卡完成,那末系统的负载就小了,执行起来就快了。

TCP卸载引擎的缺点是存在的,那就是网卡硬件性能的提升要与系统其他硬件保持同步,否则还是可能成为传输速度的瓶颈;当然,要在网卡上实现数据处理的系统,本身的硬件和软件的设计难度也是很大的。

协议细节优化

数据包处理优化实际上就是针对机器本身的“网络性能优化”,而协议细节的优化才真正关乎TCP协议本身。

拥塞控制优化

TCP的拥塞控制机制我们是熟悉的,那就是:慢启动、拥塞避免(加法增加、乘法减少)。其实在这两个机制的基础上,延伸出的快重传和快恢复也属于拥塞控制的优化,当然我们还要有更多的尝试。

针对拥塞状态的判断 。我们如何判断网络是否拥塞呢?TCP协议一般以超时和重复ACK为标准。超时意味着不仅自己的数据没有到达,对方的重复ACK也没有到达,网络的拥塞情况已经比较严重了,因此传统的处理方法是将发送窗口减到 1 ,阈值减半,重新开始慢启动。重复ACK意味着自己的数据没有到达,对方的ACK可以到达,网络的拥塞情况还不那么严重,因此传统的处理方法是将阈值减半,发送窗口减到阈值大小,重新加法增加。慢启动和加法增加都是保守的,对带宽不一定有充分的利用,尤其当网络出现了小波动的时候,如果误判为拥塞,就会导致传输速度骤降,而带宽空闲。

有若干种针对拥塞状态的判断方案,例如zetaTCP使用了动态学习的方法判断拥塞,过滤非拥塞情况引起的丢包现象,预判拥塞丢包的概率并基于这一概率直接重传。Fast TCP结合延迟信息反馈来判断拥塞,Westwood结合带宽测量的技术来判断拥塞。

参数调节

TCP协议的参数是指预先写好的、控制协议工作的一些参数,如用于进行拥塞避免的拥塞窗口阈值,用于传输数据的MTU,用于判断超时的超时时间等。针对这些参数进行仔细的调节,可以一定程度达到TCP加速的目的。

并行TCP

并行TCP的理念是将原本的一条TCP连接修改为多条TCP连接,将原本使用一条连接来传输的数据放在多条连接上传输。这种思路归根到底是对拥塞避免算法的改造,原本一条连接上的拥塞避免算法,其强度在改为多条连接之后得到了削弱。例如原本的拥塞窗口是 N ,改成 k 条连接之后就成了 kN ,每次在拥塞避免时还是只把阈值减少 N/2 ,对总的窗口的影响就没那么大了。

双边加速——以UDP Speeder为例

双边加速要求在客户端和服务端都部署相同的加速方案,常规思路是把复杂的TCP协议转化为私有的协议。使用私有协议,可以对数据包处理、重传/拥塞避免等机制进行调整,从而达到加速的目的。

以开源的 UDP Speeder 为例,该系统在客户-服务器之间架设了一条隧道,在隧道中传输的数据使用了前向纠错编码,使得数据即便在传输过程中产生了一些错误和丢失,也能通过冗余的编码数据来把原始数据恢复过来。

在客户端,UDP Speeder会开放一个监听端口,监听用户给到的数据;会开放一个发送端口,用于把数据发送到远端服务。监听端口收到数据之后,首先进行编码等处理,然后将数据通过发送端口发送出去。

在服务端,UDP Speeder也会开放一个监听端口,监听来自广域网的数据;根据收到的数据管理连接,每个连接对应一个独立的发送端口,用于把该连接的数据发送给服务程序。监听端口收到广域网传来的数据后,首先进行解码,纠错/恢复传输过程中收到影响的部分,然后送到该连接对应的发送端口,发送给服务程序。

从UDP Speeder中,我们看到双边TCP加速的基本理念,就是针对数据进行一个双方协商好的处理,其目的是提高带宽的利用效率,减少不必要的数据重传等。UDP Speeder只能实现针对UDP数据的加速,但是配合基于UDP的VPN程序,如Open VPN等,可以实现对TCP的加速。

我对UDP Speeder的源码进行了分析,如果希望更加细致的了解它的工作流程,下面的两张图可以起到帮助:

参考资料

[1] 王圣,苏金树.TCP加速技术研究综述[J].软件学报,2004,15(11):1689-1697

[2] 王建新,彭娜.广域网加速技术研究综述[J].技术交流.2009,5

[3] 钟琳华.深度解析ZetaTCP单边加速技术[J].技术研发.2015

[4] David X. Wei,Cheng Jin,Steven H. Low, et al.FAST TCP: Motivation, Architecture, Algorithms,Performance[J].IEEE/ACM TRANSACTIONS ON NETWORKING,2006,14(6):1246-1258

[5] Giuseppe Siracusano,Roberto Bifulco,Simon Kuenzer et al.On-the-Fly TCP Acceleration with Miniproxy[J].Extended version of paper published in ACM HotMiddlebox.2016,5.

[6] Tom Kelly.Scalable TCP: Improving Performance in Highspeed Wide Area Networks[J].2002,12.

[7] 蒋建军,陆平.基于 TCP 协议加速的单边加速模型研究与实现[J].信息技术,2015(2):160-164

[8] 林睿.基于 4G 核心网透明代理进行 TCP加速的效果分析[J].通信设计与应用.2020,2.

[9] 彭娜.并行TCP在广域网加速系统中的研究与实现[D].中南大学.2009.

[10] 赵欣,时向泉,吴纯青.支持TCP/IP卸载引擎的协议栈的设计与实现[J].微电子学与计算机,2006(S1)

[11] S.Floyd.RFC.3649.HighSpeed TCP.2003

有朋自远方来,不亦说乎?
Built with Hugo
Theme Stack designed by Jimmy