유닉스 상에서 통신 프로그램을 사용하다가 보면 네트워크 상태를 체크할 필요성이 생긴다.

 이때 사용하는 명령어!! 
netstat !!

 netstat에 대한 정확한 설명을 보고자 한다면 'man netstat'을 쳐서 확인을 하면 된다.
 물론 나처럼 영어에 자신이 없으면 구글링하면 친절하게 누군가가 한글로 메뉴얼 페이지를 번역해놓은 사이트가 있다.
hoppinmad_angry_line_characters-2

 간단히 말하면, netstat은 시스템 관리 명령어로써 네트워크의 상태를 보여주는 명령어 이다.

이 명령어를 통해 네트워크 상태를 보게 되면

 proto Recv-Q Send-Q Local Address Foreign Address (state)
tcp 0 0 *.23 *.*                                                                   LISTEN
tcp4 0 0 192.168.1.25.23 192.168.12.228.2502 ESTABLISHED
tcp4 0 0 192.168.1.25.7979 192.168.13.185.1033 FIN_WAIT_2

 위와 같이 나오게 되는것을 볼 수가 있다. 
음... LISTEN은 현재 23번 포트로 리슨을 하고 있군
23번 포트와 192.168.12.228.2502 와는 연결이 맺어져 있군
!?
FIN_WAIT_2 ???? what the Fxxx??
moon_mad_angry_edition-20


 처음 보았을때의 내 반응이였다.
 무슨 소린지 몰라도 일단 리슨상태도 아니고 연결이 맺어진 상태도 아니고, FIN이니깐.. 끝내기 위해서 WAIT하는 중??? 이 정도로 추측하고 말았었다.

 정확한 뜻을 알아보자.

1. LISTEN
 -> 서버 어플리케이션이 적재되어 수동적인 모드로 포트를 개설하였음을 의미. TCP는 연결 요청이 수신 되기를 기다린다.

2. SYS_SENT
 -> 로컬 시스템의 클라이언트 어플리케이션이 원격 호스트에 능동적인 개설을 요청. TCP는 Synchronize flag를 설정한 시작 세그먼트를 전송 하였으며, 원격 시스템도 역시 Synchronize flag를 설정한 시작 세그먼트로 응답할 것을 기다린다.

3. SYN_RECEIVED
 -> 서버의 TCP가 원격 클라이언트로부터 Synchronize flag가 설정된 시작 세그먼트를 수신하였고 자신의 시작 세그먼트로 응답 하였으며, 그 세그먼트에 대한 확인 메시지를 기다린다.

4. ESTABLISHED
 -> 가상회선이 작동. 3단계 핸드쉐이킹 과정이 완료되면 두 시스템은 이 연결 상태에 들어가게 된다.

5. FIN_WAIT_1
 -> 로컬 어플리케이션은 가상 회선에 능동적인 종결을 요청하였으며, TCP는 Finish flag가 설정된 연결 종료 세그먼트를 전송. 그러나 TCP는 아직도 원격 시스템이 세그먼트에 대한 확인 메세지와 자신만의 연결 종료 세그먼트로 응답하기를 기다린다.
  회선이 완전히 연결 종료 될 때까지 원격 시스템으로부터 데이터는 수신하지만, 추가적인 데이터를 전송하지는 않는다.

6. CLOSE_WAIT
 -> Finish flag가 설정된 연결종료 세그먼트가 수신되었고 로컬 TCP는 그 세그먼트에 대한 확인 메시지를 송신 시스템에 전송합니다. 그러나 로컬 TCP는 로컬 어플리케이션에서 작업을 종료하지 않아 자신의 종결 세그먼트를 생성하지는 못합니다.

7. FIN_WAIT_2
 -> 로컬 TCP는 Finish flag가 설정된 연결 종료 세그먼트를 전송하였으며, 원격 시스템으로부터 그 세그먼트에 대한 확인 메시지를 수신한다. 그러나 원격 어플리케이션이 아직 작업을 종료하지 않아 원격 TCP가 자신의 연결 종료 세그먼트를 생성하지 못하고 있는 상태이다.

8. LAST_ACK
 -> Finish flag가 설정된 연결종료 세그먼트가 수신되었고, 로컬 어플리케이션은 회선의 연결종료에 합의하여 자신도 연결 종료를 요청한다. 그 결과 로컬 TCP는 Finish flag가 설정된 자신의 연결 종료 세그먼트를 전송하고, 이 세그먼트에 대한 확인 메시지가 수신되면 연결이 종료되게 된다.

9. CLOSING
 -> 이 상태는 흔하지 않으며, 일반적으로 세그먼트가 네트워크에서 분실되었다는 것을 나타낸다. 예를 들면 FIN_WAIT_1 상태인데, 원격에서는 LAST_ACK를 보냈지만 아직 ACK를 받지 못하였을 때이다. 확인 메시지가 전송 도중 분실되었다는 의미.

10. TIME_WAIT
 -> 회선의 연결 종료 절차가 완료되었으나 TCP는 분실되었을지 모르는 느린 세그먼트를 위해 당분간 소켓을 열어 놓은 상태로 유지한다. 이 상태는 새로운 연결이 기존의 연결에서 사용된 일련번호를 다시 사용하는 것을 막는다. 원격 시스템이 종ㅇ결하는 호스트로부터 더 이상 데이터를 수신할 가능성이 없으므로, 이 상태는 먼저 연결종료를 요청한 호스트에서만 나타난다.

11. CLOSED
 -> 아무 일도 발생하지 않음. 회선이 종료되었음.
  TCP는 그 가상 회선에 사용하였던 모든 자원을 놓아준다.

--------------------------------------------------------------------
이렇게 정리를 할 수가 있다. 말이 좀 어렵다고 느껴질수도 있는데 천천히 읽어보면 이해가 된다.
 @_@;;
line_love_is_a_rollercoaster-18
 네트워크의 통신 과정을 생각해보면서 읽으면 아~~ 하게 된다.



+ 이전 블로그에서 게시했던글을 이전하고 있습니다.

+ Recent posts