wifi 基础知识

参考:http://blog.csdn.net/innost/article/details/20651445

Wi-Fi是一个认证的名称,该认证用于测试无线网络设备是否符合IEEE 802.11系列协议的规范。通过该认证的设备将被授予一个名为Wi-Fi CERTIFIED的商标。不过,随着获得Wi-Fi认证的设备普及,人们也就习以为常得称无线网络为Wi-Fi网络了。

802.11规范全称为《Part 11Wireless LAN Medium Acess ControlMAC and Physical LayerPHY Specifications

无需授权的频谱大部分集中在所谓的ISM国际共用频段中ISMIndustrial Scientific Medical的缩写各国都将2.4GHz频段划分于ISM范围,所以Wi-Fi、蓝牙等均可工作在此频段上。

ISOInternational Organization for Standardization,国际标准化组织)和IECInternational Electrotechnical Commission国际电工技术委员会)于1983年联合发布了ISO/IEC 7498标准。该标准定义了著名的Open Systems Interconnection Reference Model(开放系统互联参考模型,简写为OSI/RM)。先来看OSI/RM,它将网络划分成7层,由上到下分别是:

  • Application Layer(应用层):应用层能与应用程序界面沟通以达到向用户展示的目的。常见的协议有HTTPHTTPSFTPSMTP等。其数据单位为APDUApplication Protocol Data Unit)。
  • Presentation Layer(表示层):表示层能为不同客户端提供数据和信息的语法转换,使系统能解读成正确的数据,同时它还能提供压缩解压、加密解密等服务。例如不同格式图像(如GIFJPEGTIFF等)的显示就是由位于表示层的协议来支持的。其数据单位为PPDUPresentation Protocol Data Unit)。
  • Session Layer(会话层):会话层用于为通信双方制定通信方式,创建和注销会话(双方通信)等。其数据单位为SPDUSession Protocol Data Unit)。常见的协议有ZIPAppleTalkSCP等。
  • Transport Layer(传输层):传输层用于控制数据流量,同时能进行调试及错误处理,以确保通信顺利。发送端的传输层会为数据分组加上序号,以方便接收端把分组重组为有用的数据或文件。传输层的常见协议有TCPUDP等。其数据单位为TPDUTransport Protocol Data Unit)。
  • Network Layer(网络层):网络层为数据传送的目的地寻址,然后再选择一个传送数据的最佳路线。网络层数据的单位为PacketDatagram。常见的设备有路由器等。常见协议有IPIPv6
  • Data Link Layer(数据链路层):在物理层提供比特流服务的基础上,建立相邻结点之间的数据链路。通过差错控制提供数据帧(Frame)在信道上无差错的传输。数据链路层在不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。数据链路层数据的单位为Frame(帧)。常见的设备有二层交换机、网桥等。
  • Physical Layer(物理层):物理层定义了通信设备机械、电气、功能和过程等方面的特性,用以建立、维护和拆除物理链路连接。物理层数据的单位为bit认为TCP/IP ModelOSI/RM的一个简化版本。

最为人熟知的就是ISO/IEC 8802规范划分Data Link Layer而得到的Logic Link Control Sub Layer(简称LLC)和Medium Acess Control Sub Layer(简称MAC

  • MAC Sub LayerMedia Acess Control SubLayer:媒介访问控制子层):该子层的目的是为了解决局域网(Local Area Network,以后简写为LAN)中共用信道的使用产生竞争时,如何分配信道的使用权问题。目前LAN中常用的媒介访问控制方法是CSMA/CD(争用型介质访问控制)。由于无线网络的特殊性,MAC的控制方法略有不同。我们将在下文介绍相关内容。
  • LLC Sub Layer(逻辑链路控制子层):该子层实现了两个站点之间帧的交换,实现端到端(源到目的),无差错的帧传输和应答功能及流量控制功能。

