使用C中的Libpcap丢弃的数据包流量为1Gg



我正在使用libpcap库用C编写一个数据包解析器。这是的简单代码


int main(int argc, char *argv[])
{
pcap_t *pcap;
const unsigned char *packet;
char errbuf[PCAP_ERRBUF_SIZE];
struct pcap_pkthdr header;
clock_t begin = clock();
// Type your interface name here 

char *device = "ens33";
char error_buffer[PCAP_ERRBUF_SIZE];
pcap_t *handle;
int timeout_limit = 10000; // milliseconds
if (device == NULL)
{
printf("Error finding device: %sn", error_buffer);
return 1;
}
// For live packet capturing
handle = pcap_open_live(
device,
BUFSIZ,
0,
timeout_limit,
error_buffer);
if (handle == NULL)
{
printf("Error getting handle%sn", error_buffer);
return 2;
}
pcap_loop(handle, 0, dump_UDP_packet, NULL);
clock_t end = clock();
double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;

printf("Program completed: total packets processed: %d (non UDP/Radius packets: %d) in %f secondsn", count, non_packets, time_spent);
return 0;
}

我使用tcpreplay来播放pcap文件中的实时流量。然而,我的程序只能从240000个数据包的文件中处理/读取大约80000个数据包。当我尝试从tcpdump读取相同的数据包时,我不会丢失数据包。

这是因为缓冲区的大小吗?如何确保数据包不丢失?

tcpreplay在高速(~500MB/秒(下大约需要1.5到2秒

我在Ubuntu 18.04上运行它(32 GB RAM,24核处理器(

当我尝试从tcpdump读取相同的数据包时,我不会丢失数据包。

这是因为缓冲区的大小吗?

除非您使用-B命令行选项,tcpdump不会设置内核缓冲区大小(您也没有这样做,因为您使用的是pcap_open_live(),它没有设置它的方法;快照长度是而不是缓冲区大小(,所以它使用的默认缓冲区大小与您的程序使用的相同(2MIB(,所以可能不是缓冲区大小。

如何确保数据包不丢失?

尝试使用tcpdump的1秒(1000毫秒(超时,而不是您当前使用的10秒(10000毫秒(。

此外,请确保dump_UDP_packet()没有做太多工作(您还没有提供源代码让我们知道它在做什么(。

我在Ubuntu 18.04上运行它(32 GB RAM,24核处理器(

您的程序和tcpdump都使用一个核心。(在上下文切换之后,它们可能在与上下文切换之前运行的内核不同的内核上运行,但每次仍然是一个内核;它们都不是多线程的,除非应用程序中有一些线程没有显示。(

最新更新