为什么多线程下载比单线程快?

why*_*why 13 download tcp

我的服务器中有一个大文件。我发现多线程下载可以达到 20Mbs,但单线程可以达到 10Mbps,谁能解释一下?

Mar*_*son 14

通常这是因为在您和其他服务器之间的某个地方有一个防火墙将每个 HTTP 流限制为 10Mbps。当您使用多线程时,您将获得 2x 10Mb(每个线程一个)。


Spi*_*iff 5

当发送应用程序保持足够快地发送缓冲区以保持发送方 TCP 堆栈不断提供数据,以便它始终可以在网络上“传输”数据时,“保持管道充满”\xe2\x80\x94 时,TCP 工作效果最佳,并且当接收方应用程序以足够快的速度从接收方 TCP 堆栈读取数据时,接收方 TCP 窗口永远不会填满(再次强调,因此发送 TCP 堆栈始终可以保持数据在网络上“传输”)。

\n\n

我可以想象一个写得不好的单线程发送器应用程序,它将一个缓冲区传递到 TCP 堆栈,等待听到它已完全确认,然后传递另一个缓冲区。这意味着一旦第一个缓冲区的末尾在网络上“飞行”,发送 TCP 堆栈就会缺乏要发送的数据,这意味着管道会耗尽,并且直到 Ack 返回并且发送方之后才会重新填充。应用程序向其传递一个新的缓冲区。

\n\n

我还可以想象一个写得不好的单线程接收器应用程序,它不能足够快地从接收 TCP 堆栈中读取数据,从而让 TCP 堆栈的缓冲区填满,这意味着 TCP 窗口填满,从而导致发送 TCP 堆栈停止发送,直到窗口打开一些。增加接收方的 TCP 窗口大小可能会有所帮助,但真正的解决方案是更快地读取数据。

\n