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
E \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 |