Я надеюсь, что это проливает некоторый свет на проблему. Из справочной страницы :
Когда tcpdump заканчивает захват пакетов, он сообщит о количестве:
перехваченные пакеты (это количество пакетов, которые tcpdump получил и обработал);
пакеты, полученные фильтром (значение этого зависит от ОС, в которой вы запускаете tcpdump, и, возможно, от того, как была настроена ОС - если в командной строке был указан фильтр, в некоторых ОС он считает пакеты независимо от того, они были сопоставлены выражением фильтра и, даже если они были сопоставлены выражением фильтра, независимо от того, прочитал ли и обработал ли их tcpdump, в других ОС он считает только пакеты, которые были сопоставлены выражением фильтра, независимо от того, прочитал ли tcpdump и обработал их еще, и в других ОС он считает только пакеты, которые были сопоставлены выражением фильтра и были обработаны tcpdump);
пакеты, отброшенные ядром (это количество пакетов, которые были отброшены из-за недостатка места в буфере механизмом захвата пакетов в ОС, на которой работает tcpdump, если ОС сообщает эту информацию приложениям; если нет, то будет сообщено как 0).
И есть запись в списке рассылки с 2009 года, объясняющая:
Номер «пакеты, полученные фильтром» - это ps_recv
номер от звонка до pcap_stats()
; с БНФ , это bs_recv
число из BIOCGSTATS ioctl
. Это количество включает в себя все пакеты, которые были переданы в BPF; эти пакеты могут все еще находиться в буфере, который еще не был прочитан libpcap (и, следовательно, не передан tcpdump), или могут быть в буфере, который был прочитан libpcap, но еще не передан tcpdump, поэтому он может считать пакеты, которые не сообщаются как "захваченные".
Может быть, процесс убит слишком быстро? Также есть -c N
флаг, указывающий tcpdump завершать работу при N
захвате пакетов.
Поскольку ваша проблема кажется довольно специализированной, вы также можете использовать libpcap
напрямую или через одну из сотен языковых привязок .
На ваш вопрос, поскольку все, что вы получаете - это захваченные пакеты в capture.cap
файле, вы можете просто посмотреть на прогоны, где он не пустой, и изучить их, т. Е. Посчитать строки?
tcpdump -r capture.cap | wc -l
Вероятно, есть лучший способ использовать libpcap для возврата количества записей в файле захвата ...