Data Link层划分的这两个子层中,802.11只涉及到MAC层。由于物理介质的不同,无线和有线网络使用的MAC方法有较大差别,主要区别如下[8]

  • 有线(wired)网络最常使用的方法(此处仅考虑以太网)是CSMA/CDCarrier Sense Multiple Access/Collision Detect,载波监听多路访问/冲突检测机制)。其主要工作原理是:工作站发送数据前先监听信道是否空闲,若空闲则立即发送数据。并且工作站在发送数据时,边发送边继续监听。若监听到冲突,则立即停止发送数据并等待一段随机时间,然后再重新尝试发送。
  • 无线网络主要采用CSMA/CACarrier Sense Multiple Access/Collision Avoidance,译为载波监听多路访问/冲突避免机制)方法。无线网络没有采用冲突检测方法的原因是:如果要支持冲突检测,必须要求无线设备能一边接受数据信号一边传送数据信号,而这种设计对无线网络设备来说性价比太低。另外,冲突检测要求边发送数据包边监听,一旦有冲突则停止发送。很显然,这些因冲突而被中断的数据发送将会浪费不少的传输资源。所以,802.11CSMA/CD基础上进行了一些调整,从而得到了CSMA/CA方法。

值得指出的是:CSMA/CA协议信道利用率低于CSMA/CD协议信道利用率。信道利用率受传输距离和空旷程度的影响,当距离远或者有障碍物影响时会存在隐藏终端问题,降低信道利用率。在802.11b WLAN中,在1Mb/s速率时最高信道利用率可到90%,而在11Mb/s时最高信道利用率只有65%左右。

CSMA/CA主要使用两种方法来避免碰撞:

  • 设备发送数据前,先监听无线链路状态是否空闲。为了避免发生冲突,当无线链路被其他设备占用时,设备会随机为每一帧选择一段退避(backoff)时间。这样就能减少冲突的发生。
  • RTS-CTS握手(handshake):设备发送帧前,先发送一个很小的RTSRequest to Send)帧给目标端,等待目标端回应CTSClear to Send)帧后,才开始传送。此方式可以确保接下来传送数据时,其他设备不会使用信道以避免冲突。由于RTS帧与CTS帧长度很小,使得整体开销也较小。

下面我们通过图3-3来介绍RTSCTS的作用。

1  RTS/CTS原理

在图3-3中:

  • 以工作站AB之间传输数据为例,站B、站C、站E在站A 的无线信号覆盖的范围内,而站D不在其内。站A、站E、站D在站B的无线信号覆盖的范围内,但站C不在其内。
  • 如果站A要向站B发送数据,那么,站A在发送数据帧之前,要先向站B发送一个请求发送帧RTSRequest To Send)。在RTS帧中会说明将要发送的数据帧的长度。站B收到RTS帧后就向站A回应一个允许发送帧CTSClear To Send)。在CTS帧中也附上A欲发送的数据帧的长度(从RTS帧中将此数据复制到CTS帧中)。站A收到CTS帧后就可发送其数据帧了。

那么怎么保证其他站不会干扰AB之间的数据传输呢?

  • 对于站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发送数据帧的整个过程中不能发送数据。

总体而言,使用RTSCTS帧会使整个网络的效率有所下降。但由于这两种控制帧都很短(它们的长度分别为2014字节)。而802.11数据帧则最长可达2346字节,相比之下的开销并不算大。相反,若不使用这种控制帧,则一旦发生冲突而导致数据帧重发,则浪费的时间就更大。


另外,802.11提供了三种情况供用户选择以处理:

  • 使用RTSCTS帧。
  • 当数据帧的长度超过某一数值时才使用RTSCTS帧。
  • 不使用RTSCTS帧。

尽管协议经过了精心设计,但冲突仍然会发生。例如:站B和站C同时向站A发送RTS帧。这两个RTS帧发生冲突后,使得站A收不到正确的RTS帧因而站A就不会发送后续的CTS帧。这时,站B和站C像以太网发生冲突那样,各自随机地推迟一段时间后重新发送其RTS帧。

根据802.11协议,CSMA/CA具体运作时由所谓的协调功能(Coordination Function)来控制。协议规定有四种不同的协调功能,分别是分布式协调功能(Distributed CF,简称DCF)、基于DCF之上的Point CFPoint CF,简称PCF)、混合型协调功能(Hybrid CF,简称HCF)以及用于Mesh网络的(Mesh CF,简称MCF)。由于无线网络是共享介质,所以,协调功能的目的就是用于控制各个无线网络设备使用无线媒介的时机以避免冲突发生。


