FIN 패킷 도착이 보장되나요?

FIN 패킷 도착이 보장되나요?

4방향 핸드셰이크에는 다음이 포함됩니다.

FIN ------->
<------- ACK
<---x--- FIN (what if this packet is lost?)
ACK ------->

세 번째 패킷이 손실되면 어떻게 됩니까? 다시 전송됩니까? 세 번째 패킷이 전송될 때쯤에는 프로그램이 아마도 소켓을 파괴하여 더 이상 아무것도 보낼 수 없다는 점에 유의하십시오!

답변1

짧은 대답은 패킷 도착이 보장되지 않는다는 것입니다. 여러 가지 조건으로 인해 전송 중에 패킷이 삭제되거나 손실될 수 있습니다. TCP에는 데이터 도착을 보장하는 재시도 규칙이 포함되어 있습니다.

귀하의 시나리오는 반쯤 닫힌 연결입니다. 한쪽은 연결을 닫고, 다른 쪽이 연결을 닫을 때까지만 데이터를 읽을 수 있습니다.

FIN ------>
<------ ACK

FIN 패킷을 보내는 쪽은 연결이 닫힐 때 FIN_WAIT1, FIN_WAIT2 및 TIME_WAIT 상태를 순환합니다. FIN 패킷을 수신한 측은 CLOSE_WAIT에 진입하게 됩니다. 연결을 닫으면 ACK를 받거나 시간이 초과될 때까지 재시도 규칙에 따라 FIN 패킷을 재시도합니다. 두 번째 FIN이 전송될 때까지 연결은 반쯤 닫힌 상태입니다.

<------ FIN
ACK ------>

3개의 패킷으로 연결을 닫을 수 있습니다. 이는 내가 본 프로토콜 덤프에서 흔히 볼 수 있는 것입니다. 경우에 따라 첫 번째 FIN에 대한 응답은 RST(재설정)가 되고 마지막 ACK는 RST로 대체됩니다.

FIN ------>
<------ FIN,ACK
ACK ------>

어떤 경우에는 ACK 대신 RST(재설정)가 전송되고 최종 ACK가 RST로 대체됩니다.

FIN ------>
<------ RST
RST ------>

네트워크 지연으로 인해 양쪽 끝에서 활성 연결을 닫을 수 있습니다. 이 경우 ACK 패킷은 어느 순서로든 전달될 수 있습니다.

<------ FIN
FIN ------>
<------ ACK
ACK ------>

답변2

에서RFC 793:

반 개방형 연결 및 기타 이상 현상

TCP 중 하나가 다른 쪽도 모르게 연결을 닫거나 중단한 경우 또는 결과적으로 발생한 충돌로 인해 연결의 두 끝이 동기화되지 않은 경우 설정된 연결을 "반개방"이라고 합니다. 기억상실 중. 이러한 연결은 어느 방향으로든 데이터를 전송하려고 시도하면 자동으로 재설정됩니다. 그러나 반개방 연결은 이례적일 것으로 예상되며 복구 절차가 약간 포함됩니다.

관련 정보