赞
踩
首先感谢各位兄弟姐妹们的耐心等待。本书预计在3月中旬上市发售。从今天开始,我将在博客中连载此书的一些内容。注意,此处连载的是未经出版社编辑的原始稿件,所以样子会有些非专业。
注意,如下是本章目录,本文节选3.1-3.3.4 3.4~3.4.2 及3.5节。
为了方便读者深入学习,本系列连载都会将作者研究过
程中所学习的参考文献列出来
第3章 Wi-Fi基础知识
Wi-Fi(Wireless Fidelity)是一个无线网络通信技术的品牌,由Wi-Fi联盟(Wi-Fi Alliance,缩写为WFA)拥有。WFA专门负责Wi-Fi认证与商标授权工作。严格得说,Wi-Fi是一个认证的名称,该认证用于测试无线网络设备是否符合IEEE 802.11系列协议的规范。通过该认证的设备将被授予一个名为Wi-Fi CERTIFIED的商标。不过,随着获得Wi-Fi认证的设备普及,人们也就习以为常得称无线网络为Wi-Fi网络了。
提示:IEEE 802.11规范和Wi-Fi的关系很难用一两句话说清楚,读者可阅读参考资料[1]进行了解。简单来说,IEEE 802.11是无线网络技术的官方标准,而WFA则参考802.11规范制订了一套Wi-Fi测试方案(Test Plan)。不过,Test Plan和802.11的内容并不完全一致。有些Test项包含了目前802.11还未涉及的内容。另外,Test Plan也未覆盖802.11所有内容。所以参考资料[1]把Wi-Fi定义为802.11规范子集的扩展。
本章拟从以下几方面向读者介绍Wi-Fi技术:
提示:由于篇幅问题,本书将不拟讨论WFA制订的一些标准如Wi-Fi Display、Wi-Fi Simple Configuration等。不过做为Wi-Fi技术的重要组成部分,笔者将在博客中对它们进行系统介绍[1]。
首先来看无线电频谱和802.11协议的发展历程。
本节将介绍无线电频谱和802.11协议发展历程。
Wi-Fi依靠无线电波来传递数据。绝大多数情况下,这些能收发无线电波的设备往往被强制限制在某个无线频率范围内工作。这是因为无线频谱(即无线电波的频率,Radio Spectrum,单位为Hz)是一种非常重要的资源。所以目前大部分国家对无线频谱的使用都有国家级的管制。以下是几个主要国家的管制机构:
上述这些机构是如何管理无线频谱资源的呢?一般而言,无线频谱资源将按照无线电频率的高低进行划分。有一些频率范围内的频谱资源必须得到这些管制机构的授权才可使用,而有些频率范围的频谱资源无需管制机构的授权就可使用。这些无需授权的频谱大部分集中在所谓的ISM国际共用频段中。
ISM是Industrial Scientific Medical的缩写。如其名所示,位于ISM频段的频谱资源被工业、科学和医学三个主要机构使用。ISM一词最早由FCC定义。不过,各国的ISM频段并不完全一致。例如,美国有三个频段属于ISM,分别是902-908MHz、2400-2483.5MHz和5725-5850MHz。另外,各国都将2.4GHz频段划分于ISM范围,所以Wi-Fi、蓝牙等均可工作在此频段上。
注意:虽然无需授权就可以使用这些频段资源,但管制机构对设备的功率却有要求,因为无线频谱具有易被污染的特点,而较大的功率则会干扰周围其他设备的使用。
使用过Wi-Fi的读者或多或少都接触过IEEE 802.11这个词,它到底代表什么呢?
IEEE(Institute of Electrical and Electronics Engineers)是美国电气和电子工程师协会的简称。802是该组织中一个专门负责制定局域网标准的委员会,也称为LMSC(LAN/MAN Standards Committee,局域网/城域网标准委员会)。该委员会成立于1980年2月,其任务就是制定局域网和城域网标准。
由于工作量较大,该委员会被细分成多个工作组(Working Group),每个工作组负责解决某个特定方面问题的标准。工作组也会被赋予一个编号(位于802编号的后面,中间用点号隔开),故802.11代表802项目的第11个工作组[3]。它专门负责制订无线局域网(Wireless LAN)的介质访问控制协议(MAC:Medium Access Control)及物理层(PHY:Physical Layer)技术规范。
和工作组划分类似,工作组内部还会细分为多个任务组(Task Group)。TG的任务是修改、更新标准的某个特定方面。TG的编号为英文字母,如a、b、c等。
提示:TG编号可使用大小写字母,但其含义不同。小写字母的编号代表该标准不能单独存在。例如802.11b代表它是在802.11上进行的修订工作,其本身不能独立存在。而大写字母的编号代表这是一种体系完备的独立标准,如802.1X则是处理安全方面的一种独立标准。
如上所述,802.11制定了无线网络技术的规范,其发展历经好几个版本。以下是IEEE 802.11各版本的简单介绍[4]:
提示:读者可从IEEE官方网站中下载802.11-2012标准PDF全文(下载地址为http://standards.ieee.org/about/get/802/802.11.html),长达2793页,包含并整理了从802.11a到802.11z各个版本(包括a、b、d、e、g、h、i、j、k、n、p、r、s、u、v、w、y、z)所涉及的技术规范。
从本节开始,我们将向读者介绍802.11涉及到的无线网络技术。首先要介绍的是OSI基本参考模型。
ISO(International Organization for Standardization,国际标准化组织)和IEC(International Electrotechnical Commission国际电工技术委员会)于1983年联合发布了ISO/IEC 7498标准。该标准定义了著名的Open Systems Interconnection Reference Model(开放系统互联参考模型,简写为OSI/RM[5])。
在OSI/RM中,计算机网络体系结构被划分成7层,其名称和对应关系如图3-1所示:
图3-1 OSI RM及TCP/IP结构图
图3-1绘制了OSI/RM以及另外一个常用的网络体系TCP/IP的结构。先来看OSI/RM,它将网络划分成7层,由上到下分别是[6]:
图3-1中左边所示为另外一个常用的网络体系,即TCP/IP模型。对比图3-1中的两个模型,我们可简单认为TCP/IP Model是OSI/RM的一个简化版本。
提示,关于OSI/RM的详细信息,请读者阅读本章参考资料[5]。
虽然ISO/IEC 7498标准所定义的OSI/RM只将网络划分为七层。但实际上每一层还可划分为多个子层(Sub Layer)。所有这些Sub Layer中,最为人熟知的就是ISO/IEC 8802[7]规范划分Data Link Layer而得到的Logic Link Control Sub Layer(简称LLC)和Medium Acess Control Sub Layer(简称MAC)。它们的信息如图3-2所示:
图3-2 MAC和LLC SubLayer
图3-2中,ISO/IEC 8802将Data Link Layer划分成了两个Sub Layer,其中:
在Data Link层划分的这两个子层中,802.11只涉及到MAC层。由于物理介质的不同,无线和有线网络使用的MAC方法有较大差别,主要区别如下[8]:
值得指出的是:CSMA/CA协议信道利用率低于CSMA/CD协议信道利用率。信道利用率受传输距离和空旷程度的影响,当距离远或者有障碍物影响时会存在隐藏终端问题,降低信道利用率。在802.11b WLAN中,在1Mb/s速率时最高信道利用率可到90%,而在11Mb/s时最高信道利用率只有65%左右。
CSMA/CA主要使用两种方法来避免碰撞:
下面我们通过图3-3来介绍RTS和CTS的作用。
图3-3 RTS/CTS原理
在图3-3中:
那么怎么保证其他站不会干扰A和B之间的数据传输呢?
总体而言,使用RTS和CTS帧会使整个网络的效率有所下降。但由于这两种控制帧都很短(它们的长度分别为20和14字节)。而802.11数据帧则最长可达2346字节,相比之下的开销并不算大。相反,若不使用这种控制帧,则一旦发生冲突而导致数据帧重发,则浪费的时间就更大。
另外,802.11提供了三种情况供用户选择以处理:
尽管协议经过了精心设计,但冲突仍然会发生。例如:站B和站C同时向站A发送RTS帧。这两个RTS帧发生冲突后,使得站A收不到正确的RTS帧因而站A就不会发送后续的CTS帧。这时,站B和站C像以太网发生冲突那样,各自随机地推迟一段时间后重新发送其RTS帧。
根据802.11协议,CSMA/CA具体运作时由所谓的协调功能(Coordination Function)来控制。协议规定有四种不同的协调功能,分别是分布式协调功能(Distributed CF,简称DCF)、基于DCF之上的Point CF(Point CF,简称PCF)、混合型协调功能(Hybrid CF,简称HCF)以及用于Mesh网络的(Mesh CF,简称MCF)。由于无线网络是共享介质,所以,协调功能的目的就是用于控制各个无线网络设备使用无线媒介的时机以避免冲突发生。形象点说,这就好比在一个会议室里,所有人都可以发言,但如果多个人同时发言的话又不知道谁和谁在说话。所以,每个打算发言的人都需要检查下当前发言的情况。本章不拟详细介绍802.11中CF相关的内容。感兴趣的读者可阅读802.11协议第9节“MAC sublayer functional description”。
另外,规范还定义了基于竞争的服务(contention-based service,使用DCF进行数据交换)和一种基于无竞争的服务(contention-free service,使用PCF进行数据交换)。本章也不拟讨论它们。
ISO/IEC 7498及相关的一些标准文档除了对网络体系进行了层次划分外,还定义了层和层之间交互方式及其他一些基本组件。它们可用图3-4来表示:
图3-4 MAC Entity、Service和Clients
图3-4绘制了MAC层相关的组件及交互方式,其中:
根据上面的介绍,Entity定义了一个类,那其中是否定义了相应的功能函数呢?在标准文档中,和功能函数对应的术语是primitives(译为原语)及它们的parameters(参数)。图3-4列举了MAC Service的两个重要函数,分别是:
关于MAC层的服务详细定义,请读者阅读本章3.3.5.1节。
值得指出的是,规范只是从逻辑上定义了上述内容,它并没有指定具体的实现。关于MAC Service的详细定义,读者可阅读本章参考资料[10],即ISO/IEC 15802-1。
提醒:协议还定义了SDU和PDU两个概念。当上一层调用MAC的request原语时,会把要发送的数据传给MAC层。这个数据被称为MAC Service Data Unit(简写为MSDU)。对MAC层来说,MSDU其实就是MAC要发送的数据,即载荷(Payload)。MAC层处理Payload时还会封装MAC层自己的一些头信息。这些信息和MSDU共同构成了MAC层的Protocol Data Unit(简写为MPDU)。从OSI/RM角度来看,经过N+1层封装后的数据是(N+1)-PDU。该数据传递给N层去处理时,对N层来说就是(N)-SDU。N层封装这个SDU后就变成自己的(N)-PDU了。
在阅读802.11相关规范时,经常会碰到MIB一词,其全称是Management Information Base(译为管理信息库)。MIB是一个虚拟的数据库,里边存储了一些设备信息供查询和修改。MIB较常见的使用之处是网管利用SNMP协议管理远程主机、路由器等。
MIB内部采用树形结构来管理其数据。内部的每一个管理条目(Entry)通过一个叫object identifier(简称OID)来访问。MIB定义了Entry的属性和可取的值。由于属性及其可取值的定义采用了与具体编程语言无关的方式,所以一个MIB库可以很轻松通过编译器(compiler)将其转换成对应的编程语言源码文件。
MIB的定义比较繁琐,本章不拟拘泥于这些细节。读者可阅读参考资料[11]中所引用的资料列表以学习完整的MIB知识。
从笔者角度来看,对802.11来说,MIB就是定义了一组属性。802.11定义的MIB属性在http://www.ieee802.org/11/802.11mib.txt中。下载后将得一个名为802.11mib.txt文件。读者可通过JMIBBrowser工具(下载地址为http://sourceforge.net/projects/jmibbrowser/,它是一个用Java语言编写的可利用SNMP协议查看和设置指定设备MIB的小工具)去加载并查看其内容。如图3-5所示:
图3-5 802.11 MIB内容示意
读者需要首先点击图3-5所示左下角的“Load MIB”按钮以加载802.11mib.txt文件,然后查看802.11mib定义的一些属性。由图3-5可知:
802.11mib定义了一个较全的属性集合,一般而言,设备可能只支持其中一部分属性。图3-6所示为笔者Note2上wlan0设备的MIB信息截图(由于篇幅问题,图3-6只包含部分Note2 wlan0设备的MIB属性):
图3-6 NOTE2 wlan0设备的MIB属性示意
以图3-6中第一条属性dot11RSNAOptionImplemented为例,其在802.11mib.txt的定义如图3-7所示:
图3-7 dot11RSNAOptionImplemented内容示意
相比直接浏览802.11mib.txt文本文件而言,利用JMIBBrowser工具查看属性会更加方便和直观一些。
提示:以后分析wpa_supplicant源码时,会碰到802.11mib定义的属性,读者不妨在阅读本节时就下载相关文件和工具程序。
本节首先对OSI/RM进行了简单介绍,由此引出了MAC层的知识点。接着对802.11使用的MAC方法CSMA/CA进行了介绍。最后本节对MAC层Service及其相关概念以及MIB进行了介绍。
提醒:以上内容涉及到的知识点是读者以后阅读802.11协议时必然会碰到的。由于802.11协议引用的参考资料非常多,故笔者在本节整理了其中最基础的知识点。请读者务必认真阅读本节内容。
802.11规范全称为《Part 11:Wireless LAN Medium Acess Control(MAC) and Physical Layer(PHY) Specifications》。从其标题可知,802.11规范定义了无线局域网中MAC层和PHY层的技术标准。2012年版的802.11协议全文共2793页,包含20个小节(clause),23个附录(从A到W)。图3-8所示为802.11协议原文目录的一部分。
图3-8 802.11协议原文目录示意图
由图3-8所示目录可知802.11协议内容非常丰富。读者可尝试去阅读该文档,但估计很快会发现这将是一件非常枯燥和令人头疼的事情。主要原因是此规范类似于手册,它非常重视细节的精准,但各技术点前后逻辑上的连贯性较差,使得读者极难从散落在协议中各个角落的技术点中整理出一个内容有序,难度由浅入深的核心知识框架来。
基于上述原因,本章后续小节拟打算从以下几个知识点向读者介绍802.11规范中的一些核心内容:
由于篇幅原因,本书不可能囊括规范的所有内容。但相信读者在理解本节内容的基础上,能够轻松开展更加深入的研究。另外,为帮助读者理解规范,本章会在重要知识点之处添加“规范阅读提示”的内容。
提醒:由于802.11物理层涉及大量和无线电、信号处理相关的知识。这些知识不仅内容枯燥繁杂,而且对软件工程师来说并无太大意义,故本章不拟介绍它们。愿意深入研究的读者可阅读相关资料。
[1]笔者博客地址为blog.csdn.net/innost或者http://my.oschina.net/innost/blog
本节介绍802.11规范中的物理组件和相关网络结构。首先来看无线网络中的物理组件。
802.11无线网络包含四种主要物理组件,如图3-9所示:
图3-9 802.11四大主要物理组件
图3-9中定义了四个组件,它们分别是:
上述四个物理组件中最难解释清楚的就是DS了。笔者在仔细阅读规范后,感觉其对DS的解释并不直观。此处将列举一个常见的应用场景以帮助读者理解:
一般家用无线路由器一端通过有线接入互联网,另一端通过天线提供无线网络。当打开Android手机上的Wi-Fi功能,并成功连接到此无线路由器提供的无线网络(假设其网络名为“TP-LINK_1F9C5E”,可在路由器中设置)时,我们将得到:
上述内容中将BSS和LAN结合到一起以构成一个ESS的“东西”就是DS。虽然规范中并未明示DS到底是什么,但绝大部分情况下,DS是指有线网络(通过它可以接入互联网)。后文我们将介绍DS所提供的分布式服务(即DSS)。现在对读者来说,更重要的概念是其中和无线网络架构相关的BSS和ESS等。这部分内容将在下节介绍。
规范阅读提示:
1 上文介绍的AP、STA、DS的定义都来自于802.11的3.1节。笔者个人觉得该节所列的定义是最精确的。以DS为例,此节所定义的DS涉及到和有线网络的结合。但规范中其他关于DS的说明均未明示是否一定要和LAN结合。
2 关于STA,其定义只说明它是一个可singly addressable的实体,而没有说明其对应的功能。所以,读者会发现AP也是一个STA。另外还有提供QoS(Quality of Service)的STA。除此之外,从可移动性的角度来看,还有Mobile STA和Portable STA之分。Portable STA虽然可以移动,但只在固定地点使用(例如AP就是一个典型的Portable STA)。而Mobile STA表示那些只要在Wi-Fi覆盖范围内,都可以使用的STA(例如手机、平板等设备)。
有了上节所述的物理组件,现在就可以搭建由它们构成的无线网络了。802.11规范中,基本服务集(Basic Service Set,简写为BSS)是整个无线网络的基本构建组件(basic building block)。BSS如图3-10所示:
图3-10 BSS的两种方式
由图3-10可知,BSS有两种类型,分别是:
提示:
1 Independent BSS缩写为IBSS。而Infrastructure BSS没有对应的缩写。不过,一般用BSS代表Infrastrucutre BSS。
2 根据前文所述,AP也是一个STA。但此处STA和AP显然是两个不同的设备。
由图3-10中BSS的结构可知,其网络覆盖范围由该BSS中的AP决定。在某些情况下,需要几个BSS联合工作以构建一个覆盖面更大的网络,这就是一个ESS(Extended Service Set:扩展服务集)。如图3-11所示:
图3-11 ESS示意图
ESS在规范中的定义是“A set of one or one interconnected BSSs that appears as a single BSS to the LLC layer at any STA associated with one of those BSSs”。此定义包含几个关键点:
注意:ESS中的BSS拥有相同的SSID(Service Set Identification,详细内容见下文),并且彼此之间协同工作。这和目前随着Wi-Fi技术的推广,家庭和工作环境中存在多个无线网络(即存在多个ESS)的情况有本质不同。在多个ESS情况下,用户必须手动选择才能切换到不同的ESS。由于笔者日常工作和生活中,ESS只包含一个BSS,当某个AP停机时,笔者就得手动切换到其他无线网络中去了。
另外,切换相关的知识点属于Roaming(漫游)范畴,读者可阅读“Secure Roaming in 802.11 Networks”一书来了解相关细节。
上述网络都有所谓的Identification,它们分别是:
规范阅读提示:
1 上述网络结构中,并未提及如何与有线网络(即LAN)的整合。规范中其实还定义了一个名为portal的逻辑模块(logical component)用于将WLAN(Wireless LAN)和LAN结合起来。由于WLAN和LAN使用的MAC帧格式不同,所以直白得说,portal的功能类似翻译,它在WLAN和LAN间转换MAC帧数据。目前,portal的功能由AP实现。
2 规范中还定义了QoS BSS。这主要为了在WLAN中支持那些对QoS有要求的程序。由于无线网络本身固有的特性,WLAN中的QoS实现比较复杂,效果也不如LAN中的QoS。初学者可先不接触这部分内容。
==============================================================================================略略略略略略略略略略略略略略===================================
前面小节一直在介绍Wi-Fi规范方面的内容。从本节开始,我们将向读者介绍Linux平台中Wi-Fi编程方面的知识。
提醒:相比前文而言,本节内容读起来将显得较为轻松。但从笔者个人经验来说,编程只不过是规范的某种实现,掌握规范才是理解无线网络技术的核心。这也是本书内容组织和编排的指导原则。希望读者能认真体会。
Linux平台上目前常用的专门针对无线网络设备编程的API有两套[40],
注意:ioctl不符合Linux驱动开发要求主要体现在:
1 ioctl的原型为int ioctl(int fd, unsigned long cmd, ...),最后三个点代表它支持可变个数的参数。但对于一个经过严格定义的系统调用来说,支持可变个数参数的做法似乎显得有些随性。
2 ioctl的参数不仅个数不固定,其参数类型也无法通过函数原型来加以说明。这同样对于一个严谨的系统调用来说,也是不可接受的。
本节将重点介绍用户空间中的Wi-Fi API:wext和nl80211。不过在介绍它们之前,笔者先请读者思考这样一个问题:
为什么Wi-Fi需要在用户空间进行编程呢?
答案:
目前的无线网卡分为两种,一种为SoftMAC。这类网卡中,MLME的处理基本上在软件层(即驱动或用户空间),这样可带来较大的灵活性。另外,一些认证相关的操作,也可由软件来控制。另一种网卡称之为FullMAC。这类网卡的MLME全在硬件处理。相比SoftMAC而言,其灵活性很小。所以目前市面上SoftMAC网卡占绝大多数,而cfg80211就仅支持SoftMAC类型的网卡。
从开发者角度来说,wext的用法相当简单。Linux平台中,wext API定义于wireless.h文件。Android平台上,其文件位置在external/kernel-headers/original/linux目录下,主要供驱动开发者使用。
注意,bionic/libc/kernel/common/linux目录中也有一个wireless.h,不过此文件由工具程序根据kernel中的wireless.h自动生成而来,供用户空间使用。两个文件的区别主要是bionic下的wireless.h包含很少的注释。所以本节将分析kernel中的wireless.h。Android 4.2中的wext版本为20,由wireless.h中的宏WIRELESS_EXT定义。
虽然前面提到说ioctl函数的一个缺点是其没有指明参数类型,但wext却比较严谨,它提供了自己的数据类型。
首先,所有用户空间发起的请求都统一包括在struct iwreq中,其原型如下:
[-->wireless.h::struct iwreq]
//wext API在设计时参考了系统中现有数据结构及命名方式。做为区分,wext中几乎所有数据结构、类型、宏
//等名字中都带一个w以代表wireless。如下面的iwreq结构体,其对应的普通数据结构类型是ifreq。
//该结构体专门用于往socket句柄传递ioctrl控制参数。
struct iwreq
{
union
{
char ifrn_name[IFNAMSIZ]; //用于指定要操作的网卡设备名,如wlan0
} ifr_ifrn;
union iwreq_data u; //用于存储具体的参数信息
};
如iwreq结构所示,具体的参数信息存储在另外一个联合体iwreq_data中,其原型如下:
[-->wireless.h::union:iwreq_data]
/*
iwreq_data是一个联合体,其最大size为16字节
wext还自定义了一些小的数据结构,如iw_point、iw_param、iw_freq等。它们的作用是:
1 iw_point:当参数信息的长度超过16字节时,就只能通过iw_point指向另外一块内存区域,而参数就存储
在那个区域中。这个就是我们常用的指针方式。
2 iw_param:当参数信息不超过16字节时,可以把信息存储在iw_param中。
3 iw_freq:用于存储频率或信道值。其原型的介绍见本小节最后。
union iwreq_data
{
char name[IFNAMSIZ];
struct iw_point essid; //存储essid,也就是ssid
struct iw_param nwid; //network id
//频率或信道。取值为0-1000时代表channel,大于1000则代表频率,单位为Hz
struct iw_freq freq;
struct iw_param sens; //信号强度阈值
struct iw_param bitrate; //码率
struct iw_param txpower;
struct iw_param rts; //RTS阈值时间
struct iw_param frag;
__u32 mode; //操作模式
struct iw_param retry;
struct iw_point encoding;
struct iw_param power;
struct iw_quality qual;
struct sockaddr ap_addr; //AP地址
struct sockaddr addr; //目标地址
struct iw_param param; //其他参数
struct iw_point data; //其他字节数超过16的参数
};
当参数字节超过16的时候,wext还定义了和功能相关的参数类型,下面来看专门用于触发无线网卡发起扫描请求的数据结构iw_scan_req,其原型如下所示:
[-->wireless.h::struct iw_scan_req]
struct iw_scan_req
{
__u8 scan_type; //可取值为IW_SCAN_TYPE_{ACTIVE,PASSIVE},代表主动或被动扫描
__u8 essid_len; //essid字符串长度
__u8 num_channels; // 指明信道个数,如果为0,则表示扫描所有可允许的信道
__u8 flags; //目前仅用于字节对齐
//bssid用于指明BSS的地址。如果全为FF则为广播BSSID,即wildcard bssid
struct sockaddr bssid;
__u8 essid[IW_ESSID_MAX_SIZE]; //essid
/*
min_channel_time:指示扫描过程中在每个信道等待到第一个回复的时间。如果在此时间内没有等到回复,
则跳到下一个信道去等待。如果等到一个回复的话,则一共在该信道等待的最大时间为max_channel_time。
所有时间单位均为TU(Time Units),即1024ms
*/
__u32 min_channel_time;
__u32 max_channel_time;
struct iw_freq channel_list[IW_MAX_FREQUENCIES];//IW_MAX_FREQUENCIES值为32
};
下面来看最后一个常见的数据结构iw_freq,其原型如下:
[-->wireless.h::struct:iw_freq]:
//当频率小于109,m直接等于频率。否则m=f/(10e)
struct iw_freq
{
__s32 m;
__s16 e;
__u8 i; //该值表示此频率对象在channel_list数组中的索引
__u8 flags; //固定或自动
};
wext中的数据结构和定义还有许多。建议读者结合实际需要去学习wireless.h。
提醒:wext API虽然简单,但相信读者已经体会到其背后所依赖的和802.11规范密切相关的理论知识了。
下面我们通过一个实际的例子来看看用户空间如何通过wext API来触发无线网卡扫描工作的。
本例来源于wpa_supplicant,它是一个运行于用户空间的专门和无线网卡进行交互的程序。其详情将在下一章节进行介绍。本节仅通过一个函数看看wpa_supplicant如何利用wext API和无线网卡交互。
[-->driver_wext.c:wpa_driver_wext_scan]
int wpa_driver_wext_scan(void *priv, struct wpa_driver_scan_params *params)
{
struct wpa_driver_wext_data *drv = priv;
struct iwreq iwr; //定义一个iwreq对象
int ret = 0, timeout;
struct iw_scan_req req; //定义一个iw_scan_req对象
//获取调用者传递的ssid等参数
const u8 *ssid = params->ssids[0].ssid;
size_t ssid_len = params->ssids[0].ssid_len;
......
os_memset(&iwr, 0, sizeof(iwr));
//为iwr的ifr_name传递需操作的网卡设备名
os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
if (ssid && ssid_len) {
os_memset(&req, 0, sizeof(req));
//设置iw_scan_req的信息
req.essid_len = ssid_len;
req.bssid.sa_family = ARPHRD_ETHER;
//设置bssid的MAC地址全为0XFF,代表这是一个wildcard BSSID搜索
os_memset(req.bssid.sa_data, 0xff, ETH_ALEN);
os_memcpy(req.essid, ssid, ssid_len);
//通过data域指向这个iw_sca_req对象
iwr.u.data.pointer = (caddr_t) &req;
iwr.u.data.length = sizeof(req);
//IW_SCAN_THIS_ESSID表示只扫描指定ESSID的无线网络
iwr.u.data.flags = IW_SCAN_THIS_ESSID;
}
/*
ioctl_sock指向一个socket句柄,其创建时候的代码如下:
ioctl_sock = socket(PF_INET,SOCK_DGRAM,0)
SIOCSIWSCAN用于通知驱动进行无线网络扫描
*/
if (ioctl(drv->ioctl_sock, SIOCSIWSCAN, &iwr) < 0) {
//返回错误
}
......//其他处理
return ret;
}
wext相对比较简单,但其内部的数据结构定义、变量命名等都和规范中定义的原语有着莫大的关系。建议读者结合规范去阅读wireless.h以加深理解。
==============================================================================================略略略略略略略略略略略略略略===================================
本章是全书关于Wi-Fi技术方面的一篇基础文章,涉及的面很广,内容也很杂,需要读者耐心阅读并理解。从大体上来说,本章按如下逻辑开展:
本章是笔者从事Android写作以来耗时最长的一篇文章了(包括学习时间一共长达3个多月,而且还有很多技术点未能覆盖到)。在这个过程中,笔者也经历过烦恼和痛苦,感觉其难度比纯粹的代码分析要大得多。这也是笔者希望读者把注意力放到代码背后的理论上来的初衷。
另外,从下一章开始,我们将在分析wpa_supplicant的同时,通过背景知识介绍的方式来补充本节没有涵盖的内容。
[1] Real 802.11 Security: Wi-Fi Protected Access and 802.11i 第7.1节“Relationship Between Wi-Fi and IEEE 802.11”
本书是笔者找到的关于802.11无线网络安全技术方面知识面最完整的书籍。可惜是英文版,并需要有Wi-Fi的基础知识后才能真正理解。
[2] 802.11无线网络权威指南(第二版)“无线网络导论”一节,P16-P17,“无线电频谱:关键资源”。
此书是目前市面上关于802.11无线网络书籍的圣经。不过其排版奇特,连章节号都没有,读起来着实有些费劲。读者可首先阅读这本书以对Wi-Fi有个基本了解。另外,该书涉及到和物理层有关的内容可以略去不读。
[3] 802.11无线网络权威指南(第二版)“无线网络导论”一节,P20-P22。
[4] http://baike.baidu.com/view/345218.htm
摘抄自百度百科词条“802.11”。笔者对其内容做了必要的增删改。
[5] ISO/IEC 7498-1 “Basic Reference Model:The Basic Model”
OSI模型的官方文档,不过和其他官方文档一样,极难理清楚其间的逻辑关系,做手册用还可以。
[6] http://baike.baidu.com/view/486949.htm
百度百科词条“开放系统互连参考模型”。
[7] ISO/IEC 8802-2 “Part 2 Logical Link Control”
Logical Link Control层的官方标准。不过读者只需阅读第一节“Overview”即可。
[8] http://baike.baidu.com/view/645723.htm
百度百科词条“CSMA/CA”,以非常通俗的方式解释了CSMA/CA的工作原理。除非特别需要,读者也可参考“802.11无线网络权威指南(第二版)”一书第三章“802.11 MAC基础”,P47-P55。
[9] IEEE 802.1X-2010 “Port-Based Network Access Control”,Annex D “Basic architectural concepts and terms”
大名鼎鼎的802.1X规范。不过这些规范引用的其他标准非常多,所以802.1X在附录D中对一些基本概念和术语进行了一番介绍。建议读者阅读此文档。
[10] http://www.doc88.com/p-696270935777.html
SO/IEC 15802-1电子文档,由doc88提供。全名为“Part 1: Medium Access Control(MAC) service definition”。定义了MAC service和相关的原语。
[11] http://en.wikipedia.org/wiki/Management_information_base
维基百科词条“Management Information Base”,英文介绍,还算比较好理解。
[12] 802.11-2012第4.1节“General description of the architecture”、4.2节“How WLAN systems are different”、4.3节“Components of the IEEE 802.11 architecture”
[13] 802.11-2012第4.5节“Overview of the Services”。
注意,802.11-2012第4节“General description”非常重要,里边的许多基本概念都需要了解。注意,该节包括的内容非常多,读者应有选择的阅读。
[14] 802.11-2012第5节“MAC service definition”
对802.11 MAC服务进行了完整说明。
[15] 802.11-2012第8节“Frame formats”
802.11 MAC帧完整说明。当然,读者可把它当做手册来用。
[16] http://technet.microsoft.com/en-us/library/cc757419(v=ws.10).aspx
微软技术文章“How 802.11 Wireless Works”。非常通俗易懂,包含的知识面也比较全。读者可通过它对802.11有一个大致的认识。
[17] 802.11无线网络权威指南(第二版)第四章“802.11成帧细节”,P78-P127。
[18] 802.11无线网络权威指南(第二版)第八章“管理操作”中的“节省电力”,P200-P208。
非常详细得介绍了Power Save的原理和过程。
[19] 802.3-2008“CSMA/CD Access Method and Physical Layer Specifications”第3.2.3节“Address fields”
LAN中MAC层的官方文档。其中有对MAC地址格式的说明。
[20] http://www.doc88.com/p-905531556977.html
doc88上关于MAC组播地址的中文说明。建议读者阅读此文档。
[21] 802.11无线网络权威指南(第二版)第三章“802.11 MAC帧基础”中的“802.11对上层协议的封装”,P65-P66。
[22] 802.11-2012第6节“Layer management”
MLME的官方说明,非常详细。请读者当手册使用。
[23] 802.11无线网络权威指南(第二版)第八章“管理操作”,P182-P224
逻辑还算清晰,建议读者结合[22]一起阅读。
[24] 802.11-2012第4.10节“IEEE Std 802.11 and IEEE Std 802.1X-2004”
介绍802.1X如何与802.11相结合。
[25] 802.11无线网络权威指南(第二版)第五章“有线等效加密”,P127-P142
关于WEP的详细介绍。但有些内容用得非常少(例如关于动态WEP密匙的说明)。
[26] 802.11-2012第11.2.2节“Wired equivalent privacy (WEP)”
官方对WEP的说明,非常详细。
[27] 802.11-2012第11.2.3节“Pre-RSNA authentication”
官方对WEP中身份验证方法的说明。
[28] http://documentation.netgear.com/reference/ita/wireless/pdfs/FullManual.pdf
“Wireless Networking Basics”,Netgear贵公司提供的关于Wi-Fi安全方面的一些简单介绍。
[29] 802.11-2012第11.4节“RSNA confidentiality and integrity protocols”
官方文档关于TKIP和CCMP的介绍。
[30] 802.11无线网络权威指南(第二版)第七章“802.11:RSN、TKIP与CCMP”,P162-P176
请读者结合[29]一起研究。
[31] RFC3748 “Extensible Authentication Protocol (EAP) ”
EAP的官方文档,总长68页,难度不是特别大,建议读者阅读全文。
[32] http://en.wikipedia.org/wiki/IEEE_802.1X
维基百科词条“IEEE 802.1X”。图文并茂,读者可仔细阅读此文。
[33] 802.11无线网络权威指南(第二版)第六章“802.1X 用户身份验证”,P142-P154
[34] http://www.h3c.com.cn/Products___Technology/Technology/Security_Encrypt/Other_technology/Technology_recommend/200812/624138_30003_0.htm
H3C公司关于802.1X的介绍,非常详细,难度较小。读者可先阅读此文档。
[35] 802.1X-2010第11节“EAPOL PDUs”
官方对EAPOL格式的详细说明。
[36] http://www.docin.com/p-439759696.html
“一种针对RSNA无线网络的安全等级回滚攻击研究”,来自豆丁网。3页内容,比较容易理解。
[37] Real 802.11 Security: Wi-Fi Protected Access and 802.11i,第7章“WPA, RSN, and IEEE 802.11i”和第9章”WPA and RSN Key Hierarchy”
此书是目前笔者找到的关于Wi-Fi安全性方面覆盖面最齐全的资料。建议读者深入阅读。
[38] 802.11-2012第11.6节“Keys and key distribution”
官方文档关于密匙派生的说明。
[39] 802.11无线网络权威指南(第二版)第七章“802.11:RSN、TKIP与CCMP”,P176-P182
介绍了RSN的运作方式,对密匙派生和缓存有较为详细的说明。
[40] http://wireless.kernel.org/en/developers/Documentation/Wireless-Extensions
Linux Wireless Kernel官方网站,内容非常丰富。建议读者仔细阅读。
[41] http://www.infradead.org/~tgr/libnl/
libnl官方网站,文档较为丰富。读者可阅读其中关于libnl的文档。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。