为什么多 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连接的发送窗口。
<img src="https://pic3.zhimg.com/ac38d18e3cd9c7941bbd753fe37bbbba_b.jpg" data-rawwidth="434" data-rawheight="309" class="origin_image zh-lightbox-thumb" width="434" data-original="https://pic3.zhimg.com/ac38d18e3cd9c7941bbd753fe37bbbba_r.jpg">
绿色部分为发送者已发送,且接收者已确认(ACKed)。
黄色部分为发送者已发送,但接收者尚未确认("in-flight")。
蓝色部分为可用但尚未发送。
灰色部分为不可用。
所以在RTT(round-trip time,来回通讯延迟)不变的情况下,cwnd这个变量基本决定传输速率。
<img src="https://pic3.zhimg.com/382de3cc7379025d169f7e3264368252_b.jpg" data-rawwidth="401" data-rawheight="105" class="content_image" width="401">发送者总会试图找到不丢包情况下的最大速率。按照TCP协议,在传输开始之后,每接收到一个确认(ACK)就会把cwnd这个变量增大一倍。所以TCP连接开始之后应该是这个样子。发送者总会试图找到不丢包情况下的最大速率。按照TCP协议,在传输开始之后,每接收到一个确认(ACK)就会把cwnd这个变量增大一倍。所以TCP连接开始之后应该是这个样子。
<img src="https://pic2.zhimg.com/d6eceab08d6e7e33b62f918502c2558d_b.jpg" data-rawwidth="519" data-rawheight="508" class="origin_image zh-lightbox-thumb" width="519" data-original="https://pic2.zhimg.com/d6eceab08d6e7e33b62f918502c2558d_r.jpg">刚开始的时候传输速率应该是指数被增长的,直到丢包发生。丢包会有两种情况:
刚开始的时候传输速率应该是指数被增长的,直到丢包发生。丢包会有两种情况:
1.当接收者发送给发送者的ACK丢失了,这时会触发超时(timeout)。
2.当发送者发送给接收者的数据包丢失了,发送者会收到接收者发来的重复ACK,如果发送者收到了3个重复的ACK,也会认为发生了丢包。
具体对这两种情况采取的措施略有不同,但粗略来说,变量cwnd会被减半,也就是说传输速率减半。然后cwnd会再次增大,直到下次丢包发生。所以忽略最开始,TCP的吞吐量应该是这样。
<img src="https://pic2.zhimg.com/931df6c47759a69e63cfd37c82594b21_b.jpg" data-rawwidth="663" data-rawheight="329" class="origin_image zh-lightbox-thumb" width="663" data-original="https://pic2.zhimg.com/931df6c47759a69e63cfd37c82594b21_r.jpg">
好,那么现在我们来看多TCP连接的拥塞控制。
我们假设有两条同样的TCP连接。在他们的连接中间有一个共用的瓶颈路由器,带宽为R。
<img src="https://pic3.zhimg.com/91b2492e537591557e5009f814aefef2_b.jpg" data-rawwidth="807" data-rawheight="410" class="origin_image zh-lightbox-thumb" width="807" data-original="https://pic3.zhimg.com/91b2492e537591557e5009f814aefef2_r.jpg">假设这两条连接都需要传输足够大量的数据,那么不论他们谁先开始传输,最后一定会均分带宽。假设这两条连接都需要传输足够大量的数据,那么不论他们谁先开始传输,最后一定会均分带宽。
<img src="https://pic4.zhimg.com/6dab723d3bbdffb03c748a1b69bba2df_b.jpg" data-rawwidth="853" data-rawheight="489" class="origin_image zh-lightbox-thumb" width="853" data-original="https://pic4.zhimg.com/6dab723d3bbdffb03c748a1b69bba2df_r.jpg">因为如果总传输速率低于R的时候就会不断增大传输速率,某个连接在增大传输速率的时候发生丢包就会减半传输速率,最后趋于平衡。
因为如果总传输速率低于R的时候就会不断增大传输速率,某个连接在增大传输速率的时候发生丢包就会减半传输速率,最后趋于平衡。
所以k条经过同一节点TCP连接会平分带宽R,每条连接得到带宽R/k。
正因为如此,不论是以前的net vampire,还是现在的迅雷都采取增加并发连接数的方法来加快下载速度。
references:
- James F. Kurose, Keith W. Ross: Computer Networking: A Top-Down Approach
为什么多 TCP 连接比单 TCP 连接传输快的更多相关文章
- unp第七章补充之TCP半开连接与半闭连接
半打开(Half-Open)连接和半关闭(Half-Close)连接.TCP是一个全双工(Full-Duplex)协议,因此这里的半连接"半"字就是相对于全双工的"全&q ...
- TCP半开连接与半闭连接
半打开(Half-Open)连接和半关闭(Half-Close)连接.TCP是一个全双工(Full-Duplex)协议,因此这里的半连接"半"字就是相对于全双工的"全&q ...
- TCP同步与异步,长连接与短连接【转载】
原文地址:TCP同步与异步,长连接与短连接作者:1984346023 [转载说明:http://zjj1211.blog.51cto.com/1812544/373896 这是今天看到的一篇讲到T ...
- HTTP协议用的TCP但是只建立单向连接
作者:IronTech链接:https://www.zhihu.com/question/20085992/answer/71742030来源:知乎著作权归作者所有,转载请联系作者获得授权. 下面的解 ...
- TCP\IP三次握手连接,四次握手断开分析
TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标 ...
- Http 和TCP的关系,TCP长连接和短连接有什么区别?
HTTP 协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用.由于HTTP在 ...
- SQL Server 连接问题-TCP/IP
原文:SQL Server 连接问题-TCP/IP 出自:http://blogs.msdn.com/b/apgcdsd/archive/2012/02/24/ms-sql-server-tcp-ip ...
- TCP/IP协议--TCP协议概括和TCP连接的建立和终止
TCP提供一种面向连接的.可靠的字节流服务.面向连接指,发送和接收方在交换数据前必须建立一个TCP连接.顺便说下,一个TCP连接只有两方,因此广播和多播是不能应用于TCP的.字节流指,两个应用程序通过 ...
- 【转】关于TCP 半连接队列和全连接队列
摘要: # 关于TCP 半连接队列和全连接队列 > 最近碰到一个client端连接异常问题,然后定位分析并查阅各种资料文章,对TCP连接队列有个深入的理解 > > 查资料过程中发现没 ...
随机推荐
- open cursor too much error
今天遇到一个错误ORA-01000: maximum open cursors exceeded. 客户想增加 DB 的open_cursor这个参数. 但是我看了下,她的程序要打开几千个cursor ...
- Spring源代码解析和配置文件载入
Spring类的继承结构图: Spring运用了大量的模板方法模式和策略模式,所以各位看源代码的时候,务必留意,每个继承的层次都有不同的作用.然后将同样的地方抽取出来,依赖抽象将不同的处理依照不同的策 ...
- ASP.NET MVC 认证模块报错:“System.Configuration.Provider.ProviderException: 未启用角色管理器功能“
新建MVC4项目的时候 选 Internet 应用程序的话,出来的示例项目就自带了默认的登录认证等功能.如果选空或者基本,就没有. 如果没有,现在又想加进去,怎么办呢? 抄啊.将示例项目的代码原原本本 ...
- oc33--构造方法2
// Person.h #import <Foundation/Foundation.h> @interface Person : NSObject @property int age; ...
- Head First 设计模式 —— 策略设计模式
创建一个能够根据所传递的参数对象的不同而具有不同行为(动态绑定的多态机制)的方法,被称为策略设计模式.
- bzoj3033 太鼓达人——欧拉图搜索
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3033 考虑那 (1<<k) 个数,要形成答案,必然是相邻两个数间有 k-1 个重 ...
- 迭代,IDA*
1.codevs1288 题意:对于一个分数a/b(a!=1),将它表示为1/x + 1/y + 1/z ……的形式,x,y,z……互不相同 多解取加数少的,加数相同时,取最小的分数最大的. 思路:经 ...
- [NOI2015,LuoguP2146]软件包管理器------树剖
***题目链接戳我*** 又是在树上瞎搞滴题目.... 我们如果以安装的软件为1,未安装的软件为0,那么软件改变的数量即树上权值总和的数量,涉及到区间修改,区间查询,考虑树剖 分析完毕,似乎没啥好说的 ...
- 【PostgreSQL-9.6.3】extract函数
extract函数格式: extract (field from source) extract函数是从日期或者时间数值里面抽取子域,比如年.月.日等.source必须是timestamp.time. ...
- WEB笔记-3、盒子模型+定位+显示
3.1 盒子模型 边距控制 margin/padding:上 右 下 左: padding:内容和边距之间的空间 margin:”盒子“外撑开的空间,两个相邻标签外边距会出现重叠和累加的现象, ...