ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
本节将向读者介绍802.11中MAC服务以及MAC帧方面的内容。首先来看MAC服务。 **1.MAC服务定义[14]** 根据3.3.1节所示,MAC层定义了一些Service用于为上层LLC提供服务。其中,802.11中定义的MAC提供三种服务,分别如下。 * MA-UNITDATA.request:供LLC层发送数据。 * MA-UNITDATA.indication:通知LLC层进行数据接收。 * MA-UNITDATA-STATUS.indication:通知LLC层自己(即MAC层)的状态。 规范中这三种服务的定义和编程语言中的函数非常像。根据前文所述,服务在规范中被称为原语(primitive),每个服务有特定的参数(parameter)。另外,规范对每条原语都做了非常详细的解释,例如原语使用场景(从编程角度看就是介绍什么时候用这些API),MAC层如何处理这些原语(从编程角度看即描述应该如何实现这些API)。 (1)MA-UNITDATA.request服务 request用于发送数据,其定义如下所示。 ~~~ MA-UNITDATA.request( source address // 指定本次数据发送端的MAC地址 destination address // 指定接收端的MAC地址。可以是组播或广播地址 routing information // 路由信息。对于802.11来说,该值为null(表示该值没有作用) data // MSDU,即上层需要发送的数据。对802.11来说,其大小不能超过2304字节 priority // priority和service class的解释见下文 service class ) ~~~ request原语中,除priority和service class参数外,其他都很容易理解。而priority和serviceclass参数与QoS有关系。 * priority的取值为0~15的整数。对于非QoS相关的操作,其取值为Contention和ContentionFree。802.11中,QoS设置了不同的用户优先级(User Priority,UP)。显然,UP高的数据将优先得到发送。Priority参数和QoS中的其他参数一起决定发送数据的优先级。 * service class的取值也针对是否为QoS而有所不同。对于非QoS,取值可为ReorderableGroupAddressed或StrictlyOdered。这两个都和数据发送时是否重排(reorder)发送次序有关。非QoS情况下,STA发送数据时并不会主动去调整发送次序。而QoS情况下,很明显那些UP较高的数据见得到优先处理。但对于组播数据,发送者可以设置service class为ReorderableGroupAddressed进行次序调整。 对request原语来说,当LLC需要发送数据时,就会调用request。MAC层需要检查参数是否正确。如果不正确,将通过其他原语通知LLC层,否则将启动数据发送流程。 (2)MA-UNITDATA.indication服务 下面来看MAC层收到数据后用于通知LLC层的原语indication,其定义如下。 ~~~ MA-UNITDATA.indication( source address // 代表数据源MAC地址。其值取值MAC帧中的SA(关于MAC帧格式详情见后文) destination address // 代表目标MAC地址,取自MAC帧中的DA,可以是组播地址 routing information // 值为null data // MAC帧数据 reception status // 表示接收状态,例如成功或失败。对802.11来说,该状态永远返回success // MAC层会丢弃那些错误的数据包 priority // 和request的取值略有不同,此处略过 service class ) ~~~ 802.11中,indication只有在MAC层收到格式完整、安全校验无误及没有其他错误的数据包时才会被调用以通知LLC层。 (3)MA-UNITDATA-STATUS.indication服务 STATUS.indication用于向LLC层返回对应request原语的处理情况。其原型如下。 ~~~ MA-UNITDATA-STATUS.indication( // source和destination address和对应request的前两个参数一样 source address destination address transmission status // 返回request的处理情况,详情见下文 provided priority // 只有status返回成功,该参数才有意义。其值和调用request发送数据时的值一致 provided service class // 只有status返回成功,该参数才有意义 ) ~~~ indication最关键的一个参数是transmission status,可以是以下值。 * Successful:代表对应request发送数据成功。 * Undeliverable:数据无法发送。其原因有数据超长(excessive data length)、在request时指定了routing information(non-null source routing)、不支持的priority和service class、没有BSS(no BSS available)、没有key进行加密(cannot encrypt with anull key)等。 * * * * * **提示** 本节对应于规范的第5节"MAC service definition"。和前面内容相比,本节内容更贴近于代码实现,当然也就更符合程序员的“审美观”。 * * * * * 接下来介绍和MAC帧相关的内容。 **2.MAC帧[15][16][17]** 802.11 MAC帧格式如图3-13所示。 :-: ![](https://box.kancloud.cn/79405348c18f29583dd87b930b3ec1ae_1041x172.jpg) 图3-13 802.11 MAC帧格式 由图3-13可知,MAC帧由以下三个基本域组成。 * MAC Header:包括帧控制(Frame Control)、时长(Duration)、地址(Address)等。注意,每个方框上面的数字表示该域占据的字节数。例如Frame Control需要2字节。 * Frame Body:代表数据域。这部分内容的长度可变,其具体存储的内容由帧类型(type)和子类型(sub type)决定。 * FCS:(Frame Check Sequence,帧校验序列)用于保障帧数据完整性。 * * * * * **规范阅读提示** 1)关于MAC帧的格式。规范中还指出,如果是QoS数据帧,还需要附加QoS Control字段。如果是HT(High Throughput,一种用于提高无线网络传输速率的技术)数据帧,还需要附加HT Control字段。 2)关于Frame body长度。规范中指出其长度是7951字节,它和Aggregate-MPDU(MAC报文聚合功能)以及HT有关。本文不拟讨论相关内容。故此处采用2312字节 * * * * * 下面分别介绍MAC帧头中几个重要的域,首先是Frame Control域。 (1)Frame Control域 Frame Control域共2字节16位,其具体字段划分如图3-14所示。 :-: ![](https://box.kancloud.cn/c697a534b4d7aab739dedfbd57b3b187_1139x195.jpg) 图3-14 Frame Control域的组成 * Protocol Version:代表802.11 MAC帧的版本号。目前的值是0。 * Type和Subtype:这两个字段用于指明MAC帧的类型。802.11中MAC帧可划分为三种类型,分别是control、data和management,每种类型的帧用于完成不同功能。详情见下文。 * To DS和From DS:只用在数据类型的帧中。其意义见下文。 * More Fragments:表明数据是否分片。只支持data和management帧类型。 * Retry:如果该值为1,表明是重传包。 * Power Management:表明发送该帧的STA处于活跃模式还是处于省电模式。 * More Data:和省电模式有关。AP会为那些处于省电模式下的STA缓冲一些数据帧,而STA会定时查询是否有数据要接收。该参数表示AP中还有缓冲的数据帧。如果该值为0,表明STA已经接收完数据帧了(下节将介绍省电模式相关的内容)。 * Protected Frame:表明数据是否加密。 * Order:指明接收端必须按顺序处理该帧。 Type和Subtype的含义如表3-2所示。其中仅列出了部分Type和Subtype的取值。 :-: ![](https://box.kancloud.cn/2882a3f242c3b7e82c2b72e9ce226c9b_1263x557.jpg) 表3-2 MAC帧Type和Subtype ㈠ 本书将在第7章详细介绍Action帧。 From DS和To DS的取值如表3-3所示。 :-: ![](https://box.kancloud.cn/57785d7bb5a8c9e6dc29a1df5720b712_1269x252.jpg) :-: ![](https://box.kancloud.cn/e2b558547be082987b39b128e11edf29_1258x262.jpg) 表3-3 From To DS含义 * * * * * **扩展阅读** 省电模式[18] 无线网络的使用者常见于笔记本电脑、智能手机等设备,它们最大的一个特点就是能够移动(无线技术的一个重要目的就是摆脱各种连接线的缠绕)。无线带来便捷的同时也引入了另外一个突出问题,即电量消耗。在当前电池技术还没有明显进步的现实情况下,802.11规范对电源管理也下了一番苦功。 规范为STA定义了两种和电源相关的状态,分别是Active模式和PS(Power Save)模式。处于PS模式下,无线设备将关闭收发器(transceiver)以节省电力。 STA为了节电而关闭数据收发无可厚非,怎么保证数据传输的连贯性呢?下面讨论基础结构型网络中省电模式的知识。在这种网络中,规范规定AP为了保证数据传输的连贯性,其有两个重要工作。 1. AP需要了解和它关联的STA的电源管理状态。当某个STA进入PS状态后,AP就要做好准备以缓存发给该STA的数据帧。一旦STA醒来并进入Active模式,AP就需要将这些缓存的数据发送给该STA。注意,AP无须PS模式,因为绝大多数情况下,AP是由外部电源供电(如无线路由器)。在AP中,每个和其关联的STA都会被分配一个AID(Association ID)。 2. AP需要定时发送自己的数据缓存状态。因为STA也会定期接收信息(相比发送数据而言,开启接收器所消耗的电力要小)。一旦STA从AP定时发送的数据缓存状态中了解到它还有未收的数据,STA则会进入Active模式并通过PS-POLL控制帧来接收它们。 * * * * * 现在来看MAC帧中Power Management的取值情况。 * 对于AP不缓存的管理帧,PM字段无用。 * 对于AP发送的帧,PM字段无用。 * STA发送给还未与之关联的AP的帧中,PM字段无用。 * 其他情况下,PM为1表示STA将进入PS状态,否则将进入Active状态。 配合PM使用的字段就是More Data。根据前文介绍,STA通过PS-POLL来获取AP端为其缓存的数据帧。一次PS-POLL只能获取一个缓存帧。STA怎么知道缓存数据都获取完了呢?原来More Data值为1表示还有缓存帧,否则为0。虽然MAC帧中没有字段说明AP缓存了多少帧,但通过简单的0/1来标示是否还有剩余缓存帧也不失为一种好方法。 * * * * * **提示** 规范中的PS处理比较复杂,建议阅读参考资料[18]。 * * * * * (2)Duration/ID域 Duration/ID域占2字节共16位,其具体含义根据Type和Subtype的不同而变化,不过大体就两种,分别代表ID和Duration。 * 对于PS-POLL帧,该域表示AID的值。其中最后2位必须为1,而前14位取值为1~2007。这就是该域取名ID之意。 * 对于其他帧,代表离下一帧到来还有多长时间,单位是微秒。这就是该域取名Duration之意。 * * * * * **注意** Duration的用法和CSMA/CA的具体实现有关。本章不对它进行详细讨论,可阅读参考资料[8]。 * * * * * (3)Address域 讲解Address域的用法之前,先介绍MAC地址相关的知识。根据IEEE 802.3[19]协议,MAC地址有如下特点。 * MAC地址可用6字节的十六进制来表示,如笔者网卡的MAC地址为1C-6F-65-8C-47-D1。 * MAC地址的组成包括两个部分。0~23位是厂商向IETF等机构申请用来标识厂商的代码,也称为“组织唯一标识符”(Organizationally Unique Identifier,OUI)。后24位是各个厂商制造的所有网卡的一个唯一编号。 * 第48位用于表示这个地址是组播地址还是单播地址。如果这一位是0,表示此MAC地址是单播地址;如果这位是1,表示此MAC地址是组播地址。例如01-XX-XX-XX-XX-XX为组播地址。另外,如果地址全为1,例如FF-FF-FF-FF-FF-FF,则为MAC广播地址。 * 第47位表示该MAC地址是全球唯一的还是本地唯一。故该位也称为G/L位。 图3-15所示为MAC地址示意图[19][20]。 :-: ![](https://box.kancloud.cn/e39143e8abae175bb4289a04b1537340_973x663.jpg) 图3-15 MAC地址格式 注意图3-15中的字节序和比特序。 * 字节序为Big-endian,即最高字节在前。所以图中的first byte实际对应的MAC地址最左边一组。以Note 2 MAC地址90-18-7C-69-88-E2为例,first byte就是“90”(如果是Little-endian,则first byte是"E2"),其OUI是SamsungE,代表三星电子。 * 比特序为Little-endian,即最低位在前。这就是01-XX-XX-XX-XX-XX为组播地址的原因了。因为“01”对应的二进制是“0000-0001”,其第0位是1,应该放在图中first byte最左边一格。 * * * * * **提示**  上面的数值按从左至右为最高位到最低位。一般情况下,字节序和比特序是一致的。但是以太网数据传输时,字节序采用Big-endian,比特序为Little-endian。参考资料[19]中原文是这样描述的。 The first bit(LSB)shall be used in the Destination Address field as an address type designation bit to identify the DA either as an individual or as agroup address.If this bit is 0,it shall be…individual address","Each octet of each address filed shall be transmitted least significant bit first。 * * * * * 802.11 MAC帧头部分共包含四个Address域,但规范中却有五种地址定义,分别如下[15]。 - BSSID:在基础型BSS中,它为AP①的地址。而在IBSS中则是一个本地唯一MAC地址。该地址由一个46位的随机数生成,并且U/M位为0,G/L位为1。另外对MAC广播地址来说,其名称为wildcard BSSID。 - 目标地址(Destination Address,DA):用来描述MAC数据包最终接收者(final recipient),可以是单播或组播地址。 - 源地址(Source Address,SA):用来描述最初发出MAC数据包的STA地址。一般情况下都是单播地址。 - 发送STA地址(Transmitter Address,TA):用于描述将MAC数据包发送到WM中的STA地址。 - 接收STA地址(Receiver Address,RA):用于描述接收MAC帧数据的。如果某个MAC帧数据接收者也是STA,那么RA和DA一样。但如果接收者不是无线工作站,而是比如以太网中的某台PC,那么DA就是该机器的MAC地址,而RA则是AP的MAC地址。这就表明该帧将先发给AP,然后由AP转发给PC。 上述无线地址中,一般只使用Address 1~Address 3三个字段,故图3-13中它们的位置排在一起。表3-4展示了Address域的用法。 :-: ![](https://box.kancloud.cn/5155c5cf29a9009f5ef3743ac90baae6_1260x221.jpg) 表3-4展示了Address域的用法。 由表3-4可知,Address 1用作接收端,Address 2用作发送端。Address 3携带其他信息用于帮助MAC帧的传输,针对不同类型,各个Address域的用法如下。 - IBSS网络中,由于不存在DS,所以Address 1指明接收者,Address 2代表发送者。Address3被设置为BSSID,其作用是:如果Address 1被设置为组播地址,那么只有位于同一个BSSID的STA才有必要接收数据。 - 基础结构型网络中,如果STA发送数据,Address 1必须是BSSID,代表AP。因为这种网络中,所有数据都必须通过AP。Address 3代表最终的接收者,一般是DS上的某个目标地址。 - 基础结构型网络中,如果数据从AP来,那么Address 1指明STA的地址,Address 2代表AP的地址,Address 3则代表DS上的某个源端地址。 - Address 4只在无线网络桥接的时候才使用。本书不讨论这种情况。 图3-16描述了基础型结构网络和无线桥接情况下不同地址的使用场景。 :-: ![](https://box.kancloud.cn/83c029a4723b80d6036a47023f3a6f98_763x565.jpg) 图3-16 地址的使用 如图3-16所示: - 数据包发往DS的情况下,SA和TA一致,而RA和BSSID一致。 - 数据包来自DS的情况下,RA和DA一致,而TA和BSSID一致。 - 无线桥接的情况下,SA、TA、RA和DA四种地址都派上了用场。 * * * * * 提示  关于Address域的作用请读者务必清楚下面三个关键点。 1)MAC帧头中包含四个Address域,在不同的情况下,每个域中包含不同的地址。原则是Address 1代表接收地址,Address 2代表发送端地址,Address 3辅助用,Address 4用于无线桥接或Mesh BSS网络中。 2)规范定义了五种类型的地址,即BSSID、RA、SA、DA和TA。每种地址有不同的含义。 3)在某些情况下,有些类型地址的值相同,如图3-16所示。 * * * * * (4)Sequence Control域 Sequence Control域长16位,前4位代表片段编号(Fragment Number),后12位为帧顺序编号(Sequence Number),域格式如图3-17所示。 :-: ![](https://box.kancloud.cn/cc2aafc2a4a16c0e2bedff0715a89e1b_864x234.jpg) 图3-17 Sequence Control域格式 - Sequence Number:STA每次发送数据帧时都会设置一个帧顺序编号。注意,控制帧没有帧顺序编号。另外,重传帧不使用新的帧顺序编号。 - Fragment Number:用于控制分片帧。如果数据量太大,则MAC层会将其分片发送。每个分片帧都有对应的分片编号。 (5)MAC帧相关知识总结 本节对MAC帧格式进行介绍。这部分内容难度并不大,但读起来肯定有些枯燥。笔者在阅读参考资料[15]时也有同样的感觉。后来笔者利用公司的AirPcap无线网络分析设备截获无线网络数据并使用wireshark软件进行分析后,感觉MAC帧信息直观多了,如图3-18所示。 :-: ![](https://box.kancloud.cn/7f00b18fa4273e8fdf511a974efd2bad_924x686.jpg) 图3-18 AirPcap使用 AirPcap设备比较贵,但该工具对于将来Wi-Fi知识的学习、工作中的难题解决相当有帮 助。 * * * * * **注意** 本书的资源共享文件中提供几个Wi-Fi数据包捕获文件,读者可直接利用它们进行分析。详情见1.3节。 * * * * * 接下来介绍常见的几种具体的MAC帧。首先从控制帧开始。 **3.控制帧[15][17]** 控制帧的作用包括协助数据帧的传递、管理无线媒介的访问等。规范中定义的控制帧有好几种,本节将介绍其中的四种,它们的帧格式如图3-19所示。由图可知,控制帧不包含数据,故其长度都不大。 :-: ![](https://box.kancloud.cn/3dd1270b6c4f94e021228b984540a3fd_844x595.jpg) 图3-19 控制帧格式 - RTS(Request To Send):根据3.3.3节关于CSMA/CA的介绍,RTS用于申请无线媒介的使用时间。值为Duration,单位为微秒。Duration的计算大致是:要发送的数据帧或管理帧所需时间+CTS帧所需时间+ACK帧所需时间+3 SIFS②时间。 - CTS(Clear To Send):也和CSMA/CA有关,用于回复RTS帧。另外它被802.11g保护机制用来避免干扰旧的STA。 - ACK:802.11中,MAC以及任何数据的传输都需要得到肯定确认。这些数据包括普通的数据传输、RTS/CTS交换之前帧以及分片帧。 - PS-POLL:该控制帧被STA用于从AP中获取因省电模式而缓存的数据。其中AID的值是STA和AP关联时,由AP赋给该STA的。 * * * * * **规范阅读提示** 1)控制帧还包括CF-End、CF-End+CF-Ack等,这部分内容请读者阅读规范8.3.1节。 2)上述帧中Duration字段的计算也是一个比较重要的知识点,读者同样可阅读规范8.3.1节以了解其细节。 * * * * * **4.管理帧[15][17]** 管理帧是802.11中非常重要的一部分。相比有线网络而言,无线网络管理的难度要大很多。MAC管理帧内容较为丰富,本节将介绍其中重要的几种管理帧,分别是Beacon(信标)帧、Association Request/Response(关联请求/回复)帧、Probe Request/Response(探测请求/回复)帧、Authentication/Deauthentication(认证/取消认证)帧。 介绍具体管理帧之前,先来看看管理帧的格式,如图3-20所示。 :-: ![](https://box.kancloud.cn/b64599787cac231ea652c74742517543_1315x212.jpg) 图3-20 管理帧格式 所有管理帧都包括MAC Header的6个域。不过,无线网络要管理的内容如此之多,这6个域肯定不能承担如此重任,所以管理帧中的Frame Body将携带具体的管理信息数据。 802.11的管理信息数据大体可分为两种类型。 - 定长字段:指长度固定的信息,规范称为Fixed Field。 - 信息元素:指长度不固定的信息。显然这类信息中一定会有一个参数用于指示最终的数据长度。 从程序员的角度来看,不同的管理信息数据就好像不同的数据类型或数据结构一样。下面我们来看看802.11为管理帧定义了哪些数据类型和数据结构。 (1)定长字段 管理帧中固定长度的字段如下。 **1)Authentication Algorithm Numb**er:该字段占2字节,代表认证过程中所使用的认证类型。其取值如下。 - 0:代表开放系统身份认证(Open System Authentication)。 - 1:代表共享密钥身份认证(Shared Key Authentication)。 - 2:代表快速BSS切换(Fast BSS Transition)。 - 3:代表SAE(Simultaneous Authentication of Equals)。用于两个STA互相认证的方法,常用于Mesh BSS网络。 - 65535:代表厂商自定义算法。 * * * * * **提示** Authentication Algorithm Number的定义是不是可以在代码中用枚举类型来表示呢? * * * * * **2)Beacon Interval field**:该字段占2字节。每隔一段时间AP就会发出Beacon信号用来宣布无线网络的存在。该信号包含了BSS参数等重要信息。所以STA必须要监听Beacon信号。Beacon Interval field字段用来表示Beacon信号之间间隔的时间,其单位为Time Units(规范中缩写为TU。注意,一个TU为1024微秒。这里采用2作为基数进行计算)。一般该字段会设置为100个TU。 **3)Capability Information(性能信息)**:该字段长2字节,一般通过Beacon帧、Probe Request和Response帧携带它。该字段用于宣告此网络具备何种功能。2字节中的每一位(共16位)都用来表示网络是否拥有某项功能。该字段的格式如图3-21所示。 :-: ![](https://box.kancloud.cn/da688f243853b08dc969110e655d4a06_1159x337.jpg) 图3-21 Capability Information格式 图3-21中几个常用的功能位如下。 - ESS/IBSS:基础结构型网络中,AP将设置ESS位为1,IBSS位为0。相反,IBSS中,STA设置ESS位为0,而IBSS位为1。Mesh BSS中,这两个位都为0。 - Privacy:如果传输过程中需要维护数据机密性(data confidentiality),则AP设置该位为1,否则为0。 - Spectrum Mgmt:如果某设备对应MIB中dot11SpectrumManagementRequired为真,则该位为1。根据802.11 MIB对dot11SpectrumManagementRequired的描述,它和前面介绍的TPC(传输功率控制)和DFS(动态频率选择)功能有关。 - Radio Measurement:如果某设备对应MIB中的dot11RadioMeasurementActivated值为真,则该位置为1,用于表示无线网络支持Radio Measurement Service。 **4)Current AP Address**:该字段长6字节,表示当前和STA关联的AP的MAC地址。其作用是便于关联和重新关联操作。 **5)Listen Interval**:该值长2字节,和省电模式有关。其作用是告知AP,STA进入PS模式后,每隔多长时间它会醒来接收Beacon帧。AP可以根据该值为STA设置对应的缓存大小,该值越长,对应的缓冲也相应较大。该值的单位是前文提到的另外一个定长字段Beacon Interval。 **6)Association ID(AID)**:该字段长2字节。STA和AP关联后,AP会为其分配一个AssociationID用于后续的管理和控制(如PS-POLL帧的使用)。不过为了和帧头中的Duration/ID匹配,其最高2位永远为1,取值范围1~2007。 **7)Reason Code**:该字段长2字节。用于通知Diassociaton、Deauthentication等操作(包括DELTS、DELBA、DLS Teardown等)失败的原因。Reason Code的详细取值情况可参考规范的8.4.1.7节的Table 8-36。此处为读者列出几个常见取值及含义,如表3-5所示。 :-: ![](https://box.kancloud.cn/12b5130575e6ba164801630ac2a63ab9_1267x352.jpg) * * * * * **注意** 规范一共定义了67个不同的Reason Code值,其详细含义请参考规范的图8-36。 * * * * * **8)Status Code**:该字段长2字节,用于反馈某次操作的处理结果。0代表成功。该字段取值的细节请读者参考规范8.4.1.9节的Table 8-37。 管理帧中定长字段还有其他几个,此处就不一一列举了。读者可参考规范8.4.1节以获取详细信息。下面我们介绍管理帧定义的不定长数据结构,即信息元素(Information Elements,IE)。 (2)信息元素 信息元素(IE)包含数据长度不固定的信息,其标准结构如图3-22所示。其中,Element ID表示不同的信息元素类型。Length表示Information字段的长度。根据Element ID的不同,Information中包含不同的信息。 :-: ![](https://box.kancloud.cn/5ebfa3c5f51fb4c1f28254fa449eb450_736x130.jpg) 图3-22 IE标准结构 表3-6列出了几种Element ID及Length的取值情况。完整的取值列表请参考规范中Table 8-54。 :-: ![](https://box.kancloud.cn/873d819788a867808b7dd936826e777d_1269x385.jpg) 表3-6 Element ID及Length的取值 注意,表3-6中最后一列的Subelements表示该项对应的Information采用如图3-23所示的格式来组织其数据。 :-: ![](https://box.kancloud.cn/8151149c9129833d82175d07d08870da_1002x143.jpg) 图3-23 Subelement格式 很显然,图3-23和图3-22所示格式完全一样,这也就是Subelement的由来。Subelement的具体内容介绍由Subelement ID来决定。 * * * * * **规范阅读提示** 规范指出IE中的Length字段代表Information的长度。但规范给出的具体IE信息表(如Table 8-54)其Length一列却是IE的全长(即Element ID字段长+Length字段+Info字段长度)。本节所列表3-5中的Length长仅取Info字段长度。故比Table 8-54中的Length长度少2字节。 * * * * * (3)常用管理帧 了解了定长字段以及信息元素后,下面介绍管理帧中几种重要类型的帧。 1)Beacon帧:非常重要,AP定时发送Beacon帧用来声明某个网络。这样,STA通过Beacon帧就知道该网络还存在。此外,Beacon帧还携带了网络的一些信息。简单来说,Beacon帧就是某个网络的心跳信息。Beacon帧能携带的信息非常多,不过并非所有信息都会包含在Beacon帧中。表3-7介绍了Beacon帧中必须包含的信息。 :-: ![](https://box.kancloud.cn/f238cfc486173af5f937ec52e6d75078_1268x330.jpg) * * * * * **提示** 如果读者手头有AirPcap工具,不妨尝试截获一下周围的Beacon帧。 * * * * * 2)Probe Request/Response帧:STA除了监听Beacon帧以了解网络信息外,还可以发送ProbeRequest帧用于搜索周围的无线网络。规范要求由送出Beacon帧的STA回复Probe Response帧,这样,在基础结构型网络中,Beacon帧只能由AP发送,故Probe Response也由AP发送。IBSS中,STA轮流发送Beacon帧,故Probe Response由最后一次发送Beacon帧的STA发送。 :-: ![](https://box.kancloud.cn/7f6ce34bbdca96f193787476081f1134_1253x307.jpg) 表3-8列出了Probe Request帧中必须包含的信息。 当AP收到Probe Request时,会响应以Probe Response帧。Probe Response帧包含的内容绝大部分和Beacon帧一样,此处就不拟详细讨论了。读者可参考规范Table 8-27获取详细信息。 * * * * * **提示** 图3-18所示为笔者利用AirPcap截获的SSID为"Test"的Probe Request帧,读者不妨回头看看此图。 * * * * * 3)Association Request/Response帧:当STA需要关联到某个AP时,将发送此帧。该帧携带的一些信息项如表3-9所示。 :-: ![](https://box.kancloud.cn/8f7b7cdc46d0ab5c15f0b7467fd8efee_1255x243.jpg) 表3-9 Association Request帧信息 请读者参考规范Table 8-22获取Association Request帧包含的全部信息项。 针对Association Request帧,AP会回复一个Association Response帧用于通知关联请求处理结果。该帧携带的信息如表3-10所示。 :-: ![](https://box.kancloud.cn/e61712e15a44620157e0e9e66693fc67_1266x230.jpg) 表3-10 Association Request帧信息 请读者参考规范Table 8-23获取Association Response帧包含的全部信息项。 4)Authentication帧:用于身份验证,其包含的信息如表3-11所示。 :-: ![](https://box.kancloud.cn/1c5a2b2c20b64659e56a03a47904a7eb_1267x306.jpg) 表3-11 Authentication帧信息 至此,我们对802.11 MAC管理帧的相关知识就介绍完毕。规范定义的管理帧类型并不多,一共15种。但管理帧携带的信息却相当复杂,其中定长字段有42种,IE有120种。此处建议读者先了解管理帧中信息的组织方式,然后对最重要的几种管理帧做简单了解。以后碰到不熟悉的情况,可直接查询802.11规范相关小节即可获取最完整的信息。 **5.数据帧[15][17]** 图3-24展示了802.11中完整的数据帧格式。 :-: ![](https://box.kancloud.cn/8e59d67be14e4be06e3f4259b423c4e2_1253x246.jpg) 图3-24 数据帧格式 其中,QoS Control和HT(High Throughput)Control字段只在QoS和HT的情况下出现。本书不讨论它们的内容。其他情况下,Frame Body最大长度为2312字节。 * * * * * **提示** 图3-24中4个Address字段的使用请参考表3-3和图3-16。 * * * * * **6.802.11上层协议封装[21]** 本节介绍802.11中如何对上层协议进行格式封装。和Ethernet不同,802.11使用LLC层来封装上层协议,如图3-25所示。 :-: ![](https://box.kancloud.cn/3644ad27fb7ba54bb07c63ac5b133c85_1221x534.jpg) 图3-25 802.11上层协议封装 图3-25中,最上层是Ethernet帧格式。前面12字节分别是目标MAC地址以及源MAC地址。Type字段可以为0x0800,代表后面的数据是IP包。 当Ethernet帧要在无线网络上传输时,必须先将其转换为LLC帧,如中间一层所示。这种转换方法由RFC 1042规定。它主要在MAC headers和Type之间增加了4个字段。它们统称为SNAPheader(Sub Network Access Protocol,子网访问协议),分别如下。 - DSAP(Destination Service Access Point,目标服务接入点)。 - SSAP(Source Service Access Point,源服务接入点)。 - Control(控制字段,值被设定为0x03,代表Unnumbered Information,即未编号信息)。 - OUI(固定为0x000000)。 LLC数据最后被封装成802.11MAC帧。主要变化是帧头信息,因为802.11 MAC帧最多能携带4个MAC地址。其他信息则作为802.11 MAC帧的数据载荷。 * * * * * **注意** 802.11除了可以用RFC 1024来封装Ethernet外,还支持802.1h的封装方法。详情见参考资料[21]。 * * * * * 笔者截获的802.11 MAC帧以及以太网帧IP包如图3-26所示。 :-: ![](https://box.kancloud.cn/faaf6d0556dce77f174e4ee5ac7ce966_866x702.jpg) 图3-26 以太网帧和802.11 MAC帧 图3-26上半部分为Ethernet的IP帧封装情况,下半部分为IP包在802.11中的封装情况。 * * * * * **注意** 图3-26中的黑框表示Radiotap头信息。它是网卡添加在802.11 MAC头部前的数据,记录了信号强度、噪声强度和传输速率等物理层信息。关于Radiotap更多信息,请读者参考http://www.radiotap.org/。 * * * * * 通过对MAC提供的服务以及MAC帧相关知识的介绍,读者会发现这部分难度主要集中在802.11 MAC帧上,尤其是管理帧包含的信息更是非常丰富。 从程序员角度看,可以认为本节为802.11定义了大量的数据结构和数据类型。从下一节开始,我们将介绍MAC层中的“类和函数”。 * * * * * **规范阅读提示** 1)本节内容主要取自规范的第8章"Frame Formats"。 2)由于篇幅问题,本书不介绍802.11 MAC层的功能。这部分内容主要集中在规范的第9章"MAC sublayer functional description"。 * * * * * ① 此条根据审稿专家的反馈意见修改。Infrastructure BSS中,BSSID一般为AP的MAC地址。 ② SIFS(Short InterFrame Space,短帧间隔)和CSMA/CA的具体实现有关,本文不讨论。