为什么80%的码农都做不了架构师?>>>
首先感谢各位兄弟姐妹们的耐心等待。本书预计在3月中旬上市发售。从今天开始,我将在博客中连载此书的一些内容。注意,此处连载的是未经出版社编辑的原始稿件,所以样子会有些非专业。
注意,如下是本章目录,本文节选3.1-3.3.4 3.4~3.4.2 及3.5节。
为了方便读者深入学习,本系列连载都会将作者研究过
程中所学习的参考文献列出来
第3章 Wi-Fi基础知识
本章主要内容:
- 介绍IEEE 802.11协议相关知识;
-
介绍Linux Wireless Extension和NL80211编程。
本章所涉及的源代码文件名及位置:
- wireless.h external/kernel-headers/original/linux/wireless.h
- driver_wext.c:external/wpa_supplicant_8/src/drivers/driver_wext.c
- netlink.h:external/kernel-headers/original/linux/netlink.h
- driver_nl80211.c:external/wpa_supplicant_8/src/drivers/driver_nl80211.c
- nl80211_copy.h:external/wpa_supplicant8/wpa_supplicant/src/drivers/nl80211_copy.h
3.1 概述
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技术:
- 首先介绍IEEE 802.11协议涉及到的理论知识,包括无线频谱资源、IEEE 802.11/802.X协议中的相关内容、关键概念(例如Acess Point等)、MAC帧、无线网络安全等。
- 介绍如何在Linux系统中通过Linux Wireless Extension以及nl80211 API操作无线网络设备。
提示:由于篇幅问题,本书将不拟讨论WFA制订的一些标准如Wi-Fi Display、Wi-Fi Simple Configuration等。不过做为Wi-Fi技术的重要组成部分,笔者将在博客中对它们进行系统介绍[1]。
首先来看无线电频谱和802.11协议的发展历程。
3.2 无线电频谱和802.11协议的发展历程
本节将介绍无线电频谱和802.11协议发展历程。
3.2.1 无线电频谱知识介绍[2]
Wi-Fi依靠无线电波来传递数据。绝大多数情况下,这些能收发无线电波的设备往往被强制限制在某个无线频率范围内工作。这是因为无线频谱(即无线电波的频率,Radio Spectrum,单位为Hz)是一种非常重要的资源。所以目前大部分国家对无线频谱的使用都有国家级的管制。以下是几个主要国家的管制机构:
- 美国的FCC(Federal Communication Commission),美国联邦通信委员会。
- 欧洲的ERO(European Radiocommunication Office),欧洲无线电通信局。
- 中国的MIIT(Ministry of industry and Information Technology),中国工信部下属的无线电管理局。
- 国际电信联盟ITU(International Telecomunication Union)。
上述这些机构是如何管理无线频谱资源的呢?一般而言,无线频谱资源将按照无线电频率的高低进行划分。有一些频率范围内的频谱资源必须得到这些管制机构的授权才可使用,而有些频率范围的频谱资源无需管制机构的授权就可使用。这些无需授权的频谱大部分集中在所谓的ISM国际共用频段中。
ISM是Industrial Scientific Medical的缩写。如其名所示,位于ISM频段的频谱资源被工业、科学和医学三个主要机构使用。ISM一词最早由FCC定义。不过,各国的ISM频段并不完全一致。例如,美国有三个频段属于ISM,分别是902-908MHz、2400-2483.5MHz和5725-5850MHz。另外,各国都将2.4GHz频段划分于ISM范围,所以Wi-Fi、蓝牙等均可工作在此频段上。
注意:虽然无需授权就可以使用这些频段资源,但管制机构对设备的功率却有要求,因为无线频谱具有易被污染的特点,而较大的功率则会干扰周围其他设备的使用。
3.2.2 IEEE 802.11发展历程介绍
使用过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]:
- 802.11:1997年发布,原始标准(2Mbit/s,工作在2.4GHz频段)。由于它在速率和传输距离上都不能满足人们的需要,因此,IEEE小组又相继推出了802.11b和802.11a两个新标准。
- 802.11a:1999年发布,新增物理层补充(54Mbit/s,工作在5GHz频段)。
- 802.11b:1999年发布,新增物理层补充(11Mbit/s,工作在2.4GHz频段)。802.11b是所有无线局域网标准中最著名也是普及最广的标准。有时候它被称作Wi-Fi。不过根据前文的介绍,Wi-Fi是WFA的一个商标。
- 802.11c:它在媒体接入控制/链路连接控制(MAC/LLC)层面上进行扩展,旨在制订无线桥接运作标准,但后来将标准追加到既有的802.1中,成为802.1d。
- 802.11d:它和802.11c一样在媒体接入控制/链路连接控制(MAC/LLC)层面上进行扩展,对应802.11b标准,解决Wi-Fi在某些不能使用2.4GHz频段国家中的使用问题。
- 802.11e:新增对无线网络服务质量(Quality of Service,QoS)的支持。其分布式控制模式可提供稳定合理的服务质量,而集中控制模式可灵活支持多种服务质量策略,让影音传输能及时、定量、保证多媒体的顺畅应用,WFA将此称为WMM(Wi-Fi Multi-Media)
- 802.11f:追加了IAPP(inter-access point protocol)协定,确保用户端在不同接入点间的漫游,让用户端能平顺、无形地切换区域。不过,此规范已被废除。
- 802.11g:2003年发布,它是IEEE 802.11b的后继标准,其传送速度为54Mbit/s。802.11g是为了更高的传输速率而制定的标准,它采用2.4GHz频段,使用CCK技术与802.11b后向兼容,同时它又通过采用OFDM技术支持高达54Mbit/s的数据流,所提供的带宽是802.11a的1.5倍。
- 802.11h:是为了与欧洲的HiperLAN2相协调的修订标准。由于美国和欧洲在5GHz频段上的规划、应用上存在差异,故802.11h目的是为了减少对同处于5GHz频段的雷达的干扰。802.11h涉及两种技术,一种是动态频率选择(DFS),另一种技术是传输功率控制(TPC)。
- 802.11i:2004年发布,新增无线网络安全方面的补充。于2004年7月完成。其定义了基于AES的全新加密协议CCMP(CTR with CBC-MAC Protocol),以及向前兼容RC4的加密协议TKIP(Temporal Key Integrity Protocol)。
- 802.11j:它是为适应日本在5GHz频段以上的应用不同而定制的标准。
- 802.11k:它为无线局域网应该如何进行信道选择、漫游服务和传输功率控制提供了标准。
- 802.11l:由于“11L”字样与安全规范“11i”容易混淆,并且很像“111”,因此被放弃编号使用。
- 802.11m:该标准主要对802.11家族规范进行维护、修正、改进,以及为其提供解释文件。m表示Maintenance。
- 802.11n:2004年1月IEEE宣布成立一个新的单位来发展802.11标准,其标称支持的数据传输速度可达540Mbit/s。新增对MIMO(Multiple-Input Multiple-Output)的支持。MIMO支持使用多个发射和接收天线来支持更高的数据传输速率和无线网络涵盖范围。
- 802.11p:又称WAVE(Wireless Access in the Vehicular Environment,)是一个由IEEE 802.11标准扩充的通信协议,主要用于车载电子无线通信。它本质上是IEEE 802.11的扩充延伸,符合智能交通系统(ITS:Intelligent Transportation Systems)的相关应用。
- 802.11r:2008年发布,新增快速基础服务转移(Fast Transition),主要是用来解决客户端在不同无线网络AP间切换时的延迟问题。
- 802.11s:制订与实现目前最先进的MESH网络,提供自主性组态(self-configuring),自主性修复(self-healing)等能力。无线Mesh网可以把多个无线局域网连在一起从而能覆盖一个大学校园或整个城市。Mesh本意是指所有节点都相互连接。无线Mesh网的核心思想是让网络中的每个节点都可以收发信号。它可以增加无线系统的覆盖范围和带宽容量。
- 802.11t:提供提高无线广播链路特征评估和衡量标准的一致性方法。
- 802.11u:也称"与外部网络互通(InterWorking with External Networks)",它定义了不同种类的无线网络之间的网络安全互连功能,让802.11无线网络能够访问蜂窝网络(Cellular Network)或者WiMax等其它无线网络。
- 802.11v:该标准主要针对无线网络的管理。它提供了简化无线网络部署和管理的重要和高效率机制。无线终端设备控制、网络选择、网络优化和统计数据获取与监测都属于802.11v建议的功能。
- 802.11w:其任务是通过保护管理帧(无线网络MAC帧的一种类型,还有数据帧和控制帧。详情见3.3.5.2节),以进一步提升无线网络的安全性。因为802.11i所涉及的安全技术只覆盖了数据帧,而随着无线技术的发展,越来越多的敏感信息(如基于位置的标识符以及快速传播的信息)却是通过管理帧来传播的,所以安全保护也需要拓展到管理帧。
- 802.11y:该标准的目标是对在与其他用户共享的美国3.65GHz~3.7GHz频段中802.11无线局域网通信的机制进行标准化。
提示:读者可从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)所涉及的技术规范。
3.3 802.11无线网络技术介绍
从本节开始,我们将向读者介绍802.11涉及到的无线网络技术。首先要介绍的是OSI基本参考模型。
3.3.1 OSI基本参考模型及相关基本概念
1. OSI/RM介绍
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]:
- Application Layer(应用层):应用层能与应用程序界面沟通以达到向用户展示的目的。常见的协议有HTTP、HTTPS、FTP、SMTP等。其数据单位为APDU(Application Protocol Data Unit)。
- Presentation Layer(表示层):表示层能为不同客户端提供数据和信息的语法转换,使系统能解读成正确的数据,同时它还能提供压缩解压、加密解密等服务。例如不同格式图像(如GIF、JPEG、TIFF等)的显示就是由位于表示层的协议来支持的。其数据单位为PPDU(Presentation Protocol Data Unit)。
- Session Layer(会话层):会话层用于为通信双方制定通信方式,创建和注销会话(双方通信)等。其数据单位为SPDU(Session Protocol Data Unit)。常见的协议有ZIP、AppleTalk、SCP等。
- Transport Layer(传输层):传输层用于控制数据流量,同时能进行调试及错误处理,以确保通信顺利。发送端的传输层会为数据分组加上序号,以方便接收端把分组重组为有用的数据或文件。传输层的常见协议有TCP、UDP等。其数据单位为TPDU(Transport Protocol Data Unit)。
- Network Layer(网络层):网络层为数据传送的目的地寻址,然后再选择一个传送数据的最佳路线。网络层数据的单位为Packet或Datagram。常见的设备有路由器等。常见协议有IP、IPv6。
- Data Link Layer(数据链路层):在物理层提供比特流服务的基础上,建立相邻结点之间的数据链路。通过差错控制提供数据帧(Frame)在信道上无差错的传输。数据链路层在不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。数据链路层数据的单位为Frame(帧)。常见的设备有二层交换机、网桥等。
- Physical Layer(物理层):物理层定义了通信设备机械、电气、功能和过程等方面的特性,用以建立、维护和拆除物理链路连接。物理层数据的单位为bit。
图3-1中左边所示为另外一个常用的网络体系,即TCP/IP模型。对比图3-1中的两个模型,我们可简单认为TCP/IP Model是OSI/RM的一个简化版本。
提示,关于OSI/RM的详细信息,请读者阅读本章参考资料[5]。
2. LLC和MAC子层介绍
虽然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,其中:
- MAC Sub Layer(Media Acess Control SubLayer:媒介访问控制子层):该子层的目的是为了解决局域网(Local Area Network,以后简写为LAN)中共用信道的使用产生竞争时,如何分配信道的使用权问题。目前LAN中常用的媒介访问控制方法是CSMA/CD(争用型介质访问控制)。由于无线网络的特殊性,MAC的控制方法略有不同。我们将在下文介绍相关内容。
- LLC Sub Layer(逻辑链路控制子层):该子层实现了两个站点之间帧的交换,实现端到端(源到目的),无差错的帧传输和应答功能及流量控制功能。
在Data Link层划分的这两个子层中,802.11只涉及到MAC层。由于物理介质的不同,无线和有线网络使用的MAC方法有较大差别,主要区别如下[8]:
- 有线(wired)网络最常使用的方法(此处仅考虑以太网)是CSMA/CD(Carrier Sense Multiple Access/Collision Detect,载波监听多路访问/冲突检测机制)。其主要工作原理是:工作站发送数据前先监听信道是否空闲,若空闲则立即发送数据。并且工作站在发送数据时,边发送边继续监听。若监听到冲突,则立即停止发送数据并等待一段随机时间,然后再重新尝试发送。
- 无线网络主要采用CSMA/CA(Carrier Sense Multiple Access/Collision Avoidance,译为载波监听多路访问/冲突避免机制)方法。无线网络没有采用冲突检测方法的原因是:如果要支持冲突检测,必须要求无线设备能一边接受数据信号一边传送数据信号,而这种设计对无线网络设备来说性价比太低。另外,冲突检测要求边发送数据包边监听,一旦有冲突则停止发送。很显然,这些因发送冲突而被中断的数据发送将会浪费不少的传输资源。所以,802.11在CSMA/CD基础上进行了一些调整,从而得到了CSMA/CA方法。其主要工作原理见下节内容。
值得指出的是:CSMA/CA协议信道利用率低于CSMA/CD协议信道利用率。信道利用率受传输距离和空旷程度的影响,当距离远或者有障碍物影响时会存在隐藏终端问题,降低信道利用率。在802.11b WLAN中,在1Mb/s速率时最高信道利用率可到90%,而在11Mb/s时最高信道利用率只有65%左右。
3. CSMA/CA介绍[8]
CSMA/CA主要使用两种方法来避免碰撞:
- 设备发送数据前,先监听无线链路状态是否空闲。为了避免发生冲突,当无线链路被其他设备占用时,设备会随机为每一帧选择一段退避(backoff)时间。这样就能减少冲突的发生。
- RTS-CTS握手(handshake):设备发送帧前,先发送一个很小的RTS(Request to Send)帧给目标端,等待目标端回应CTS(Clear to Send)帧后,才开始传送。此方式可以确保接下来传送数据时,其他设备不会使用信道以避免冲突。由于RTS帧与CTS帧长度很小,使得整体开销也较小。
下面我们通过图3-3来介绍RTS和CTS的作用。
图3-3 RTS/CTS原理
在图3-3中:
- 以工作站A和B之间传输数据为例,站B、站C、站E在站A 的无线信号覆盖的范围内,而站D不在其内。站A、站E、站D在站B的无线信号覆盖的范围内,但站C不在其内。
- 如果站A要向站B发送数据,那么,站A在发送数据帧之前,要先向站B发送一个请求发送帧RTS(Request To Send)。在RTS帧中会说明将要发送的数据帧的长度。站B收到RTS帧后就向站A回应一个允许发送帧CTS(Clear To Send)。在CTS帧中也附上A欲发送的数据帧的长度(从RTS帧中将此数据复制到CTS帧中)。站A收到CTS帧后就可发送其数据帧了。
那么怎么保证其他站不会干扰A和B之间的数据传输呢?
- 对于站C,站C处于站A的无线传输范围内,但不在站B的无线传输范围内。因此站C能够收听到站A发送的RTS帧,但经过一小段时间后,站C收听不到站B发送的CTS帧。这样,在站A向站B发送数据的同时,站C也可以发送自己的数据而不会干扰站B接收数据(注意:站C收听不到站B的信号表明,站B也收不听到站C的信号)。
- 对于站D,站D收听不到站A发送的RTS帧,但能收听到站B发送的CTS帧。因此,站D在收到站B发送的CTS帧后,应在站B随后接收数据帧的时间内关闭数据发送操作,以避免干扰站B接收自A站发来的数据。
- 对于站E,它能收到RTS帧和CTS帧,因此,站E在站A发送数据帧的整个过程中不能发送数据。
总体而言,使用RTS和CTS帧会使整个网络的效率有所下降。但由于这两种控制帧都很短(它们的长度分别为20和14字节)。而802.11数据帧则最长可达2346字节,相比之下的开销并不算大。相反,若不使用这种控制帧,则一旦发生冲突而导致数据帧重发,则浪费的时间就更大。
另外,802.11提供了三种情况供用户选择以处理:
- 使用RTS和CTS帧。
- 当数据帧的长度超过某一数值时才使用RTS和CTS帧。
- 不使用RTS和CTS帧。
尽管协议经过了精心设计,但冲突仍然会发生。例如:站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进行数据交换)。本章也不拟讨论它们。
4. MAC层Service及其他概念介绍[5][9]
ISO/IEC 7498及相关的一些标准文档除了对网络体系进行了层次划分外,还定义了层和层之间交互方式及其他一些基本组件。它们可用图3-4来表示:
图3-4 MAC Entity、Service和Clients
图3-4绘制了MAC层相关的组件及交互方式,其中:
- 协议规定了每一层所提供的功能,这些功能统一用Service来表示。图3-4中,MAC层为上层提供MAC Service。从Java编程角度来看,就好比定义了一个名为MACService的Java Package。
- 每一层内部有数个Entity。Entity代表封装了一组功能的模块。上面提到的Service就是由Entity提供的。根据OSI/RM的层次关系,第N层为第N+1层提供服务。所以,图3-4中,MAC Entity对上一层提供MAC Service。从Java编程角度来看,MAC Entity就好比MAC Service Package中定义的类,不同的Entity代表该Package中实现不同的功能类。一个Package中的Entity可以相互调用以完成某个功能。
- 第N+1层要使用第N层服务时,必须经由Service Acess Point来完成。图3-3中,MAC的Service必须借由MAC Service Access Point(缩写为MSAP)来访问。
根据上面的介绍,Entity定义了一个类,那其中是否定义了相应的功能函数呢?在标准文档中,和功能函数对应的术语是primitives(译为原语)及它们的parameters(参数)。图3-4列举了MAC Service的两个重要函数,分别是:
- M_UNITDATA.request:Client调用该primitive发送数据。该primitive的参数是destination_address(目标地址)、source_address(源地址)、MSDU(MAC Service Data Unit,即数据)、priority(优先级)。
- M_UNITDATA.indication:当位于远端机器的MAC层收到上面发送的数据后,将通过indication原语来通知上一层以处理该数据。
关于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了。
5. MIB介绍[11]
在阅读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可知:
- 左侧显示当前查看的是dot11MACAddress的条目。
- 右侧显示该条目的信息,Acess中的"read only"表示只读。Description表示该条目的意义。
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定义的属性,读者不妨在阅读本节时就下载相关文件和工具程序。
6. 知识总结
本节首先对OSI/RM进行了简单介绍,由此引出了MAC层的知识点。接着对802.11使用的MAC方法CSMA/CA进行了介绍。最后本节对MAC层Service及其相关概念以及MIB进行了介绍。
提醒:以上内容涉及到的知识点是读者以后阅读802.11协议时必然会碰到的。由于802.11协议引用的参考资料非常多,故笔者在本节整理了其中最基础的知识点。请读者务必认真阅读本节内容。
3.3.2 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规范中的一些核心内容:
- 3.3.3节将介绍802.11中的物理组件和网络结构。
- 在物理组件和网络结构基础上,3.3.4节将介绍802.11为无线网络所定义的服务。这些服务对我们从整体上理解无线网络的功能有重要意义。
- 3.3.5节将介绍802.11 MAC服务和帧方面的内容。这部分知识比较具体,相信读者理解起来没有问题。
- 3.3.6节将介绍MAC层管理实体方面的内容。搞清楚这部分内容有助于读者理解后续有关Linux Wi-Fi编程的知识。
- 3.3.7节将为读者介绍802.11安全性方面的知识点。
由于篇幅原因,本书不可能囊括规范的所有内容。但相信读者在理解本节内容的基础上,能够轻松开展更加深入的研究。另外,为帮助读者理解规范,本章会在重要知识点之处添加“规范阅读提示”的内容。
提醒:由于802.11物理层涉及大量和无线电、信号处理相关的知识。这些知识不仅内容枯燥繁杂,而且对软件工程师来说并无太大意义,故本章不拟介绍它们。愿意深入研究的读者可阅读相关资料。
[1]笔者博客地址为blog.csdn.net/innost或者http://my.oschina.net/innost/blog
3.3.3 802.11组件介绍
本节介绍802.11规范中的物理组件和相关网络结构。首先来看无线网络中的物理组件。
1. 物理组件[12]
802.11无线网络包含四种主要物理组件,如图3-9所示:
图3-9 802.11四大主要物理组件
图3-9中定义了四个组件,它们分别是:
- Wireless Medium(译为无线媒介):规范中缩写为WM。其本意指能传送无线MAC帧数据的物理层。规范最早定义了射频和红外两种物理层,但目前使用最多的是射频物理层。
- Station(译为工作站):规范中缩写为STA,其英文定义是“A logical entity that is a singly addressable instance of a MAC and PHY interface to the WM”。通俗点说,STA就是指携带有无线网络接口卡(即无线网卡)的设备,例如笔记本、智能手机等。另外,无线网卡和有线网卡的MAC地址均分配自同一个地址池以确保其唯一性。。
- Acess Point(译为接入点):规范中缩写为AP,其原文定义是“An entity that contains one STA and provides access to the distribution services, via the WM for associated STAs”。由其定义可知,AP本身也是一个STA,只不过它还能为那些已经关联的(associated)STA提供分布式服务(distribution services)。什么是Distribution Services呢?请读者阅读下文。
- Distribution system(译为分布式系统):规范中缩写为DS,其英文定义为“A system used to interconnect a set of basic service sets(BSSs)and integrated local area networks(LANs)to create an extended service set(ESS)”。DS的定义涉及到BSS、ESS等后文才介绍的无线网络架构,其解释见下文。
上述四个物理组件中最难解释清楚的就是DS了。笔者在仔细阅读规范后,感觉其对DS的解释并不直观。此处将列举一个常见的应用场景以帮助读者理解:
一般家用无线路由器一端通过有线接入互联网,另一端通过天线提供无线网络。当打开Android手机上的Wi-Fi功能,并成功连接到此无线路由器提供的无线网络(假设其网络名为“TP-LINK_1F9C5E”,可在路由器中设置)时,我们将得到:
- 路由器一端通过有线接入互联网,故可认为它整合(integrate)了LAN。
- 不论路由器是否接入有线网络(即本例中的互联网),手机(扮演STA的角色)和路由器(扮演AP的角色)之间建立了一个小的无线网络。该无线网络的覆盖范围由AP即路由器决定。这个小网络就是一个BSS。另外,定义中提及的ESS是对BSS的扩展。一个ESS可包含一或多个BSS。在本例中,ESS对应的ID就是“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(例如手机、平板等设备)。
2. 无线网络的构建[12]
有了上节所述的物理组件,现在就可以搭建由它们构成的无线网络了。802.11规范中,基本服务集(Basic Service Set,简写为BSS)是整个无线网络的基本构建组件(basic building block)。BSS如图3-10所示:
图3-10 BSS的两种方式
由图3-10可知,BSS有两种类型,分别是:
- Independent BSS(独立型BSS):这种类型的BSS不需要AP参与。各STA之间可直接交互。这种网络也叫ad-hoc BSS(一般译为自组网络或对等网络)。
- Infrastructure BSS(基础结构型BSS):所有STA之间的交互必须经过AP。AP是基础结构型BSS的中控台。这也是家庭或工作中最常见的网络架构。在这种网络中,一个STA必须完成诸如关联、授权等步骤后才能加入某个BSS。注意,一个STA一次只能属于一个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。如图3-11中所示的BSS1和BSS2。
- BSS1和BSS2本来各自组成了自己的小网络。但在ESS结构中,它们在逻辑上又构成了一个更大的BSS。这意味着最初在BSS2中使用的STA4(利用STA3,即BSS2中的AP上网)能跑到BSS1的范围内利用它的AP(即STA2)上网而不用做任何无线网络切换之类的操作。此场景在手机通信领域很常见。例如在移动的汽车上打电话。此时手机就会根据情况在物理位置不同的基站间切换语音数据传输而不影响通话。
注意:ESS中的BSS拥有相同的SSID(Service Set Identification,详细内容见下文),并且彼此之间协同工作。这和目前随着Wi-Fi技术的推广,家庭和工作环境中存在多个无线网络(即存在多个ESS)的情况有本质不同。在多个ESS情况下,用户必须手动选择才能切换到不同的ESS。由于笔者日常工作和生活中,ESS只包含一个BSS,当某个AP停机时,笔者就得手动切换到其他无线网络中去了。
另外,切换相关的知识点属于Roaming(漫游)范畴,读者可阅读“Secure Roaming in 802.11 Networks”一书来了解相关细节。
上述网络都有所谓的Identification,它们分别是:
- BSSID:每一个BSS都有自己的唯一编号,称为BSS Identification。在基础结构型网络中,BSSID就是AP的MAC地址,该MAC地址是真实的地址。IBSS中,其BSSID也是一个MAC地址,不过这个MAC地址是随机生成的。
- SSID:Service Set Identification。一般而言,BSSID会和一个SSID关联。BSSID是MAC地址,而SSID就是网络名。网络名往往是一个可读字符串,因为网络名比MAC地址更方便人们记忆。
- ESS包括一到多个BSS,而它对外看起来就像一个BSS。所以,对ESS的编号就由SSID来表达。只要设置其内部BSS的SSID为同一个名称即可。一般情况下,ESS的SSID就是其网络名(network name)。
规范阅读提示:
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。初学者可先不接触这部分内容。
==============================================================================================略略略略略略略略略略略略略略===================================
3.4 Linux Wi-Fi编程API介绍
前面小节一直在介绍Wi-Fi规范方面的内容。从本节开始,我们将向读者介绍Linux平台中Wi-Fi编程方面的知识。
提醒:相比前文而言,本节内容读起来将显得较为轻松。但从笔者个人经验来说,编程只不过是规范的某种实现,掌握规范才是理解无线网络技术的核心。这也是本书内容组织和编排的指导原则。希望读者能认真体会。
Linux平台上目前常用的专门针对无线网络设备编程的API有两套[40],
- 最早的一套API由HP公司员工Jean Tourrilhes于1997年开发,全称为Linux Wireless Extensions。一般缩写为wex或wext。这套API使得用户空间的程序能通过ioctl函数来控制无线网卡驱动。
- 由于利用ioctl开展编程的方式不太符合Linux驱动开发的要求,所以后来Linux又提供了cfg80211和nl80211两套编程接口用于替代wext。其中,cfg80211用于驱动开发,而nl80211 API供用户空间进程使用以操作那些利用cfg80211 API开发的无线网卡驱动。
注意: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类型的网卡。
3.4.1 Linux Wireless Extensions介绍
从开发者角度来说,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却比较严谨,它提供了自己的数据类型。
1. 常用数据结构介绍
首先,所有用户空间发起的请求都统一包括在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来触发无线网卡扫描工作的。
2. 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;
}
3. wext知识总结
wext相对比较简单,但其内部的数据结构定义、变量命名等都和规范中定义的原语有着莫大的关系。建议读者结合规范去阅读wireless.h以加深理解。
==============================================================================================略略略略略略略略略略略略略略===================================
3.5 本章总结和参考资料说明
3.5.1 本章总结
本章是全书关于Wi-Fi技术方面的一篇基础文章,涉及的面很广,内容也很杂,需要读者耐心阅读并理解。从大体上来说,本章按如下逻辑开展:
- 首先简单介绍了无线频谱资源和802.11发展历程。
- 为了帮助读者以后能真正看懂802.11规范,本章介绍了OSI/RM模型以及其中关于Entity、SAP、MIB等基本概念。
- 接着我们正式介绍802.11规范中的一些重要内容,包括无线网络组件,网络结构、无线网络提供的服务等。
- 在上述基础上,我们着重对802.11 MAC层进行了介绍,包括MAC帧格式、MLME等。这部分内容是理解后续章节关于wpa_supplicant介绍的核心。
- 最后一个关于802.11的知识点是其安全性问题。建议读者从机密性、完整性和身份验证三个考察点来理解其中的各种安全保护方法。
- 本章最后对Linux Wi-Fi API进行了介绍,目前用得最多的应该是nl80211。不过读者可先从简单的wext开始学习。
本章是笔者从事Android写作以来耗时最长的一篇文章了(包括学习时间一共长达3个多月,而且还有很多技术点未能覆盖到)。在这个过程中,笔者也经历过烦恼和痛苦,感觉其难度比纯粹的代码分析要大得多。这也是笔者希望读者把注意力放到代码背后的理论上来的初衷。
另外,从下一章开始,我们将在分析wpa_supplicant的同时,通过背景知识介绍的方式来补充本节没有涵盖的内容。
3.5.2 参考资料说明
概述
[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”。笔者对其内容做了必要的增删改。
OSI基本参考模型及相关基本概念
[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”即可。
CSMA/CA介绍
[8] http://baike.baidu.com/view/645723.htm
百度百科词条“CSMA/CA”,以非常通俗的方式解释了CSMA/CA的工作原理。除非特别需要,读者也可参考“802.11无线网络权威指南(第二版)”一书第三章“802.11 MAC基础”,P47-P55。
MAC层Service及其他概念介绍
[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和相关的原语。
MIB介绍
[11] http://en.wikipedia.org/wiki/Management_information_base
维基百科词条“Management Information Base”,英文介绍,还算比较好理解。
802.11组件介绍
[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”
802.11 Service介绍
[13] 802.11-2012第4.5节“Overview of the Services”。
注意,802.11-2012第4节“General description”非常重要,里边的许多基本概念都需要了解。注意,该节包括的内容非常多,读者应有选择的阅读。
802.11 MAC服务和帧介绍
[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。
802.11 MAC管理实体介绍
[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相结合。
WEP介绍
[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安全方面的一些简单介绍。
RSN数据加密及完整性校验介绍
[29] 802.11-2012第11.4节“RSNA confidentiality and integrity protocols”
官方文档关于TKIP和CCMP的介绍。
[30] 802.11无线网络权威指南(第二版)第七章“802.11:RSN、TKIP与CCMP”,P162-P176
请读者结合[29]一起研究。
EAP和802.1X介绍
[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格式的详细说明。
RSNA介绍
[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的运作方式,对密匙派生和缓存有较为详细的说明。
Linux Wi-Fi编程API介绍
[40] http://wireless.kernel.org/en/developers/Documentation/Wireless-Extensions
Linux Wireless Kernel官方网站,内容非常丰富。建议读者仔细阅读。
netlink编程介绍
[41] http://www.infradead.org/~tgr/libnl/
libnl官方网站,文档较为丰富。读者可阅读其中关于libnl的文档。