为什么多 TCP 连接比单 TCP 连接传输快

摘要:
换句话说,是什么原因导致单个TCP连接不尽可能多地使用带宽?是因为不同的TCP连接使用不同的链接吗?在多用户环境中,用户拥有的TCP连接越多,获得的带宽就越大。让我们来看看单个TCP连接的拥塞控制。蓝色部分可用,但尚未发送。根据TCP协议,传输开始后,每次收到确认时,cwnd变量都会加倍。因此,TCP连接启动后应该是这样的。让我们假设有两个相同的TCP连接。

转自:

我观察到,客户端机器从单一服务器使用 HTTP 下载一个文件:
1. 单连接下载,速度没有达到客户端网络的最大带宽;
2. 多连接同时下载,传输速度有极大的提高,带宽被占满。

假设如下前提:
1. 服务器是单一的,没有使用提供相同文件的其它服务器,也没有使用同域名的其它服务器;
2. 服务器不对单个连接限速。

那么,是什么导致多连接下载的速度大为提高呢?换一种说法,是什么原因导致单一 TCP 连接没有尽可能地利用带宽呢?
是因为不同的 TCP 连接使用了不同的链路吗?可是传输层不应该影响网络层的吧?
是因为 TCP 本身的特性吗?那又是怎样的特性导致了这种结果呢?

测试结果:
1. 单连接下载:wget --header='Host: python.org' http://82.94.164.162/ftp/python/3.4.0/Python-3.4.0a3.tar.xz 138 KB/s
2. 多连接下载:aria2c -k 1M -x 16 -s 16 --header='Host: python.org' http://82.94.164.162/ftp/python/3.4.0/Python-3.4.0a3.tar.xz 414KiB/s
3. 国外服务器单连接下载: 2.26 MB/s

补充:文件是下载到内存的(tmpfs),因此避开了并发磁盘 I/O 带来的影响。

=====================================================================================================================

作者:知乎用户
链接:https://www.zhihu.com/question/21813579/answer/19402704
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

简短版本:

TCP特性使得每个TCP连接可以得到均等的带宽。在多用户环境下,一个用户拥有越多TCP连接,获得的带宽越大。

具体来说:

这个涉及到了TCP的拥塞控制。

我们先看一下单TCP连接的拥塞控制。

这是一个TCP连接的发送窗口。
为什么多 TCP 连接比单 TCP 连接传输快第1张

绿色部分为发送者已发送,且接收者已确认(ACKed)。
黄色部分为发送者已发送,但接收者尚未确认("in-flight")。
蓝色部分为可用但尚未发送。
灰色部分为不可用。

所以在RTT(round-trip time,来回通讯延迟)不变的情况下,cwnd这个变量基本决定传输速率。
为什么多 TCP 连接比单 TCP 连接传输快第2张发送者总会试图找到不丢包情况下的最大速率。按照TCP协议,在传输开始之后,每接收到一个确认(ACK)就会把cwnd这个变量增大一倍。所以TCP连接开始之后应该是这个样子。
为什么多 TCP 连接比单 TCP 连接传输快第3张

刚开始的时候传输速率应该是指数被增长的,直到丢包发生。丢包会有两种情况:
1.当接收者发送给发送者的ACK丢失了,这时会触发超时(timeout)。
2.当发送者发送给接收者的数据包丢失了,发送者会收到接收者发来的重复ACK,如果发送者收到了3个重复的ACK,也会认为发生了丢包。

具体对这两种情况采取的措施略有不同,但粗略来说,变量cwnd会被减半,也就是说传输速率减半。然后cwnd会再次增大,直到下次丢包发生。所以忽略最开始,TCP的吞吐量应该是这样。
为什么多 TCP 连接比单 TCP 连接传输快第4张
好,那么现在我们来看多TCP连接的拥塞控制。
我们假设有两条同样的TCP连接。在他们的连接中间有一个共用的瓶颈路由器,带宽为R。
为什么多 TCP 连接比单 TCP 连接传输快第5张假设这两条连接都需要传输足够大量的数据,那么不论他们谁先开始传输,最后一定会均分带宽。
为什么多 TCP 连接比单 TCP 连接传输快第6张

因为如果总传输速率低于R的时候就会不断增大传输速率,某个连接在增大传输速率的时候发生丢包就会减半传输速率,最后趋于平衡。

所以k条经过同一节点TCP连接会平分带宽R,每条连接得到带宽R/k。

正因为如此,不论是以前的net vampire,还是现在的迅雷都采取增加并发连接数的方法来加快下载速度。

references:

免责声明:文章转载自《为什么多 TCP 连接比单 TCP 连接传输快》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#的输入输出流Vue watch监听下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Facebook 开发页面App 流程讲解

在Facebook上的应用程序被加载到一个canvas页面。一个画布页面毫不夸张地说是一个空白的canvas,在Facebook上运行您的应用程序。填充canvas页面提供一个的canvas URL包含HTML,JavaScript和CSS,使您的应用程序。当一个用户请求,我们载入帆布画布页面URL在一个iframe中,该网页上。因为都在iframe中,用...

【Android】WebDav For Android

最近在写一个云备份功能,参考了一下市面上的软件,发现有一种采用WebDav协议的云备份成本比较低,故特地研究一下使用。 服务器提供商是使用国内的坚果云,还是非常良心的。 坚果云官网:https://www.jianguoyun.com 注册账号后,点击账户信息,安全选项中即可看到 第三方应用管理 这里需要三个东西,服务器地址、账户、密码(这个密码是你为应用...

.NET(c#) 移动APP开发平台

转载地址:https://www.cnblogs.com/oudi/p/8288617.html 如果说基于.net的移动开发平台,目前比较流行的可能是xamarin了,不过除了这个,还有一个比xamarin更好用的国内的.net移动开发平台,smobiler,不用学习另外一套开发模式或者搭建复杂的开发环境,smobiler能够让大家像开发传统window...

Dirsearch 快速开始

Dirsearch 一个 web 路径扫描工具 本文版本:v0.4.1(2020.12.8) 安装 下载源代码: git clone https://github.com/maurosoria/dirsearch.git 安装需求的 python 库: cd dirsearch pip3 install -r requirements.txt 或者使用...

【新特性速递】工具栏自动换行,再也不会重叠了!

前言 很多网友都会遇到这个问题,在手机平板等小屏幕设备上,表格分页工具栏右侧的分页信息会和左侧的分页按钮重叠: 一般遇到这种情况,我们会让用户设置 ShowPagingMessage=false 来隐藏右侧的分页信息,示例如下: https://pro.fineui.com/#/gridpaging/gridpaging_database.aspx 但...

网络编程学习小结

几种网络编程方式: ISAPI、CGI、WinInet、Winsock 它们之间的差别: 1) ISAPI主要是开发基于浏览器client与server端程序。效率比CGI方式高,并且也扩展了CGI没有的一些功能。(基于TCP/IP模型中的应用层) 2) CGI主要是开发基于浏览器client与server端程序。(基于TCP/IP模型中的应用层...