linux下基于信道跳变的数据包嗅探

linux下基于信道跳变的数据包嗅探,linux,packet-capture,packet-sniffers,wifi,Linux,Packet Capture,Packet Sniffers,Wifi,我想扫描b/g接口上的WiFi,我想通过在每个通道上花费100毫秒来嗅探每个通道上的数据包。我最大的要求之一是不存储我得到的数据包(因为磁盘空间较少),我的应用程序将解析数据包,检索Tx MAC和RSSI,并在每分钟结束时构建列表(MAC、Avg RSSI、#记录),然后清除此列表并重新开始 我想出了两种在linux上进行频道跳转的方法: 选项1:在C中使用wi_set_channel(struct wif*,channel number)系统调用,并在C中编写代码以嗅探所有数据包 选项2:使用

我想扫描b/g接口上的WiFi,我想通过在每个通道上花费100毫秒来嗅探每个通道上的数据包。我最大的要求之一是不存储我得到的数据包(因为磁盘空间较少),我的应用程序将解析数据包,检索Tx MAC和RSSI,并在每分钟结束时构建列表(MAC、Avg RSSI、#记录),然后清除此列表并重新开始

我想出了两种在linux上进行频道跳转的方法:

选项1:在C中使用wi_set_channel(struct wif*,channel number)系统调用,并在C中编写代码以嗅探所有数据包

选项2:使用linux命令iw dev wlan0 set channel 4,并使用python+scapy或C等任何语言嗅探数据包

我想知道两者中哪一个更有效(如果有的话),以便将WiFi接口切换到不同频道的延迟/等待降至最低。我怀疑这个延迟意味着当切换到另一个信道时,数据包丢失,是这样吗


我还想知道在linux中解决这个问题的其他一些方法。

直接回答第一个问题,使用选项1,让两个线程完成这项工作-一个线程用从通道收集的数据包填充内存中的循环缓冲区,另一个线程按顺序处理它们。您可以根据处理线程的测量性能和其他因素(如果有的话)来确定最佳数据包丢弃算法


至于第二个问题,我同意上面的说法,因为我完全可以控制如何调整算法,而不是依赖固定的处理工具。

您能告诉我为什么选项1比选项2好吗?因为你说的话也可以用选项2来完成。我想知道选项1中的通道切换是否比第二个选项更有效。这是一个观点,不是通道扫描只能用选项1来完成。考虑到您必须“扫描”所有通道的需要,最好不要用创建/销毁进程来破坏内核,从而在进程管理上花费本可以花在数据包嗅探上的时间。如果我问您哪种通道跳转技术更有效,那将是哪种?我要求您这样做的原因是,我也可以使用python+scapy或其他一些脚本(或非脚本)语言来执行您在选项2中建议的操作。假设在所有语言中都可以实现循环缓冲区、线程等,唯一的区别是切换通道的开销。那么哪一个更好呢?“wi_set_channel(struct wif*,channel number)”或“iw dev wlan0 set channel 4”?我自己没有看到或做过基准测试,但在我的第一个回答中我应该更清楚——“iw”是一个外部命令,而不是API。通过调用“iw”,您将启动一个新流程,该流程将更改通道和出口。与诸如wi_set_channel()之类的进程内API调用相比,无论C-lib调用多么低效,它都不会比创建一个新进程来切换通道更昂贵。我希望这澄清了我的建议的基础。你是否发现这两种方法之间的时间差异不可信?谢谢Murali,这在很大程度上澄清了问题!