LAST_ACK가 CLOSE_WAIT를 입력하지 않는 이유는 무엇입니까?

LAST_ACK가 CLOSE_WAIT를 입력하지 않는 이유는 무엇입니까?

연결의 한쪽 끝에서 TCP 연결이 닫히면 다른 쪽 끝은 를 수신 FIN하고 로 응답합니다 ACK. 그런 다음 연결의 끝이 CLOSE_WAIT상태에 들어갑니다. 이 끝에서 호출 되면 close()TCP는 FIN패킷을 보내고 상태에 들어갑니다 LAST_ACK. 그러나 결코 TIME_WAIT상태에 들어 가지 않습니다.

TCP 상태 전환 다이어그램

close()이제 Host A가 소켓을 호출하고 Host B로 패킷을 보낸다고 가정해 보겠습니다 FIN. Host A는 FIN_WAIT_1해당 상태에 들어갑니다. 호스트 B는 FIN패킷을 수신하고 전송 ACK한 후 CLOSE_WAIT상태에 들어갑니다. 그러나 ACK는 업스트림 라우터 어딘가에 삭제됩니다.

그 사이에 호스트 B는 호출 close()(호스트 B가 해당 상태에 있음을 기억 )하고 호스트 A에 패킷을 CLOSE_WAIT보냅니다 . 이제 호스트 B는 상태에 들어갑니다. 호스트 A는 패킷을 수신하고 . 그런 다음 상태에 들어갑니다.FINLAST_ACKFINACKCLOSING

다른 쪽 끝에서는 호스트 B가 여전히 LAST_ACK상태에 있습니다. 그런 다음 ACK호스트 A로부터 메시지를 수신 하고 해당 CLOSED상태로 들어갑니다. 호스트 B에서 호스트 A로의 패킷이 ACK삭제되었으며 호스트 A가 해당 FIN패킷을 재전송하지 않았다는 점을 기억하십시오. 호스트 A는 FIN시간 초과 시 패킷을 다시 전송하지만 호스트 B는 연결을 닫았습니다.

이제 호스트 A가 해당 상태에 멈춰 있습니까 CLOSING? 연결 해제가 계속될 수 있나요? 다음에는 어떻게 되나요?

답변1

내 TCP는 약간 녹슬었지만 다음과 같이 작동한다고 생각합니다.

호스트 B가 를 호출 close()하고 전송 하면 FIN해당 시퀀스 번호는 FIN호스트 B에서 패킷을 놓쳤다는 것을 호스트 A에 표시합니다. 따라서 호스트 A는 호스트 B의 응답을 확인하지 않고 FIN마지막 TCP 세그먼트를 계속 응답합니다. 호스트 B로부터 성공적으로 수신되었습니다. 그러면 호스트 B가 누락된 ACK.

따라서 호스트 A는 이전에 누락된 항목을 수신할 때까지 CLOSING잘못된 순서를 실제로 수신한 것으로 간주하지 않기 때문에 상태에 도달하지 않습니다 .FINACK

관련 정보