Получение количества пакетов в файле захвата pcap?
Мне нужна программа, которая печатает количество пакетов в файле захвата, которое использует формат pcap. Это число не представляется доступным в заголовке pcap (возможно, потому, что оно записано до начала захвата), и, похоже, в файле нет "нижнего колонтитула", с этой информацией.
Итак, я считаю, что единственным алгоритмом является цикл по всем пакетам и их суммирование. Он находится в O (N) и для больших трасс довольно длинный.
Я публикую здесь, чтобы узнать, есть ли у кого-то более умная идея?
Я отметил "C", потому что это язык, который я использую в настоящее время, но я считаю, что это проблема, не зависящая от языка.
Ответы
Ответ 1
Роберт Эдмондс, автор pcaputils, упомянул мне, что уже есть программа, которая делает то, что я хочу, capinfos, в пакете Wireshark. Он отображает различные указания на файл pcap, включая количество содержащихся в нем пакетов.
Считывая исходный код, он, похоже, работает, пропуская весь файл последовательно.
Ответ 2
Единственный способ определить, сколько пакетов в файле - прочитать весь файл. Фактически, в заголовке файла нет пакетов, потому что формат был предназначен для записи в один проход, и на самом деле нет нижнего колонтитула.
Ответ 3
Если вы хотите число фреймов в pcap:
tshark -r test.cap | wc -l
Использование capinfos:
capinfos test.cap | grep "Number of packets"| tr -d " " | cut -d ":" -f 2
Использование tcpdump:
tcpdump -r test.cap 2>/dev/null| wc -l
Итак, в основном, используйте libpcap, вот пример:
#include <stdio.h>
#include <pcap.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
unsigned int packet_counter=0;
struct pcap_pkthdr header;
const u_char *packet;
if (argc < 2) {
fprintf(stderr, "Usage: %s <pcap>\n", argv[0]);
exit(1);
}
pcap_t *handle;
char errbuf[PCAP_ERRBUF_SIZE];
handle = pcap_open_offline(argv[1], errbuf);
if (handle == NULL) {
fprintf(stderr,"Couldn't open pcap file %s: %s\n", argv[1], errbuf);
return(2);
}
while (packet = pcap_next(handle,&header)) {
packet_counter++;
}
pcap_close(handle);
printf("%d\n", packet_counter);
return 0;
}
ПРИМЕЧАНИЕ. Вам нужно установить заголовки libpcap (в Linux искать пакет libpcap dev/devel)
Затем скомпилируйте с помощью gcc -o myprogram myprogram.c -lpcap
Ответ 4
Единственный метод, который я знаю, - это прочитать файл, захваченный кадр захваченным фреймом и увеличивать "счетчик пакетов". Однако есть небольшой заголовок кадра, который содержит длину сохраненного фрейма, поэтому вы можете искать вперед в файле по этой длине. Возможно, это не так быстро, подумайте.
Однако, если вам интересно делать больше, чем просто подсчитывать количество захваченных кадров, имеет смысл прочитать данные и построить цепочку захваченных кадров при их подсчете для будущего использования. Моя библиотека PCAP для Common Lisp делает это. Он читает "следующий кадр" по мере необходимости, сохраняя необработанные фреймы в двойном списке для упрощения будущей навигации "вперед/назад" вперед, считывая больше кадров с диска по мере необходимости. Однако анализ содержимого фрейма оставлен на усмотрение пользователя библиотеки и не выполняется, просто читая октеты фрейма в структуру данных.