TCP 클라이언트가 시퀀스 번호가 10000-20000 인 패킷을 TCP 서버로 보내는 경우 tcp는 seq_ack 20001의 ACK로 응답합니다.
클라이언트에서 TCP 패킷을 가로 채서 패킷을 2 tcp 세그먼트로 분할하면 하나는 seq를 10000에서 15000으로, 다른 하나는 seq를 15001에서 20000으로 분리합니다. 그러면이 두 TCP 세그먼트가 TCP 서버로 전송됩니다. 경로에서 두 번째 세그먼트가 손실되었다고 가정하십시오. TCP 서버는 seq_ack 15001로 ACK를 응답합니다.
TCP 클라이언트는 seq 10000에서 20000으로 통합 패킷을 보내지 만 클라이언트의 관점에서 15001으로 ACK를 얻으므로 이상합니다. 어떻게 반응할까요? 이론적으로 클라이언트는 순서 15001에서 20000으로 바이트를 다시 전송해야합니다. 즉 클라이언트가 순서 15001에서 새 패킷을 전송할 것입니다. 그러나 TCP 스택 구현의 실제는 어떻습니까?
TCP 전송 버퍼에서 TCP 세그먼트가 전송되면 세그먼트는 여전히 ACK까지 유지됩니다. ACK가 오면 세그먼트에 대한이 바이트는 버퍼에서 지워집니다. 송신 버퍼에 포인터가 있으며 ACK가 올 때 포인터는 ack_seq가 해당하는 위치를 가리 킵니다. ack_seq 아래에있는 바이트가 지워집니다. 이런 식으로 전체 세그먼트를 재전송 할 필요가 없습니까?