[네트워크] TCP Socket State

까막이의 몸부림·2026년 8월 2일

네트워크

목록 보기
14/15

TCP Socket State

TCP Socket State는 TCP 연결의 생명주기에서 각 TCP 종단점이 현재 어떤 단계에 있는지를 나타낸다.

TCP 연결은 크게 연결 설정, 데이터 전송, 연결 해제의 단계로 분류되며, 이벤트와 패킷 송수신에 따라 각 종단점의 상태 전이가 일어난다.

리눅스에서는 netstat 또는 ss 명령어로 소켓의 상태를 출력할 수 있다.


외워야 될...까?

  • ESTABLISHED : TCP 연결이 성립된 상태. 양방향 데이터 송수신이 가능한 데이터 전송 상태.
  • SYN_SENT : 로컬에서 SYN을 보낸 후, 상대방의 SYN 또는 SYN + ACK를 기다리는 상태.
  • SYN_RECV : 상대방의 SYN을 받고 SYN, ACK를 보낸 뒤, 최종 ACK를 기다리는 상태.
  • FIN_WAIT1 : 로컬 FIN을 보낸 뒤, ACK 또는 상대 FIN을 기다리는 상태.
  • FIN_WAIT2 : 로컬 FIN에 대한 ACK를 받고, 상대 FIN을 기다리는 상태.
  • TIME_WAIT : closed 이후 socket이 여전히 네트워크에 남아있는 패킷을 처리하기 위해 대기하는 상태. 일정시간 지난 후, CLOSED로 변하는 상태.
  • CLOSED : socket이 사용 중이지 않은 상태. (TCP 연결이 존재하지 않는 상태)
  • CLOSE_WAIT : 상대 FIN을 받고 ACK하였으며, 로컬 애플리케이션이 close하기를 기다리는 상태.
  • LAST_ACK : 로컬도 FIN을 보냈고, 그 FIN에 대한 최종 ACK를 기대리는 상태.
  • LISTEN : socket이 연결 요청을 기다리는 상태.
  • CLOSING : 양쪽 모두 socket이 닫혔지만(거의 동시에 FIN 송신), 로컬 FIN이 아직 ACK 되지 않은 상태에서 상대방의 FIN도 받은 상태.
  • UNKNOWN : socket의 상태를 알 수 없는 상태. (표준 아님)

연결 설정 (3-way handshake) 시 소켓 상태

(클라이언트 상태 - <패킷 송신> - 서버 상태 : 설명)

() - - - (LISTEN) : Server가 해당 소켓에 대해 연결을 기다리고 있는 상태.
(SYN-SENT) -> SYN -> (SYN-RECV) : client에서 SYN 신호를 보내 Server에서 SYN 신호를 받음.
(ESTABLISHED) <- SYN, ACK <- (SYN-RECV) : server에서 ACK 신호를 client에 보냄.
(ESTABLISHED) -> ACK -> (ESTABLISHED) : client에서 ACK 신호를 server에 보냄. 이후부터 상호간에 데이터 송수신.

데이터 송수신

연결 완료 후, 양측이 ESTABLISHED된 상태에서 데이터를 송수신 받는다. ^^b

연결 종료 (4-way handshake) 시 소켓 상태

(여기서의 클라이언트는 먼저 소켓을 close 요청한 쪽으로 전제한다. 통신에서는 client쪽에서든 server쪽에서든 종료를 요청할 수 있다.)

(FIN-WAIT-1) -> FIN, ACK -> (CLOSE-WAIT) : socket이 종료를 요청 중인 상태. server의 응답은 받을 수 있음.
(FIN-WAIT-2) <- ACK <- (CLOSE-WAIT) : server에서 ACK을 보내 client가 받은 상태.
(TIME-WAIT) <- FIN, ACK <- (LAST-ACK) : server에서 ACK 신호를 client에 보냄.
(TIME-WAIT) -> ACK -> (CLOSED) : client에서 종료 ACK를 보냄.
(CLOSED) : 연결 종료.

0개의 댓글