2011-03-08

FIN_WAIT_2 란 무엇인가

웹서버등 통신관련 서버를 관리하다보면 TCP 연결에서  FIN_WAIT_2 라는 악명높은 상태를 종종 보게된다.


RFC 규정대로라면 재부팅하기 전에는 없어지지 않게 되서, 종국에는 서비스가 불가능할 수 있는 끔찍한 일이다.


결론적으로는 이런 문제로 각 OS 벤더 (IBM AIX, HP HPUX 등등)에서는 RFC 규정을 무시하여, 이런 FIN_WAIT_2 상태를 없앨 수 있는 기능을 제공한다.


TCP에서 이런 상황이 발생하는 경우는 UDP와 달리 복잡한 신호를 주고 받기 때문이다.

00 Server-Client         (흔한 경우는 www.abcd.com   - 인터넷익스플로러)
01 Server : (send close, 데이터 전송 불가, 수신은 가능)
02 Server : FIN_WAIT_1 (데이터를 다보냈으니 끊겠다 )  
03               Client : CLOSE-WAIT  (엥, 서버가 끊겠다네)
04               Client : CLOSE-WAIT   (알았어, 곧 끊고 알려줄께)
05 Server : FIN_WAIT_2 (아.. 조금만 기다리면 되겠네... )  
06               Client :  (send close, 어플리케이션에서 송수신 불가)
07               Client : LAST-ACK  (이제 다 끊었어)

08 Server : TIME-WAIT (이제 나도 정리 해야지)
09 Server : TIME-WAIT (정리 다 했다, 너도 정리해)
10               Client : CLOSED (끝~~~)
11 Server : 2x MSL( Maximum Segment Life;  대기)
12 Server : CLOSED (나도 끝)


별거 아닌 것 같은 TCP 통신 끊는 과정이, 내부적으로는 꽤 복잡하다.

FIN_WAIT_2 문제는 가끔 server 쪽을 잘못 개발하기도 하지만, 대부분은 client 에서 LAST-ACK 을 보내지 않고 끊어진 경우로, 보통 bug때문이다.


서버 관리자가 client 를 고쳐 주기는 힘들기 때문에, OS 에서 RFC 규격외 기능으로 일정기간후에 끊어버리는 형식으로 대안을 제공하는 까닭이다.

댓글 없음:

댓글 쓰기