Подтвердить что ты не робот

Получение количества пакетов в файле захвата pcap?

Мне нужна программа, которая печатает количество пакетов в файле захвата, которое использует формат pcap. Это число не представляется доступным в заголовке pcap (возможно, потому, что оно записано до начала захвата), и, похоже, в файле нет "нижнего колонтитула", с этой информацией.

Итак, я считаю, что единственным алгоритмом является цикл по всем пакетам и их суммирование. Он находится в O (N) и для больших трасс довольно длинный.

Я публикую здесь, чтобы узнать, есть ли у кого-то более умная идея?

Я отметил "C", потому что это язык, который я использую в настоящее время, но я считаю, что это проблема, не зависящая от языка.

4b9b3361

Ответ 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 делает это. Он читает "следующий кадр" по мере необходимости, сохраняя необработанные фреймы в двойном списке для упрощения будущей навигации "вперед/назад" вперед, считывая больше кадров с диска по мере необходимости. Однако анализ содержимого фрейма оставлен на усмотрение пользователя библиотеки и не выполняется, просто читая октеты фрейма в структуру данных.