TCP 통신 방식 3way handshake (SYN, SYN/ACK, ACK)

by 파시스트 posted Apr 09, 2015
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

Client와 Server 또는 P2P Socket 통신 등, 네트워크를 사용한 통신시 TCP 통신을 많이 사용한다.

 

TCP 통신을 위한 네트워크 연결은 3 way handshake 라는 방식으로 연결된다.

 

쉽게 이야기 하면, 서로의 통신을 위한 관문(port)을 확인하고 연결하기 위하여 3번의 요청/응답 후에 연결이 되는 것이다.

 

3_way_handshake.jpg


 

 

그림을 보면 이해가 쉬울 것이다.

 

먼저 Server에서 열려있는 포트는 LISTEN 상태이고 Client에서는 Closed 상태이다.

 

1. Client에서 Server에 연결 요청을 하기위해 SYN 데이터를 보낸다.

 

2. Server에서 해당 포트는 LISTEN 상태에서 SYN 데이터를 받고 SYN_RCV로 상태가 변경된다.

  그리고 요청을 정상적으로 받았다는 대답(ACK)와 Client도 포트를 열어달라는 SYN 을 같이 보낸다.

 

3. Client에서는 SYN+ACK 를 받고 ESTABLISHED로 상태를 변경하고 서버에 요청을 잘 받았다는 ACK 를 전송한다.

 ACK를 받은 서버는 상태가 ESTABLSHED로 변경된다.

 

위와 같이 3번의 통신이 정상적으로 이루어지면, 서로의 포트가 ESTABLISHED 되면서 연결이 되게 된다.

 

* Status

 

- Closed : 닫힌 상태

- LISTEN : 포트가 열린 상태로 연결 요청 대기 중

- SYN_RCV : SYNC 요청을 받고 상대방의 응답을 기다리는 중

- ESTABLISHED : 포트 연결 상태


현재의 포트 상태 확인은 netstat 명령어로 할 수 있다.

 

netstat 명령어는 네트워크 포트(TCP, UDP) 상태를 확인하는 명령어로 윈도우의 커맨드 창에서와 UNIX 모두 사용할 수 있다.

* netstat [-a] [-e] [-n] [-s] [-r] [-p proto] [interval]

-a : 컴퓨터에서 수신되어 활성화 되어 있는 모든 TCP 및 UDP 포트를 표시

-r : 라우팅 테이블 확인 및 Connection 되어 있는 포트번호 확인

-n : 현재 다른 PC와 연결(Established) 되어 있는 포트번호 확인

-e : 랜카드에서 송수신한 패킷의 용량 및 종류 확인 (-s와 같이 사용한다.)

-s : IP, ICMP, TCP, UDP 프로토콜의 상태


* Activie Connections Display State

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

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

- SYN_RECEIVED : 서버가 원격 클라이언트로부터 접속 요구를 받아 클라이언트에게 응답했지만 아직 클라이언트에게 확인 메시지를 받지 않은 상태

- ESTABLISHED : 3 Way-Handshaking이 완료된 후 서로 연결된 상태

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

- CLOSING : 확인 메시지가 전송 도중 분실된 상태

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

- CLOSED : 완전히 종료된 상태


netstat 은 통신이 정상적으로 되고 있는지, 방화벽은 잘 열려있는지 등을 확인할 때 유용하다.

또한 해킹 여부를 확인할 때도 확인하기도 한다.

netstat 은 윈도우 UNIX 모두 사용할 수 있다.

 






Articles

1 2 3 4 5 6 7