无线网络的构建

有了上节所述的物理组件,现在就可以搭建由它们构成的无线网络了。802.11规范中,基本服务集(Basic Service Set,简写为BSS)是整个无线网络的基本构建组件(basic building block)。BSS如图3-10所示:

2 BSS的两种方式


BSS有两种类型,分别是:

  • Independent BSS(独立型BSS):这种类型的BSS不需要AP参与。各STA之间可直接交互。这种网络也叫ad-hoc BSS(一般译为自组网络或对等网络)。
  • Infrastructure BSS(基础结构型BSS):所有STA之间的交互必须经过APAP是基础结构型BSS的中控台。这也是家庭或工作中最常见的网络架构。在这种网络中,一个STA必须完成诸如关联、授权等步骤后才能加入某个BSS。注意,一个STA一次只能属于一个BSS

ESSExtended Service Set:扩展服务集)。如图3-11所示:

3  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中所示的BSS1BSS2
  • BSS1BSS2本来各自组成了自己的小网络。但在ESS结构中,它们在逻辑上又构成了一个更大的BSS。这意味着最初在BSS2中使用的STA4(利用STA3,即BSS2中的AP上网)能跑到BSS1的范围内利用它的AP(即STA2)上网而不用做任何无线网络切换之类的操作。此场景在手机通信领域很常见。例如在移动的汽车上打电话。此时手机就会根据情况在物理位置不同的基站间切换语音数据传输而不影响通话。

注意ESS中的BSS拥有相同的SSIDService Set Identification),并且彼此之间协同工作。这和目前随着Wi-Fi技术的推广,家庭和工作环境中存在多个无线网络(即存在多个ESS)的情况有本质不同。在多个ESS情况下,用户必须手动选择才能切换到不同的ESS

上述网络都有所谓的Identification,它们分别是:

  • BSSID:每一个BSS都有自己的唯一编号,称为BSS Identification。在基础结构型网络中,BSSID就是APMAC地址,该MAC地址是真实的地址。IBSS中,其BSSID也是一个MAC地址,不过这个MAC地址是随机生成的。
  • SSIDService Set Identification。一般而言,BSSID会和一个SSID关联。BSSIDMAC地址,而SSID就是网络名。网络名往往是一个可读字符串,因为网络名比MAC地址更方便人们记忆。
  • ESS包括一到多个BSS,而它对外看起来就像一个BSS。所以,对ESS的编号就由SSID来表达。只要设置其内部BSSSSID为同一个名称即可。一般情况下,ESSSSID就是其网络名(network name)。
如何与有线网络(即LAN)的整合。规范中其实还定义了一个名为portal的逻辑模块(logical component)用于将WLANWireless LAN)和LAN结合起来。由于WLANLAN使用的MAC帧格式不同,所以直白得说,portal的功能类似翻译,它在WLANLAN间转换MAC帧数据。目前,portal的功能由AP实现。

Linux Wi-Fi编程API

Linux平台上目前常用的专门针对无线网络设备编程的API有两套,

  • 最早的一套APIHP公司员工Jean Tourrilhes1997年开发,全称为Linux Wireless Extensions。一般缩写为wexwext。这套API使得用户空间的程序能通过ioctl函数来控制无线网卡驱动。
  • 由于利用ioctl开展编程的方式不太符合Linux驱动开发的要求,所以后来Linux又提供了cfg80211nl80211两套编程接口用于替代wext。其中,cfg80211用于驱动开发,而nl80211 API供用户空间进程使用以操作那些利用cfg80211 API开发的无线网卡驱动。

从开发者角度来说,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.hAndroid 4.2中的wext版本为20,由wireless.h中的宏WIRELESS_EXT定义。

虽然前面提到说ioctl函数的一个缺点是其没有指明参数类型,但wext却比较严谨,它提供了自己的数据类型。








  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值