2016-09-26 3 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 полезным.

Чтобы дать быстрый бег, что вы мощь должны сделать (предполагая, что нижний уровень Ethernet без VLAN тегов)

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 

Этот код является хрупким. Прыжки к прямым смещениям без правильной длины и проверки типов - это не очень хорошая идея.

Смежные вопросы