转载自 https://blog.csdn.net/gh201030460222/article/details/79872617
Wi-Fi Peer-to-Peer(简写为P2P):P2P的商品名(brand name)为Wi-Fi Direct。它可以支持多个Wi-Fi设备在没有AP的情况下相互连接。主要应用为miracast:即在家庭中,用户可直接把手机上的内容通过P2P技术传输到电视机上和家人分享
1、 支持802.11g及以上规范:为了保证一定的传输速率,P2P要求P2P Device必须支持802.11g及以上的规范。其中,安全部分必须支持WPA2
2、WMM: Wi-Fi Multimedia的缩写,它是一种源自802.11e的QoS服务,主要针对实时视音频数据的传输。主要的应用场景就是设备之间共享媒体数据(例如前面提到的Miracast应用场景)
3、 WSC: Wi-Fi Simple Configuration,P2P Client关联到GO之前,需要先通过WSC来协商安全信息,所以WSC也是P2P的依赖技术项
4、除了以上之外,还有p2p本身的P2P Discovery、P2P Group Operation、P2P PowerManagerment以及Managed P2P Device Operation。
1)P2P Discovery是P2P所特有的,用于扫描p2p设备并进行go协商
2)P2P PowerManagement和P2P设备的电源管理有关,用于节省不必要的电力损耗
3)P2P Group Operation讲得是GO如何管理一个Group,也就是GO的工作职责
4)Managed P2P Device Operation,定义了如何在企业级环境中由对应的IT部门来统一配置和管理P2P设备
p2p组件,也有人称这是p2p架构,但感觉还是称之为组件更加合适点
一个P2P Group中只能有一个GO。而一个GO可以支持1个或多个Clients连接
由于GO的功能类似于AP,所以周围那些不支持P2P功能的STA也能发现并关联到GO。这些STA被称之为Legacy Clients
P2P Client:指支持p2p协议的设备
Legacy client: 不支持P2P功能,指不能处理P2P协议。在P2P网络中,GO等同于AP,所以Legacy Clients也能搜索到GO并关联上它。不过,由于Legacy Clients不能处理P2P协议,所以P2P一些特有功能在这些Legacy Clients中无法实现
P2P Device Discovery的工作流程包含两个状态和两个阶段
两个状态:
Search State:在该状态中,P2P Device将在2.4GHz的1,6,11频段上分别发送Probe Request帧。这几个频段被称为Social Channels。为了区别非P2P的Probe Request帧,P2P Device Discovery要求必须在Probe Request帧中包含P2P IE。注意,只有当两个设备处于同一频段时,一方发送的帧才能被对方接收到
Listen State:在该状态下,P2P Device将随机选择在1,6,11频段中的一个频段(被选中的频段被称为Listen Channel)监听Probe Request帧并回复Probe Response帧。值得指出的是,Listen Channel一旦选择好后,在整个P2P Discovery阶段就不能更改。另外,在这个阶段中,P2P Device只处理那些包含了P2P IE信息的Probe Request帧。
两个阶段:
Scan Phase:扫描阶段。跟无线网络扫描一样,P2P Device会在各个频段上发送Probe Request帧(主动扫描)。P2P Device在这一阶段中不会处理来自其他设备的Probe Request帧。这一阶段过后,P2P Device将进入下一个阶段,即Find Phase。
Find Phase:虽然从中文翻译来看,Scan和Find意思比较接近,但P2P的Find Phase却和Scan Phase大不相同。在这一阶段中,P2P Device将在Search State和Listen State之间来回切换。Search State中,P2P Device将发送Probe Request帧,而Listen State中,它将接收其他设备的Probe Request帧并回复Probe Response帧。
流程图如下:
P2p inviation阶段,及p2p go negotiation都是在同一个listen channel内完成的,所发的
也都是Action frame。Inviation后,response frame回应还没有建立group,于是接下来就
进行go的协商,并建立一个group
GO Negotiation: 在这一阶段中, 两个Device要协商好由谁来做GO
GO协商共包含三个类型的Action帧:GO Req、GO Resp、GO Confirm
GO Req和GO Resp包含GO Intent的IE,是一个0到15的整数值,通过这两个值的大小来确定GO,具体方法如下图。如果Intent不相等时,谁大谁做GO;如果相等时且小于15时,根据GO Req的随机数Tie Breaker来决定,Tie Break为1就自己做GO,否则对方做GO;如果相等且等于15,GO协商失败,这种情况说明A和B都必须成为GO,谁也不能妥协,那么只能以失败告终
交互过程如下:
封包情况如下:
Group形成后,GO就会向外发生Beacon Frame并携带group formation=1
当Client获取到GO端的beacon包的,那么它会解析beacon包中的是否有WSC IE,如果 通过判断符合接入条件的时候, Client会尝试去和GO进行认证,向GO发送Auth包,GO接收到后,也回应一个status成功Auth
本来应该是, 的,但一直抓取不到EAPOL-Start的包……
Assoc rsp后,Client要发EAPOL-Start来启动EAPOL-WSC流程,在Client和GO双方开展EAP-WSC流程前,GO需要确定Client的Identity以及使用的身份验证算法。
该过程涉及三次EAP包交换:
1) GO发送EAP-Request/Identity以确定Client的ID。
2) 对于打算使用WSC认证方法的Client来说,它需要在回复的EAP-Response/Identity包中设置Identity为”WFA-SimpleConfig-Enrollee-1-0“
3) GO确定Client的Identity为“WFA-SimpleConfig-Enrollee-1-0”后,将发送EAP-Request/WSC_Start包以启动EAP-WSC认证流程。(即接下来的WSC)
Wi-Fi Simple Configuration(以后简写为WSC):该项技术用于简化办公室环境中无线网络的配置和使用。举一个简单的例子,配置无线网络环境时,网管需要首先为AP设置SSID、安全属性(如身份认证方法、加密方法等)。然后还得把SSID、密码告诉给该无线网络的使用者。可是这些安全设置信息对普通大众而言还是有些复杂。而有了WSC之后,用户只需输入PIN码(Personal Identification Number,一串数字),或者摁一下专门的按钮(WSC中,该按钮被称为Push Button)甚至用户只要拿着支持NFC的手机到目标AP(它必须也支持NFC)旁刷一下,这些安全设置就能被自动配置好。有了这些信息,手机就能连接上目标无线网络了。显然,相比让用户记住SSID、密码等信息,WSC要简单多了主要包括
两种快速接入的方法:
1) PIN (personal identifiy number)
2) PBC (push button configuration)
WSC规范早期的名字叫Wi-Fi Protected Setup(简写为WPS,就目前抓取包信息中还是使用WPS命名方式)。WFA推出WPA后不久,WPS规范便被推出。随着WPA2的出现,WFA又制订了WPS的升级版,即WSC
- Enrollee的角色类似于supplicant,它向Registrar发起注册请求。
- Registrar用于检查Enrollee的合法性。另外,Registrar还能对AP进行配置。
- AP也需要注册到Registar中。所以,从Registrar角度来看,AP也是Enrollee。
AP和Registrar以及Enrollee三者交互,Enrollee从Registrar那获取AP的安全配置信息,然后Enrollee利用该信息加入AP提供的无线网络
1)日常生活中,支持WSC的无线路由器兼具AP和Registrar的功能。这种AP在规范中被称为Standalone AP。Android智能手机扮演Enrollee的角色。
2)如果AP和Registrar分别由不同实体来实现,这种Registrar也被称为External Registrar
EAP-WSC流程:
1 EAPOL-Start
2 identity
1 WSC_Start
8 M1-M8
1 WSC_Done
1 EAP-Failure
共14次交互
封包如下:
GO确定Client的Identity为”WFA-SimpleConfig-Enrollee-1-0”后,将发送EAP-Request/WSC_Start包以启动EAP-WSC认证流程。这个流程将涉及M1~M8相关的知识
1)M1-M7,主要进行安全信息的交互。
2)最终在Client接收到的M8中,Client将会获取到GO的安全设置信息。Client获取到这些信息以后,一般会保存起来并修改到p2p_supplicant.conf 文件中,后面Client就可以用这个配置文件正常的连接GO了
3)Client处理完M8消息后,将回复WSC_DONE消息给GO,表示自己已经成功处理M8消息
4)GO发送EAP Failure以及Deauthentication帧给Client。Client收到该帧后将取消和AP的关联
5)GO将继续发送Beacon Frame,此时携带group formation为0了。Client将重新扫描周围的网络。由于Client已经获取了GO的配置信息,所以它可以利用这些信息加入GO所在的网络
6)接下来就是Client跟GO进行认证及4次握手连接的过程了。这个跟wifi的WPA2连接过程一样
第一次握手AP–>STA,PMK已经预设好了,这个AP时候发送一个随机产生的ANonce数。
第二次握手STA–>AP,STA根据接收到的随机数ANonce,自己也生成一个随机数BNonce,以及PMK,经过一系列算法AES,产生了PTK了,MIC是PTK的其中一部分。然后把BNonce加PTK的MIC发给AP
第三次握手,AP接收到BNonce后,使用相同的方法生成PTK,并取出其中的MIC密钥对第二次握手包进行较验,如果相同,那么AP知道这个时候STA拥一个跟它一样的PMK。这个时候AP有了PTK后就可以对它第一次握手生成的EAP包进行检验生成一个MIC序列号,并发送给STA
第四次握手,STA接收到这个包后,同样执行跟AP的检验操作以确认AP拥有跟自己一样的PMK。然后发送ACK说明自己确实安装PMK,连接已经成功了。接下来系统可以进行DHCP的操作了
PSK(Pre-Shared Key, 预共享密钥): 口令(passphrase)经PSK映射转换算法处理后得到的结果。
PMK(Pairwise Master Key, 成对主密钥): 最高等级的密钥,由PSK生成。
GMK(Group Master Key, 组主密钥): 由认证器(接入点)生成,是组临时密钥 (GTK)的种子。
4次握手: 使用伪随机函数来创建和分发动态加密密钥的过程。
Nonce: 一个随机生成的值,只使用一次。
PTK(Pairwise Transient Key, 成对临时密钥): 最终用于加密单播数据流的加密密钥。
GTK (Group Temporal Key, 组临时密钥):最终用于加密广播和组播数据流的加密密钥。
1,用三台机器,分别抓取1,6,11 channel的包,同时查看action frame,即可得知两台设备相互扫,并决定谁来当GO的过程(虽然一台机也可以,但很容易抓丢)
2,p2p的连接过程,这个得先知道通过go协商后,决定用哪个channel来当operation channel,即可抓取。可用来查询Auth、Assoc、WSC的交互过程、EAPOL-Key交互及DHCP过程
使用Notepad++软件使用正则表达式进行搜索下面的字符A如下:
Building Message|WPS-CRED-RECEIVED|CTRL-EVENT-EAP-METHOD|CTRL-EVENT-EAP-PROPOSED-METHOD|CTRL-EVENT-EAP-STARTED|Associated with|ASSOCIATING|NL80211_CMD_CONNECT|Add interface|P2P-GO-NEG|P2P-DEVICE-FOUND|P2P-PROV|GO Negotiation Response|Create a new interface|Request to start group negotiation|Prepare channel|operating channel|GO Negotiation Request|GO Negotiation Request|GO Negotiation Response|GO Negotiation Confirm|GO_NEG|P2P_CLIENT|Added interface|WPS IE for Probe Request|scan request|SCAN_RESULTS|Add new id|priority group|selected based on WPS IE|Request association with|Trying to associate with|Association Request|Connect request send successfully|ASSOCIATED|RX EAPOL from|AUTHENTICATING|SUPP_BE|EAP entering state|WPS-SUCCESS|WPS-CRED-RECEIVED|WPS-CRED-RECEIVED|P2P-GROUP-FORMATION|PROVISIONING|EAP-Failure|unauthorized|CTRL-EVENT-DISCONNECTED|Tear down peers|AP-STA-CONNECTED|Invitation Request|Invitation from|Use peer preference op_class|No forced channel from invitation processing|Using original operating class and channel|Invitation Response|dnsmasq|go_intent|4WAY_HANDSHAKE|GROUP_HANDSHAKE|CTRL-EVENT-CONNECTED|P2P-GROUP-STARTED|P2P-GROUP-STARTED|Sending discover|WPS-PBC-ACTIVE|CTRL-EVENT-DISCONNECTED|EAP-Failure|CTRL-EVENT-EAP-FAILURE|Auto connect enabled|rtsp read more fail|Connection reset by peer|miracast disconnected|P2P_GO_NEGOTIATION_FAILURE_EVENT|P2P-GROUP-FORMATION-FAILURE
如果使用logcat,可以直接使用logcat -v time|grep -E “A” (ps:把A替换成上面的字符串即可)
应用场景
1) wifi direct和蓝牙都是p2p直连。
BT的主要应用场景是蓝牙耳机,传文件和连接周围的可穿戴设备(ble低功耗)
wifi direct的主要场景是wifi display(重要方向)和传文件。对于传文件这一重叠场景。
2)BT的优势是上层应用成熟,实现是集成在android系统里,所有设备互通。弱点是太慢,只适合传小文件。wifi direct传文件优点是速度快,但是缺少统一的上层协议支持,所以现在市面上很多app都支持wifi快传,但是必须两个设备都安装了同一个app,否则不兼容。
功耗(目前来说最为硬商的事情)
1)蓝牙技术联盟表示,在蓝牙4.0低功耗的支持下,即使由一个纽扣电池供电,使用时间也可以长达一年,甚至更长(低数据传输)
2)根据Wi-Fi Direct白皮书,该标准的部分能源管理功能以Wi-Fi Power Save和WMM-PowerSave规范为基础,这些规范采用了被称为P2P-PS和P2P-WMM-PowerSave的机制。P2P规范引入了两种全新的节能机制:机会节能与缺席通知。这些机制可结合使用,以实现休眠时间的最大化。缺席通知机制可以通报计划中的缺席(包括一次性或定期性缺席);当连接的所有Wi-FiDirect设备进入休眠时,机会节能机制能够帮助负责管理小组的Wi-FiDirect设备也进入休眠状态,从而节约能源。需要注意的是,同蓝牙4.0有些相似,Wi-Fi Direct“能源管理机制只用于仅包括Wi-FiDirect设备的小组。如果小组中存在传统设备,则不能使用能源管理功能。”
传输速度
自从蓝牙3.0引入了WLAN,其传输速度提升了8倍到25Mbps,而据称蓝牙4.0会和3.0拥有同样的速度。”Wi-Fi联盟承诺Wi-Fi Direct的速度可达250Mbps
传输距离
1)据wi-fi联盟声称,Wifi Direct设备彼此间联系最大距离可达656英尺(200米)
2)蓝牙特别兴趣小组表示,蓝牙4.0最大距离不取决于规范,而取决于设备的功能。传输距离至少200英尺(61米)
安全性
1)wifi direct使用AES 256位加密技术
2)BT4.0使用AES 128位加密技术