2016-09-26 13 views
0

pcap 파일을 구문 분석하고 패킷을 별도로 (TCP, UDP, IP) 계산해야합니다. 나는 pcap, jnetpcap와 같은 많은 라이브러리를 발견했다. 그러나 나는 외부 라이브러리를 사용하지 않고 이것을하고 싶다. 코드가 필요 없지만 개념적 설명 만 필요합니다.라이브러리를 사용하지 않고 pcap 파일 (tcpdump 출력)에서 프레임 추출하기

Question 

내가 프레임을 구별하는 방법을 PCAP 파일을 구문 분석하는 동안 (이것은 TCP, UDP, IP 수). 형식에 대해 읽으려고했으나 이해할 수없는 것은 특정 프레임에 대해 얼마나 많은 바이트를 읽어야하는지, 그리고 어떤 프레임 유형인지를 알 수있는 방법입니다. 한 번만 사용할 수 있기 때문에 패킷을 따로 추출하면 다른 정보를 걸러 낼 수 있습니다.

+1

_ "외부 라이브러리를 사용하지 않고이 작업을 수행하고 싶습니다."_ 그런 다음 사양으로 들어가서 바퀴를 다시 만듭니다. 그렇게하는 법을 우리에게 묻는 것은 너무 광범위합니다. – CodeCaster

+0

pcap은 데이터를 유선처럼 캡처합니다. 그것이 IP인지, TCP인지, UDP인지를 확인하려면 이러한 프로토콜이 어떻게 전송되는지 이해해야합니다. 당신은 pcap 명세에서 그러나 IP, TCP ... 명세에서이 것을 발견하지 못할 것이다. –

답변

0

각 프레임을 별도로 구문 분석하고 계산하려는 각 값에 대한 카운터가 있어야합니다. 검사하는 캡처가 pcap/pcapng 형식이라고 가정하면 libpcap이 유용 할 수 있습니다.

uint64_t ip_count, tcp_count, udp_count; 

void parse_pkt(uint8_t *data, uint32_t data_len) { 
    uint8_t *ether_hdr = data; 
    uint16_t ether_type = ntohs(*(uint16_t *) (data + 12)) 

    if (ether_type != 0x800) { 
     return; 
    } 
    ip_count += 1; 

    uint8_t *ip_hdr = data + 14; 
    protocol = ntohs(*(uint16_t *) (ip_hdr + 9)) 
    //protocol is either udp/tcp/sctp...etc 
    if (protocol == 0x11) { 
     udp_count++; 
    } else if (protocol == 0x06) { 
     tcp_count++; 
    } 
} 

// foreach pkt from libpcap_open call parse_pkt with the data and data_len 

이 코드는 깨지기 쉬운 당신 이 (낮은 수준은 VLAN 태그없이 이더넷을 가정하고)해야 할 일의 빠른 실행을 제공합니다. 적절한 길이와 유형 검사없이 직접 오프셋으로 점프하는 것은 좋은 생각이 아닙니다.