ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • pcap Library
    Network 2013. 6. 14. 23:07

    pcap library download : http://www.tcpdump.org

    download in linux : apt-get install libpcap

    참조 사이트 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Network_Programing/AdvancedComm/pcap_intro


    device setup


     char pcap_lookupdev(char *errbuf);

     패킷을 캡쳐할 적당한 네트워크 디바이스(NIC : Network Interface Card)를 찾아 그 디바이스를 지칭하는 String을 반환한다.
    네트워크 디바이스를 지칭하는 스트링은 각 운영체제 별로 표현되는 별명(alias)을 말하며 Linux의 경우 "eth0", "eth1" 식으로 표현된다.

    ▪ char *errbuf : 에러 발생 시 에러 메시지 저장하는 버퍼.
     [return value]
    ▪ NULL : 에러 발생시
    ▪ string : 네트워크 디바이스의 별명(alias)

     

    int pcap_lookupnet(char *device, bpf_u_int32 *netp, bpf_u_int32 *maskp, char *errbuf); 

     네트워크 디바이스의 네트워크 주소와 netmask 정보를 가져오기 위해 사용된다.

     ▪ char *device : 네트워크 디바이스의 별명(alias).
    ▪ bpf_u_int32 *netp : 네트워크 디바이스의 네트워크 주소가 저장될 주소.
    ▪ bpf_u_int32 *maskp : 네트워크 디바이스의 넷마스크 주소가 저장될 주소.
    ▪ char *errbuf : 에러 발생시 에러 메시지 저장.
    [return value]
     ▪ -1 : 에러 발생시

     

     pcap_t *pcap_open_live(char *device, int snaplen, int mode, int to_ms, char *ebuf);

     네트워크의 패킷들을 보기 위해 필요한 packet capture descriptor를 얻기 위해 사용된다.

     ▪ char *device : 사용할 네트워크 디바이스를 지시하는 String. "nay", NULL로 설정할 경우 모든 디바이스에서 패킷을 캡쳐한다.
    ▪ int snaplen : 캡처할 최대 Byte 수. 크기를 조절하여 필요한 데이터만 받아 올 수 있다.
    ▪ int mode : 기본적으로 1 (PROMISCUOUS) 로 설정하여 사용한다.
    1 일 경우 동일 네트워크 내의 다른 호스트의 패킷 역시 받아들이는 것이고,
    0 일 경우 자신에게 온 패킷만 받아들이는 것
    ▪ int to_ms : 패킷이 버퍼로 바로 전달되는 것이 아니라 설정한 시간이 지나거나 버퍼가 다 차게 되면 전달한다.
    ▪ char *ebuf : pcap_open_live()가 실패할 경우에만 에러 메시지가 저장된다. 보통 NULL 값을 갖는다.

     


    packet filtering


     int pcap_compile(pcap_t *p, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 netmask);

     스트링 형태의 필터링 룰을 해석해 bpf_program 구조체에 저장한다.

     ▪ pcap_t *p : 패킷 캡쳐 descriptor.
    ▪ struct bpf_program *fp : 필터링 룰에 따라 결정될 구조체.
    ▪ char *str : 스트링 형태의 필터링 룰.
    ▪ int optimize : 결과 코드를 수행할 때 최적화 여부.
    ▪ bpf_u_int32 netmask : 네트워크의 mask.
    [return value]
    ▪ 0 : 성공 ▪ -1 : 실패

     

     int pcap_setfilter(pcap_t *p, struct bpf_program *fp);

     네트워크 장치 디스크립터에 필터 프로그램을 지정함. pcap_compile()을 통해 결정된  bpf_program 구조체를 적용할 때 사용된다.

     ▪ pcap_t *p : 패킷 캡쳐 descriptor.
    ▪ struct bpf_program *fp : 보통 pcap_compile()에서 결과.
    [return value]
    ▪  0 : 성공  ▪ -1 : 실패

     

    packet capture


     u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h)

     pcap_next함수는 pcap_open_live함수를 통해 리턴된 장치ID인 p를 넘겨 캡쳐한 패킷의 기본정보를 h에 담아주고 해당 패킷의 데이터를 리턴하게 된다.

     pcap_t *p : 패킷 캡쳐 descriptor.

     

     int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user);

     실제 패킷을 잡아서 실행할 함수를 지정해 주는 함수입니다. cnt의 수만큼 패킷을 잡아서 잡을 때 마다 해당 패킷을 처리하기 위해 allback 함수를 수행하게 된다.

     ▪ pcap_t *p : 패킷 캡쳐 descriptor.
    ▪ int cnt : 읽을 패킷의 개수.
    ▪ pcap_handler callback : 패킷을 처리할 함수
    ▪ u_char *user : 사용자 데이터.
    [return value]
    ▪ 성공시 읽은 패킷의 개수
    ▪ 0 : 저장 파일의 EOF
    ▪ -1 : 에러가 발생했을 때

     

     void pcap_close(pcap_t *p)

     pcap_t와 관계되는 파일을 닫고 사용한 자원들을 닫는다.

     ▪ pcap_t *p : 패킷 캡쳐 descriptor.

     

    Programming Example  


    1. 네트워크 인터페이스 명칭 지정한다.

    2. 네트워크 인터페이스 디스크립터 얻는다.



    3. filter rule 을 컴파일 시킨다.

    4. 컴파일된 filter rule을 네트워크 인터페이스에 적용한다.

    5. 패킷을 모으고패킷에 따른 프로세싱을 한다.




     

     

    'Network' 카테고리의 다른 글

    BGP up/down  (0) 2014.10.30
    BGP 간의 주고받는 메시지  (0) 2014.10.19
    ARQ(Automatic Repeat reQuest)  (0) 2014.01.01
    encapsulation  (0) 2013.12.21
    server / client 데이터송수신과정  (0) 2013.06.14
Designed by Tistory.