연결의 한쪽 끝에서 TCP 연결이 닫히면 다른 쪽 끝은 를 수신 FIN
하고 로 응답합니다 ACK
. 그런 다음 연결의 끝이 CLOSE_WAIT
상태에 들어갑니다. 이 끝에서 호출 되면 close()
TCP는 FIN
패킷을 보내고 상태에 들어갑니다 LAST_ACK
. 그러나 결코 TIME_WAIT
상태에 들어 가지 않습니다.
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는 패킷을 수신하고 . 그런 다음 상태에 들어갑니다.FIN
LAST_ACK
FIN
ACK
CLOSING
다른 쪽 끝에서는 호스트 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
잘못된 순서를 실제로 수신한 것으로 간주하지 않기 때문에 상태에 도달하지 않습니다 .FIN
ACK