libpcap:接收帧和回调函数调用之间的延迟

时间:2016-04-13 11:37:21

标签: c++ c linux-kernel libpcap

我遇到以下情况: 我用pcap_open_live()我的一个网络接口打开。然后我正在为pcap编译一个过滤器,仅用于捕获指定的以太网类型(ether proto 0x1234)。现在我开始pcap_loop()。回调函数执行的唯一事情是通过pcap_inject()发送帧。 (该帧被硬编码为全局字符数组)。

当我现在比较接收帧和发送帧的时间戳时(例如,在第三个非涉及的计算机上的wireshark上),延迟大约是3毫秒(最小1毫秒,但也高达10毫秒)。因此,pcap平均需要大约3毫秒来继续接收帧并调用回调函数来发送新帧。 我希望/必须减少这种延迟。

我已经尝试过以下事情:

  • pcap_open_live()中尝试了 read-timout(以毫秒为单位)的所有不同变体:即使读取时间为-1,根据我的知识应该是轮询,会产生延迟大约3毫秒
  • 设置无过滤器
  • 设置更高的优先级以处理
  • 设置InterrupThrottleRate=0e1000 / e1000e内核模块的其他参数以强制硬件为每个帧发送中断

但我从未在平均3毫秒的时间内减少延迟。

对于我计划的应用程序,有必要在 <100> 的时间内对传入的数据包作出反应。 这通常可以用libpcap吗?!或者有没有其他建议来实现这样的应用程序?

感谢您的回复, 我希望有人能帮助我!

Notes :我在Linux / Ubuntu下用C / C ++进行部署。

1 个答案:

答案 0 :(得分:1)

  

对于我计划的应用程序,有必要在 <100> 的时间内对传入的数据包作出反应。

然后缓存libpcap运行的许多捕获机制(除了AIX上的BPF,Linux上的TPACKET_V3,更新的libpcap和内核,Solaris 10及更早版本的DLPI等),以减少每个数据包的开销会妨碍你。

如果系统上的libpcap具有pcap_set_immediate_mode()功能,则:

  • 使用pcap_create()pcap_activate()而不是pcap_open_live()来打开捕获设备;
  • pcap_set_immediate_mode()pcap_create()来电之间致电pcap_activate()

在&#34;立即模式&#34;中,一旦捕获机制收到数据包,捕获机制就应该将数据包传递给应用程序。