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