p2p 设备角色
go 为 group owner,类似 ap 的功能,控制 p2p 组,每个 group 只有一个 go
gc 是 client,为连接 go 的设备,是组成员
P2P 扫描
p2p discovery 利用 probe request 和 probe response 帧来搜索周围的 p2p 设备,probe request 必须包含 p2p 的 ie。
device discovery 定义了两个阶段和两个状态
1.Scan Phase:扫描阶段,P2P device 会在各个频段发送 probe request(主动扫描),p2p device 在进行该扫描的时候不会处理来自其他设备的 probe request 帧,这一阶段后,p2p device 会进入 下一阶段(Find Phase)
2.Find Phase:找寻阶段,在这个阶段,p2p device 将会在 search state 和 Listen State 之间来回切换。Search State 中,P2P Device 将发送 Probe Request 帧,而 Listen State 中,它将接收其他设备的 Probe Request 帧并回复 Probe Response
search state:此状态下,P2P Device 将在 2.4GHZ 的 1/6/11 频段上分别发送 Probe Request 帧。为了与非 p2p 的 probe request 进行区分,p2p 的 probe request 帧会包含 p2p 的 ie,表示这是一个 p2p 的探测帧
listen state:p2p device 将随机选择在 1/6/11 频段中的一个频段来监听 probe request 帧,选定的信道成为 listen channel,整个 discovery 阶段都不会更改,listen 状态的持续时间 是 100TU 的随机整数倍(默认在 1 到 3 之间,厂商可以修改),随机是为了避免两个设备同时进入 listen 和 search 导致始终无法发现对方
Group Formation
设备发现后就可以进行 组协商了,主要作用是决定哪个设备当 GO,整个协商过程包括三次握手
Group Owner Intent 属性(成为 go 的渴望程度,最大值 为 15,15 表示该设备一定要成为 go)大的一方会成为 go,若相等的话,tie breaker bit 是 1 的成为 GO,若都是 15 则协商失败
第一次握手:设备 A 向设备 B 发送 GO Negotiation Request(包含了 Intent 属性值和 breaker 属性值),B 在收到后进行比较,此时 B 可以确定自己本次 P2P 连接时的角色了
第二次握手:设备 B 向 A 发送一个 GO Negotiation Response 帧,该帧包含了 B 的 Intent 属性值和 breaker 属性值,B 的 breaker 属性值为第一次握手时 A 的 breaker 属性值取反,因此不可能相同
第三次握手:设备 A 向 B 发送一个 GO Negotiation Comfirmation 帧,该 Confirmation 的作用之一时作为协商的确认,同时确定了后面 P2P 连接所使用的信道
在 Go 协商时设备 A 向设备 B 发送 GO Negotiation Request,如果 B 没有准备好的话,这时候 B 会先保存下 A 的协商信息,然后发送一个 GO Negotiation Response (包含 B 的协商信息)给 A,B 把状态设置为 P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE,表示当前 P2P 连接不可用,A 在收到该 response 之后,保存 B 的协商信息,切换到 Listen state,等待 B 的 P2P 连接初始化完成,并等待 B 发送GO Negotiation Request,这种情况下第一次协商没有确定任何东西,第二次协商才是正常流程
wps 流程
协商一个公共的 key,wps 流程结束后 ,gc 会自动断开和 go 的关联,然后重新发起连接,再次关联完成后可以进行四路握手
四路握手
以前面的公共 key 作为参数协商处 PTK 和 GTK,之后进行加密数据传输