802.11协议栈帧结构
- 首先选择合适的无线网卡
- 了解基本操作
- 学习协议栈帧结构
- 实际抓包查看
命令
查看配置
iw list
查看无线网卡的配置信息iwlist wlan0 frequency
查看支持的频段
扫描附近AP
iw dev wlan0 scan
iw dev wlan0 scan|egrep "DS\ Parameter\ set|SSID"
iwlist wlan0 scannign|grep"ESSID|Channel"
添加删除侦听端口
iw dev wlan0 interface add wlan0mon type monitor
iw dev wlan0mon interface del
RADIOTAP头
- 802.11帧发射和接收的事实标准,802.11依赖Radiotap完成通信过程
- Linux系统在驱动和API中内建支持Radiotap
- 802.11帧发射之前,网卡驱动在802.11头前添加Radiotap头,反之当网卡接收无线帧时,驱动通知MAC层,此帧头包含Radiotap头
- Radiotap为802.11帧传递额外信息,厂家可以自定义,因此头长度不固定
802.11帧结构
- DU(Data Unit)数据单元,信息传输的最小数据集合
- SDU(Service Data Unit)/PDU(Protocol Data Unit)
字段
帧控制
- Protocol Version(2bit) :802.11协议版本,始终为0,1,2,3
- Type(2bit):规定帧的具体用途(3种类型):
Type | Mean |
---|---|
00 | 管理帧 |
01 | 控制帧 |
10 | 数据帧 |
11 | 保留 |
- SubType(4bit)
Subtype | Mean | Type |
---|---|---|
0000 | Association request(连接请求) | 00 |
0001 | Association response(连接应答) | 00 |
0010 | Reassociation request(重新连接请求) | 00 |
0011 | Reassociation response(重新连接应答) | 00 |
0100 | Probe request(探查请求) | 00 |
0101 | Probe response(探查应答) | 00 |
1000 | Beacon(导引信号) | 00 |
1001 | Announcement traffic indication message (ATIM)(数据代传指示通知信号) | 00 |
1010 | Disassociation(解除连接) | 00 |
1011 | Authentication(身份验证) | 00 |
1100 | Deauthentication(解除认证) | 00 |
Subtype | Mean | Type |
0000-0110 保留 | ||
0111 | Control Wrapper | |
1000 | Block Ack Request(BlockAckReq) | |
1001 | Block Ack (BlockAck) | |
1010 | PS-Poll | |
1011 | RTS(请求发送) | 01 |
1100 | CTS(允许发送) | 01 |
1101 | ACK(应答) | 01 |
1110 | CF-End(免竞争期间结束) | 01 |
1111 | CF-End(免竞争期间结束)+CF-Ack(免竞争期间回应) | 01 |
Subtype | Mean | Type |
0000 | Data(数据) | 10 |
0001 | Data+CF-Ack | 10 |
0010 | Data+CF-Poll | 10 |
0011 | Data+CF-Ack+CF-Poll | 10 |
0100 | Null data (无数据:未发送数据) | 10 |
0101 | CF-Ack (未发送数据) | 10 |
0110 | CF-Poll (未发送数据) | 10 |
0111 | Data+CF-Ack+CF-Poll | 10 |
1000 | QoS Data | 10 |
1001 | QoS Data + CF-Ack | 10 |
1010 | QoS Data + CF-Poll | 10 |
1011 | QoS Data + CF-Ack + CF-Pol | 10 |
1100 | QoS Null (未发送数据) | 10 |
1101 | QoS CF-Ack (未发送数据) | 10 |
1110 | QoS CF-Poll (未发送数据) | 10 |
1111 | QoS CF-Ack+CF-Poll (未发送数据) | 10 |
To DS/From DS(1/1 bit)
- 0x00:出现在IBSS环境中(可能是Management帧或者是Control帧类型);或者是STSL(Station to Station Link)中两个STA之间通信,这种情况下不通过AP
- 0x01:表示data从AP向STA传递
- 0x02:表示data从STA向AP传递
- 0x03:表示两个AP间通信,这是典型的WDS环境下AP间的通信;或者表示Mesh环境下MP间的通信,只有此时才会使用到Address4字段。
More frag(1bit):表示是否还有后续帧
- 值为1时表示有后续分段,可能是data或者management帧类型。只有单播接收地址的帧会被分段,广播的直接发送。
retry(1bit):重传
- 值为1表示重传帧,可能是data或者management帧类型,接收端进程使用此值防止帧重复;
PowerMgmt(1bit):活动模式(0)/省电模式(1)
- STA处于省电模式时,向关联的AP发送该值为1的帧(AP从不使用此字段),省电模式下STA不接受数据,发送给它的Data帧由AP暂时缓存。
MoreData(1bit)
- 当AP至少缓存了一个MSDU时,会向省电模式的STA发送该值为1的帧,表示有数据要传输给STA,接收到此帧的STA唤醒自己,并向AP发送PS-Poll帧,取回由AP为其缓存的数据。也被用于AP有更多的广播/多播帧需要发送的情况;
Protected Frame(bit)
- 可能是data或者management帧类型,表示MSDU是否被加密,也被用于表示psk身份验证Frame#3帧;数据载荷为空时,该字段值为0;
Order(1bit)
- 在非Qos帧的情况下,值为1表示数据必须严格按顺序处理,通常为0
Duration/ID
- 所有Control帧都使用该字段,其作用随Type/SubType变化有所不同
- 帧类型为PS Poll(type:1,subtype:10)时,表示STA关联的AID(association identity,在sta连上ap时,由ap发送给sta);
- 其它情况下,该字段作为一种载波侦听机制,表示接收下一帧之前需要保持的时间间隔,用于(Network Allocation Vector)计算,单位是微秒;
MAC Layer Address
- Basic service set ID(BSSID);它是BSS的2层唯一标识,Infrastructure模式中BSSID就是AP的MAC地址,当AP支持多BSS时,随机生成每个BSSID。
Sequence Control(16bit)
- 这个字段包含两个子字段:Sequence Number和Fragment Number;
- Sequence Number是每个帧的编号,数值范围是0-4095,当帧被分段时,同帧不同分段的sequenceNumber相同。
- FragmentNumber是被分段的帧用于标识分段位置顺序的编号,数值范围是0-15,以1为步长递增。
Frame Body(变长)
- 数据字段,未加密的最大MSDU长度为2304字节(其中包含最大256字节的上层头信息,和可被传递的 数据2048字节)。不同的加密方法会增加一定的内容长度。
- WEP:+8bytes->2312bytes
- TKIP(WPA1):+20bytes->2324bytes
- CCMP(WPA2):+16bytes->2320bytes
FCS(32bit)
- 发送端对全部MAC包头和FrameBody内容进行CRC计算,计算结果即为FCS(FrameCheckSequence)值,接收端进行同样的计算,结果一致时,则接收端向发送端返回ACK,否则丢弃帧(只对单播帧有效,FCS错误的广播/多播帧可能被接收)
- 注:wireshark抓包时已经删除了FCS值
控制帧实例
ACK
- 接收端正确接收数据后向发送端返回ACK确认
- 每个单播帧需要立即确认
- 组播和广播帧不需要确认、
- 尽快响应
- 由硬件完成,而非驱动层
- Type/Subtype:1/13
PS-POLL
- AID——Association ID
- STA省电模式唤醒
- 数据发送至AP(AP缓存数据包)
- 通过Beacon发送TIM(traffic indication map)
- 其中包含AID
- STA对比AID后唤醒网卡
- STA发送PS-Poll帧,请求从AP缓存中取回数据
- 每个帧都需要ACK确认
- ACK确认后AP从缓存中删除数据帧
- 传输过程中STA保持唤醒状态,传输结束后STA恢复省电状态
- Type/Subtype:1/10
RTS/CTS
RTS/CTS是CSMA/CA方法的一种补充手段
降低冲突产生的可能性
正式通信之前通过请求应答机制,确信通信介质的可用性
锁定传输介质,预约通信时间
只有在传输长帧时使用,传输短帧时不会使用
- 驱动接口提供长帧阈值的自定义
A —-RTS—->B
A<—-CTS—-B
A—-Data—->B
A<—-ACK—-B
A—-Data—->B
A<—-ACK—-B
……
管理帧实例
- 管理帧用于协商和控制STA与AP之间的关系
Beacon Frame
- AP发送的广播帧,通告无线网络的存在(BSSID)
- 发包频率
- 102.4ms(可变)
- 单位时间1024microsecond()
- SSID网络名
- 隐藏AP不发SSID广播
Probe Request Frames
- 用于STA扫描现有AP
- 发现连接过的AP
- 发现未连接的AP
Probe Response Frames
- 发现连接过的AP时,速率和ESSID相同的AP会响应。
Authentication Frames
- Authentication Algorithm身份认证类型
- 0:开放系统身份验证
- 1:共享密钥身份验证
- 身份认证有多个帧交换过程组成
- Authentication Seq
- 每次身份验证过程Seq唯一
- 1-65535
- Challenge text
- 只用共享密钥方式才有此字段
- Status Code:成功/失败
Association/Reassociation Freames
- 身份验证后,STA执行关联操作,加入无线网络
Disassociation/Deauthentication
- 由AP发出,2字节
ATIM Frames
- 只在ad-hoc网络下使用
- STA使用此帧通知接收者其有缓存的数据要发送
数据帧
- 传输用户数据
- DATA Frame
- 空数据帧
- Null data frame
- 只包含MAC头和FCS
- STA用空数据帧声明自己要进入省电模式
连接到无线网络的过程
- Probe
- STA向所有信道发出probe帧,发现AP
- AP应答Response
- Authentication
- STA向AP发出验证请求
- 发生认证过程
- AP响应STA认证结果
- Association
- STA发出关联请求
- AP响应
- 开始通信
WEP PSK认证过程
- STA发认证请求
- AP返回随机Challenge消息
- STA使用PSK加密Cha并发回给AP
- AP使用PSK解密,获得Cha并与原始Cha对比,相同则验证成功,不同则失败。
- 大部分无线驱动首先尝试open验证,如果失败则尝试PSK
- 无论使用什么加密架构,关联过程完全相同
- STA向AP发送关联请求
- AP向STA发送关联成功或者失败结果
- 隐藏AP
- STA关联包中必须包含目标AP的ESSID
- 嗅探到此关联包,说明有隐藏AP存在
加密
- 无线安全根源
- 802.11基于无线电波发射信息
- 嗅探侦听是主要问题
- 加密机制是必须的手段
- Wired Equivalent Privacy(WEP)
- 802.11标准的一部分
- 发布不久后被发现存在安全漏洞
- WiFi Protected Access(WPA)取代WEP
- WPA2(802.11i标准)
参考
- 协议栈:https://www.kernel.org/doc/htmldocs/80211/index.html
- 无线驱动:https://wireless.wiki.kernel.org/
- 《802.11权威书》