← 질문 목록
#3깊이 0

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

네트워크기초프로토콜

답변 연습

내 답변 적어보기접힘
이 브라우저에 자동 저장 · 0자
모범답안 확인하기내 답변 뒤에 열어보세요

마지막 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이 많다는 사실만으로 장애는 아니다.

그 호스트가 능동 종료를 많이 했다는 뜻이다. 실제 문제는 같은 목적지로 나갈 로컬 임시 포트나 연결 추적 자원이 모자랄 때 생긴다.

먼저 상태별 연결 수, 로컬 포트 범위, 반복되는 목적지 4-tuple, 누가 먼저 닫는지 확인한다. 짧은 연결이 원인이면 keep-alive와 연결 풀로 재사용률을 높인다.

SO_REUSEADDR나 대기 시간을 줄이는 설정은 포트 고갈의 보편적인 해결책이 아니다. 오래된 패킷을 새 연결에서 막는 안전 여유도 줄일 수 있다.

추천 꼬리질문

0/300

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

관련 질문

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