출처 : http://cafe.naver.com/ArticleRead.nhn?articleid=100&sc=e0d5351d01452b9a12&clubid=11678574

 

netstat의 State 필드에 표시되는 TCP 상태표시가 갖는 의미.
RFC 793 문서에 있는 TCP 기본 연결, 종료 과정 참고.
 
-----------------------------------------------------------

# netstat -atn
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.123.10:32799  207.46.106.141:1863  ESTABLISHED <-- 서로 연결중
tcp  0  0 192.168.123.10:32794  218.xxx.xx.xx:22   ESTABLISHED
tcp  0  0 192.168.123.10:32802  207.46.108.46:1863  CLOSE_WAIT <-- 종료 대기중
tcp  0  0 192.168.123.10:33244  211.xxx.xx.x:80    ESTABLISHED
... 생략 ...
-----------------------------------------------------------
 
1) TCP 연결관련 상태
 
* RFC 793문서에 나온 기본적인 TCP 연결 과정

   TCP A                           TCP B

 1. CLOSED                          LISTEN
 2. SYN-SENT  --> < SEQ=100>< CTL=SYN>         --> SYN-RECEIVED
 3. ESTABLISHED <-- < SEQ=300>< ACK=101>< CTL=SYN,ACK> <-- SYN-RECEIVED
 4. ESTABLISHED --> < SEQ=101>< ACK=301>< CTL=ACK>    --> ESTABLISHED
 5. ESTABLISHED --> < SEQ=101>< ACK=301>< CTL=ACK>< DATA> --> ESTABLISHED

LISTEN   : 데몬이 요청을 발을 수 있도록 연결 요구를 기다리는 상태
 즉, 포트가 열려있음을 의미. http(80), mail(25), ftp(21), telnet(23) 등
 위에서 포트 25(mail)이 메일을 받을 수 있도록 열려 있는 상태
 윈도우즈에서는 LISTENING으로 표시
SYN_SENT  : 로컬에서 원격으로 연결 요청(SYN 신호를 보냄)을 시도한 상태
SYN_RECV  : 원격으로 부터 연결 요청을 받은 상태
 요청을 받아 SYN+ACK 신호로 응답은 한 상태이지만 ACK는 받지 못했다.
 netstat로 확인할 때 SYN_RECV가 상당히 많다면 TCP SYN 플러딩(Flooding) 공격일
 가능성이 있다.
 윈도우즈와 솔라리스에서는 SYN_RECEIVED으로, FreeBSD는 SYN_RCVD으로 표시
ESTABLISHED : 서로 연결이 되어 있는 상태
 위에서 192.168.123.10의 포트 32794과 218.xxx.xx.xx의 포트 22(ssh)이 서로
 연결되어 있는 상태

2) TCP 종료관련 상태

* 정상적인 연결 종료 과정

   TCP A                          TCP B

 1. ESTABLISHED                       ESTABLISHED
 2. (Close)
   FIN-WAIT-1 --> < SEQ=100>< ACK=300>< CTL=FIN,ACK> --> CLOSE-WAIT
 3. FIN-WAIT-2 <-- < SEQ=300>< ACK=101>< CTL=ACK>   <-- CLOSE-WAIT
 4.                    (Close)
   TIME-WAIT  <-- < SEQ=300>< ACK=101>< CTL=FIN,ACK> <-- LAST-ACK
 5. TIME-WAIT  --> < SEQ=101>< ACK=301>< CTL=ACK>   --> CLOSED
 6. (2 MSL)
   CLOSED                           

FIN_WAIT1  : 소켓이 닫히고 연결이 종료되고 있는 상태. 원격의 응답은 받을 수 있다.
 솔라리스에서는 FIN_WAIT_1로 표시
FIN_WAIT2  : 로컬이 원격으로 부터 연결 종료 요구를 기다리는 상태
 솔라리스에서는 FIN_WAIT_2로 표시
CLOSE_WAIT : 원격의 연결 요청을 받고 연결이 종료되기를 기다리는 상태
 원격으로 부터 FIN+ACK 신호를 받고 ACK 신호를 원격에 보냈다.
