티스토리 뷰

Network

TCP/IP 3 Way-Handshaking

Hackerrior 2017. 4. 11. 11:59 댓글확인

Network - TCP 3 Way-Handshaking




  3 Way - Handshaking


 TCP통신은 UDP 통신과는 달리 신뢰성 있는 통신을 하기위해 3번의 패킷 교환을 한다. 이를 3 Way -Handshaking

 이라고 하며 데이터의 동기화라고도 한다. 이러한 동기화 과정은 TCP 프로토콜을 이용해서 통신을 하는 응용

 프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터에 사전에 세션을 수립하는

 과정을 의미하고 이러한 과정을 통해 서로의 통신을 위한 포트( PORT )를 확인하고 연결한다.

 # UDP 통신은 상대방이 받을 준비여부에 관계없이 데이터를 전송한다. 신뢰↓




  3 Way - Handshaking 과정




 ↑3 Way Handshake 과정

  # 클라이언트( Client ) → 서버( Server ) :  SYN

     서버( Server ) → 클라이언트( Client ) :  SYN + ACK

     클라이언트( Client ) → 서버( Server ) :  ACK

 # SYN : Synchronize sequence numbers

    ACK : Acknowledgment


 # 클라이언트와 서버 모두 데이터를 전송할 준비가 되어 있다는 것을 보장하고, 실제로 데이터가 전달이 시작하기전에

    서로 준비되어 있다는 것을 알 수 있도록 한다.



 1. 클라이언트( Client )에서 웹 서버로 연결을 최초시도시 먼저 SYN 패킷을 보낸다.

 2. SYN 패킷을 보낸 클라이언트는 SYN-SENT 상태가 된다.

 3. 이때 서버( Server )는 Listen 상태로 포트 서비스가 가능한 상태여야 한다. ( Closed : 닫힌 상태 )

 4. Listen상태에서 클라이언트로부터  SYN 패킷을 받으면 이에 대한 응답으로 SYN + ACK패킷을 

    클라이언트에게 전송 한다.

 5. 서버는 클라이언트 IP에 대해 포트 SYN-Received 상태로 전환 된다.

 6. 서버로부터 SYN+ACK 패킷을 받으면, 클라이언트는 Established 상태로 변하게 되면서 연결을 확인한다.

 7. 클라이언트는 서버로 SYN에 대한 응답으로 ACK 패킷을 보낸다.

 8. 서버는 이 ACK 패킷을 받고 해당 클라이언트 IP에 대한 포트 Established상태로 전환된다.

 

 상태

 Closed           

  닫힌 상태

 Listen            

  포트가 연린 상태로 연결 요청 대기중

 SYN-sendt     

 SYN 요청을 한 상태

 SYN-Received 

 SYN 요청을 받고 상대방의 응답을 기다리는중

 Established

 확인,확립 된 상태 즉, 연결인 확인된상태



  Code Bit ( TCP Header )



 TCP Header에는 Code Bit라는 항목이 있다. 이는 64bit로 되어 있으며 각각의 bit는 의미를 가지고 있다.

 Urg - Ack - Psh - Syn - Fin 순서로 되어 있으며 해당 위치의 비트에 1이 들어가게 되면 이 패킷이 어떤

 패킷인지 알려주게 된다. ( ex. 000010  라면 SYN 패킷이 된다. )




  Sequence Number


 Sequence Number 과 Acknowledgment Number이 있다. 이는 TCP 패킷을 주고 받을 때 순서,Data와 관련있다.

 최초 TCP 3-Way Handshaking 과정을 Sequence number와 Acknowledgment number로 나타 낼 수 있다.






   1. 클라이언트에서 SYN 패킷을 보낼 때 sequence Number(1번)에 랜덤으로 숫자( ex. 100 )를 넣어서 보낸다. 

   2. 서버가 이 SYN패킷을 받게 되면 응답으로 SYN+ACK 패킷을 보내게 된다. 

     # 서버에서 보내는 SequenceNumber(2번)의 경우 또 랜덤의 숫자( ex. 200 )를 넣어서 보낸다. 

   3. Acknowledgment Number의 경우, 앞 클라이언트에서 보내온 SYN 패킷의 Sequence Number +1을 

      해서 보낸다. ( 100 + 1)   # 여기서 Sequence Number가 101이 된다.

   4. 서버로부터 SYN + ACK를 받은 클라이언트는 응답으로 ACK 패킷을 보낸다.

      # 이때 ACK 패킷은 서버로부터 받은 Sequence Number에 +1을 하여 보낸다. ( 200 + 1 ) 

         Acknowledgment Number 201을 보낸다.







  3 Way-Handshaking 실습


   - TCP통신에 사용한 환경은 리눅스( linuxt_centOS-5.1.1 )내 파이썬( Python3.6.0 ) 사용

   - 클라이언트측 파일과 서버측 파일을 파이썬 코드로 구성

   - 간단한 TCP 통신으로 3 Way-Handshaking이 이뤄지는지 확인



 ↑3 Way- Handshaking이 이루어 지는 것을 확인할 수 있었다.

    # 클라이언트 측에서 서버측에 연결을 시도하자 위와같은 결과를 얻을 수 있었다.

    # TCP 통신은 랜덤으로 정해진 Sequence Number로 SYN, SYN+ACK, ACK를 통해 클라이언트와 서버는 통신에 앞서 

       동기화과정을 통해 신뢰성 있는 통신을 시도한다.









참고 ========================

http://mintnlatte.tistory.com/552