
내가 이해하는 바에 따르면 TCP는 데이터 덩어리를 가져와서세그먼트TCP를 통해 전송되는 것세션.
이제 클라이언트로서 서버로 전송하려는 두 개의 데이터 A
청크 가 있다고 가정합니다. B
각 청크는 3개의 세그먼트로 절단되어 총 6개의 세그먼트를 형성합니다.
나는 그 6개의 세그먼트를 인터넷을 통해 보낼 것이지만, 서버가 그것을 수신할 순서를 보장할 수는 없습니다. 다행스럽게도 TCP 서버는 순서가 잘못된 세그먼트를 다시 정렬해 줍니다.
그러나 내 응용 프로그램의 경우 청크 A
와 완전히 독립적이므로 모든 세그먼트가 수신된 경우 B
서버가 세그먼트를 기다리거나 그 반대의 경우도 원하지 않습니다 . 실제로 청크 와 .A
B
A
B
클라이언트와 서버가 병렬적이고 독립적인 TCP 세션을 갖는 것이 가능합니까? TCP 헤더 항목을 보면 "세션 번호"가 없습니다. 다른 소스 또는 대상 포트를 사용해야 합니까?
답변1
물론 동일한 클라이언트와 서버 간에 두 개의 병렬적이고 독립적인 TCP 세션이 있을 수 있습니다. 그렇지 않으면 예를 들어 웹 브라우저는 HTML 페이지와 이미지 하나 또는 웹 서버에서 두 개의 이미지를 동시에 가져올 수 없습니다.
TCP 세션의 판별자는 "세션 번호"가 아니라 튜플입니다.(로컬 주소, 로컬 포트, 원격 주소, 원격 포트). 그 중 적어도 하나가 다른 한 다른 TCP 세션입니다.
따라서 귀하의 질문에 대한 대답으로 예, 다른 소스 또는 대상 포트를 사용해야 합니다. 동일한 소스 및 대상 포트를 사용하려고 하면 TCP 스택이 연결을 거부합니다(EADDRINUSE 오류 발생). 이것은 모두 로컬 주소와 원격 주소가 동일하다고 가정합니다.
그러나 이것은 일반적으로 걱정할 필요가 없습니다. 일반적으로 TCP 개시자(클라이언트)는 특정 포트에 바인딩할 필요가 없습니다. bind()
호출하기 전에 호출하지 않음으로써 커널이 소스 포트를 자동으로 선택하도록 합니다 connect()
. 커널은 두 번째 연결에 대해 다른 소스 포트를 선택합니다.
답변2
허용된 답변은 정확하고 질문에 대한 답변이지만 질문은 여러 TCP 스트림을 사용하는 것과 다른 답변이 있는 문제를 해결합니다.
귀하가 설명하는 "헤드 오브 라인 차단" 문제는 QUIC(Quick UDP Internet Connections) 프로토콜의 동기 중 하나입니다. 시청을 추천합니다이 웹캐스트이것이 어떻게 QUIC와 다른 문제를 해결하는지에 관심이 있다면 Google에서 QUIC에 대해 알아보세요.
물론 있습니다.Wikipedia의 QUIC도.