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所示:
:-: ![](http://img.blog.csdn.net/20140306211114015?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图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所示:
:-: ![](http://img.blog.csdn.net/20140306211358453?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图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的作用。
:-: ![](http://img.blog.csdn.net/20140306211419093?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图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来表示:
:-: ![](http://img.blog.csdn.net/20140306211438265?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图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](http://www.ieee802.org/11/802.11mib.txt) 中。 下载后将得一个名为802.11mib.txt文件。读者可通过JMIBBrowser工具(下载地址为http://sourceforge.net/projects/jmibbrowser/, 它是一个用Java语言编写的可利用SNMP协议查看和设置指定设备MIB的小工具)去加载并查看其内容。如图3-5所示:
:-: ![](http://img.blog.csdn.net/20140306211503156?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图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属性):
:-: ![](http://img.blog.csdn.net/20140306211522203?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图3-6 NOTE2 wlan0设备的MIB属性示意
以图3-6中第一条属性dot11RSNAOptionImplemented为例,其在802.11mib.txt的定义如图3-7所示:
:-: ![](http://img.blog.csdn.net/20140306211538984?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图3-7 dot11RSNAOptionImplemented内容示意
相比直接浏览802.11mib.txt文本文件而言,利用JMIBBrowser工具查看属性会更加方便和直观一些。
* * * * *
**提示**:以后分析wpa_supplicant源码时,会碰到802.11mib定义的属性,读者不妨在阅读本节时就下载相关文件和工具程序。
以上内容涉及到的知识点是读者以后阅读802.11协议时必然会碰到的。由于802.11协议引用的参考资料非常多,故笔者在本节整理了其中最基础的知识点。请读者务必认真阅读本节内容。
* * * * *
- 前言
- 第1章 准备工作
- 1.1 Android系统架构
- 1.2 工具使用
- 1.2.1 Source Insight的使用
- 1.2.2 Eclipse的使用
- 1.2.3 BusyBox的使用
- 1.3 本书资源下载说明
- 第2章 深入理解Netd
- 2.1 概述
- 2.2 Netd工作流程
- 2.2.1 main函数分析
- 2.2.2 NetlinkManager分析
- 2.2.3 CommandListener分析
- 2.2.4 DnsProxyListener分析
- 2.2.5 MDnsSdListener分析
- 2.3 CommandListener中的命令
- 2.3.1 iptables、tc和ip命令
- 2.3.2 CommandListener构造函数和测试工具ndc
- 2.3.3 InterfaceCmd命令
- 2.3.4 IpFwd和FirewallCmd命令
- 2.3.5 ListTtysCmd和PppdCmd命令
- 2.3.6 BandwidthControlCmd和IdletimerControlCmd命令
- 2.3.7 NatCmd命令
- 2.3.8 TetherCmd和SoftapCmd命令
- 2.3.9 ResolverCmd命令
- 2.4 NetworkManagementService介绍
- 2.4.1 create函数详解
- 2.4.2 systemReady函数详解
- 2.5 本章总结和参考资料说明
- 2.5.1 本章总结
- 2.5.2 参考资料说明
- 第3章 Wi-Fi基础知识
- 3.1 概述
- 3.2 无线电频谱和802.11协议的发展历程
- 3.2.1 无线电频谱知识
- 3.2.2 IEEE 802.11发展历程
- 3.3 802.11无线网络技术
- 3.3.1 OSI基本参考模型及相关基本概念
- 3.3.2 802.11知识点导读
- 3.3.3 802.11组件
- 3.3.4 802.11 Service介绍
- 3.3.5 802.11 MAC服务和帧
- 3.3.6 802.11 MAC管理实体
- 3.3.7 无线网络安全技术知识点
- 3.4 Linux Wi-Fi编程API介绍
- 3.4.1 Linux Wireless Extensions介绍
- 3.4.2 nl80211介绍
- 3.5 本章总结和参考资料说明
- 3.5.1 本章总结
- 3.5.2 参考资料说明
- 第4章 深入理解wpa_supplicant
- 4.1 概述
- 4.2 初识wpa_supplicant
- 4.2.1 wpa_supplicant架构
- 4.2.2 wpa_supplicant编译配置
- 4.2.3 wpa_supplicant命令和控制API
- 4.2.4 git的使用
- 4.3 wpa_supplicant初始化流程
- 4.3.1 main函数分析
- 4.3.2 wpa_supplicant_init函数分析
- 4.3.3 wpa_supplicant_add_iface函数分析
- 4.3.4 wpa_supplicant_init_iface函数分析
- 4.4 EAP和EAPOL模块
- 4.4.1 EAP模块分析
- 4.4.2 EAPOL模块分析
- 4.5 wpa_supplicant连接无线网络分析
- 4.5.1 ADD_NETWORK命令处理
- 4.5.2 SET_NETWORK命令处理
- 4.5.3 ENABLE_NETWORK命令处理
- 4.6 本章总结和参考资料说明
- 4.6.1 本章总结
- 4.6.2 参考资料说明
- 第5章 深入理解WifiService
- 5.1 概述
- 5.2 WifiService的创建及初始化
- 5.2.1 HSM和AsyncChannel介绍
- 5.2.2 WifiService构造函数分析
- 5.2.3 WifiStateMachine介绍
- 5.3 加入无线网络分析
- 5.3.1 Settings操作Wi-Fi分析
- 5.3.2 WifiService操作Wi-Fi分析
- 5.4 WifiWatchdogStateMachine介绍
- 5.5 Captive Portal Check介绍
- 5.6 本章总结和参考资料说明
- 5.6.1 本章总结
- 5.6.2 参考资料说明
- 第6章 深入理解Wi-Fi Simple Configuration
- 6.1 概述
- 6.2 WSC基础知识
- 6.2.1 WSC应用场景
- 6.2.2 WSC核心组件及接口
- 6.3 Registration Protocol详解
- 6.3.1 WSC IE和Attribute介绍
- 6.3.2 802.11管理帧WSC IE设置
- 6.3.3 EAP-WSC介绍
- 6.4 WSC代码分析
- 6.4.1 Settings中的WSC处理
- 6.4.2 WifiStateMachine的处理
- 6.4.3 wpa_supplicant中的WSC处理
- 6.4.4 EAP-WSC处理流程分析
- 6.5 本章总结和参考资料说明
- 6.5.1 本章总结
- 6.5.2 参考资料说明
- 第7章 深入理解Wi-Fi P2P
- 7.1 概述
- 7.2 P2P基础知识
- 7.2.1 P2P架构
- 7.2.2 P2P Discovery技术
- 7.2.3 P2P工作流程
- 7.3 WifiP2pSettings和WifiP2pService介绍
- 7.3.1 WifiP2pSettings工作流程
- 7.3.2 WifiP2pService工作流程
- 7.4 wpa_supplicant中的P2P
- 7.4.1 P2P模块初始化
- 7.4.2 P2P Device Discovery流程分析
- 7.4.3 Provision Discovery流程分析
- 7.4.4 GO Negotiation流程分析
- 7.5 本章总结和参考资料说明
- 7.5.1 本章总结
- 7.5.2 参考资料说明
- 第8章 深入理解NFC
- 8.1 概述
- 8.2 NFC基础知识
- 8.2.1 NFC概述
- 8.2.2 NFC R/W运行模式
- 8.2.3 NFC P2P运行模式
- 8.2.4 NFC CE运行模式
- 8.2.5 NCI原理
- 8.2.6 NFC相关规范
- 8.3 Android中的NFC
- 8.3.1 NFC应用示例
- 8.3.2 NFC系统模块
- 8.4 NFC HAL层讨论
- 8.5 本章总结和参考资料说明
- 8.5.1 本章总结
- 8.5.2 参考资料说明
- 第9章 深入理解GPS
- 9.1 概述
- 9.2 GPS基础知识
- 9.2.1 卫星导航基本原理
- 9.2.2 GPS系统组成及原理
- 9.2.3 OMA-SUPL协议
- 9.3 Android中的位置管理
- 9.3.1 LocationManager架构
- 9.3.2 LocationManager应用示例
- 9.3.3 LocationManager系统模块
- 9.4 本章总结和参考资料说明
- 9.4.1 本章总结
- 9.4.2 参考资料说明
- 附录