我花了最后几天阅读手册页、文档和谷歌提出的任何其他内容,但我想我现在比开始时更加困惑。
我想做的是:我想在使用 C/C++ 的 Linux 系统上通过无线接口(interface) (802.11) 使用我自己的第 3-x 层协议(protocol)发送和接收数据包。 到目前为止,一切都很好。我不需要信标、关联或任何 AP/SSID 相关的东西。然而,对于数据传输,我希望 MAC 层表现得“像往常一样”,这意味着单播数据包被确认、重传、退避等。我还想享受扩展的 QoS 功能(802.11e 有 4 个队列和不同的访问类别)。另一方面,混杂模式不是问题,我只需要广播数据包和发送到特定站点的数据包。
正确的做法是什么?大多数关于原始套接字访问的文档似乎都集中在网络嗅探上,但这无济于事。我已经尝试使用监控模式一段时间了,但从我目前所读到的内容来看,接收到的数据包在监控模式等下没有被确认。 没有监控模式,替代方案是什么?使用 ad hoc 模式 和 unix 原始套接字?还是我必须摆弄司机?
我不是在寻找一个完整的解决方案,只是一些好的想法,从哪里开始。我通读了 socket(2)、socket(7) 和 packet(7) 的手册页,但这对不同模式下 MAC 层的行为没有帮助。
提前致谢。
最佳答案
802.11 是第 2 层(和第 1 层)协议(protocol)规范。它的设计方式允许更高层协议(protocol)将其视为以太网网络。寻址和行为通常是相同的。因此,对于第 3 层协议(protocol),您根本不应该关心 802.11,编写您的代码就好像您希望它在以太网网络上运行一样。
要使其正常工作,您应该首先连接到某种无线网络(这在概念上等同于将电线插入以太网卡)。在这里,您可以选择临时(又名 IBSS)或基础设施(又名 BSS)网络(或 PBSS,一旦 802.11ad 获得批准;)。
操作卡与网络没有任何关联(只是在空中吐出数据包)不是一个好主意,原因有几个。最重要的是,它非常依赖硬件且不可靠。您仍然可以在一侧使用 RF mon(AKA 监控模式)接口(interface),在另一侧使用数据包注入(inject)(使用 radiotap header ),但我不建议这样做。即使您有一组相同的卡片,您也很可能会在某个时候遇到难以解释和随机的行为。 802.11 NIC 并不是为这种操作而设计的,并且在固件中保持不同的状态装载(阅读有关 FullMAC 与 SoftMAC 卡的信息)。甚至 SoftMAC 卡也有很大差异。例如,理论上在监控模式下,如您所说,卡不应确认收到的数据包。虽然有些卡片无论如何都会确认接收到的帧,因为它们的决定完全基于所述帧是发给它们的事实。有些卡片甚至可能会尝试确认它们看到的所有帧。重传也会发生类似的事情:有些卡只会发送一次注入(inject)的数据包(这就是它应该工作的方式)。在其他 NIC 中,重传由硬件(和固件)处理,驱动程序无法将其关闭,因此即使有注入(inject)数据,您也会自动重传。
坚持使用第 3 层并使用现有模式(如临时模式),将为您提供您想要的所有功能以及更多(QoS 等)。您发送到接口(interface)的以太网帧将由内核“翻译”为带有 QoS 映射等的 802.11 格式。
如果您想了解各种模式下的 MAC 行为,您必须阅读 mac80211 代码或 802.11 标准本身。 http://linuxwireless.org wiki 我可以帮你做一些事情,但内核黑客通常忙于编写文档而不是代码中的注释 ;)
L3 协议(protocol)实现本身也可以在内核或用户模式(使用原始套接字)中完成。像往常一样,内核端会更难做,但更强大。
关于linux - 在MAC层访问无线接口(interface)(802.11)(Linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9192333/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
我想将我的MacSnowLeopardruby从1.8.7升级到1.9.1版本,有人知道轻松且最好的升级方法吗?因为我读了一些论坛/帖子/博客/讨论说覆盖苹果发布的ruby不好将Rails从版本2.2.2升级到2.3.8的最佳方法是什么?因为我找到的所有信息都仅适用于豹/老虎,而且很少有关于雪豹的复杂文章。他们还说覆盖apple提供的rails不好吗。谁能帮帮我?谢谢。 最佳答案 DanBenjamin有一些greatinstructionsforcompilingandinstallingRuby,RubyGemsandRai
我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案
运行bundleinstall后出现此错误:Gem::Package::FormatError:nometadatafoundin/Users/jeanosorio/.rvm/gems/ruby-1.9.3-p286/cache/libv8-3.11.8.13-x86_64-darwin-12.gemAnerroroccurredwhileinstallinglibv8(3.11.8.13),andBundlercannotcontinue.Makesurethat`geminstalllibv8-v'3.11.8.13'`succeedsbeforebundling.我试试gemin
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
注意:本文主要掌握DCN自研无线产品的基本配置方法和注意事项,能够进行一般的项目实施、调试与运维AP基本配置命令AP登录用户名和密码均为:adminAP默认IP地址为:192.168.1.10AP默认情况下DHCP开启AP静态地址配置:setmanagementstatic-ip192.168.10.1AP开启/关闭DHCP功能:setmanagementdhcp-statusup/downAP设置默认网关:setstatic-ip-routegeteway192.168.10.254查看AP基本信息:getsystemgetmanagementgetmanaged-apgetrouteAP配
我想从then子句中访问case语句表达式,即food="cheese"casefoodwhen"dip"then"carrotsticks"when"cheese"then"#{expr}crackers"else"mayo"end在这种情况下,expr是食物的当前值(value)。在这种情况下,我知道,我可以简单地访问变量food,但是在某些情况下,该值可能无法再访问(array.shift等)。除了将expr移出到局部变量然后访问它之外,是否有直接访问caseexpr值的方法?罗亚附注我知道这个具体示例很简单,只是一个示例场景。 最佳答案