Geralmente, isso acontece porque, em algum lugar entre você e o outro servidor, há um firewall que limita cada fluxo HTTP a 10Mbps. Quando você usa multi-thread, você recebe 2x 10Mb (um para cada thread).
Existe um arquivo grande no meu servidor. Eu acho que o download multi thread pode obter 20Mbs, mas único segmento pode obter 10Mbps, alguém pode explicar isso?
Geralmente, isso acontece porque, em algum lugar entre você e o outro servidor, há um firewall que limita cada fluxo HTTP a 10Mbps. Quando você usa multi-thread, você recebe 2x 10Mb (um para cada thread).
Isso se deve ao seu ping entre você e o servidor e o tamanho do pacote / tamanho da janela do tcpip usado pelo seu software de download.
Basicamente, se você tem 100ms de ping no servidor, e solicita pacotes de 100kb, você só pode receber 10 pacotes por segundo usando 1 conexão, mesmo que sua velocidade de internet seja infinita.
O TCP funciona melhor quando você "mantém o pipe cheio" - quando o aplicativo de envio continua enviando buffers com rapidez suficiente para manter a pilha TCP do remetente constantemente suprida de dados para que sempre tenha dados "em trânsito" na rede e quando o aplicativo receptor mantém a leitura da pilha TCP do receptor rápida o suficiente para que a janela TCP do receptor nunca seja preenchida (novamente, para que a pilha TCP de envio possa sempre manter os dados "em movimento" na rede).
Eu poderia imaginar um aplicativo remetente de thread único mal escrito que passa um buffer para a pilha TCP, aguarda para saber que ele está totalmente ativado e passa outro buffer. Isso significa que, uma vez que o final do primeiro buffer está "em andamento" na rede, a pilha TCP que está enviando está com falta de dados para enviar, o que significa que o cano é drenado e não é recarregado até que o Ack volte e o aplicativo de envio passa um novo buffer.
Também posso imaginar um aplicativo receptor de thread único mal escrito que não lê a pilha TCP de recebimento rápido o suficiente e, portanto, permite o preenchimento dos buffers da pilha TCP, o que significa que a janela TCP é preenchida, o que causa o envio Pilha TCP para parar de enviar até que a janela abra alguns. Aumentar o tamanho da janela TCP do receptor pode ajudar um pouco, mas a solução real para isso é ler os dados mais rapidamente.
Bem, provavelmente é porque você só pode transferir muitos dados em uma conexão. No entanto, em um programa multi-threaded você pode ter duas conexões recebendo dados ao mesmo tempo e duplicando a quantidade de informações que você pode obter. Existem algumas limitações para isso, por exemplo, a velocidade do servidor que você está baixando de ... Hats off dois quem escreveu o downloader multi-threaded, aqueles não são fáceis de escrever.