본문 바로가기

TCP/IP Protocol

TCP State Machine ( 상태 천이 다이어그램 )

★ 상태 천이 다이어그램

연결 설정, 연결 종료, 데이터 전송 기간 동안에는 여러가지 이벤트가 발생되며 이러한 이벤트들을 관리하기 위하여 TCP 소프트웨어는 제한된 수의 상태를 가지며 이벤트에 따라 상태가 변하는 유한 상태 기기(finite state machine)를 이용하여 구현됩니다. 아래 그림을 이용하여 유한 상태 기기의 상태 변화를 알아보겠습니다.

아래 그림에서 사용된 표현법

상태 - 타원형
굵은 점선 - 서버의 상태 변화
굵은 실선 - 클라이언트의 상태 변화
가는 실선 - 비정상적인 상황
/ 를 기준으로
앞쪽 - TCP가 수신하는 입력
뒤쪽 - TCP가 전송하는 출력

서버 프로세스 - 수동 개방 및 수동 종료를 실행
클라이언트 프로세스 - 능동 개방 및 능동 종료를 실행



☆ 각 상태별 설명
1. CLOSED 상태      
   - LISTEN 상태에서 RST 세그먼트수신하면 CLOSED 상태로 바뀐다.
   - 클라이언트가 SYN-SENT 상태에서 프로세스가 능동 종료하면 CLOSED 상태로 바뀐다.
  
   - SYN-SENT 상태에서 Close or Time out or RST 세그먼트수신하면 CLOSED 상태로 바뀐다.
   - SYN-RCVD 상태에서 Time-out 되거나 RST 세그먼트 출력하면 CLOSED 상태로 바뀐다.

   - LAST ACK 상태에서 ACK 세그먼트수신하면 CLOSED 상태로 바뀐다.
   - TIME-WAIT 상태에서 Time-out 되면 CLOSED 상태로 바뀐다. ( 2MSL )

2MSL 이란?
   - TIME_WAIT state를 2MSL Wait State라고도 합니다. 이는 TIME_STATE에서는 MSL의 두배의 시간동안  Segment가 사라지지 않고 살아 있기 때문입니다.

2. LISTEN
   - 서버 프로세스가 수동 개방을 하면 TCP는 LISTEN 상태로 바뀐다.
   - SYN-RCVD 상태에서 RST 세그먼트수신하면 LISTEN 상태로 바뀐다.

3. SYN-SENT
   - 클라이언트 프로세스가 능동 개방을 하면 TCP는 SYN 세그먼트를 전송하며 SYN-SENT 상태로 바뀐다. 
   -

4. SYN-RCVD
   - SYN-SENT 상태에서 SYN 세그먼트수신하고 SYN+ACK 세그먼트출력하면 SYN-RCVD 상태로 바뀐다. (simultaneous open)
   - LISTEN 상태에서 SYN 세그먼트를 수신하고 SYN + ACK  세그먼트출력하면 SYN-RCVD 상태로 바뀐다.

 ☆ Simultaneous open ( 동시 개방 )
   - 동시 개방이라는 드문 현상은 양쪽 프로세스 모두가 능동적 개방을 요구할 때 발생한다.
   - 서로의 지역 포트를 알고 잇는 두 피어 사이에 일어난다.
   - 이 경우 양쪽은 상대방에게 SYN+ACK 세그먼트를 전달하여 하나의 단일 연결을 상호간에 설정한다.



5. ESTABLISHED
   - SYN-SENT 상태에서 SYN+ACK 세그먼트수신하고 ACK 세그먼트를 출력 하면 ESTABLISHED 상태로 바뀐다.
   - SYN-RCVD 상태에서 ACK 세그먼트수신하면 ESTABLISHED 상태로 바뀐다. 

6. FIN-WAIT-1
   - SYN-RCVD 상태에서 Close 세그먼트를 수신하고 FIN 세그먼트출력하면 FIN-WAIT1 상태로 바뀐다.
   - ESTABLISHED 상태에서 Close 세그먼트수신하고 FIN 세그먼트출력하면 FIN-WAIT1 상태로 바뀐다.

7. FIN-WAIT-2
   - FIN-WAIT-2 상태에서 ACK 세그먼트수신하면 FIN-WAIT-2 상태로 바뀐다.
 
8. CLOSING
   - FIN-WAIT-1 상태에서 FIN 세그먼트수신하고 ACK 세그먼트출력하면 CLOSING 상태로 바뀐다.(Simultaneous close)

 ☆ Simultaneous open ( 동시 종료 )
   - 동시 종료는 양쪽 프로세스 모두가 능동적 종료를 요구할 때 발생한다.
   - FIN 세그먼트를 수신하고 ACK 세그먼트를 종료한 뒤 TIME-WAIT 상태에 들어가고 일정 시간후 종료된다.



9. TIME-WAIT
   - CLOSING 상태에서 ACK 세그먼트수신하면 TIME- WAIT 상태로 바뀐다.
   - FIN-WAIT-1 상태에서 FIN + ACK 세그먼트수신하고 ACK 세그먼트출력하면 TIME-WAIT 상태로 바뀐다.(3 Way-Handshake)
   - FIN-WATI-2 상태에서 FIN 세그먼트수신하고 ACK 세그먼트출력하면 TIME-WAIT 상태로 바뀐다.

10. CLOSE-WAIT
   - ESTABLISHED 상태에서 FIN 세그먼트수신하고 ACK 세그먼트출력하면 CLOSE-WAIT 상태로 바뀐다.

11. LAST ACK
   - CLOSE-WAIT 상태에서 Close 세그먼트수신하고 FIN 세그먼트출력하면 LAST ACK 상태로 바뀐다.