TIME_WAIT  : 연결은 종료되었으나 원격의 수신 보장을 위해 기다리고 있는 상태
 이 상태를 특히 자주 보게되는 Apache에서 KeepAlive를 OFF로 해둔 경우,
 Tomcat 서버를 쓰는 경우 등
LAST_ACK  : 연결은 종료되었고 승인을 기다리는 상태
CLOSED   : 완전히 연결이 종료된 상태

※ 위의 FIN_WAIT1, FIN_WAIT2, CLOSE_WAIT 3개 상태는 연결 종료를 위해 서로간에
  신호를 주고받는 과정에 나타나는 상태로 이해하면 된다.
  종료 요청을 한 곳에서는 FIN_WAIT1, FIN_WAIT2, TIME_WAIT 상태가
  종료 요청을 받는 곳에서는 CLOSE_WAIT, LAST_ACK 상태가 표시된다.

3) 기타

CLOSING   : 연결은 종료되었으나 전송도중 데이타가 분실된 상태
UNKNOWN   : 소켓의 상태를 알 수 없음

솔라리스의 netstat 명령에서는 다음 2개의 상태를 더 표시한다.

IDLE    : 소켓이 열렸지만 binding 되지 않은 상태
BOUND    : listen이나 연결을 위한 준비 상태

 

추가) Time-Wait

먼저 종료를 시킨경우는 Time-Wait 과정을 거치게 된다

종료요청을 하게되변 FIN 을 전송하게 되며

 

Time-Wait 상태

** A가 먼저 종료하는 경우

< four-way handshaking >

   A                                  B

 FIN  ------------------>

       <-----------------   ACK

       <-----------------   FIN

ACK  ------------------>

Time-Wait                      소켓소멸

      ~

소켓소멸

 

 

결론> 발생이유: 마지막 ACK가 소멸 되었을 경우 재전송을 하기 위함

         따라서 재시작시 Bind 에러가 발생하며 이는 적정시간이 흐르면 해제가 된다

        이때 접속되어있는 클라이언트가 패킷을 송신을 하면 Time-Wait 상태를 유지하는 타이머는 재시작된다

       이는 Time-Wait상태가 길어질 수 있는 결과를 초래한다

해결방안 : 소켓옵션중 SO_REUSEADDR의 상태를 1(TRUE)로 설정한다

                물론, 접속자가 없는 상태에선 Fin메세지를 시작으로 four-way handshaking 과정을 거치지 않는다

 

 

===========================================

 

LISTEN : 서버의 데몬이 떠서 접속 요청을 기다리는 상태

SYS-SENT : 로컬의 클라이언트 애플리케이션이 원격 호스트에 연결을 요청한 상태

SYS-RECEIVED : 서버가 클라이언트로 부터 접속 요구를 받아 클라이언트에게 응답을 했지만 아직 클라이언트에게 확인 메세지는 받지 않은 상태

ESTALISHED : 3Way Handshaking 완료된후 서로 연결된 상태

FIN-WAIT, CLOSE-WAIT, FIN-WAIT2 : 서버에서 연결을 종료하기 위해 클라이언트에게 종결을 요청하고 회신을 받아 종료하는 과정의 상태

CLOSING : 흔하지 않지만 주로 확인 메세지가 존송 도중 분실된 상태

TIME-WAIT : 연결은 종료 되었지만 분실되었을지 모를 느린 세그먼트를 위해 당분간 소켓을 열어 놓은 상태

CLOSED : 완전히 종료

'unix and linux' 카테고리의 다른 글

bash if 문 비교  (0) 2007.11.30
[bash] 로깅 시간 출력  (0) 2007.11.14
netstat 과 tcp 상태  (0) 2007.10.31
grep -c 와 wc -l은 똑같은 명령어이다.  (0) 2007.10.18
crond 문제  (0) 2007.10.17
bash 배열 선언 및 처리하기  (0) 2007.10.16
Posted by 김용환 '김용환'

댓글을 달아 주세요