【问题标题】:Packets getting dropped with Libpcap in C on 1 Gig Traffic在 1 Gig 流量上使用 C 中的 Libpcap 丢弃数据包
【发布时间】:2020-08-21 08:21:07
【问题描述】:

我正在使用 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: %s\n", 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%s\n", 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 seconds\n", count, non_packets, time_spent);
    return 0;
}


我正在使用 tcpreplay 播放来自 pcap 文件的实时流量。然而,我的程序只能从 240,000 个数据包的文件中处理/读取大约 80,000 个数据包。当我尝试从 tcpdump 读取相同的数据包时,我没有丢包。

这是由于缓冲区大小造成的吗?如何确保数据包不丢失?

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

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

【问题讨论】:

  • 贴出的代码无法编译!除其他问题外,它缺少所需头文件的#include 语句,您是否希望使用猜测您实际使用的头文件?
  • 编译时,始终启用警告,然后修复这些警告。 (对于gcc,至少使用:-Wall -Wextra -Wconversion -pedantic -std=gnu11)注意:其他编译器使用不同的选项来产生相同的结果
  • 关于; int main(int argc, char *argv[]) 这会导致编译器输出 2 条关于未使用参数的警告消息。建议使用main()int main( void )的其他有效签名
  • 关于:const unsigned char *packet; 当指针不指向任何东西时,它怎么可能是const
  • 关于; if (device == NULL) 这永远不会是真的,因为:char *device = "ens33";

标签: c tcpdump libpcap packet-capture tcpreplay


【解决方案1】:

当我尝试从 tcpdump 读取相同的数据包时,我没有丢包。

这是由于缓冲区大小造成的吗?

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

如何确保数据包不丢失?

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

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

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

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

【讨论】:

    猜你喜欢
    • 2010-11-20
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多