我需要一个程序,它在使用pcap 格式的捕获文件中打印数据包的数量。这个数字在 pcap 标头中似乎不可用(可能是因为它是在捕获开始之前写入的),并且文件中似乎没有带有此信息的“页脚”。
所以,我相信唯一的算法是遍历所有数据包并将它们相加。它在 O(N) 中,并且对于大迹线,相当长。
我在这里发帖看看是否有人有更聪明的想法?
我用“C”标记,因为它是我目前使用的语言,但我相信这是一个与语言无关的问题。
pcaputils 的作者 Robert Edmonds 向我提到,在 Wireshark 包中已经有一个程序在做我想做的事情,capinfos。它显示有关 pcap 文件的各种指示,包括它包含的数据包数量。
阅读代码源,它似乎可以通过按顺序遍历整个文件来工作。
确定文件中有多少数据包的唯一方法是读取整个文件。实际上,文件头中没有数据包计数(因为该格式被设计为一次可写),实际上也没有页脚。
如果您想要pcap 中的帧数:
tshark -r test.cap | wc -l
使用 capinfo:
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 编译
我知道的唯一方法是读取文件,逐帧捕获并增加“数据包计数器”。但是,有一个包含存储帧长度的小帧头,因此您可以在文件中查找按那个长度。请注意,它可能不会更快。
但是,如果您有兴趣做的不仅仅是简单地计算捕获的帧数,那么阅读数据并在计算它们的同时构建捕获的帧链以供将来使用可能是有意义的。我的 Common Lisp 的 PCAP 库就是这样做的。它根据需要读取“下一帧”,将原始帧存储在双链表中,以便将来更轻松地进行“下一帧/上一帧”导航,根据需要从磁盘读取更多帧。但是,帧内容的解析由库用户自行决定,并且不会通过简单地将帧八位字节读入数据结构来强制执行。
您可以使用 tshark 和 -qz 打印 .pcap 文件的统计信息
例如,以 5 秒为间隔分析文件:
❯ tshark -r file1.pcap -qz io,stat,5,"COUNT(frame) frame"
=============================
| IO Statistics |
| |
| Duration: 17. 29551 secs |
| Interval: 5 secs |
| |
| Col 1: COUNT(frame) frame |
|---------------------------|
| |1 | |
| Interval | COUNT | |
|------------------| |
| 0 <> 5 | 10 | |
| 5 <> 10 | 10 | |
| 10 <> 15 | 10 | |
| 15 <> Dur| 6 | |
=============================
同一个文件,现在使用一个 30 秒的间隔
❯ tshark -r file1.pcap -qz io,stat,30,"COUNT(frame) frame"
==================================
| IO Statistics |
| |
| Duration: 17.0 secs |
| Interval: 17.0 secs |
| |
| Col 1: COUNT(frame) frame |
|--------------------------------|
| |1 | |
| Interval | COUNT | |
|----------------------| |
| 0.0 <> 17.0 | 36 | |
==================================