我对原因有所怀疑,但我希望有一位在网络方面更有经验的人来解释。
为什么从多个不同位置下载时,某些连接会饱和带宽,而其他连接几乎处于空闲状态,直到主连接完成?
答案1
一般来说,连接速度最快的会获胜。但是,在 Windows 7 之前,网络很乱,性能很差。尝试从 XP 获得超过 20mb/s 的速度,祝你好运。
http://research.microsoft.com/pubs/70189/tr-2005-86.pdf
标准 TCP 拥塞避免算法采用加法增加和乘法减少 (AIMD) 方案。当未检测到数据包丢失时(通过三个重复 ACK 或重传超时),拥塞窗口 (cwnd) 每 RTT 增加一个最大段大小 (MSS)。否则,如果检测到数据包丢失,TCP 发送方将 cwnd 减少一半。在高速和长延迟网络中,需要非常大的窗口(例如数千个数据包)才能充分利用链路容量。因此,标准 TCP 需要许多 RTT 才能在单次丢失事件后恢复发送速率。此外,现在众所周知,平均 TCP 拥塞窗口与数据包丢失率的平方根成反比。
更快的连接拥有更多成功的数据包,因此它的 cwnd/mss 会增加,并获得更多的总连接。
答案2
主动开放的 TCP 将通过测量服务器的响应来测试网络状况。如果路由器缓冲区被另一个连接饱和并导致高延迟,客户端将相应地调整其发送窗口。如果使用经典的拥塞控制方法,客户端将不断增加其发送速率,直到发生掉线。因此,如果使路由器饱和的设备开始出现严重掉线,而新来者没有,那么新来者就有可能强行闯入。
现在,有实验性的、更智能的拥塞控制方法,它们使用延迟作为衡量网络状况的指标,而不是简单地使用丢包率来衡量网络状况。然而,这些新方法有一个坏习惯,那就是被更顽固的传统方法所欺负,后者会占用尽可能多的带宽。
此外,如果 UDP 连接大量存在,它会因为随意散播比特而控制任何网络。根据应用程序的不同,它会不顾网络状况,肆意地使路由器缓冲区饱和。