TCP Socket State는 TCP 연결의 생명주기에서 각 TCP 종단점이 현재 어떤 단계에 있는지를 나타낸다.
TCP 연결은 크게 연결 설정, 데이터 전송, 연결 해제의 단계로 분류되며, 이벤트와 패킷 송수신에 따라 각 종단점의 상태 전이가 일어난다.
리눅스에서는 netstat 또는 ss 명령어로 소켓의 상태를 출력할 수 있다.

외워야 될...까?
(클라이언트 상태 - <패킷 송신> - 서버 상태 : 설명)

() - - - (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
(여기서의 클라이언트는 먼저 소켓을 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) : 연결 종료.