首先感謝各位兄弟姐妹們的耐心等待。本書預計在3月中旬上市發售。從今天開始,我將在博客中連載此書的一些內容。注意,此處連載的是未經出版社編輯的原始稿件,因此樣子會有些非專業。html
注意,以下是本章目錄,本文節選3.1-3.3.4 3.4~3.4.2 及3.5節。linux
爲了方便讀者深刻學習,本系列連載都會將做者研究過數據庫
程中所學習的參考文獻列出來編程
第3章 Wi-Fi基礎知識數組
Wi-Fi(Wireless Fidelity)是一個無線網絡通訊技術的品牌,由Wi-Fi聯盟(Wi-Fi Alliance,縮寫爲WFA)擁有。WFA專門負責Wi-Fi認證與商標受權工做。嚴格得說,Wi-Fi是一個認證的名稱,該認證用於測試無線網絡設備是否符合IEEE 802.11系列協議的規範。經過該認證的設備將被授予一個名爲Wi-Fi CERTIFIED的商標。不過,隨着得到Wi-Fi認證的設備普及,人們也就習覺得常得稱無線網絡爲Wi-Fi網絡了。緩存
提示:IEEE 802.11規範和Wi-Fi的關係很難用一兩句話說清楚,讀者可閱讀參考資料[1]進行了解。簡單來講,IEEE 802.11是無線網絡技術的官方標準,而WFA則參考802.11規範制訂了一套Wi-Fi測試方案(Test Plan)。不過,Test Plan和802.11的內容並不徹底一致。有些Test項包含了目前802.11還未涉及的內容。另外,Test Plan也未覆蓋802.11全部內容。因此參考資料[1]把Wi-Fi定義爲802.11規範子集的擴展。安全
本章擬從如下幾方面向讀者介紹Wi-Fi技術:網絡
提示:因爲篇幅問題,本書將不擬討論WFA制訂的一些標準如Wi-Fi Display、Wi-Fi Simple Configuration等。不過作爲Wi-Fi技術的重要組成部分,筆者將在博客中對它們進行系統介紹[1]。數據結構
首先來看無線電頻譜和802.11協議的發展歷程。架構
本節將介紹無線電頻譜和802.11協議發展歷程。
Wi-Fi依靠無線電波來傳遞數據。絕大多數狀況下,這些能收發無線電波的設備每每被強制限制在某個無線頻率範圍內工做。這是由於無線頻譜(即無線電波的頻率,Radio Spectrum,單位爲Hz)是一種很是重要的資源。因此目前大部分國家對無線頻譜的使用都有國家級的管制。如下是幾個主要國家的管制機構:
上述這些機構是如何管理無線頻譜資源的呢?通常而言,無線頻譜資源將按照無線電頻率的高低進行劃分。有一些頻率範圍內的頻譜資源必須獲得這些管制機構的受權纔可以使用,而有些頻率範圍的頻譜資源無需管制機構的受權就可以使用。這些無需受權的頻譜大部分集中在所謂的ISM國際共用頻段中。
ISM是Industrial Scientific Medical的縮寫。如其名所示,位於ISM頻段的頻譜資源被工業、科學和醫學三個主要機構使用。ISM一詞最先由FCC定義。不過,各國的ISM頻段並不徹底一致。例如,美國有三個頻段屬於ISM,分別是902-908MHz、2400-2483.5MHz和5725-5850MHz。另外,各國都將2.4GHz頻段劃分於ISM範圍,因此Wi-Fi、藍牙等都可工做在此頻段上。
注意:雖然無需受權就可使用這些頻段資源,但管制機構對設備的功率卻有要求,由於無線頻譜具備易被污染的特色,而較大的功率則會干擾周圍其餘設備的使用。
使用過Wi-Fi的讀者或多或少都接觸過IEEE 802.11這個詞,它到底表明什麼呢?
IEEE(Institute of Electrical and Electronics Engineers)是美國電氣和電子工程師協會的簡稱。802是該組織中一個專門負責制定局域網標準的委員會,也稱爲LMSC(LAN/MAN Standards Committee,局域網/城域網標準委員會)。該委員會成立於1980年2月,其任務就是制定局域網和城域網標準。
因爲工做量較大,該委員會被細分紅多個工做組(Working Group),每一個工做組負責解決某個特定方面問題的標準。工做組也會被賦予一個編號(位於802編號的後面,中間用點號隔開),故802.11表明802項目的第11個工做組[3]。它專門負責制訂無線局域網(Wireless LAN)的介質訪問控制協議(MAC:Medium Access Control)及物理層(PHY:Physical Layer)技術規範。
和工做組劃分相似,工做組內部還會細分爲多個任務組(Task Group)。TG的任務是修改、更新標準的某個特定方面。TG的編號爲英文字母,如a、b、c等。
提示:TG編號可以使用大小寫字母,但其含義不一樣。小寫字母的編號表明該標準不能單獨存在。例如802.11b表明它是在802.11上進行的修訂工做,其自己不能獨立存在。而大寫字母的編號表明這是一種體系完備的獨立標準,如802.1X則是處理安全方面的一種獨立標準。
如上所述,802.11制定了無線網絡技術的規範,其發展歷經好幾個版本。如下是IEEE 802.11各版本的簡單介紹[4]:
提示:讀者可從IEEE官方網站中下載802.11-2012標準PDF全文(下載地址爲http://standards.ieee.org/about/get/802/802.11.html),長達2793頁,包含並整理了從802.11a到802.11z各個版本(包括a、b、d、e、g、h、i、j、k、n、p、r、s、u、v、w、y、z)所涉及的技術規範。
從本節開始,咱們將向讀者介紹802.11涉及到的無線網絡技術。首先要介紹的是OSI基本參考模型。
ISO(International Organization for Standardization,國際標準化組織)和IEC(International Electrotechnical Commission國際電工技術委員會)於1983年聯合發佈了ISO/IEC 7498標準。該標準定義了著名的Open Systems Interconnection Reference Model(開放系統互聯參考模型,簡寫爲OSI/RM[5])。
在OSI/RM中,計算機網絡體系結構被劃分紅7層,其名稱和對應關係如圖3-1所示:
圖3-1 OSI RM及TCP/IP結構圖
圖3-1繪製了OSI/RM以及另一個經常使用的網絡體系TCP/IP的結構。先來看OSI/RM,它將網絡劃分紅7層,由上到下分別是[6]:
圖3-1中左邊所示爲另一個經常使用的網絡體系,即TCP/IP模型。對比圖3-1中的兩個模型,咱們可簡單認爲TCP/IP Model是OSI/RM的一個簡化版本。
提示,關於OSI/RM的詳細信息,請讀者閱讀本章參考資料[5]。
雖然ISO/IEC 7498標準所定義的OSI/RM只將網絡劃分爲七層。但實際上每一層還可劃分爲多個子層(Sub Layer)。全部這些Sub Layer中,最爲人熟知的就是ISO/IEC 8802[7]規範劃分Data Link Layer而獲得的Logic Link Control Sub Layer(簡稱LLC)和Medium Acess Control Sub Layer(簡稱MAC)。它們的信息如圖3-2所示:
圖3-2 MAC和LLC SubLayer
圖3-2中,ISO/IEC 8802將Data Link Layer劃分紅了兩個Sub Layer,其中:
在Data Link層劃分的這兩個子層中,802.11只涉及到MAC層。因爲物理介質的不一樣,無線和有線網絡使用的MAC方法有較大差異,主要區別以下[8]:
值得指出的是:CSMA/CA協議信道利用率低於CSMA/CD協議信道利用率。信道利用率受傳輸距離和空曠程度的影響,當距離遠或者有障礙物影響時會存在隱藏終端問題,下降信道利用率。在802.11b WLAN中,在1Mb/s速率時最高信道利用率可到90%,而在11Mb/s時最高信道利用率只有65%左右。
CSMA/CA主要使用兩種方法來避免碰撞:
下面咱們經過圖3-3來介紹RTS和CTS的做用。
圖3-3 RTS/CTS原理
在圖3-3中:
那麼怎麼保證其餘站不會干擾A和B之間的數據傳輸呢?
整體而言,使用RTS和CTS幀會使整個網絡的效率有所降低。但因爲這兩種控制幀都很短(它們的長度分別爲20和14字節)。而802.11數據幀則最長可達2346字節,相比之下的開銷並不算大。相反,若不使用這種控制幀,則一旦發生衝突而致使數據幀重發,則浪費的時間就更大。
另外,802.11提供了三種狀況供用戶選擇以處理:
儘管協議通過了精心設計,但衝突仍然會發生。例如:站B和站C同時向站A發送RTS幀。這兩個RTS幀發生衝突後,使得站A收不到正確的RTS幀於是站A就不會發送後續的CTS幀。這時,站B和站C像以太網發生衝突那樣,各自隨機地推遲一段時間後從新發送其RTS幀。
根據802.11協議,CSMA/CA具體運做時由所謂的協調功能(Coordination Function)來控制。協議規定有四種不一樣的協調功能,分別是分佈式協調功能(Distributed CF,簡稱DCF)、基於DCF之上的Point CF(Point CF,簡稱PCF)、混合型協調功能(Hybrid CF,簡稱HCF)以及用於Mesh網絡的(Mesh CF,簡稱MCF)。因爲無線網絡是共享介質,因此,協調功能的目的就是用於控制各個無線網絡設備使用無線媒介的時機以免衝突發生。形象點說,這就比如在一個會議室裏,全部人均可以發言,但若是多我的同時發言的話又不知道誰和誰在說話。因此,每一個打算髮言的人都須要檢查下當前發言的狀況。本章不擬詳細介紹802.11中CF相關的內容。感興趣的讀者可閱讀802.11協議第9節「MAC sublayer functional description」。
另外,規範還定義了基於競爭的服務(contention-based service,使用DCF進行數據交換)和一種基於無競爭的服務(contention-free service,使用PCF進行數據交換)。本章也不擬討論它們。
ISO/IEC 7498及相關的一些標準文檔除了對網絡體系進行了層次劃分外,還定義了層和層之間交互方式及其餘一些基本組件。它們可用圖3-4來表示:
圖3-4 MAC Entity、Service和Clients
圖3-4繪製了MAC層相關的組件及交互方式,其中:
根據上面的介紹,Entity定義了一個類,那其中是否認義了相應的功能函數呢?在標準文檔中,和功能函數對應的術語是primitives(譯爲原語)及它們的parameters(參數)。圖3-4列舉了MAC Service的兩個重要函數,分別是:
關於MAC層的服務詳細定義,請讀者閱讀本章3.3.5.1節。
值得指出的是,規範只是從邏輯上定義了上述內容,它並無指定具體的實現。關於MAC Service的詳細定義,讀者可閱讀本章參考資料[10],即ISO/IEC 15802-1。
提醒:協議還定義了SDU和PDU兩個概念。當上一層調用MAC的request原語時,會把要發送的數據傳給MAC層。這個數據被稱爲MAC Service Data Unit(簡寫爲MSDU)。對MAC層來講,MSDU其實就是MAC要發送的數據,即載荷(Payload)。MAC層處理Payload時還會封裝MAC層本身的一些頭信息。這些信息和MSDU共同構成了MAC層的Protocol Data Unit(簡寫爲MPDU)。從OSI/RM角度來看,通過N+1層封裝後的數據是(N+1)-PDU。該數據傳遞給N層去處理時,對N層來講就是(N)-SDU。N層封裝這個SDU後就變成本身的(N)-PDU了。
在閱讀802.11相關規範時,常常會碰到MIB一詞,其全稱是Management Information Base(譯爲管理信息庫)。MIB是一個虛擬的數據庫,裏邊存儲了一些設備信息供查詢和修改。MIB較常見的使用之處是網管利用SNMP協議管理遠程主機、路由器等。
MIB內部採用樹形結構來管理其數據。內部的每個管理條目(Entry)經過一個叫object identifier(簡稱OID)來訪問。MIB定義了Entry的屬性和可取的值。因爲屬性及其可取值的定義採用了與具體編程語言無關的方式,因此一個MIB庫能夠很輕鬆經過編譯器(compiler)將其轉換成對應的編程語言源碼文件。
MIB的定義比較繁瑣,本章不擬拘泥於這些細節。讀者可閱讀參考資料[11]中所引用的資料列表以學習完整的MIB知識。
從筆者角度來看,對802.11來講,MIB就是定義了一組屬性。802.11定義的MIB屬性在http://www.ieee802.org/11/802.11mib.txt中。下載後將得一個名爲802.11mib.txt文件。讀者可經過JMIBBrowser工具(下載地址爲http://sourceforge.net/projects/jmibbrowser/,它是一個用Java語言編寫的可利用SNMP協議查看和設置指定設備MIB的小工具)去加載並查看其內容。如圖3-5所示:
圖3-5 802.11 MIB內容示意
讀者須要首先點擊圖3-5所示左下角的「Load MIB」按鈕以加載802.11mib.txt文件,而後查看802.11mib定義的一些屬性。由圖3-5可知:
802.11mib定義了一個較全的屬性集合,通常而言,設備可能只支持其中一部分屬性。圖3-6所示爲筆者Note2上wlan0設備的MIB信息截圖(因爲篇幅問題,圖3-6只包含部分Note2 wlan0設備的MIB屬性):
圖3-6 NOTE2 wlan0設備的MIB屬性示意
以圖3-6中第一條屬性dot11RSNAOptionImplemented爲例,其在802.11mib.txt的定義如圖3-7所示:
圖3-7 dot11RSNAOptionImplemented內容示意
相比直接瀏覽802.11mib.txt文本文件而言,利用JMIBBrowser工具查看屬性會更加方便和直觀一些。
提示:之後分析wpa_supplicant源碼時,會碰到802.11mib定義的屬性,讀者不妨在閱讀本節時就下載相關文件和工具程序。
本節首先對OSI/RM進行了簡單介紹,由此引出了MAC層的知識點。接着對802.11使用的MAC方法CSMA/CA進行了介紹。最後本節對MAC層Service及其相關概念以及MIB進行了介紹。
提醒:以上內容涉及到的知識點是讀者之後閱讀802.11協議時必然會碰到的。因爲802.11協議引用的參考資料很是多,故筆者在本節整理了其中最基礎的知識點。請讀者務必認真閱讀本節內容。
802.11規範全稱爲《Part 11:Wireless LAN Medium Acess Control(MAC) and Physical Layer(PHY) Specifications》。從其標題可知,802.11規範定義了無線局域網中MAC層和PHY層的技術標準。2012年版的802.11協議全文共2793頁,包含20個小節(clause),23個附錄(從A到W)。圖3-8所示爲802.11協議原文目錄的一部分。
圖3-8 802.11協議原文目錄示意圖
由圖3-8所示目錄可知802.11協議內容很是豐富。讀者可嘗試去閱讀該文檔,但估計很快會發現這將是一件很是枯燥和使人頭疼的事情。主要緣由是此規範相似於手冊,它很是重視細節的精準,但各技術點先後邏輯上的連貫性較差,使得讀者極難從散落在協議中各個角落的技術點中整理出一個內容有序,難度由淺入深的核心知識框架來。
基於上述緣由,本章後續小節擬打算從如下幾個知識點向讀者介紹802.11規範中的一些核心內容:
因爲篇幅緣由,本書不可能囊括規範的全部內容。但相信讀者在理解本節內容的基礎上,可以輕鬆開展更加深刻的研究。另外,爲幫助讀者理解規範,本章會在重要知識點之處添加「規範閱讀提示」的內容。
提醒:因爲802.11物理層涉及大量和無線電、信號處理相關的知識。這些知識不只內容枯燥繁雜,並且對軟件工程師來講並沒有太大意義,故本章不擬介紹它們。願意深刻研究的讀者可閱讀相關資料。
[1]筆者博客地址爲blog.csdn.net/innost或者http://my.oschina.net/innost/blog
本節介紹802.11規範中的物理組件和相關網絡結構。首先來看無線網絡中的物理組件。
802.11無線網絡包含四種主要物理組件,如圖3-9所示:
圖3-9 802.11四大主要物理組件
圖3-9中定義了四個組件,它們分別是:
上述四個物理組件中最難解釋清楚的就是DS了。筆者在仔細閱讀規範後,感受其對DS的解釋並不直觀。此處將列舉一個常見的應用場景以幫助讀者理解:
通常家用無線路由器一端經過有線接入互聯網,另外一端經過天線提供無線網絡。當打開Android手機上的Wi-Fi功能,併成功鏈接到此無線路由器提供的無線網絡(假設其網絡名爲「TP-LINK_1F9C5E」,可在路由器中設置)時,咱們將獲得:
上述內容中將BSS和LAN結合到一塊兒以構成一個ESS的「東西」就是DS。雖然規範中並未明示DS究竟是什麼,但絕大部分狀況下,DS是指有線網絡(經過它能夠接入互聯網)。後文咱們將介紹DS所提供的分佈式服務(即DSS)。如今對讀者來講,更重要的概念是其中和無線網絡架構相關的BSS和ESS等。這部份內容將在下節介紹。
規範閱讀提示:
1 上文介紹的AP、STA、DS的定義都來自於802.11的3.1節。筆者我的以爲該節所列的定義是最精確的。以DS爲例,此節所定義的DS涉及到和有線網絡的結合。但規範中其餘關於DS的說明均未明示是否必定要和LAN結合。
2 關於STA,其定義只說明它是一個可singly addressable的實體,而沒有說明其對應的功能。因此,讀者會發現AP也是一個STA。另外還有提供QoS(Quality of Service)的STA。除此以外,從可移動性的角度來看,還有Mobile STA和Portable STA之分。Portable STA雖然能夠移動,但只在固定地點使用(例如AP就是一個典型的Portable STA)。而Mobile STA表示那些只要在Wi-Fi覆蓋範圍內,均可以使用的STA(例如手機、平板等設備)。
有了上節所述的物理組件,如今就能夠搭建由它們構成的無線網絡了。802.11規範中,基本服務集(Basic Service Set,簡寫爲BSS)是整個無線網絡的基本構建組件(basic building block)。BSS如圖3-10所示:
圖3-10 BSS的兩種方式
由圖3-10可知,BSS有兩種類型,分別是:
提示:
1 Independent BSS縮寫爲IBSS。而Infrastructure BSS沒有對應的縮寫。不過,通常用BSS表明Infrastrucutre BSS。
2 根據前文所述,AP也是一個STA。但此處STA和AP顯然是兩個不一樣的設備。
由圖3-10中BSS的結構可知,其網絡覆蓋範圍由該BSS中的AP決定。在某些狀況下,須要幾個BSS聯合工做以構建一個覆蓋面更大的網絡,這就是一個ESS(Extended Service Set:擴展服務集)。如圖3-11所示:
圖3-11 ESS示意圖
ESS在規範中的定義是「A set of one or one interconnected BSSs that appears as a single BSS to the LLC layer at any STA associated with one of those BSSs」。此定義包含幾個關鍵點:
注意:ESS中的BSS擁有相同的SSID(Service Set Identification,詳細內容見下文),而且彼此之間協同工做。這和目前隨着Wi-Fi技術的推廣,家庭和工做環境中存在多個無線網絡(即存在多個ESS)的狀況有本質不一樣。在多個ESS狀況下,用戶必須手動選擇才能切換到不一樣的ESS。因爲筆者平常工做和生活中,ESS只包含一個BSS,當某個AP停機時,筆者就得手動切換到其餘無線網絡中去了。
另外,切換相關的知識點屬於Roaming(漫遊)範疇,讀者可閱讀「Secure Roaming in 802.11 Networks」一書來了解相關細節。
上述網絡都有所謂的Identification,它們分別是:
規範閱讀提示:
1 上述網絡結構中,並未說起如何與有線網絡(即LAN)的整合。規範中其實還定義了一個名爲portal的邏輯模塊(logical component)用於將WLAN(Wireless LAN)和LAN結合起來。因爲WLAN和LAN使用的MAC幀格式不一樣,因此直白得說,portal的功能相似翻譯,它在WLAN和LAN間轉換MAC幀數據。目前,portal的功能由AP實現。
2 規範中還定義了QoS BSS。這主要爲了在WLAN中支持那些對QoS有要求的程序。因爲無線網絡自己固有的特性,WLAN中的QoS實現比較複雜,效果也不如LAN中的QoS。初學者可先不接觸這部份內容。
==============================================================================================略略略略略略略略略略略略略略===================================
前面小節一直在介紹Wi-Fi規範方面的內容。從本節開始,咱們將向讀者介紹Linux平臺中Wi-Fi編程方面的知識。
提醒:相比前文而言,本節內容讀起來將顯得較爲輕鬆。但從筆者我的經驗來講,編程只不過是規範的某種實現,掌握規範纔是理解無線網絡技術的核心。這也是本書內容組織和編排的指導原則。但願讀者能認真體會。
Linux平臺上目前經常使用的專門針對無線網絡設備編程的API有兩套[40],
注意:ioctl不符合Linux驅動開發要求主要體如今:
1 ioctl的原型爲int ioctl(int fd, unsigned long cmd, ...),最後三個點表明它支持可變個數的參數。但對於一個通過嚴格定義的系統調用來講,支持可變個數參數的作法彷佛顯得有些隨性。
2 ioctl的參數不只個數不固定,其參數類型也沒法經過函數原型來加以說明。這一樣對於一個嚴謹的系統調用來講,也是不可接受的。
本節將重點介紹用戶空間中的Wi-Fi API:wext和nl80211。不過在介紹它們以前,筆者先請讀者思考這樣一個問題:
爲何Wi-Fi須要在用戶空間進行編程呢?
答案:
目前的無線網卡分爲兩種,一種爲SoftMAC。這類網卡中,MLME的處理基本上在軟件層(即驅動或用戶空間),這樣可帶來較大的靈活性。另外,一些認證相關的操做,也可由軟件來控制。另外一種網卡稱之爲FullMAC。這類網卡的MLME全在硬件處理。相比SoftMAC而言,其靈活性很小。因此目前市面上SoftMAC網卡佔絕大多數,而cfg80211就僅支持SoftMAC類型的網卡。
從開發者角度來講,wext的用法至關簡單。Linux平臺中,wext API定義於wireless.h文件。Android平臺上,其文件位置在external/kernel-headers/original/linux目錄下,主要供驅動開發者使用。
注意,bionic/libc/kernel/common/linux目錄中也有一個wireless.h,不過此文件由工具程序根據kernel中的wireless.h自動生成而來,供用戶空間使用。兩個文件的區別主要是bionic下的wireless.h包含不多的註釋。因此本節將分析kernel中的wireless.h。Android 4.2中的wext版本爲20,由wireless.h中的宏WIRELESS_EXT定義。
雖然前面提到說ioctl函數的一個缺點是其沒有指明參數類型,但wext卻比較嚴謹,它提供了本身的數據類型。
首先,全部用戶空間發起的請求都統一包括在struct iwreq中,其原型以下:
[-->wireless.h::struct iwreq]
//wext API在設計時參考了系統中現有數據結構及命名方式。作爲區分,wext中幾乎全部數據結構、類型、宏
//等名字中都帶一個w以表明wireless。以下面的iwreq結構體,其對應的普通數據結構類型是ifreq。
//該結構體專門用於往socket句柄傳遞ioctrl控制參數。
struct iwreq
{
union
{
char ifrn_name[IFNAMSIZ]; //用於指定要操做的網卡設備名,如wlan0
} ifr_ifrn;
union iwreq_data u; //用於存儲具體的參數信息
};
如iwreq結構所示,具體的參數信息存儲在另一個聯合體iwreq_data中,其原型以下:
[-->wireless.h::union:iwreq_data]
/*
iwreq_data是一個聯合體,其最大size爲16字節
wext還自定義了一些小的數據結構,如iw_point、iw_param、iw_freq等。它們的做用是:
1 iw_point:當參數信息的長度超過16字節時,就只能經過iw_point指向另一塊內存區域,而參數就存儲
在那個區域中。這個就是咱們經常使用的指針方式。
2 iw_param:當參數信息不超過16字節時,能夠把信息存儲在iw_param中。
3 iw_freq:用於存儲頻率或信道值。其原型的介紹見本小節最後。
union iwreq_data
{
char name[IFNAMSIZ];
struct iw_point essid; //存儲essid,也就是ssid
struct iw_param nwid; //network id
//頻率或信道。取值爲0-1000時表明channel,大於1000則表明頻率,單位爲Hz
struct iw_freq freq;
struct iw_param sens; //信號強度閾值
struct iw_param bitrate; //碼率
struct iw_param txpower;
struct iw_param rts; //RTS閾值時間
struct iw_param frag;
__u32 mode; //操做模式
struct iw_param retry;
struct iw_point encoding;
struct iw_param power;
struct iw_quality qual;
struct sockaddr ap_addr; //AP地址
struct sockaddr addr; //目標地址
struct iw_param param; //其餘參數
struct iw_point data; //其餘字節數超過16的參數
};
當參數字節超過16的時候,wext還定義了和功能相關的參數類型,下面來看專門用於觸發無線網卡發起掃描請求的數據結構iw_scan_req,其原型以下所示:
[-->wireless.h::struct iw_scan_req]
struct iw_scan_req
{
__u8 scan_type; //可取值爲IW_SCAN_TYPE_{ACTIVE,PASSIVE},表明主動或被動掃描
__u8 essid_len; //essid字符串長度
__u8 num_channels; // 指明信道個數,若是爲0,則表示掃描全部可容許的信道
__u8 flags; //目前僅用於字節對齊
//bssid用於指明BSS的地址。若是全爲FF則爲廣播BSSID,即wildcard bssid
struct sockaddr bssid;
__u8 essid[IW_ESSID_MAX_SIZE]; //essid
/*
min_channel_time:指示掃描過程當中在每一個信道等待到第一個回覆的時間。若是在此時間內沒有等到回覆,
則跳到下一個信道去等待。若是等到一個回覆的話,則一共在該信道等待的最大時間爲max_channel_time。
全部時間單位均爲TU(Time Units),即1024ms
*/
__u32 min_channel_time;
__u32 max_channel_time;
struct iw_freq channel_list[IW_MAX_FREQUENCIES];//IW_MAX_FREQUENCIES值爲32
};
下面來看最後一個常見的數據結構iw_freq,其原型以下:
[-->wireless.h::struct:iw_freq]:
//當頻率小於109,m直接等於頻率。不然m=f/(10e)
struct iw_freq
{
__s32 m;
__s16 e;
__u8 i; //該值表示此頻率對象在channel_list數組中的索引
__u8 flags; //固定或自動
};
wext中的數據結構和定義還有許多。建議讀者結合實際須要去學習wireless.h。
提醒:wext API雖然簡單,但相信讀者已經體會到其背後所依賴的和802.11規範密切相關的理論知識了。
下面咱們經過一個實際的例子來看看用戶空間如何經過wext API來觸發無線網卡掃描工做的。
本例來源於wpa_supplicant,它是一個運行於用戶空間的專門和無線網卡進行交互的程序。其詳情將在下一章節進行介紹。本節僅經過一個函數看看wpa_supplicant如何利用wext API和無線網卡交互。
[-->driver_wext.c:wpa_driver_wext_scan]
int wpa_driver_wext_scan(void *priv, struct wpa_driver_scan_params *params)
{
struct wpa_driver_wext_data *drv = priv;
struct iwreq iwr; //定義一個iwreq對象
int ret = 0, timeout;
struct iw_scan_req req; //定義一個iw_scan_req對象
//獲取調用者傳遞的ssid等參數
const u8 *ssid = params->ssids[0].ssid;
size_t ssid_len = params->ssids[0].ssid_len;
......
os_memset(&iwr, 0, sizeof(iwr));
//爲iwr的ifr_name傳遞需操做的網卡設備名
os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
if (ssid && ssid_len) {
os_memset(&req, 0, sizeof(req));
//設置iw_scan_req的信息
req.essid_len = ssid_len;
req.bssid.sa_family = ARPHRD_ETHER;
//設置bssid的MAC地址全爲0XFF,表明這是一個wildcard BSSID搜索
os_memset(req.bssid.sa_data, 0xff, ETH_ALEN);
os_memcpy(req.essid, ssid, ssid_len);
//經過data域指向這個iw_sca_req對象
iwr.u.data.pointer = (caddr_t) &req;
iwr.u.data.length = sizeof(req);
//IW_SCAN_THIS_ESSID表示只掃描指定ESSID的無線網絡
iwr.u.data.flags = IW_SCAN_THIS_ESSID;
}
/*
ioctl_sock指向一個socket句柄,其建立時候的代碼以下:
ioctl_sock = socket(PF_INET,SOCK_DGRAM,0)
SIOCSIWSCAN用於通知驅動進行無線網絡掃描
*/
if (ioctl(drv->ioctl_sock, SIOCSIWSCAN, &iwr) < 0) {
//返回錯誤
}
......//其餘處理
return ret;
}
wext相對比較簡單,但其內部的數據結構定義、變量命名等都和規範中定義的原語有着莫大的關係。建議讀者結合規範去閱讀wireless.h以加深理解。
==============================================================================================略略略略略略略略略略略略略略===================================
本章是全書關於Wi-Fi技術方面的一篇基礎文章,涉及的面很廣,內容也很雜,須要讀者耐心閱讀並理解。從大致上來講,本章按以下邏輯開展:
本章是筆者從事Android寫做以來耗時最長的一篇文章了(包括學習時間一共長達3個多月,並且還有不少技術點未能覆蓋到)。在這個過程當中,筆者也經歷過煩惱和痛苦,感受其難度比純粹的代碼分析要大得多。這也是筆者但願讀者把注意力放到代碼背後的理論上來的初衷。
另外,從下一章開始,咱們將在分析wpa_supplicant的同時,經過背景知識介紹的方式來補充本節沒有涵蓋的內容。
[1] Real 802.11 Security: Wi-Fi Protected Access and 802.11i 第7.1節「Relationship Between Wi-Fi and IEEE 802.11」
本書是筆者找到的關於802.11無線網絡安全技術方面知識面最完整的書籍。惋惜是英文版,並須要有Wi-Fi的基礎知識後才能真正理解。
[2] 802.11無線網絡權威指南(第二版)「無線網絡導論」一節,P16-P17,「無線電頻譜:關鍵資源」。
此書是目前市面上關於802.11無線網絡書籍的聖經。不過其排版奇特,連章節號都沒有,讀起來着實有些費勁。讀者可首先閱讀這本書以對Wi-Fi有個基本瞭解。另外,該書涉及到和物理層有關的內容能夠略去不讀。
[3] 802.11無線網絡權威指南(第二版)「無線網絡導論」一節,P20-P22。
[4] http://baike.baidu.com/view/345218.htm
摘抄自百度百科詞條「802.11」。筆者對其內容作了必要的增刪改。
[5] ISO/IEC 7498-1 「Basic Reference Model:The Basic Model」
OSI模型的官方文檔,不過和其餘官方文檔同樣,極難理清楚其間的邏輯關係,作手冊用還能夠。
[6] http://baike.baidu.com/view/486949.htm
百度百科詞條「開放系統互連參考模型」。
[7] ISO/IEC 8802-2 「Part 2 Logical Link Control」
Logical Link Control層的官方標準。不過讀者只需閱讀第一節「Overview」便可。
[8] http://baike.baidu.com/view/645723.htm
百度百科詞條「CSMA/CA」,以很是通俗的方式解釋了CSMA/CA的工做原理。除非特別須要,讀者也可參考「802.11無線網絡權威指南(第二版)」一書第三章「802.11 MAC基礎」,P47-P55。
[9] IEEE 802.1X-2010 「Port-Based Network Access Control」,Annex D 「Basic architectural concepts and terms」
大名鼎鼎的802.1X規範。不過這些規範引用的其餘標準很是多,因此802.1X在附錄D中對一些基本概念和術語進行了一番介紹。建議讀者閱讀此文檔。
[10] http://www.doc88.com/p-696270935777.html
SO/IEC 15802-1電子文檔,由doc88提供。全名爲「Part 1: Medium Access Control(MAC) service definition」。定義了MAC service和相關的原語。
[11] http://en.wikipedia.org/wiki/Management_information_base
維基百科詞條「Management Information Base」,英文介紹,還算比較好理解。
[12] 802.11-2012第4.1節「General description of the architecture」、4.2節「How WLAN systems are different」、4.3節「Components of the IEEE 802.11 architecture」
[13] 802.11-2012第4.5節「Overview of the Services」。
注意,802.11-2012第4節「General description」很是重要,裏邊的許多基本概念都須要瞭解。注意,該節包括的內容很是多,讀者應有選擇的閱讀。
[14] 802.11-2012第5節「MAC service definition」
對802.11 MAC服務進行了完整說明。
[15] 802.11-2012第8節「Frame formats」
802.11 MAC幀完整說明。固然,讀者可把它當作手冊來用。
[16] http://technet.microsoft.com/en-us/library/cc757419(v=ws.10).aspx
微軟技術文章「How 802.11 Wireless Works」。很是通俗易懂,包含的知識面也比較全。讀者可經過它對802.11有一個大體的認識。
[17] 802.11無線網絡權威指南(第二版)第四章「802.11成幀細節」,P78-P127。
[18] 802.11無線網絡權威指南(第二版)第八章「管理操做」中的「節省電力」,P200-P208。
很是詳細得介紹了Power Save的原理和過程。
[19] 802.3-2008「CSMA/CD Access Method and Physical Layer Specifications」第3.2.3節「Address fields」
LAN中MAC層的官方文檔。其中有對MAC地址格式的說明。
[20] http://www.doc88.com/p-905531556977.html
doc88上關於MAC組播地址的中文說明。建議讀者閱讀此文檔。
[21] 802.11無線網絡權威指南(第二版)第三章「802.11 MAC幀基礎」中的「802.11對上層協議的封裝」,P65-P66。
[22] 802.11-2012第6節「Layer management」
MLME的官方說明,很是詳細。請讀者當手冊使用。
[23] 802.11無線網絡權威指南(第二版)第八章「管理操做」,P182-P224
邏輯還算清晰,建議讀者結合[22]一塊兒閱讀。
[24] 802.11-2012第4.10節「IEEE Std 802.11 and IEEE Std 802.1X-2004」
介紹802.1X如何與802.11相結合。
[25] 802.11無線網絡權威指南(第二版)第五章「有線等效加密」,P127-P142
關於WEP的詳細介紹。但有些內容用得很是少(例如關於動態WEP密匙的說明)。
[26] 802.11-2012第11.2.2節「Wired equivalent privacy (WEP)」
官方對WEP的說明,很是詳細。
[27] 802.11-2012第11.2.3節「Pre-RSNA authentication」
官方對WEP中身份驗證方法的說明。
[28] http://documentation.netgear.com/reference/ita/wireless/pdfs/FullManual.pdf
「Wireless Networking Basics」,Netgear貴公司提供的關於Wi-Fi安全方面的一些簡單介紹。
[29] 802.11-2012第11.4節「RSNA confidentiality and integrity protocols」
官方文檔關於TKIP和CCMP的介紹。
[30] 802.11無線網絡權威指南(第二版)第七章「802.11:RSN、TKIP與CCMP」,P162-P176
請讀者結合[29]一塊兒研究。
[31] RFC3748 「Extensible Authentication Protocol (EAP) 」
EAP的官方文檔,總長68頁,難度不是特別大,建議讀者閱讀全文。
[32] http://en.wikipedia.org/wiki/IEEE_802.1X
維基百科詞條「IEEE 802.1X」。圖文並茂,讀者可仔細閱讀此文。
[33] 802.11無線網絡權威指南(第二版)第六章「802.1X 用戶身份驗證」,P142-P154
[34] http://www.h3c.com.cn/Products___Technology/Technology/Security_Encrypt/Other_technology/Technology_recommend/200812/624138_30003_0.htm
H3C公司關於802.1X的介紹,很是詳細,難度較小。讀者可先閱讀此文檔。
[35] 802.1X-2010第11節「EAPOL PDUs」
官方對EAPOL格式的詳細說明。
[36] http://www.docin.com/p-439759696.html
「一種針對RSNA無線網絡的安全等級回滾攻擊研究」,來自豆丁網。3頁內容,比較容易理解。
[37] Real 802.11 Security: Wi-Fi Protected Access and 802.11i,第7章「WPA, RSN, and IEEE 802.11i」和第9章」WPA and RSN Key Hierarchy」
此書是目前筆者找到的關於Wi-Fi安全性方面覆蓋面最齊全的資料。建議讀者深刻閱讀。
[38] 802.11-2012第11.6節「Keys and key distribution」
官方文檔關於密匙派生的說明。
[39] 802.11無線網絡權威指南(第二版)第七章「802.11:RSN、TKIP與CCMP」,P176-P182
介紹了RSN的運做方式,對密匙派生和緩存有較爲詳細的說明。
[40] http://wireless.kernel.org/en/developers/Documentation/Wireless-Extensions
Linux Wireless Kernel官方網站,內容很是豐富。建議讀者仔細閱讀。
[41] http://www.infradead.org/~tgr/libnl/
libnl官方網站,文檔較爲豐富。讀者可閱讀其中關於libnl的文檔。