C++ libpcap:接收帧和回调函数调用之间的延迟
我正在经历以下情况: 我使用C++ libpcap:接收帧和回调函数调用之间的延迟,c++,c,linux-kernel,libpcap,C++,C,Linux Kernel,Libpcap,我正在经历以下情况: 我使用pcap\u open\u live()我的一个网络接口打开。然后,我正在为pcap编译一个过滤器,以便仅捕获指定的以太网类型(以太网协议0x1234)。现在我开始执行pcap\u循环()。回调函数执行的唯一操作是通过pcap\u inject()发送帧。(帧硬编码为全局字符数组) 当我现在比较接收帧和发送帧的时间戳时(例如,在第三台未涉及的计算机上的wireshark上),延迟大约为3毫秒(最小1毫秒,但也最多为10毫秒)。因此,pcap平均需要3毫秒来处理接收到的
pcap\u open\u live()
我的一个网络接口打开。然后,我正在为pcap编译一个过滤器,以便仅捕获指定的以太网类型(以太网协议0x1234
)。现在我开始执行pcap\u循环()。回调函数执行的唯一操作是通过pcap\u inject()
发送帧。(帧硬编码为全局字符数组)
当我现在比较接收帧和发送帧的时间戳时(例如,在第三台未涉及的计算机上的wireshark上),延迟大约为3毫秒(最小1毫秒,但也最多为10毫秒)。因此,pcap平均需要3毫秒来处理接收到的帧并调用回调函数来发送新帧。
我想/不得不减少延误
以下是我已经尝试过的事情:
- 在
pcap\u open\u live()
中尝试了读取timout的所有不同变体(以毫秒为单位):即使是-1的读取timout(据我所知是轮询),也会产生大约3毫秒的延迟
- 设置无过滤器
- 为进程设置更高的优先级
- 设置
InterrupThrottleRate=0
和e1000
/e1000e
-内核模块的其他参数,以强制硬件为每一帧发送中断
但我从未将延迟降低到平均3毫秒以下
对于我计划的应用程序,有必要在100微秒的时间内对传入的数据包做出反应。
这在libpcap中通常是可行的吗?!或者对于实现这样一个应用程序还有其他建议吗
谢谢你的回复,
我希望任何人都能帮助我
注意:我在Linux/Ubuntu下以C/C++进行部署
对于我计划的应用程序,有必要在100微秒的时间内对传入的数据包做出反应
然后,libpcap运行的许多捕获机制(除AIX上的BPF、具有较新libpcap和内核的Linux上的TPACKET_V3、solaris10和更早版本上的DLPI等)为减少每包开销而提供的缓冲将妨碍您
如果系统上的libpcap具有pcap\u set\u immediate\u mode()
功能,则:
- 使用
pcap\u create()
和pcap\u activate()
,而不是pcap\u open\u live()
,打开捕获设备李>
- 在
pcap\u create()
和pcap\u activate()
调用之间调用pcap\u set\u immediate\u mode()
在“即时模式”中,数据包应在捕获机制接收到数据包后立即通过捕获机制发送到应用程序。“例如,在第三台未涉及的计算机上的wireshark上”。你到底是如何测量延迟的?将一个数据包从这台未涉及的计算机发送到一台具有libpcap的计算机,并接收返回的响应,从而测量往返行程?如果是这种情况,您还需要考虑网络延迟。如果你比较来自不同计算机的时间戳,你也可能会遇到它们之间的时间同步问题。我用一个处于点击模式的NuDog设备嗅探到了这个问题。所以我只比较了一台计算机的时间戳。但是现在使用pcap_set_immediate_mode()函数,我可以大大减少延迟!谢谢你的回复!所以我可以将延迟减少到平均150微秒。。。我不知道为什么我自己没有找到那个解决方案,但它总是出现在只有pcap_open_live()的例子中,就是这样。