TCP 소켓 상태(FIN_WAIT1, FIN_WAIT2, TIME_WAIT, CLOSE_WAIT, LAST_WAIT)
TCP 소켓에는 CLOSED, LISTEN, SYN_SENT, SYN_RECV, ESTABLISHED, CLOSE_WAIT, LAST_ACK, FIN_WAIT1, FIN_WAIT2, CLOSING, TIME_WAIT와 같이 총 11가지의 상태가 있습니다.(netstat를 이용해 소켓의 상태 확인 가능)
그 중 사람들이 많이 헷갈려 하는 상태가 바로 TIME_WAIT와 CLOSE_WAIT 이 두가지 상태입니다.
오늘은 이 TIME_WAIT와 CLOSE_WAIT, 이 두 상태에 대한 차이점에 대해서 얘기해보고자 합니다.
Active Close를 하는 곳(close() 함수를 호출한 곳)은 TIME_WAIT상태가 되며, Passive Close 를 하는 곳(FIN을 수신한 곳)은 CLOSE_WAIT 상태가 됩니다. 아래 그림에서 A가 Active Close를 하는 곳이고, B가 Passive Close를 하는 곳입니다.

※ active close, passive close를 하는 곳에 따로 서버, 클라이언트 구분이 없습니다.
※ 용어 정리
- Active Open : connect()를 호출 하는 곳. 즉, SYN 세그먼트를 전송한 곳. 종종 클라이언트가 되지만 100% 클라이언트라고 할 수는 없음.
- Passive Open : accept()를 호출 하는 곳. 일반적으로 서버의 역할이지만 이 역시 100% 서버라고 단정지을 수는 없음.
- Active Close : close()를 처음 호출 한 곳. 즉 FIN 세그먼트를 전송 한 곳으로 클라이언트, 서버 관계 없이 어느 쪽이든 다 active close를 할 수 있음
- Passive Close : FIN 세그먼트를 받은 곳.
- MSL : Maximum Segment Lifetime, 세그먼트가 네트워크내에서 폐기 되기 전까지 살아남을 수 있는 시간
TIME_WAIT 상태
1. Active Close하는 곳의 마지막 ACK가 사라지게 되었을 때, Passive Close하는 곳은 자신이 보낸 FIN에 대한 응답을 받지 못했으므로 FIN(SEQ:6001, ACK:5001)을 재전송합니다. 이 때 TCP는 connection 정보(주소와 포트)를 유지하고 있고, 이런 이유로 RST(에러라고 처리되는 세그먼트) 대신 ACK를 다시 보낼수 있습니다.
2. Passive Close하는 곳에서 보낸 중복된 FIN 메시지가 나중에 다시 생긴 connection에 영향을 주는 것을 방지하기 위해서TIME_WAIT 상태를 2MSL 동안 유지합니다. 물론 이럴 확률은 극도로 희박하긴 합니다.
CLOSE_WAIT 상태
1. CLOSE_WAIT는 Passive Close하는 곳(FIN을 받는 곳)에서 프로그램이 소켓을 종료 시키는 것을 기다리기 위한 상태입니다. 프로그래밍 관점에서 보자면, recv byte가 0으로 연결이 끊어 졌으나 아직 close() 함수가 호출 되지 않은 상태라고 생각하면 됩니다.
2. TCP connection은 close() 함수가 명시적으로 호출되지 않으면 CLOSE_WAIT 상태에서 영원히 멈춰 있을 수 있고, 이것은 자원 누수로 이어지게 됩니다. 커널 옵션으로 타임아웃 조절이 가능한 FIN_WAIT이나 재사용이 가능한 TIME_WAIT과 달리 CLOSE_WAIT 상태는 포트를 잡고 있는 프로세스의 종료 또는 네트워크 재시작 외에는 제거할 방법이 없습니다. 소켓 사용하고 나면 잊지말고 반드시 close()를 명시적으로 호출 해 주어야만 합니다.
결론
소켓 사용하고 나면 잊지말고 반드시 close()를 명시적으로 호출해주도록 하잣!!
'IT' 카테고리의 다른 글
| Linux 서버 상태 확인하기 (0) | 2024.03.04 |
|---|---|
| ElasticSearch Heap 메모리 설정 (0) | 2024.03.04 |
| C# Windows 방화벽 정책 추가/삭제 (0) | 2024.03.04 |
| 대규모 언어 모델(LLM)을 위한 검색-증강 생성(RAG) (0) | 2024.02.28 |
| nohup (0) | 2022.12.05 |
댓글