转自:https://www.zhihu.com/questio...python
TCP特性使得每一个TCP链接能够获得均等的带宽。在多用户环境下,一个用户拥有越多TCP链接,得到的带宽越大。
具体来讲:
这个涉及到了TCP的拥塞控制。
咱们先看一下单TCP链接的拥塞控制。
这是一个TCP链接的发送窗口。服务器
绿色部分为发送者已发送,且接收者已确认(ACKed)。
黄色部分为发送者已发送,但接收者还没有确认("in-flight")。
蓝色部分为可用但还没有发送。
灰色部分为不可用。因此在RTT(round-trip time,来回通信延迟)不变的状况下,cwnd这个变量基本决定传输速率。网络
发送者总会试图找到不丢包状况下的最大速率。按照TCP协议,在传输开始以后,每接收到一个确认(ACK)就会把cwnd这个变量增大一倍。因此TCP链接开始以后应该是这个样子。并发
刚开始的时候传输速率应该是指数被增加的,直到丢包发生。丢包会有两种状况:
1.当接收者发送给发送者的ACK丢失了,这时会触发超时(timeout)。
2.当发送者发送给接收者的数据包丢失了,发送者会收到接收者发来的重复ACK,若是发送者收到了3个重复的ACK,也会认为发生了丢包。性能
具体对这两种状况采起的措施略有不一样,但粗略来讲,变量cwnd会被减半,也就是说传输速率减半。而后cwnd会再次增大,直到下次丢包发生。因此忽略最开始,TCP的吞吐量应该是这样。spa
好,那么如今咱们来看多TCP链接的拥塞控制。
咱们假设有两条一样的TCP链接。在他们的链接中间有一个共用的瓶颈路由器,带宽为R。blog
假设这两条链接都须要传输足够大量的数据,那么不论他们谁先开始传输,最后必定会均分带宽。ip
由于若是总传输速率低于R的时候就会不断增大传输速率,某个链接在增大传输速率的时候发生丢包就会减半传输速率,最后趋于平衡。
因此k条通过同一节点TCP链接会平分带宽R,每条链接获得带宽R/k。正由于如此,不管是之前的net vampire,仍是如今的迅雷都采起增长并发链接数的方法来加快下载速度。内存
在不存在链路争用的状况下,单链接能够作到和多链接同样快。
例如,我这里局域网用的是百兆交换机,下载文件到内存,能够达到11.3MB/s:路由
百兆的理论速率是12.5MB/s(100Mbps),考虑到帧间隔、不一样包长等因素,这个速率比较接近理论速率了。
在此状况下,“多链接比单链接下载快”并不成立,或者说,只有很小的性能提高。
推而广之,假设你的PC和http://python.org的服务器之间的全部交换设备(路由器、防火墙、交换机等),都只为你的这个下载提供服务,等价于你独占这整个传输通道的所有带宽,此时,单链接下载也不会比多链接下载慢多少。
问题是,这些中间设备,一般服务于成千上百(万)的用户,带宽是供全部的用户共享使用的。路由器的带宽有限,没法保证每一个链接都按照它所能支持的最大速率进行传输,即使不考虑路由器自己作的流量控制功能,单单这成百上千(万)的用户访问所造成的TCP链接之间的竞争,就会产生如1楼所说的,各链接均分整个带宽的状况。
所以,现实环境下,因为传输网络的带宽有限,一般各个链接会均分带宽,致使单链接下载时速率较低,而多链接下载时速率较高。