转自:

我观察到,客户端机器从单一服务器使用 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

转载于:https://www.cnblogs.com/leonxyzh/p/7446458.html

为什么多 TCP 连接比单 TCP 连接传输快相关推荐

  1. 基于单TCP连接的高吞吐模型设计

    对于服务与服务之间往往需要高效的吞吐的信息交互,但在绝大部分服务应用中为了实现高吞吐交互都是基于连接池模式,即通过多个TCP连接来提高吞吐量,这种设计完全是通过增加IO的读写量来实现高效吞吐. 如果能 ...

  2. TCP协议中的核心知识点,SYN Flood?ISN?滑动窗口?数据重传?拆包粘包?单tcp连接多请求?拥塞管理?(个人收藏学习笔记)

    TCP协议中的核心知识点,滑动窗口?数据重传?拆包粘包?单tcp连接多请求? 1.前言 2.TCP/IP四层结构 3. TCP 3.1 TCP 协议头 3.2 TCP通信过程 3.2.1 建立连接的三 ...

  3. 通过连接实例解读TCP/IP协议

    通过连接实例解读TCP/IP协议 最近狂补基础,猛看TCP/IP协议.不过,书上的东西太抽象了,没有什么数据实例,看了不 久就忘了.于是,搬来一个sniffer,抓了数据包来看,呵呵,结合书里面得讲解 ...

  4. TCP协议三次握手连接四次握手断开和DOS攻击

    转载: http://hi.baidu.com/xgdcisco/blog/item/60da65f70fd8145d342acc28.html: http://blog.csdn.net/losty ...

  5. 5.3 计算机网络传输层之TCP协议(tcp协议特点、tcp报文段首部格式、tcp连接---三次握手、tcp连接释放---四次握手)

    文章目录 1.TCP协议特点 2.TCP报文段的首部格式 3.TCP连接管理 (1)连接的建立 - - - 三次握手 (2)SYN泛洪攻击 4.TCP连接释放----四次握手 5.TCP连接建立和释放 ...

  6. TCP三次握手建立连接的过程

    来源:TCP三次握手建立连接的过程 TCP 是面向连接的协议,所以每次发出的请求都需要对方进行确认.TCP 客户端与 TCP 服务器在通信之前需要完成三次握手才能建立连接. 下面详细讲解三次握手的过程 ...

  7. TCP四次握手释放连接

    一.四次握手的过程 TCP需要三次握手才能建立连接,整个过程如下图所示: 假设A运行的是TCP客户端进程,而B运行的是TCP服务端进程.最开始的时候两端的TCP进程都处于ESTABLISHED(已建立 ...

  8. tcp协议中的长连接和短连接服务器,谈谈HTTP协议中的短轮询、长轮询、长连接和短链接...

    undefined 在之前总结 WebSocket 的时候就已经提到过短长轮询了~~今天看公众号文章,又把长短连接引进来一起分析.感觉这种总结很棒,那么我们一起看看呗 长短连接 听说长短连接的话,应该 ...

  9. tcp长连接和短连接的区别_TCP --- 连接

    一个TCP连接由4个元组组成:2个ip地址和2个端口号 tcp三次握手 为什么是三次握手 解决历史连接问题 通过三次握手才能阻止重复历史连接的初始化 通过三次握手,才能对通讯双方的初始序号初始化 如果 ...

最新文章

  1. [Matlab] 线性卷积圆周卷积代码实现
  2. 【BZOJ-1113】海报PLA 单调栈
  3. GPS服务端解析程序编写日记
  4. pb string最大长度_跑马备赛训练计划大盘点,助你跑出PB
  5. [渝粤教育] 中国地质大学 工业卫生技术 复习题 (2)
  6. Python3.8安装 jupyter报错 NotImplementedError
  7. layui select动态赋值_layui与 VUE 配合使用时动态渲染 select 坑
  8. redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
  9. 上世纪军用设备仍在继续使用,美军E-3G预警机升级改造后易被黑客攻击
  10. 高性能web建站规则(将js放在页面底部)
  11. 【金蝶K3】新/老单据转换流程相关表说明(单据转换流程下推老单,钩稽关系可为严格控制)
  12. E-BOM和M-BOM的区别
  13. 数据挖掘项目---航空公司客户价值分析
  14. 电脑重装系统蓝屏是什么原因
  15. npm常用命令(持续更新)
  16. excel 冻结多列窗口
  17. 小学教师听课体会 计算机,小学教师观有效课堂听课心得体会
  18. 智能餐厅摆动手势点餐人脸识别支付
  19. 小红书怎么做关键词搜索排名?哪些行业适合在小红书推广?
  20. 通信中间件DDS介绍(一)

热门文章

  1. hdu 4608 I-number
  2. OpenCV 【十六】RNG随机数发生器putText绘制文字
  3. ubuntu添加sudo权限
  4. 为什么jdk源码推荐ThreadLocal使用static
  5. 不同版本浏览器前端标准兼容性对照表以及CORS解决跨域和CSRF安全问题解决方案
  6. CDMA模块上网设置的过程
  7. 如果有大型 Web 应用程序,可考虑执行预批编译
  8. 程序在内存中运行的奥秘
  9. Windows下创建进程简介
  10. OpenFace库(Tadas Baltrusaitis)中基于HOG进行正脸人脸检测的测试代码