在dst计算机从src计算机接收数据包之前,第三台计算机使用libpcap捕获,修改和注入数据包

时间:2014-07-28 03:51:11

标签: c capture libpcap inject

我是libpcap的新手。现在我正在编写用于捕获,修改和注入数据包的C程序。我有三台计算机:A,B,C。A正在向B发送ENIP数据包,间隔为10 ms。 C捕获A发送的数据包并通过以下方式修改数据包:1)将seq位递增1; 2)改变有效载荷。例如,A正在发送seq = 1的数据包.C捕获该数据包,将其seq位更改为2,更改有效负载并将其注入网络。我希望计算机B能够在接收到由A发送的seq = 2的数据包之前接收由C发送的这个数据包。

我的c程序使用pcap_loop来捕获数据包,使用pcap_inject来注入数据包。此过程只需几微秒。但是,B在接收B发送的数据包之前无法接收C发送的数据包。我在计算机B上观察到的是B收到A发送的几个数据包(例如seq = 1,2,3,... 30),然后B接收C发送的几个数据包(seq = 2,3,4,...,31),然后由A发送数据包(seq = 31,32,... 90),然后由C发送数据包(seq) = 32,...... 91)...

如果我将A的间隔更改为1秒,则此问题不存在...

我想也许pcap_loop有一些中断时间?也许pcap_loop捕获数据包0.5秒,然后将它们发送到网络中?我不确定......

1 个答案:

答案 0 :(得分:2)

在几个操作系统上,libpcap使用的数据包捕获机制实现了#34;批处理"。它不是在数据包到达时传送数据包,而是收集数据包,直到内核中的数据包缓冲区填满或计时器到期,此时它会传送整个缓冲区数据包,从而减少上下文切换次数和减少系统调用次数。 / p>

这意味着数据包的到达与其传递到pcap_loop()之间会有延迟;这对于数据包捕获来说是可以的(特别是高容量数据包捕获,其中批处理可以减少捕获的CPU开销,从而减少数据包被丢弃的可能性),但对于实时"实时"应用程序,应用程序希望在数据包到达时立即查看数据包。

在较新版本的libpcap上,有一个pcap_set_immediate_mode()电话;如果您使用pcap_create()pcap_activate()代替pcap_open_live(),请设置"立即模式"通过在pcap_set_immediate_mode()上调用pcap_t,在pcap_create()pcap_activate()调用之间使用第二个参数1,不会进行缓冲 - 数据包将尽快传递他们到了。

在旧版本的libpcap上,您可以将超时设置为非常小的值(1毫秒),或者在某些平台上设置"立即模式",在某些平台上,在平台中 - 依赖时尚。 (我们需要知道您正在使用的操作系统,以及您正在使用的libpcap版本,以便指明是否可以执行此操作以及如何执行此操作。)