我遇到以下情况:
我用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=0
和e1000
/ e1000e
内核模块的其他参数以强制硬件为每个帧发送中断但我从未在平均3毫秒的时间内减少延迟。
对于我计划的应用程序,有必要在 <100> 的时间内对传入的数据包作出反应。 这通常可以用libpcap吗?!或者有没有其他建议来实现这样的应用程序?
感谢您的回复, 我希望有人能帮助我!
Notes :我在Linux / Ubuntu下用C / C ++进行部署。
答案 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;中,一旦捕获机制收到数据包,捕获机制就应该将数据包传递给应用程序。