본문으로 바로가기

TCP 로우 소켓 프로그래밍

category SECURITY/Network 2017. 4. 26. 22:17

 


   TCP 로우 소켓 프로그래밍


   TCP

- 흐름제어, 오류정정, ...

- UDP에 비해 느리고, 안전한 통신이 가능

- 대규모 통신에 적합하다.


   TCP 헤더 (최소 20바이트)


1) 출발지 포트 (2바이트)

2) 도착지 포트 (2바이트)

3) 시퀀스 넘버 (4바이트)

4) Acknowledge 넘버 (4바이트)

5) 헤더길이 & 플래그 (2바이트)

   플래그 (URG,ACK,PSH,RST,SYN,FIN)

6) 윈도우 사이즈 (2바이트)

7) 체크썸 (2바이트)

8) 패딩 (2바잍) - TCP최소길이(20바이트)를 채우기 위한 용도

 

[ TCP_Server 소스코드 ]

[ TCP Client 소스코드 ]

[ Sniffer 소스코드 ]

[ Client측 보낸 메시지 - hello ]

 

 

여기서 4-way handshaking을 볼 수 있다. 위에 프로그램을 통해 받은 패킷들을 정리해서 그림으로 나타내 보았습니다.

 

1) 처음 client 쪽의 seq number는 ISN 넘버라고도 하며 초기 값을 나타냅니다. ACK 넘버는 받은것이 없기 때문에 0으로 된 것을 확인할 수 있고, FLAG가 2인것으로 보아 이진수로 변환하면 0000 0010이므로 SYN임을 볼 수 있습니다.

2) 서버쪽에서 클라이언트에 패킷을 받았기 때문에 보낸 ack number는 받은 seq number의 1를 증가해 보내게 되고, 서버측도 seq넘버를 처음 보내기 때문에 랜덤값으로 생성되며 ISN넘버라고도 합니다. 여기서 FLAG는 18로 이진수로 변환하면 0001 0010 이므로 ACK와 SYN 패킷을 보내는 것을 볼 수 있습니다.

3) 서버측에서 SYN을 보냈기 때문에 받는 ACK를 다시 보내는 것을 확인해 볼 수 있고, 마찬가지로 ack number가 1 증가해 보낸다는 것을 확인할 수 있습니다.

4) hello라는 데이터를 보내기 위해 ACK와 PSH를 보내며 24를 이진수로 변환하면 0001 1000임을 확인할 수 있습니다.

5) hello라는 5바이트의 데이터를 받았기 때문에 ack number를 보낼때에는 데이터의 크기와 함께 합쳐 보냅니다.

6) 끝내기 위해서 FLAG가 17인 FIN,ACK를 보냅니다

7) 똑같이 ack number는 이전 seq number에서 1증가해 보내고 FIN,ACK를 보냅니다.

8) 알았다는 뜻으로 서버측에서 ACK 메시지를 보내며 연결이 종료됩니다.

 

이론 참고 : 네트워크 기초 TCP_UDP

 

 

'SECURITY > Network' 카테고리의 다른 글

이더넷 소켓 프로그래밍  (0) 2017.04.28
IP 로우 소켓 프로그래밍  (0) 2017.04.27
리눅스 네트워크 설정  (1) 2017.04.27
UDP 로우 소켓 프로그래밍  (0) 2017.04.25
소켓 프로그래밍  (0) 2017.04.24