본문으로 바로가기

IP 로우 소켓 프로그래밍

category SECURITY/Network 2017. 4. 27. 21:46


 

   IP 로우 소켓 프로그래밍


 

   3계층 프로토콜

- IP (Internet Protocol)

- 라우팅 프로토콜(RIP, OSPF, ...)

- IPSEC

- PDU : Packet

- 주소체계 : IPv4, IPv6


   IP 헤더

1) IP버전 & 헤더길이 (1바이트) : 0x45(E)

2) 서비스(1바이트) : 사용하지 않음

3) 패킷 전체 크기(2바이트)

4) 패킷 식별자(2바이트)

5) 플래그 & 프래그먼트 오프셋(2바이트)

첫번째 비트 : 예약된 필드 ( 사용하지 않음 )

두번째 비트 : Don't fragment ( 분할되지 않은 패킷 )

세번째 비트 : More fragment ( 분할된 패킷 )

6) TTL(1바이트) : hop(라우터)의 개수

7) IP패킷의 타입(1바이트) : TCP(6) UDP(17) ICMP(1)

8) 체크섬(2바이트)

9) 출발지 IP 주소(4바이트)

10) 도착지 IP 주소(4바이트)

IP헤더 정보를 알아보기 위해 로우 소켓 프로그래밍으로 확인해보았습니다

 

[ UDP_Server 소스코드 ]

[ UDP_Client 소스코드 ]

[ Sniffer 소스코드 ]

[ Sniffer 결과창 ]

 

결과창으로 받은 내용들을 분석해보면

IP Data

                                                                                                                                                                                                 

   \x00   \x00!    \x00\x00    @\x00      @    \x11   \xb8\xa9    \xc0\xa8\x00j    \xc0\xa8\x00h        

  (1)  (2)    (3)       (4)        (5)      (6)    (7)     (8)            (9)              (10)            

                                                                                                           

 

(1) E : IP 버전과 헤더 길이 - E를 아스키코드표로 보면 16진수로 0x45

(2) \x00 : 서비스타입(현재 사용하지 x)

(3) \x00! : 패킷전체길이 - 16진수로 변환하면 !는 0x21 따라서 33비트 길이를 갖고 있다는 것을 확인할 수 있다.

(4) \x00\x00 : 패킷식별자

(5) @\x00 : 플래그와 프래그먼트 오프셋으로 16진수로 변환하면 0x4000 -> 0b 0100 0000 0000 0000 플래그는 앞에 3비트만 보기 때문에 010이며 두번째 필드만 있어, Don't fragment임으로 분할되지 않은 패킷임을 확인해 볼 수 있다.

(6) @ : TTL로 0x40으로 hop의 개수는 64개이다.

(7) \x11 : IP패킷의 타입으로 10진수로 변환해보면 17. 현재 udp통신을 하고 있으므로 맞다는 것을 확인해 볼 수 있다.

(8) \b8\xa9 : 체크썸

(9) \c0\a8\00j : 출발지 IP 주소로 1바이트씩 끊어보면 \c \a \00 j 이렇게 나누어볼 수 있고, 다 10진수로 변환해 보면 192 168 0 106로 현재 클라이언트 서버주소인 192.168.0.106임을 확인할 수 있다.

(10) \c\a\00h : 도착지 IP 주소로 1바이트씩 끊어보면 \c \a \00 h 이렇게 나누어볼 수 있고, 다 10진수로 변환해보면 192 168 0 104로 현재 서버주소인 192.168.0.104임을 확인할 수 있다.

 

이 과정을 더 쉽게 struct.unpack을 이용해서 표현할 수 있다. 

 

 

 

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

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