在上面的示意图里,Preamble(序言)和PLCP header是物理层驱动的使用的一些信息,而我们获取的MAC层协议帧是MPDU部分,MPDU是Mac protocal data unit的简称,即IEEE 802.11在 MAC 层的数据单元。
MPDU分为三大类:管理帧、控制帧和数据帧。通过Frame Control里的Type值,我们可以判断当前数据帧是什么类型:
管理帧(00) 这类数据帧主要用来进行身份验证,发送信号(Beacon)等。
控制帧(01) 发送RTS/CTS,ACK等一些查询和控制响应帧。
数据帧(10) 携带更高层的数据(如IP数据包,ISO7层协议)。
在这三个大类下面,又会根据subtype的不同将数据帧分为不同的类型。
由于,每种数据帧对应的数据格式是不同的(除了Frame control部分以外),所以说如果我们解析某个数据帧格式,需要根据具体的类型来判断:
管理帧(00)
管理帧根据subtype的不同,又分为如下类型:
subtype | 描述 |
---|---|
0000 | Association request (关联请求) |
0001 | Association response (关联响应) |
0010 | Reassociation request(重关联请求) |
0011 | Reassociation response(重关联响应) |
1010 | Disassociation(解除关联) |
0100 | Probe request(探测请求) |
0101 | Probe response(探测响应) |
1000 | Beacon(信标,由AP发出,告知BSS的存在) |
1001 | ATIM(通知传输指示消息) |
1011 | Authentication(身份验证) |
1100 | Deauthentication(解除认证) |
1101~1111 | Reserved(保留,未使用) |
Beacon帧格式:
Probe Request帧:
Probe Response帧:
ATIM帧:
Disassociation与Deauthentication帧:
Association Request帧:
Reassociation Request帧:
Authentication帧:
控制帧(01)
Subtype值 | 描述 |
---|---|
1010 | Power Save- Poll(省电-轮询,由休眠的AP定时发送) |
1011 | RTS(Request To Send,请求发送,预约信道,帧长20字节) |
1100 | CTS(Clear To Send,清除发送,收到RTS后,如果同意预约,就通过CTS告知其他人在一定时间内暂停向自己发送数据,避免冲突,帧长14字节) |
1101 | ACK(确认收到的数据帧,如果收到的数据帧校验出错,则不发送ACK,等待重传。) |
1110 | CF-End(无竞争周期结束,让STA脱离协调模式,开始基于竞争模式。) |
1111 | CF-End+CF-ACK(无竞争周期结束+无竞争周期确认) |
RTS帧:
CTS帧:
ACK帧:
PS-Poll:
数据帧(10)
Subtype值 | 描述 |
---|---|
0000 | Data(传输数据) |
0001 | Data+CF-ACK |
0010 | Data+CF-Poll |
0011 | Data+CF-ACK+CF-Poll |
0100 | Null(无数据的空帧) |
0101 | CF-ACK(无竞争周期的确认,用于确认之前所收到的帧) |
0110 | CF-Poll(无竞争周期的轮询,用于通知已经没有数据要传输) |
0111 | Data+CF-ACK+CF-Poll |
1000 | Qos Data |
1001 | Qos Data + CF-ACK |
1010 | Qos Data + CF-Poll |
1011 | Qos Data + CF-ACK+ CF-Poll |
1100 | QoS Null(未传送数据) |
1101 | QoS CF-ACK(未传送数据) |
1110 | QoS CF-Poll(未传送数据) |
1111 | QoS CF-ACK+ CF-Poll(未传送数据) |
IBSS帧:
由接入点发出的数据帧格式(From AP):
发送至接入点的数据帧格式(To AP):
WDS数据帧:
RadioTap
当无线网络接口处于monitor模式时,内核会生成一个名为RadioTap的数据添加在IEEE802.11数据帧(MPDU)的前面,该Radiotap记录了热点的信息,如信号强度、MPDU帧信息等信息。意思就是在正常的IEEE802.11数据帧前面,内核又额外给你加了一块RadioTap类型的数据,这块数据记录了一些无线网的属性。
---------------------|--Header--|--Data--|---------------------
RadioTap的结构包括Header和Data两部分,首先看一眼Header:
struct ieee80211_radiotap_header { u_int8_t it_version; /* set to 0 */ u_int8_t it_pad; u_int16_t it_len; /* entire length */ u_int32_t it_present; /* fields present */ } __attribute__((__packed__));
it_version 是一个8位的版本号,值始终为0,it_pad未使用,只作字段对齐用,it_len 是整个Radiotap的长度,如果你不关心Radiotap里具体包含哪些信息,可以通过这个值跳过解析Radiotap的解析。it_present 是Data数据的掩码,标识哪些数据出现在接下来的Data里。
在这里面,it_present是最有趣的一个值,它总共有32位,里面的每一位都代表一种数据有没有出现在接下来的Data里。什么意思呢,我们知道每一位的值无非就是0和1两个值,如果该位是1则表示该位代表的数据在RadioTap里的Data部分携带了,并且每一位对应什么值都可以在这里(http://www.radiotap.org/defined-fields)查到,例如是它的size多大或是它代表了啥含义。
it_present代表的数据出场顺序与这32个掩码的位置是依次相关的。也就是第一位携带的数据如果有,永远是靠在最前的,其他的依次排列。通常it_present的最后一位Ext为0,此时Data紧随it_present之后出现。如果Ext为1,表明开发者增加了it_present字段,每个增加的it_present大小都是标准的32位,直到最后一个Ext为0的it_present出现时,Data才会紧接着出现。除Ext之外Present中倒数第2、3位是设备厂商的保留位,不能作为Data掩码使用。
.... .... .... .... .... .... .... ...1 = TSFT : True .... .... .... .... .... .... .... ..1. = Flags: True .... .... .... .... .... .... .... .1.. = Rate : True .... .... .... .... .... .... .... 1... = Channel : True .... .... .... .... .... .... ...0 .... = FHSS : False .... .... .... .... .... .... ..1. .... = Antenna signal : False .... .... .... .... .... .... .0.. .... = Antenna noise : False .... .... .... .... .... .... 0... .... = Lock quality : False .... .... .... .... .... ...0 .... .... = TX attenuation : False .... .... .... .... .... ..0. .... .... = dB TX attenuation : False .... .... .... .... .... .0.. .... .... = dBm TX power : False .... .... .... .... .... 1... .... .... = Antenna : True .... .... .... .... ...0 .... .... .... = dB antenna signal : False .... .... .... .... ..0. .... .... .... = dB antenna noise : False .... .... .... .... .1.. .... .... .... = RX flags : False .... .... .... .... 0... .... .... .... = MCS : False .... .... .... ...0 .... .... .... .... = A-MPDU status : False .... .... .... ..0. .... .... .... .... = VHT : False .... .... .... .0.. .... .... .... .... = ... 0... .... .... .... .... .... .... .... = Ext:False
掩码对应信息:
位置编码 | 大小 | 名称 | 描述 |
---|---|---|---|
0 | 8byte | TSFT | 只对接收帧有效,表示MPDU第一个bit到达MAC时的时间,单位是微秒 |
1 | 1byte | Flags | 发送或接收帧属性,包括一些有用信息,比如FCS是否符合 |
2 | 1byte | Rate | 传输或接收速率,单位500kbs |
3 | 2byte | Channel | 发送接收信号的频率,单位是MHz |
4 | 1byte | FHSS | 跳频技术,是无线通讯最常用的扩频方式之一 |
5 | 1byte | Antenna signal | 天线的射频信号强度,单位是dBm |
6 | 1byte | Antenna noise | 天线的射频噪声强度,单位是dBm; |
7 | 2byte | Lock quality | 信号质量 |
8 | 2byte | TX attenuation | 与出厂标准最大功率相比的功率衰减,0为最大功率 |
9 | 2byte | dB TX attenuation | 与出厂标准最大功率相比的功率衰减dB值,0为最大功率 |
10 | 1byte | dBm TX power | 传输功率的dBm值,这是在天线端口测量的功率绝对值 |
11 | 1byte | Antenna | 发送或接收该帧的天线索引编号(硬件编号从0开始); |
12 | 1byte | dB antenna signal | 天线的射频信号的相对功率强度dB值; |
13 | 1byte | dB antenna noise | 天线的射频噪音的相对功率强度dB值; |