Wi-Fi Direct協議詳解

理論上,Wi-Fi Direct屬於純軟件協議,也就是說不需要額外的硬件支持,只要支持802.11g、n或者ac的設備都可以實現Wi-Fi Direct的基本功能。但一些高級功能,比如Wi-Fi Direct電源管理需要非常精細的定時管理和狀態切換,Concurrent模式需要對多個源MAC地址進行高效的過濾,這些都靠軟件實現會比較費勁。所以不要太指望老設備通過軟件升級來實現Wi-Fi Direct,就算能實現也是效率低下或者功能殘缺。

基本概念

  • Wi-Fi Peer-to-Peer:簡稱P2P,Wi-Fi Direct別名
  • P2P Device:支持P2P的設備,在組協商完成之前都叫P2P Device
  • P2P Group Owner:簡稱GO,組協商成爲SoftAP的P2P Device稱爲P2P GO
  • P2P Group Client:簡稱GC,組協商成爲Station的P2P Device稱爲P2P GC

流程圖

首先,來看一下Wi-Fi Direct連接的詳細流程,下面這張圖涵蓋了Wi-Fi Direct的大部分功能,包括設備的發現、組協調、認證關聯、WPS以及4次握手。(點擊圖片可以查看大圖 :))

wifi_direct

設備發現

設備發現是Wi-Fi Direct最關鍵的一個功能,它包含scan和find兩個了功能。scan是爲了快速的發現已有的GO,注意scan是全信道掃描。find又分爲search和listen兩個階段,這兩個階段交叉執行,協議建議find持續兩分鐘。search階段和scan類似,區別在於search只掃描1、6、11三個信道,並且對接收到的probe resp和beacon幀要判斷是否包含P2P IE。listen階段隨機在1、6、11三個信道監聽,響應包含P2P IE的probe req。listen的時間爲n個100TU(time unit),802.11規定1TU=1024微秒,約1毫秒,n是一個隨機整數,所以listen持續的時間約爲100毫秒的整數倍。這裏隨機數的目的是讓雙方都能發現對方,否則如果雙方剛好同時處於search和listen狀態,那麼永遠也掃描不到對方,而隨機數的出現總能讓雙方快速發現對方。

Listen信道

前面說了Wi-Fi Direct設備總是在1、6、11信道進行scan和listen,listen信道是在Wi-Fi Direct打開時隨機生成,工作時固定在這個信道,直到Wi-Fi Direct關閉。有兩個方法可以知道對方的listen信道,一個是通過在哪個信道接收到probe resp來確定,另一個是通過分析probe resp裏的P2P IE,有一個listen channel字段來確定。一般使用第二種方法,因爲有一些不標準的P2P設備,在scan階段也會回覆probe resp,這樣的話第一種方法就會得到錯誤的Listen信道。

GO協商

發現對方後,下一步就點擊進行連接,而連接的第一步要確認各自的角色:誰做GO,誰做GC。Wi-Fi Direct通過增加Action幀的交互來達到此目的,這個交互非常簡單,如下圖如示:

group_fomation

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,誰也不能妥協,那麼只能以失敗告終。

go_determination

事實上,一般情況下GO協商會有5個幀交互,P2P流程圖已經清晰的展現出來了,一開始會讓人比較迷惑,下面舉例說明。假設有兩個P2P設備A(Listen信道爲1)和B(Listen信道爲11),在A的P2P界面點擊B進行連接,這時A首先會在11信道發送GO Req,發送需要持續一段時間,因爲B可能會處於Search狀態,所以持續的時間至少要大於B的Search時間;直到B切換爲Listen狀態,才能收到 GO Req,收到後立即在11信道回覆GO Resp並給上層應用發送對應消息,應用提示用戶是否同意A的連接。注意B剛剛回復的GO Resp包含的狀態是fail:information is unavailable,A收到這個消息後不做任何動作,繼續等待。直到用戶點擊B的同意後,B會再發起GO Req,由於A是連接發起方,他不用再去提醒用戶同意,直接響應成功的GO Resp。最後B通過GO Confirm確認GO協商結束。

WPS流程

Wi-Fi Direct採用WPS PBC方式來協商密鑰,我們知道當手機和AP進行WPS連接時,需要先按一下AP上的WPS按鈕,再點擊手機上的WPS按鍵,兩者會自動建立連接。其實按AP的WPS按鈕的作用是讓他在後續兩分鐘的Beacon幀WPS IE裏置上一個PBC標誌,手機端WPS按鍵用於啓動WPS連接流程,如果掃描到的Beacon幀有PBC標誌就開始連接和WPS密鑰協商。

Wi-Fi Direct省去了WPS按鍵流程,協商爲GO的P2P設備轉換爲GO狀態時自動在Beacon幀裏增加PBC標誌,GC也自動啓動WPS連接流程。這裏隱藏着一個問題,如果當前環境有AP剛好處於PBC狀態或者當前有多組P2P設備在連接,那麼很有可能GC掃描到的AP列表裏有一個以上的AP包含PBC標誌,引起PBC Overlap異常,導致P2P連接失敗。這個問題概率很小,但使用WPS方式的設備都會存在,需要引起重視,當然P2P可以根據之前GO協商的MAC地址進行區分來避免。

4次握手

WPS流程只是協商出一個公共的Key,這個Key還不能用於數據加密。4次握手的作用是以公共Key爲參數協商出PTK和GTK,之後進行加密數據傳輸。

如果仔細看P2P流程圖會發現連接流程執行了兩個auth和associa,在WPS結束後GC發起的deauth沒有在流程圖表現出來。爲什麼不繼續4次握手來減少交互次數呢,我覺得這樣做的目的是最大程度的兼容原有的Wi-Fi連接流程,投入較少的改動來實現P2P功能。

Wi-Fi Direct已經漸漸的成爲手機的標準功能,隨着主流Wi-Fi芯片的支持和越來越多P2P應用的興起,我們可以在更多的應用場景看到他的身影,比如打印機、相機、家用電器,甚至物聯網。


轉載至:http://blog.weenas.com/?p=56

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章