我已经写了一个自定义的无线系统/驱动程序,它工作在无线网卡上,带有数据包注入,并且处于监控模式。我的程序基于libpcap,使用pcap_inject在无线设备上发送数据包。
它可以很好地处理任意数量的传入通信量和每秒输出的1-2个数据包(ICMP ping)。然而,问题是,当我开始尝试以更快的速度(TCP,更有用的25+数据包每秒传输协议)传输时,我似乎很快就耗尽了缓冲区,我的程序错误在Failed to inject packet: send: Resource temporarily unavailable中耗尽了。
这对我来说没有任何意义。我知道,我的无线网卡传输速度足够快,可以以超过500 my /S的速率处理TCP (因此它没有饱和设备的TX环缓冲区),所以我假设问题在别的地方。在驱动程序/固件中,包注入是否不那么优化?libpcap是否只是在避开某种重要的缓冲区,并试图将其单独传输?
发布于 2018-01-07 06:35:25
这实际上不是一个libpcap问题,而是一个无线工程问题。然而,我正在处理的频道已经相当嘈杂,因为这是一个不受管制的网格(这意味着没有人使用RTS/CTS进行协调),所以我的wifi卡在监视器模式下,决定回到“倾听并等待沉默”的方法,这显然更慢,更容易出错。这意味着我不能非常快地传输,这意味着我的TX缓冲区很快被填满,从而导致Resource temporarily unavailable错误。这是物理载波感知(CCA)的结果,这会导致指数退避。
我切换到一个空通道(每两秒只有一个包),我突然能够以每秒一千多个包的速度传输,这要好得多。我的传输速度仍然很差(最大容量约为600 at /S),但至少足够快,可以供我使用。这篇博文似乎暗示有些扑克牌打不了那么快
不幸的是,我的无线网卡及其驱动程序没有简单的方法来禁用这种非常胆小的传输行为。有些驱动程序允许您处理退避参数,如果你有一张Atheros卡,其他人会让你实际上禁用CCA.
发布于 2018-01-06 23:23:00
通过pcap_inject以高速率发送TCP数据包听起来不像是一场你可能会赢的性能大战。考虑滥用高性能TCP机制将此类数据包发送到自定义内核模块,该模块根据需要调整有效负载,并将数据包转发出网络接口。
https://unix.stackexchange.com/questions/414256
复制相似问题