← 질문 목록
#3깊이 0

TCP 연결을 끊을 때 TIME_WAIT 상태가 필요한 이유는?

네트워크기초프로토콜

마지막 ACK가 유실될 수 있기 때문이다. 먼저 닫는 쪽이 잠시 남아 있어야 상대의 재전송을 받아줄 수 있다.

  1. 1. 능동 종료에서 수동 종료로: FIN. 보낼 것은 다 보냈다
  2. 2. 수동 종료에서 능동 종료로: ACK. 알겠다
  3. 3. 수동 종료에서 능동 종료로: FIN. 나도 다 보냈다
  4. 4. 능동 종료에서 수동 종료로: 마지막 ACK. **이게 유실되면 상대는 FIN을 다시 보낸다**

4-way handshake의 마지막에서 능동 종료 측은 상대의 FIN에 ACK를 보낸다. 이 ACK가 유실되면 상대는 FIN을 재전송한다. 이때 소켓이 이미 사라졌다면 응답할 주체가 없어 상대는 연결을 정상 종료하지 못한다.

두 번째 이유는 이전 연결의 지연 패킷이다. 같은 포트 조합으로 새 연결이 곧바로 열리면 뒤늦게 도착한 옛 패킷이 새 연결의 데이터로 섞일 수 있다. TIME_WAIT은 그 시간을 벌어준다.

대기 시간은 통상 2MSL이다. 문제는 트래픽이 많은 서버에서 TIME_WAIT 소켓이 쌓여 포트가 고갈되는 것이다. 다만 이는 대개 능동 종료를 서버가 하고 있다는 신호다.

해결은 커널 설정부터 바꾸는 일이 아니다. SO_REUSEADDR나 커널 파라미터를 만지기 전에 keep-alive로 연결을 재사용하는 쪽이 먼저다. 원인이 연결을 너무 자주 맺고 끊는 데 있기 때문이다.

추천 꼬리질문

0/300

적은 내용은 AI 학습에 쓰일 수 있습니다. 이름이나 연락처는 넣지 말아 주세요.

관련 질문

TCP 연결을 끊을 때 TIME_WAIT 상태가 필요한 이유는?