我编写了一个自定义无线系统/驱动程序,它在带有数据包注入的 WiFi 卡上工作,并处于监视模式。我的程序基于 libpcap,用于pcap_inject
通过无线设备发送数据包。
它适用于任何数量的传入流量以及每秒 1-2 个数据包的传出 (ICMP ping)。然而,问题是,当我开始尝试更快地传输(TCP,每秒 25 个以上数据包的更有用的协议)时,我似乎很快就耗尽了缓冲区,并且我的程序出现了错误Failed to inject packet: send: Resource temporarily unavailable
。
这对我来说没有任何意义。我知道我的无线卡传输速度足够快,能够以超过 500Mb/s 的速率处理 TCP(因此它不会使设备的 TX 环形缓冲区饱和),因此我认为问题出在其他地方。数据包注入在驱动程序/固件中是否优化程度较低? libpcap 是否只是回避某种重要的缓冲区并尝试仅传输自身?
答案1
这实际上不是libpcap
问题,而是无线工程问题。我正在处理的频道已经相当嘈杂,但是因为这是一个不受监管的网格(意味着没有人使用 RTS/CTS 进行协调),所以我的 wifi 卡在监控模式下决定退回到“监听并等待安静” “这种方法显然速度较慢且更容易出错。这意味着我无法快速传输,这意味着我的 TX 缓冲区很快就填满,从而出现错误Resource temporarily unavailable
。这是物理载波侦听 (CCA) 的结果,它会导致指数退避。
我切换到一个空闲的通道(每两秒只有一个数据包),然后我突然能够以每秒一千多个数据包的速度传输数据,这要好得多。我的传输速度仍然很差(最高约为 600KB/s),但这至少对我来说足够快了。这篇博文似乎表明有些卡无法注入那么快
不幸的是,对于我的无线卡及其驱动程序,没有简单的方法来禁用这种非常胆怯的传输行为。有些驱动程序会让你弄乱退避参数,如果您有 Atheros 卡,其他的则可以让您实际禁用 CCA。
答案2
通过高速发送 TCP 数据包pcap_inject
听起来不像是一场您可能会获胜的性能战。考虑滥用高性能 TCP 机制将此类数据包发送到自定义内核模块,该模块根据您的需要调整有效负载并将数据包转发出网络接口。