← 질문 목록
#350깊이 0
TCP 연결에서 CLOSE_WAIT 상태가 쌓이는 원인은 무엇인가?
네트워크
애플리케이션이 상대방의 종료 요청을 받고도 소켓을 닫지 않았기 때문이다. TCP 표준에서 CLOSE_WAIT는 상대의 FIN 패킷을 받아 시작되는 수동 종료 상태다.
ESTABLISHED
CLOSE_WAIT
상대방의 FIN 패킷 수신
CLOSE_WAIT
LAST_ACK
애플리케이션이 close() 호출
LAST_ACK
CLOSED
상대방의 ACK 패킷 수신
OS는 FIN 패킷을 받으면 상대에게 ACK를 즉시 보낸다. 그리고 소켓 상태를 CLOSE_WAIT로 바꾼다. 하지만 애플리케이션이 close() 함수를 부르는 것은 별개의 과정이다. 예외 처리에서 소켓을 닫지 않거나 커넥션 풀 반환을 누락하면 소켓이 이 상태에 영구히 남는다.
CLOSE_WAIT가 쌓이면 파일 디스크립터 자원이 빠르게 고갈된다. 자원이 바닥나면 새로 들어오는 통신 요청을 더 이상 처리할 수 없다. OS 설정으로는 해결할 수 없으며 애플리케이션 소스 코드의 소켓 반환 로직을 수정해야 한다.