반응형

누군가의 질문을 받고 만들어 줬습니다.
OS 상에서 CLOSE_WAI와 FIN_WAIT가 생길 때 어떻게 해야 하냐고...

정답은 프로그램에서 닫아 주어야 합니다.

소켓 클라이언트와 서버 사이에 어느 한 쪽에서 close를 했음에도(FIN 신호를 상대방으로 보냄)
상대방에서 close를 하지(FIN ACK를 보내지 않음) 않으면 close 한 쪽에는 FIN_WAIT가
close를 하지 않은 쪽에는 CLOSE_WAIT가 발생합니다.

TCP 파라미터를 조정해서 해결할 수 없냐는 경우도 있는데, 이것은 절대로 TCP 파라미터로 해결할 문제가 아니라
프로그램을 잘 짜야 하는 문제입니다. 특히 CLOSE_WAIT가 많이 발생하는 서버는 memory leak이 발생할 가능성도 매우 높습니다.

그 과정을 보여주는 예제코드를 올리니 궁금하면 테스트 해 보시기 바랍니다.
다음은 프로그램에 대한 설명입니다.

SocketServer 에서 stream으로 데이터를 클라이언트하고 다주고 받고,
클라이언트쪽 소켓이 닫히면 stream 종료(Java에서는 -1... 언어 마다 다름)를 만나면 닫아줘야 하는데 그것을 닫지 않으면fin/close_wait 현상이 발생합니다. 다음과 같이 실행하고 Server 소스에서 close 부분의 remark를 풀고도 테스트해 보시기 바랍니다.

java SocketServer


java SocketClient



SocketClient.java


SocketServer.java


Posted by Hey Jerry
,