2012-03-30 7 views
8

TCP가 순서대로 배달을 정확히 구현하는지 궁금합니다.TCP는 주문형 데이터 전송을 어떻게 구현합니까?

는이

  1. packet1 전송받은 ACK 이벤트의 목록입니다 말할 수 있습니다.
  2. packet2가 전송되었습니다. ack not received.
  3. packet3이 전송되었습니다.
  4. packet4가 전송되었습니다.
  5. ack4를 수신했습니다.
  6. ack3을 수신했습니다.
  7. ack2를 수신했습니다.

정확하게 순차적으로 발생하는 것을 설명 할 수 있습니까?

답변

7

짧은 대답은 각 패킷에 스트림의 페이로드가있는 위치를 지정하는 오프셋 정보 (시퀀스 번호로 가장함)가 포함되어 있다는 것입니다.

다음과 같은 상황이 발생했다고 가정 해 봅니다. 패킷 1은 수신되고 패킷 2는 수신되지 않으며 패킷 3과 4는 수신됩니다. 이 시점에서 TCP 스택을 수신하면 패킷 3과 4의 내용을 버퍼에서 복사 할 위치를 알고 있으며 이전 데이터를 아직받지 못했기 때문에 패킷 1 데이터를 읽을 수있게 만들지 만 만들 수는 없습니다. 패킷 2가 수신 될 때까지 사용 가능한 패킷 3 또는 4 데이터.

송신 TCP 스택은 일반적으로 다음 패킷을 전송하기 전에 단일 패킷에 대한 수신 확인을 기다리지 않지만 주어진 패킷에 대한 수신 확인을받지 못하면 (그리고 ACK는 효율성을 위해 단일 패킷에 함께 묶을 수 있습니다), ACK를 수신 할 때까지 재전송합니다.

정확한 이벤트 순서는 네트워크 조건, TCP 스택 구현, 선택한 TCP 정책, 소켓 옵션 및 기타 요인에 따라 다릅니다.

enter image description here

그래서 당신이 상황 등을 끝낼 수 :

4

TCP 패킷은 특정 오프셋이 수신되었음을 인정 (메모리에서 시작부터 바이트 오프셋) 시퀀스 번호와 ACK 메시지가 :

data 1 (10 bytes)   -> 
          <- ack (10, data1) 
data 2 (15 bytes)   -> 
data 3 (10 bytes)   -> 
data 4 (8 bytes)   -> 
          <- ack (25, data1/2/3) 
          <- ack (33, data1/2/3/4) 

, 보낸 사람은 버퍼가 가득 지점까지 승인에 관계없이 계속 보낼 수 있습니다 (그것은 그들을 다시 전송해야하는 경우에는 승인되지 않은 패킷을 유지해야한다).

송신과 수신 확인 간의 "연결 해제"는 데이터 흐름을 크게 가속화 할 수 있습니다.

수신 측에서는 패킷이 순서대로 도착하지 못하고 순서대로 상위 수준으로 전달 될 때까지 보관됩니다.

예를 들어, data 3data 2 전에 도착한 경우 data 2이 도착할 때까지 수신 끝이 유지되고 둘 다 위쪽으로 보내집니다.