답변:
일반적으로 이는 사용자와 다른 서버 사이에 각 HTTP 스트림을 10Mbps로 제한하는 방화벽이 있기 때문입니다. 다중 스레드를 사용하면 2x 10Mb (각 스레드 당 하나씩)가 제공됩니다.
이것은 사용자와 서버 사이의 핑과 다운로드 소프트웨어에서 사용하는 패킷 크기 / tcpip 창 크기 때문입니다.
기본적으로 서버에 100ms 핑을 보내고 100kb의 패킷을 요청하는 경우 인터넷 속도가 무한한 경우에도 1 개의 연결을 사용하여 초당 10 개의 패킷 만 얻을 수 있습니다.
TCP는 "파이프를 가득 채운 상태"에서 가장 잘 작동합니다. 송신 응용 프로그램이 송신 버퍼를 빠르게 유지하여 발신자 TCP 스택에 지속적으로 데이터를 제공하여 네트워크에서 항상 "비행 중"데이터를 가질 수있을 때 응용 프로그램은 수신기 TCP 창을 채우지 않을 정도로 수신기 TCP 스택에서 빠르게 읽습니다 (따라서 보내는 TCP 스택은 항상 네트워크에서 데이터를 "비행 중"으로 유지할 수 있습니다).
하나의 버퍼를 TCP 스택으로 전달하고 완전히 승인되었음을 듣고 기다린 다음 다른 버퍼를 전달하는 잘못 작성된 단일 스레드 송신자 앱을 상상할 수 있습니다. 즉, 일단 첫 번째 버퍼의 끝이 네트워크에서 "비행 중"이면 전송 TCP 스택에 데이터를 보낼 굶주림을 의미합니다. 이는 파이프가 배수되고 Ack가 돌아오고 전송 앱이 완료 될 때까지 파이프가 다시 채워지지 않음을 의미합니다. 새 버퍼를 전달합니다.
수신 TCP 스택에서 충분히 빨리 읽지 못하여 TCP 스택의 버퍼가 채워지도록 잘못 작성 된 단일 스레드 수신기 응용 프로그램을 상상할 수 있습니다. 이는 TCP 창이 가득 차서 보내는 TCP 스택을 창이 열릴 때까지 전송을 중지하십시오. 수신자의 TCP 창 크기를 늘리면 약간 도움이 될 수 있지만이 방법의 실제 해결책은 데이터를 더 빨리 읽는 것입니다.
아마도 하나의 연결을 통해서만 많은 양의 데이터를 전송할 수 있기 때문일 것입니다. 그러나 다중 스레드 프로그램에서는 두 개의 연결이 동시에 데이터를 수신하고 얻을 수있는 정보의 양을 두 배로 늘릴 수 있습니다. 예를 들어 다운로드하는 서버의 속도와 같은 몇 가지 제한 사항이 있습니다. 멀티 스레드 다운로더를 작성한 두 사람의 모자는 쓰기가 쉽지 않습니다.