TCP State
CLOSE : 커넥션 없음
LISTEN : Passive open, SYN을 기다리는 상태
SYN-SENT : SYN을 보내고 ACK를 기다리는 상태
SYN-RCVD : SYN+ACK을 보내고 ACK를 기다리는 상태
ESTABLISHED : 커넥션이 생성된 상태, 데이터를 전송할 수 있다.
FIN-WAIT-1 : 첫 FIN이 보내진 상태, ACK를 기다리고 있다.
FIN-WAIT-2 : 첫 FIN에 대한 ACK를 받은 상태, 2번째 FIN을 기다리고 있다.
CLOSE-WAIT : 첫 FIN을 받고 ACK를 보낸 상태, 어플리케이션의 종료를 기다리고 있다.
TIME-WAIT : 2번째 FIN을 받고 ACK를 보낸 상태, 동일 포트와 주소에 커넥션이 생성되지 않도록 하는 시간(2MSL time out)을 기다리는 상태
LASK-ACK : 2번째 FIN을 보내고 ACK를 기다리는 상태
CLOSING : 양쪽이 동시에 닫기로 한 상태
TCP connection close
TCP 연결 해제 과정에서의 TCP 상태에 대해 알아보자
TCP 커넥션 종료는 클라이언트와 서버 어느 쪽에서도 할 수 있기 때문에, 클라이언트와 서버로 나누지 않고 active close와 passive close로 나눈다. 여기서 말하는 Active close와 Passive close는 다음과 같다.
Active close : TCP 연결 해제 요청한 쪽, 그러니까 트래픽을 전송(request)하고 정상적으로 전송 되었으면 연결을 끊는 쪽
Passive close : TCP 연결 해제 요청을 받은 쪽, 트래픽을 받는 쪽(api 서버라고 치면 클라이언트에게 응답을 주는 쪽)
이 포스팅에서는 Client가 Active Close, Server가 Passive Close 라고 생각한다.
Active close
FIN-WAIT-2 상태에서는 일정시간이 지나면 TIME-WAIT로 전환된다.
Passive close
Server 쪽에서 passive close를 받고 (또는 받지 못하거나) fin을 정상적으로 보내지 못하면 Server 쪽은 영원히 CLOSE_WAIT 상태로 기다리게 된다. (Client의 FIN-WAIT-2는 일정 시간이 지나면 TIME WAIT로 바뀐다)
CLOSE WAIT
FIN-WAIT는 일정 시간이 지나면 TIME-WAIT 상태로 전환되고, TIME-WAIT는 재 사용이 가능한 상태지만 CLOSE WAIT는 포트를 잡고 있는 프로세스의 종료, 네트워크 재시작 외에는 제거할 방법이 없다. (그래서 어플리케이션의 정상 종료가 필요하다.)
원문 : https://smjeon.dev/etc/tcp-state/
https://luyin.tistory.com/424