← 질문 목록
#312깊이 0
TCP 연결은 어떤 상태를 지나 닫히는가?
양쪽이 각자 닫아야 해서 한 번에 안 끝난다. 먼저 닫는 쪽과 받는 쪽이 서로 다른 상태를 지난다.
연결됨
FIN_WAIT_1
먼저 닫는 쪽이 FIN을 보낸다
FIN_WAIT_1
FIN_WAIT_2
상대가 그 FIN에 ACK만 보낸다
FIN_WAIT_2
TIME_WAIT
상대도 다 보내고 FIN을 보낸다
TIME_WAIT
닫힘
2MSL을 기다린 뒤 없앤다
받는 쪽은 다른 길을 간다. FIN을 받으면 CLOSE_WAIT로 가서 아직 보낼 것을 마저 보낸다. 다 보내고 자기 FIN을 보내면 LAST_ACK가 되고, 마지막 ACK를 받으면 닫힌다.
CLOSE_WAIT가 쌓여 있으면 상대 탓이 아니다. 내 쪽 코드가 소켓을 안 닫고 있다는 뜻이다.
TIME_WAIT가 필요한 이유는 마지막 ACK가 유실될 수 있어서다. 그러면 상대가 FIN을 다시 보내는데, 그때 응답할 쪽이 남아 있어야 한다. 그 사이 늦게 도착한 옛 패킷이 새 연결로 섞이는 것도 막는다.
TIME_WAIT는 먼저 닫은 쪽에 생긴다. 서버에 쌓였다면 서버가 먼저 끊고 있다는 신호다. 양쪽이 동시에 닫으면 둘 다 생긴다.
추천 꼬리질문
관련 질문
- TCP 연결을 끊을 때 TIME_WAIT 상태가 필요한 이유는?네트워크종료 시 지나는 상태 흐름을 알아야 그중 TIME_WAIT의 필요성 논의가 읽힌다
- TCP 연결 종료는 왜 대개 네 번 주고받는가?네트워크같은 TCP 종료 절차를 메시지 교환 관점과 상태 전이 관점에서 각각 다룬다
- TIME_WAIT 포트 고갈은 어떻게 진단하는가?네트워크TCP 종료 상태(TIME_WAIT 포함)라는 같은 밑바탕 위의 질문들이다
- TCP 연결에서 RST 패킷은 어떤 상황에 전송되는가?네트워크정상 종료 상태 전이와 RST 강제 종료는 같은 TCP 종료 의미론을 다룬다
- TCP 연결에서 CLOSE_WAIT 상태가 쌓이는 원인은 무엇인가?네트워크