CS/네트워크

TCP 상태 전이도 설명

alpacadabra 2023. 5. 18. 01:57

TCP state diagram - Wikimedia Commons

 

소켓 프로그래밍을 해봤다면 이해가 조금 수월할 것이다.

 


서버의 입장에서는,

 

  1. 소켓을 Listen 상태로 전환한다. (LISTEN)
  2. SYN을 수신하고 SYN+ACK를 송신한다. (SYN RECEIVED)
  3. ACK를 수신한다. 클라이언트 소켓이 Accept 된다. (ESTABLISHED)
  4. 데이터를 송수신한다.
  5. FIN을 수신하고 ACK를 송신한다. (CLOSE WAIT)
  6. FIN을 송신한다. 소켓을 Close하려 한다. (LAST ACK)
  7. ACK를 수신한다. 소켓을 Close 한다. (CLOSED)

위의 흐름이 가장 일반적이다.

이는 다이어그램의 파란 선을 따라간 것이고, 회색 선을 따라가면 일반적이지 않은 전이가 보인다.

 

대표적으로,

 

  • 서버가 먼저 SYN을 송신한다. (SYN SENT)
  • 서버가 먼저 FIN을 송신한다. (FIN WAIT 1)

위의 두 전이는 일반적인 전이가 아니다.

특히, 서버가 Active close(그림에는 Open으로 잘못 적혀 있다) 하는 경우는 Time wait으로 인한 자원 낭비가 발생할 수 있으므로 주의해야 한다.

 


클라이언트의 입장에서는,

 

  1. SYN을 송신한다. 서버와의 Connect를 시도한다. (SYN SENT)
  2. SYN+ACK를 수신하고 ACK를 송신한다. (ESTABLISHED)
  3. 데이터를 송수신한다.
  4. FIN을 송신한다. 소켓을 Close하려 한다. (FIN WAIT 1)
  5. ACK를 수신한다. (FIN WAIT 2)
  6. FIN을 수신하고 ACK를 송신한다. (TIMED WAIT)

서버보다 비교적 간단한 흐름을 보인다.

 


재밌는 부분이 있다면 SYN이나 FIN이 동시에 송수신될 수 있다는 것이다.

이를 Simultaneous open/close라고 하던데, 물론 굉장히 드물겠지만 Wireshark에서 마주치게 되면 상당히 당혹스럽지 않을까 싶다. ^^;