Answers:
通常这是因为在您与另一台服务器之间的某个地方存在防火墙,将每个HTTP流限制为10Mbps。使用多线程时,您将获得2x 10Mb(每个线程一个)。
这是由于您与服务器之间的ping操作以及下载软件使用的数据包大小/ tcpip窗口大小。
基本上,如果您对服务器执行100ms ping操作,并请求100kb的数据包,则即使您的Internet速度是无限的,您也只能使用1个连接每秒获得10个数据包。
当您“保持管道满载”时,TCP效果最好—当发送应用程序保持足够快的速度发送缓冲区,以使发送方TCP堆栈不断获得数据时,以便它始终可以在网络上“传输”数据,并且当接收方应用程序保持从接收方TCP堆栈读取数据的速度足够快,以至于接收方TCP窗口永远不会被填满(再次,因此发送方TCP堆栈可以始终使网络上的数据处于“传输中”状态)。
我可以想象一个编写不佳的单线程发送器应用程序,该应用程序将一个缓冲区传递给TCP堆栈,等待它被完全唤醒,然后再传递另一个缓冲区。这意味着,一旦第一个缓冲区的末端在网络上处于“运行中”状态,发送TCP协议栈就会饿死以发送数据,这意味着管道耗尽了,直到Ack回来并且发送应用程序之后才重新填充向其传递一个新的缓冲区。
我还可以想象一个编写不佳的单线程接收器应用程序,它不能足够快地从接收方TCP堆栈中读取数据,从而使TCP堆栈的缓冲区被填满,这意味着TCP窗口被填满,从而导致发送方TCP堆栈停止发送直到窗口打开一些。增大接收器的TCP窗口大小可能会有所帮助,但是为此,真正的解决方案是更快地读取数据。