在MAC层访问无线接口(802.11)(Linux)

roc*_*ale 18 linux network-programming network-protocols raw-sockets systems-programming

我花了最后几天阅读手册页,文档和谷歌提出的任何其他内容,但我想我现在比起初时更加困惑.

这就是我想要做的事情:我希望通过带有C/C++的Linux系统上的无线接口(802.11)使用我自己的3-x协议发送和接收数据包.到现在为止还挺好.我不需要信标,关联或任何AP/SSID相关的东西.然而,对于数据传输,我希望MAC层"像往常一样",这意味着单播数据包是ACK,重传,退避等.我还想享受扩展的QoS功能(802.11e有4个队列和不同的访问类别).另一方面,混杂模式不是一个问题,我只需要广播数据包和发送到特定站的数据包.

什么是正确的方法呢?关于原始套接字访问的大多数文档似乎都集中在网络嗅探上,但这并没有帮助.我一直在玩监控模式已经有一段时间了,但从我到目前为止所读到的内容来看,收到的数据包在监控模式下没有确认等.如果没有监控模式,会有什么替代方案?使用ad hoc模式和unix原始套接字?或者我是否必须摆弄司机?

我不是在寻找一个完整的解决方案,只是一些好的想法,从哪里开始.我通读了socket(2),socket(7)和packet(7)的手册页,但这对于不同模式下MAC层的行为没有帮助.

提前致谢.

moo*_*ray 7

802.11是第2层(和1)协议规范.它的设计方式允许更高层协议将其视为以太网.寻址和行为通常是一样的.因此,对于第3层协议,您根本不应该关注802.11并编写代码,就好像您希望它在以太网上运行一样.

为了使其工作,您应该首先连接到某种无线网络(这在概念上等于将电线插入以太网卡).在这里,您可以选择ad-hoc(也称为IBSS)或基础设施(也称为BSS)网络(或一旦802.11ad获得批准,就可以选择PBSS).

由于几个原因,操作卡与网络没有任何关联(只是在空中吐出数据包)并不是一个好主意.最重要的是,它非常依赖于硬件并且不可靠.您仍然可以使用一侧的RF mon(AKA监控模式)接口和另一侧的数据包注入(使用radiotap接头),但我不建议这样做.即使你有一套相同的卡片,你很可能会在某些时候难以解释和随机行为.802.11 NIC并非专为此类操作而设计,并且在固件内保持不同的状态挂载(请参阅FullMAC与SoftMAC卡).甚至SoftMAC卡也有很大不同.例如理论上在监控模式下,正如您所说,卡不应该确认收到的数据包.还有尽管这卡收到ACK帧,无论如何,因为他们仅仅立足于事实,所述框架是给他们自己的决定.有些卡甚至可能会尝试确认他们看到的所有帧.重传会发生类似的事情:一些卡只会发送一次注入的数据包(它应该如何工作).在其他NIC中,重新传输由硬件(和固件)处理,驱动程序无法将其关闭,因此即使注入数据,您也将获得自动重传.

坚持第3层并使用现有模式(如ad hoc),将为您提供所需的所有功能和更多功能(QoS等).您发送到接口的以太网帧将由内核"转换"为具有QoS映射等的802.11格式.

如果您想了解各种模式下的MAC行为,您必须阅读mac80211代码或802.11标准本身.http://linuxwireless.org wiki我帮你做了一些事情,但内核黑客通常忙于编写代码中的注释以外的文档;)

L3协议实现本身也可以在内核或用户模式下完成(使用原始套接字).像往常一样,内核方面将更难做,但更强大.


Set*_*ble 0

听起来你把媒体层和传输层搞混了。

802.11 是通常所说的“链路”、“物理”或“媒体”层,这意味着它只处理原始数据报的传输。

ACK、重传、退避(流量控制)等概念适用于“传输”层,这些特定术语与 TCP/IP 密切相关。

从头开始实现您自己的完整传输层非常困难,而且几乎肯定不是您想要做的。相反,如果您想在您自己的 802.11 自定义解释之上使用现有的 TCP/IP 堆栈,那么您可能需要创建一个虚拟网络接口。这将充当 TCP/IP 和媒体层之间的中介。

希望这能为您提供一些更好的上下文和关键字来查找。

  • OP 不混合图层。802.11有ack和重传,参见www.sss-mag.com/pdf/802_11tut.pdf (2认同)