← 질문 목록
#3깊이 0
TCP 연결을 끊을 때 TIME_WAIT 상태가 필요한 이유는?
마지막 ACK가 유실될 수 있기 때문이다. 먼저 닫는 쪽이 잠시 남아 있어야 상대의 재전송을 받아줄 수 있다.
- 1. 능동 종료에서 수동 종료로: FIN. 보낼 것은 다 보냈다
- 2. 수동 종료에서 능동 종료로: ACK. 알겠다
- 3. 수동 종료에서 능동 종료로: FIN. 나도 다 보냈다
- 4. 능동 종료에서 수동 종료로: 마지막 ACK. **이게 유실되면 상대는 FIN을 다시 보낸다**
4-way handshake의 마지막에서 능동 종료 측은 상대의 FIN에 ACK를 보낸다. 이 ACK가 유실되면 상대는 FIN을 재전송한다. 이때 소켓이 이미 사라졌다면 응답할 주체가 없어 상대는 연결을 정상 종료하지 못한다.
두 번째 이유는 이전 연결의 지연 패킷이다. 같은 포트 조합으로 새 연결이 곧바로 열리면 뒤늦게 도착한 옛 패킷이 새 연결의 데이터로 섞일 수 있다. TIME_WAIT은 그 시간을 벌어준다.
대기 시간은 통상 2MSL이다. 문제는 트래픽이 많은 서버에서 TIME_WAIT 소켓이 쌓여 포트가 고갈되는 것이다. 다만 이는 대개 능동 종료를 서버가 하고 있다는 신호다.
해결은 커널 설정부터 바꾸는 일이 아니다. SO_REUSEADDR나 커널 파라미터를 만지기 전에 keep-alive로 연결을 재사용하는 쪽이 먼저다. 원인이 연결을 너무 자주 맺고 끊는 데 있기 때문이다.
추천 꼬리질문
관련 질문
- TCP 연결 종료는 왜 대개 네 번 주고받는가?네트워크4-way 종료 흐름을 알아야 마지막 ACK 유실 대비인 TIME_WAIT 이유가 읽힌다
- TIME_WAIT 포트 고갈은 어떻게 진단하는가?네트워크TIME_WAIT의 의미와 목적을 알아야 포트 고갈 진단이 읽힌다
- TCP 연결에서 RST 패킷은 어떤 상황에 전송되는가?네트워크둘 다 TCP 연결 종료 국면의 상태·패킷 처리를 다룬다
- TCP 연결은 어떤 상태를 지나 닫히는가?네트워크종료 시 지나는 상태 흐름을 알아야 그중 TIME_WAIT의 필요성 논의가 읽힌다
- TCP TIME_WAIT 상태의 유지 시간은 어떻게 결정되는가?네트워크