본문 바로가기

OS/Windows

TIME_WAIT 제거하기

Windows 서버에서 소켓을 사용하는 프로그램을 구동시 TIME_WAIT 가 수만개 증가하는 현상이 발생했다.

특정 솔루션을 도입했는데...서버 관리자로 부터 연락이 왔다...어여 해결해라고..

cmd 창에서 netstat 명령을 이용해 확인해보니...

 

스크린샷에 나온게 전부가 아니다...진짜 몇만개가 있더라...

당연히 원인분석을 진행하야 하지만 정상화가 우선이었다. 이것저것 방법을 알아보다가 결국은...서버 재부팅..

공공기관 시스템을 재부팅...

역시 Windows 는 개인용이건 서버건 재부팅...

 

남아있는 것은 TIME_WAIT 증가 원인 분석과 재발방지였다.

TIME_WAIT는 TCP 통신의 연결끊기 4 way hand shaking 과정에서 마지막 4단계로 최종 끊기 요청에 대한 응답을 대기하는 상태이다.

TCP 4 way hand shake(연결끊기) 과정

1. A가 B에게 FIN(연결끊기)fmf qhsosek.

2. B가 A에게 ACK(요청에 대한 응답)을 보낸다.

3. B가 A에게 FIN(연결끊기)을 보낸다. (이때 A는 TIME_WAIT 상태로 들어간다.)

4. A가 B에게 ACK(요청에 대한 응답)을 보내면 연결이 끊어진다.

즉, A가 B로 부터 받은 FIN 에 대한 ACK 를 보내지 못하고 있었던 것이다. B 입장에서는 ACK 오지 않으니, 계속해서 FIN 을 날렸을 수도 있고, 새로운 새션을 생성해서 다시 FIN 에 대한 ACK를 받지 못했을 수도 있다. 그렇게 계속 TIME_WAIT가 증가한듯 하다.

 

우선 WIndows 서버에서 해결할 수 있는 방법은 TcpTimeWaitDelay 를 설정하는 것이었다.

일반적인 서버환경에서는 Default wait 시간이 있어, TIME_WAIT 상태에서 미응답 상태일 경우 해당 TIME_WAIT를 삭제한다.

Windows 서버에서는 Regstry에 TcpTimeWaitDelay를 설정하여 적용 후 재부팅 해야한다.....그래서 재부팅했다...

regedit를 이용하여

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\TCPIP\Parameters

새 REG_DWORD 값 TcpTimedWaitDelay를 생성하고 값을 10진수 30(16진수 0x0000001e)으로 설정하였다.

 

 

문제는 재부팅해야 적용된다는 점.