libpcap:接收帧和调用回调函数之间的延迟
libpcap: Delay between receiving frames and call of callback-function
我遇到了以下情况:
我用 pcap_open_live()
我的网络接口之一打开。然后我正在为 pcap 编译一个过滤器,只捕获指定的以太网类型(ether proto 0x1234
)。现在我开始 pcap_loop()
。回调函数执行的唯一一件事是通过 pcap_inject()
发送一个帧。 (框架被硬编码为全局字符数组)。
当我现在比较接收帧和发送帧的时间戳时(例如,在第三台非相关计算机上的 wireshark 上),延迟大约为 3 毫秒(最小 1 毫秒,但也最多 10 毫秒)。所以 pcap 平均需要大约 3 毫秒来处理接收到的帧并调用回调函数来发送新帧。
我 want/have 减少延迟。
以下我已经尝试过的事情:
- 在
pcap_open_live()
中尝试了读取超时(以毫秒为单位)的所有不同变体:即使是-1的读取超时,据我所知应该是轮询,产生大约 3 毫秒的延迟
- 设置无过滤器
- 为进程设置更高的优先级
- 设置
InterrupThrottleRate=0
和e1000
/e1000e
-内核模块的其他参数来强制硬件为每一帧发送一个中断
但我从来没有将延迟降低到平均 3 毫秒以下。
对于我计划的应用程序,有必要在 100 微秒 内对传入的数据包做出反应。
对于 libpcap,这甚至通常可行吗?!或者对于实现这样的应用程序还有其他建议吗?
感谢您的所有回复,
我希望有人能帮助我!
注意事项:我在C/C++中的Linux/Ubuntu下部署。
For my planned application it is necessary to react to incoming packets in a time under 100 microseconds.
然后是 libpcap 运行的许多捕获机制的缓冲(BPF 除了在 AIX 上,TPACKET_V3 在 Linux 上使用较新的 libpcap 和内核,DLPI 在 Solaris 10 和更早版本上,等等。 ) 提供以减少每个数据包的开销会妨碍您。
如果您系统上的 libpcap 具有 pcap_set_immediate_mode()
函数,则:
- 使用
pcap_create()
和pcap_activate()
,而不是pcap_open_live()
来打开捕获设备;
- 在
pcap_create()
和 pcap_activate()
调用之间调用 pcap_set_immediate_mode()
。
在 "immediate mode" 中,捕获机制应在捕获机制接收到数据包后立即将其传递给应用程序。
我遇到了以下情况:
我用 pcap_open_live()
我的网络接口之一打开。然后我正在为 pcap 编译一个过滤器,只捕获指定的以太网类型(ether proto 0x1234
)。现在我开始 pcap_loop()
。回调函数执行的唯一一件事是通过 pcap_inject()
发送一个帧。 (框架被硬编码为全局字符数组)。
当我现在比较接收帧和发送帧的时间戳时(例如,在第三台非相关计算机上的 wireshark 上),延迟大约为 3 毫秒(最小 1 毫秒,但也最多 10 毫秒)。所以 pcap 平均需要大约 3 毫秒来处理接收到的帧并调用回调函数来发送新帧。 我 want/have 减少延迟。
以下我已经尝试过的事情:
- 在
pcap_open_live()
中尝试了读取超时(以毫秒为单位)的所有不同变体:即使是-1的读取超时,据我所知应该是轮询,产生大约 3 毫秒的延迟 - 设置无过滤器
- 为进程设置更高的优先级
- 设置
InterrupThrottleRate=0
和e1000
/e1000e
-内核模块的其他参数来强制硬件为每一帧发送一个中断
但我从来没有将延迟降低到平均 3 毫秒以下。
对于我计划的应用程序,有必要在 100 微秒 内对传入的数据包做出反应。 对于 libpcap,这甚至通常可行吗?!或者对于实现这样的应用程序还有其他建议吗?
感谢您的所有回复, 我希望有人能帮助我!
注意事项:我在C/C++中的Linux/Ubuntu下部署。
For my planned application it is necessary to react to incoming packets in a time under 100 microseconds.
然后是 libpcap 运行的许多捕获机制的缓冲(BPF 除了在 AIX 上,TPACKET_V3 在 Linux 上使用较新的 libpcap 和内核,DLPI 在 Solaris 10 和更早版本上,等等。 ) 提供以减少每个数据包的开销会妨碍您。
如果您系统上的 libpcap 具有 pcap_set_immediate_mode()
函数,则:
- 使用
pcap_create()
和pcap_activate()
,而不是pcap_open_live()
来打开捕获设备; - 在
pcap_create()
和pcap_activate()
调用之间调用pcap_set_immediate_mode()
。
在 "immediate mode" 中,捕获机制应在捕获机制接收到数据包后立即将其传递给应用程序。