서버.스토리지.네트워크

[개요] TCP에서 상태(state) 의미

투칼론 2016. 12. 8. 06:26
반응형
1. 개요

netstat 명령어를 통해 tcp와 udp를 상태를 모니터링 할 수 있다. 명령어 결과로 상태(State) 컬럼에서는 LISTEN, ESTABLISHED 등 다양하게 값이 올수 있는데, 이 상태에 대한 의미는 아래와 같다.

(예시)
$ netstat  -atn  (t 옵션은 tcp 세션만 조회)

Active Internet connections (servers and established)

Proto Recv-Q Send-Q Local Address          Foreign Address       State
... 
tcp        0      0 0.0.0.0:25             0.0.0.0:*             LISTEN
tcp        0      0 192.168.121.11:27599   217.46.116.141:1863   ESTABLISHED
tcp        0      0 192.168.121.11:23794   219.55.112.121:22      ESTABLISHED
tcp        0      0 192.168.121.11:28032   206.46.103.46:1863    CLOSE_WAIT
tcp        0      0 192.168.121.11:34244   211.112.100.5:80       ESTABLISHED
...


2. TCP 연결 과정 및 상태 (3 way handshake)

클라이언트 (상태)

 

서버(상태)

 설명

 -


LISTEN 

 서버 데몬이 특정 포트(22,80 등)에 대해 연결을 기다리는 상태

 SYN-SENT

-> SEQ, SYN -> 

SYN-RECV

클라이어트에서 SYN 신호를 보내어 서버에서 SYN 신호를 받음 

 ESTABLISHED

<- SEQ, SYN, ACK <-   

SYN-RECV 

서버에서 ACK 신호를 클라이언트에 보냄

 ESTABLISHED

-> SEQ, ACK -> 

ESTABLISHED 

클라이언트에서 ACK 신호를 서버에 보냄. 이후부터 상호 간에 데이터(Data)를 송수신 함

참고1) Windows와 Solaris는 SYN_RECEIVED, FreeBSD는 SYN_RCVD로 상태가 표시됨

참고2) SYN_RECV가 많이 보인다면, TCP SYN Flooding 공격을 받았을 수도 있음


3. TCP 종료 과정 및 상태 (4 way handshake)

종료에서 클라이언트 의미는 먼저 소켓을 close() 시스템 콜을 호출한 쪽(active closing)을 말한다. 즉 서버 애플리케이션에서 먼저 close()를 호출한다면, 클라이언트와 서버의 상태가 바뀌어서 나타날 수 있다.

클라이언트 (상태)

active closing

 

서버(상태)

passive closing

 설명

 FIN-WAIT-1

-> SEQ, ACK, FIN ->

CLOSE-WAIT 

 socket이 닫히고, 종료되고 있는 상태. 서버의 응답은 받을 수 있음

 FIN-WAIT-2

<- SEQ, ACK <-

CLOSE-WAIT

 서버에서 ACK를 보내, 클라이언트는 ACK를 받은 상태임

 TIME-WAIT

<- SEQ, ACK, FIN <-

LAST-ACK 

서버에서 ACK 신호를 클라이언트에 보냄

 TIME-WAIT

-> SEQ, ACK -> 

CLOSED 

클라이언트에서 종료 ACK를 보냄

 CLOSED

   연결이 종료됨

참고1) Solaris는 FIN_WAIT_1, FIN_WAIT_2로 표시됨

참고2) 리눅스 기준 FIN-WAIT-2 상태 시간은 net.ipv4.fin_timeout 파라미터 변경으로 수정 가능하나, TIME-WAIT 상태 시간은 커널에 1분으로 설정되어 있음. 변경하기 위해서는 커널을 재빌드해야 수정 가능함


그림. TCP Status and OPeration


[참고사이트] http://www.ietf.org/rfc/rfc0793.txt