TCP 3-Way Handshake

2017. 7. 12. 18:56NetworkHacking/Network




전송 제어 프로토콜(TCP)은 근거리 통신망이나 인트라넷, 인터넷에 연결된 컴퓨터에서 실행되는 프로그램간 데이터를 에러없이 순서대로 교환할 수 있게한다



< TCP 세그먼트 구조 >


[ 그림1 ]


1> 출발지포트 ( 2byte )

2> 도착지포트 ( 2byte )

3> 시퀀스넘버 ( 4byte )

4> Acknowlege Number ( 4byte )

5,6> TCP Header Length(4bit) & TCP Flag(나머지) ( 2byte )

Flag (6bit)

0      0    0     0     0     0

URG ACK PSH RES SYN FIN

         32    16    8    4    2    1

U : Urgent ( URG )

A : Acknowledgement ( ACK ) : 값을 정한다

P : Push ( PSH ) : 데이터를 전달하는 경우 사용한다

  R : Reset ( RST )    : 연결 초기화

  S : Synchronize ( SYN ) : 동기화 시퀀스 번호

        F : Finish ( FIN ) : 남은 송신측 데이터 없음

7> Window Size ( 1byte )

8> Checksum ( 2byte ) 

9> 긴급 포인트 or 더미 ( 2byte )

urgent flag때 긴급포인트로 사용하거나  20byte가되도록하는 패딩을 채워주는 더미역할



< 3-Way Handshake >

[ 그림2 ]


TCP는 flag의 값을 이용해서 3-Way Handshake라는 특별한 통신기법을 사용합니다

파이썬 프로그래밍을 하여 직접 TCP통신을 수행하고, 해당 패킷을 해석해보겠습니다


#vi Tcp.py: TCP패킷 생성1

#vi Packet.py: TCP패킷 생성2

#vi sniffer.py:    패킷 수집


=> 'eth0' 장치로 오고 나가는 패킷들을 출력해주며, TCP통신일 경우 해당 헤더의 정보들을 출력하도록 조건을 줌


#vi TCP_Server.py: 서버

#vi TCP_Client.py:    클라이언트


=> TCP통신을 하는 서버를 열어준 뒤, Client파일을 실행시켜 서로 TCP통신을 실시한다


컴퓨터A

#python3 tcp_server.py


컴퓨터B

#python3 sniffer.py

#python3 tcp_client.py [A의 IP] [A의 포트번호]


[ 실행결과 ]

[ sniffer.py 출력화면 ] 


tcp_client파일을 이용해서 열려있는 tcp_server에게 TCP통신으로 데이터를 전송하였습니다

sniffer 프로그램을 통해 출력한 결과를 해석하고 3-Way Handshake 과정을 이해하도록 합시다


#결과 해석



< TCP 3-Way HandShake 순서 >


1> client에서 server에게 SYN패킷을 보낸다

2> server는 client에게 SYN+ACK 패킷으로 응답으르 한다

3> client는 server에게 ACK패킷을 보내서 마지막 응답을 한다

4> 서로 데이터를 주고 받는다

5> 데이터 교환이 끝나면, client는 server에게 FIN패킷을 보낸다

6> server는 client에게 FIN+ACK패킷을 보낸다 ( 각각 따로 보낼 수 도 있음, 운영체제에 따라 다르다 )

7> client는 server에게 ACK패킷을 보내고 TCP연결을 종료된다