2016년 6월 11일 토요일

뇌자극 TCP_IP 프로그래밍 21강 요약

21강 RAW Socket

1. RAW Socket 의 필요성

setsockeopt 함수를 이용해서 소켓을 세밀하게 조절 할수 있다.
하지만 이 함수는 TCP의 흐름을 제어하는 기술로 더 낮은 계층을 다룰 수는 없다.
이 때 필요한 것이 RAW Socket 다.

로수 소켓을 다루기 위해서는 socket 함수 호출 시 두 번째 매개 변수 값
SOCK_RAW로 설정하면 된다.
로우 소켓은 시스템 하부로 접근하므로 루트 권한이 필요하다.

예제)
int icmp_socket;
icmp_socket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

2. ICMP 체크 프로그램 개발

ICMP란? Internet Control Message Protocl 의 약어다.
ICMP 프로토콜은 다른 호스트나 게이트웨이와 연결된 네트워크 문제가 있는지
확인할 때 주로 쓰인다. 예를 들면 ping 명령어를 들 수 있다.

ICMP는 인터넷 계층의 프로토콜이므로 로우 소켓을 이용해야 한다.

ICMP 프로토콜의 구조

Type :  ICMP 패킷의 유형을 지정하기 위해서 사용한다.
          ICMP 요청은 8이고, 이에 대한 응답은 0이다
code : 각 type에 대한 결과 정보를 전송하기 위해서 사용한다.
         그러므로 type에 따라서 다른 code 값을 가진다.

Checksum : 패킷 송수신 도중에 잡음 등으로 인한 데이터 변조가 발생했는지 검사하기 위해서 사용한다.
동일한 데이터면 동일한 checksum 값이 나오도록 하는 일종의 해시 알고리즘을 사용한다.
checksum 값은 패킷을 보내는 쪽에서 데이터의 내용을 검사해서 만든다.

받는 쪽에서는 동일한 방식으로 데이터 내용을 검사해서 chacksum 값과 일치하는지 확인한다.
만약 전송 도중 변조가 발생했다면 checksum 값이 일치하지 않게 되고
데이터를 받은 측에서는 받은 데이터에 문제가 있음을 인지하게 된다.

ID : 내가 보낸 ICMP 패킷인지 확인하기 위해 사용한다

CMP :  네트워크의 상태를 측정하기 위해 사용한다. 이때 네트워크 속도를 측정하기도 한다.
ICMP 요청에 대한 응답시간을 검사하는 방식이다.
네트워크 속도를 정확하게 측정하려면 여러 ICMP 요청을 보내서 응답 시간을 평균을 내야 한다.
이 경우 ICMP 패킷에 일련번호가 매겨저 있어야 정확한 계산이 가능할 것이다.

3. 패킷 캡처 프로그램 개발

소스는 깃 허브에 올렸고 대략적인 흐름을 적겠다.

1) 로우 소켓을 만든다.
2) 로우 소켓으로 데이터를 읽는다.

3) PrintPacket 함수로 패킷 헤더를 분석하고 프로토콜에 맞는 함수를 호출한다.
4) iphdr 구조체로 IP 헤더를 가리킨다.

5) 프로토콜을 읽어서 여기에 맞도록 처리한다.
6) 패킷 캡처는 헤더를 제외한 사용자 데이터에만 이루어져야 한다.
   TCP 데이터는 IP 패킷 + TCP 패킷 + 데이터로 구성되어 있으므로
   읽은 데이터의 처음부터 IP 패킷 + TCP 패킷 만큼 포인터를 이동해서
   유저 데이터의 시작 지점부터 읽는다.

7) 읽은 데이터를 출력한다.

리눅스용 코드랑 윈도우용 코드를 따로 저장소를 분리해서 리눅스용 깃허브를 먼저 링크 건다.

소스 코드 받기

4. 윈속 RAW Socket 프로그래밍

윈도우는 리눅스와 달리 IP와 ICMP, TCP 패킷 헤더 정보를 저장하기 위한 구조체를 제공하지 않는다.
그러므로 개발자가 필요에 따라서 자체 개발해서 사용해야 한다.
그 외에는 리눅스 용이랑 동일하다.

소스 코드 받기

5. libpcap 을 이용한 패킷 캡처

제대로 된 패킷 프로그램을 만들려면 통계와 필터링 기능을 갖추고 있어야 한다.
libpcap 은 패킷 캡처를 쉽게 할 수 있도록 각종 함수를 제공하는 라이브러리다.

댓글 없음:

댓글 쓰기