gpt4 book ai didi

network-programming - libpcap:pcap_dispatch 或 pcap_next 的效率如何

转载 作者:行者123 更新时间:2023-12-01 13:56:00 26 4
gpt4 key购买 nike

我使用 libpcap 捕获大量数据包,然后处理/修改这些数据包并将它们发送到另一台主机。

首先,我创建一个 libpcap 处理程序 handle并将其设置为非阻塞,并使用 pcap_get_selecable_fd(handle)获取对应的文件描述符pcap_fd .

然后我为这个 pcap_fd 添加一个事件到一个 libevent 循环(就像 select() 或 epoll())。

为了避免频繁轮询这个文件描述符,每次有数据包到达事件时,我使用pcap_dispatch收集一个缓冲区的数据包并将它们放入队列packet_queue ,然后调用process_packet处理/修改/发送队列中的每个数据包packet_queue .

  pcap_dispatch(handle, -1, collect_pkt, (u_char *)packet_queue);
process_packet(packet_queue);

我使用 tcpdump 捕获 process_packet(packet_queue) 发送的数据包,并注意:
  • 一开始,发送数据包之间的间隔很小
  • 在发送了几个数据包之后,间隔变为大约 0.055 秒
  • 发送20个数据包后,间隔变为0.031秒并保持为0.031秒

  • 我仔细检查了我的源代码,没有发现导致如此大间隔的可疑 block 或逻辑。所以不知道是不是函数 pcap_dispatch的问题.

    pcap_dispatch 或 pcap_next 甚至 libpcap 文件描述符是否存在效率问题?
    谢谢!

    最佳答案

    在许多平台上libpcap使用特定于平台的实现来更快地捕获数据包,因此 YMMV。通常,它们涉及内核和应用程序之间的共享缓冲区。

  • 一开始,在数据包开始堆积在 RX 缓冲区和开始处理之间有一个时间窗口。这些数据包的积累可能会导致这里出现更高的频率。无论实现如何,这部分都是正确的。
  • 我还没有找到令人满意的解释。也许您落后并错过了一些数据包,因此您重新发送数据包之间的时间变长了。
  • 我认为这是您在正常操作中所期望的。
  • pcap_dispatch至少在 libpcap . pcap_next ,另一方面,会招致两个惩罚(至少在 Linux 上,但我认为在其他主流平台上也是如此):每个数据包的系统调用( libpcap 调用 poll 进行错误检查,即使在非阻塞模式下也是如此)和副本( libpcap 尽快释放共享缓冲区中的“槽”,因此它不能只返回该指针)。一个实现细节是,在 Linux 上, pcap_next只需调用 pcap_dispatch对于一个数据包并带有复制回调。

    关于network-programming - libpcap:pcap_dispatch 或 pcap_next 的效率如何,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17347712/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com