1. OSI/RM介紹
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]:
- Application Layer(應用層):應用層能與應用程序界面溝通以達到向用戶展示的目的。常見的協議有HTTP、HTTPS、FTP、SMTP等。其數據單位為APDU(Application Protocol Data Unit)。
- Presentation Layer(表示層):表示層能為不同客戶端提供數據和信息的語法轉換,使系統能解讀成正確的數據,同時它還能提供壓縮解壓、加密解密等服務。例如不同格式圖像(如GIF、JPEG、TIFF等)的顯示就是由位于表示層的協議來支持的。其數據單位為PPDU(Presentation Protocol Data Unit)。
- Session Layer(會話層):會話層用于為通信雙方制定通信方式,創建和注銷會話(雙方通信)等。其數據單位為-SPDU(Session Protocol Data Unit)。常見的協議有ZIP、AppleTalk、SCP等。
- Transport Layer(傳輸層):傳輸層用于控制數據流量,同時能進行調試及錯誤處理,以確保通信順利。發送端的傳輸層會為數據分組加上序號,以方便接收端把分組重組為有用的數據或文件。傳輸層的常見協議有TCP、UDP等。其數據單位為TPDU(Transport Protocol Data Unit)。
- Network Layer(網絡層):網絡層為數據傳送的目的地尋址,然后再選擇一個傳送數據的最佳路線。網絡層數據的單位為Packet或Datagram。常見的設備有路由器等。常見協議有IP、IPv6。
- Data Link Layer(數據鏈路層):在物理層提供比特流服務的基礎上,建立相鄰結點之間的數據鏈路。通過差錯控制提供數據幀(Frame)在信道上無差錯的傳輸。數據鏈路層在不可靠的物理介質上提供可靠的傳輸。該層的作用包括:物理地址尋址、數據的成幀、流量控制、數據的檢錯、重發等。數據鏈路層數據的單位為Frame(幀)。常見的設備有二層交換機、網橋等。
- Physical Layer(物理層):物理層定義了通信設備機械、電氣、功能和過程等方面的特性,用以建立、維護和拆除物理鏈路連接。物理層數據的單位為bit。
圖3-1中左邊所示為另外一個常用的網絡體系,即TCP/IP模型。對比圖3-1中的兩個模型,我們可簡單認為TCP/IP Model是OSI/RM的一個簡化版本。
* * * * *
**提示**,關于OSI/RM的詳細信息,請讀者閱讀本章參考資料[5]。
* * * * *
2. LLC和MAC子層介紹
雖然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,其中:
- MAC Sub Layer(Media Acess Control SubLayer:媒介訪問控制子層):該子層的目的是為了解決局域網(Local Area Network,以后簡寫為LAN)中共用信道的使用產生競爭時,如何分配信道的使用權問題。目前LAN中常用的媒介訪問控制方法是CSMA/CD(爭用型介質訪問控制)。由于無線網絡的特殊性,MAC的控制方法略有不同。我們將在下文介紹相關內容。
- LLC Sub Layer(邏輯鏈路控制子層):該子層實現了兩個站點之間幀的交換,實現端到端(源到目的),無差錯的幀傳輸和應答功能及流量控制功能。
在Data Link層劃分的這兩個子層中,802.11只涉及到MAC層。由于物理介質的不同,無線和有線網絡使用的MAC方法有較大差別,主要區別如下[8]:
- 有線(wired)網絡最常使用的方法(此處僅考慮以太網)是CSMA/CD(Carrier Sense Multiple Access/Collision Detect,載波監聽多路訪問/沖突檢測機制)。其主要工作原理是:工作站發送數據前先監聽信道是否空閑,若空閑則立即發送數據。并且工作站在發送數據時,邊發送邊繼續監聽。若監聽到沖突,則立即停止發送數據并等待一段隨機時間,然后再重新嘗試發送。
- 無線網絡主要采用CSMA/CA(Carrier Sense Multiple Access/Collision Avoidance,譯為載波監聽多路訪問/沖突避免機制)方法。無線網絡沒有采用沖突檢測方法的原因是:如果要支持沖突檢測,必須要求無線設備能一邊接受數據信號一邊傳送數據信號,而這種設計對無線網絡設備來說性價比太低。另外,沖突檢測要求邊發送數據包邊監聽,一旦有沖突則停止發送。很顯然,這些因發送沖突而被中斷的數據發送將會浪費不少的傳輸資源。所以,802.11在CSMA/CD基礎上進行了一些調整,從而得到了CSMA/CA方法。其主要工作原理見下節內容。
* * * * *
**注意**:CSMA/CA協議信道利用率低于CSMA/CD協議信道利用率。信道利用率受傳輸距離和空曠程度的影響,當距離遠或者有障礙物影響時會存在隱藏終端問題,降低信道利用率。在802.11b WLAN中,在1Mb/s速率時最高信道利用率可到90%,而在11Mb/s時最高信道利用率只有65%左右。
* * * * *
3. CSMA/CA介紹[8]
CSMA/CA主要使用兩種方法來避免碰撞:
- 設備發送數據前,先監聽無線鏈路狀態是否空閑。為了避免發生沖突,當無線鏈路被其他設備占用時,設備會隨機為每一幀選擇一段退避(backoff)時間。這樣就能減少沖突的發生。
- RTS-CTS握手(handshake):設備發送幀前,先發送一個很小的RTS(Request to Send)幀給目標端,等待目標端回應CTS(Clear to Send)幀后,才開始傳送。此方式可以確保接下來傳送數據時,其他設備不會使用信道以避免沖突。由于RTS幀與CTS幀長度很小,使得整體開銷也較小。
下面我們通過圖3-3來介紹RTS和CTS的作用。
:-: 
圖3-3 RTS/CTS原理
在圖3-3中:
以工作站A和B之間傳輸數據為例,站B、站C、站E在站A 的無線信號覆蓋的范圍內,而站D不在其內。站A、站E、站D在站B的無線信號覆蓋的范圍內,但站C不在其內。
如果站A要向站B發送數據,那么,站A在發送數據幀之前,要先向站B發送一個請求發送幀RTS(Request To Send)。在RTS幀中會說明將要發送的數據幀的長度。站B收到RTS幀后就向站A回應一個允許發送幀CTS(Clear To Send)。在CTS幀中也附上A欲發送的數據幀的長度(從RTS幀中將此數據復制到CTS幀中)。站A收到CTS幀后就可發送其數據幀了。
那么怎么保證其他站不會干擾A和B之間的數據傳輸呢?
- 對于站C,站C處于站A的無線傳輸范圍內,但不在站B的無線傳輸范圍內。因此站C能夠收聽到站A發送的RTS幀,但經過一小段時間后,站C收聽不到站B發送的CTS幀。這樣,在站A向站B發送數據的同時,站C也可以發送自己的數據而不會干擾站B接收數據(注意:站C收聽不到站B的信號表明,站B也收不聽到站C的信號)。
- 對于站D,站D收聽不到站A發送的RTS幀,但能收聽到站B發送的CTS幀。因此,站D在收到站B發送的CTS幀后,應在站B隨后接收數據幀的時間內關閉數據發送操作,以避免干擾站B接收自A站發來的數據。
- 對于站E,它能收到RTS幀和CTS幀,因此,站E在站A發送數據幀的整個過程中不能發送數據。
總體而言,使用RTS和CTS幀會使整個網絡的效率有所下降。但由于這兩種控制幀都很短(它們的長度分別為20和14字節)。而802.11數據幀則最長可達2346字節,相比之下的開銷并不算大。相反,若不使用這種控制幀,則一旦發生沖突而導致數據幀重發,則浪費的時間就更大。
另外,802.11提供了三種情況供用戶選擇以處理:
- 使用RTS和CTS幀。
- 當數據幀的長度超過某一數值時才使用RTS和CTS幀。
- 不使用RTS和CTS幀。
盡管協議經過了精心設計,但沖突仍然會發生。例如:站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進行數據交換)。本章也不擬討論它們。
* * * * *
4. MAC層Service及其他概念介紹[5][9]
ISO/IEC 7498及相關的一些標準文檔除了對網絡體系進行了層次劃分外,還定義了層和層之間交互方式及其他一些基本組件。它們可用圖3-4來表示:
:-: 
圖3-4 MAC Entity、Service和Clients
圖3-4繪制了MAC層相關的組件及交互方式,其中:
- 協議規定了每一層所提供的功能,這些功能統一用Service來表示。圖3-4中,MAC層為上層提供MAC Service。從Java編程角度來看,就好比定義了一個名為MACService的Java Package。
- 每一層內部有數個Entity。Entity代表封裝了一組功能的模塊。上面提到的Service就是由Entity提供的。根據OSI/RM的層次關系,第N層為第N+1層提供服務。所以,圖3-4中,MAC Entity對上一層提供MAC Service。從Java編程角度來看,MAC Entity就好比MAC Service Package中定義的類,不同的Entity代表該Package中實現不同的功能類。一個Package中的Entity可以相互調用以完成某個功能。
- 第N+1層要使用第N層服務時,必須經由Service Acess Point來完成。圖3-3中,MAC的Service必須借由MAC Service Access Point(縮寫為MSAP)來訪問。
根據上面的介紹,Entity定義了一個類,那其中是否定義了相應的功能函數呢?在標準文檔中,和功能函數對應的術語是primitives(譯為原語)及它們的parameters(參數)。圖3-4列舉了MAC Service的兩個重要函數,分別是:
- **M_UNITDATA.request**:Client調用該primitive發送數據。該primitive的參數是destination_address(目標地址)、source_address(源地址)、MSDU(MAC Service Data Unit,即數據)、priority(優先級)。
- **M_UNITDATA.indication**:當位于遠端機器的MAC層收到上面發送的數據后,將通過indication原語來通知上一層以處理該數據。
* * * * *
**提示**:關于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了。
* * * * *
5. MIB介紹[11]
在閱讀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](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可知:
左側顯示當前查看的是dot11MACAddress的條目。
右側顯示該條目的信息,Acess中的"read only"表示只讀。Description表示該條目的意義。
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定義的屬性,讀者不妨在閱讀本節時就下載相關文件和工具程序。
以上內容涉及到的知識點是讀者以后閱讀802.11協議時必然會碰到的。由于802.11協議引用的參考資料非常多,故筆者在本節整理了其中最基礎的知識點。請讀者務必認真閱讀本節內容。
* * * * *
- 前言
- 第1章 準備工作
- 1.1 Android系統架構
- 1.2 工具使用
- 1.2.1 Source Insight的使用
- 1.2.2 Eclipse的使用
- 1.2.3 BusyBox的使用
- 1.3 本書資源下載說明
- 第2章 深入理解Netd
- 2.1 概述
- 2.2 Netd工作流程
- 2.2.1 main函數分析
- 2.2.2 NetlinkManager分析
- 2.2.3 CommandListener分析
- 2.2.4 DnsProxyListener分析
- 2.2.5 MDnsSdListener分析
- 2.3 CommandListener中的命令
- 2.3.1 iptables、tc和ip命令
- 2.3.2 CommandListener構造函數和測試工具ndc
- 2.3.3 InterfaceCmd命令
- 2.3.4 IpFwd和FirewallCmd命令
- 2.3.5 ListTtysCmd和PppdCmd命令
- 2.3.6 BandwidthControlCmd和IdletimerControlCmd命令
- 2.3.7 NatCmd命令
- 2.3.8 TetherCmd和SoftapCmd命令
- 2.3.9 ResolverCmd命令
- 2.4 NetworkManagementService介紹
- 2.4.1 create函數詳解
- 2.4.2 systemReady函數詳解
- 2.5 本章總結和參考資料說明
- 2.5.1 本章總結
- 2.5.2 參考資料說明
- 第3章 Wi-Fi基礎知識
- 3.1 概述
- 3.2 無線電頻譜和802.11協議的發展歷程
- 3.2.1 無線電頻譜知識
- 3.2.2 IEEE 802.11發展歷程
- 3.3 802.11無線網絡技術
- 3.3.1 OSI基本參考模型及相關基本概念
- 3.3.2 802.11知識點導讀
- 3.3.3 802.11組件
- 3.3.4 802.11 Service介紹
- 3.3.5 802.11 MAC服務和幀
- 3.3.6 802.11 MAC管理實體
- 3.3.7 無線網絡安全技術知識點
- 3.4 Linux Wi-Fi編程API介紹
- 3.4.1 Linux Wireless Extensions介紹
- 3.4.2 nl80211介紹
- 3.5 本章總結和參考資料說明
- 3.5.1 本章總結
- 3.5.2 參考資料說明
- 第4章 深入理解wpa_supplicant
- 4.1 概述
- 4.2 初識wpa_supplicant
- 4.2.1 wpa_supplicant架構
- 4.2.2 wpa_supplicant編譯配置
- 4.2.3 wpa_supplicant命令和控制API
- 4.2.4 git的使用
- 4.3 wpa_supplicant初始化流程
- 4.3.1 main函數分析
- 4.3.2 wpa_supplicant_init函數分析
- 4.3.3 wpa_supplicant_add_iface函數分析
- 4.3.4 wpa_supplicant_init_iface函數分析
- 4.4 EAP和EAPOL模塊
- 4.4.1 EAP模塊分析
- 4.4.2 EAPOL模塊分析
- 4.5 wpa_supplicant連接無線網絡分析
- 4.5.1 ADD_NETWORK命令處理
- 4.5.2 SET_NETWORK命令處理
- 4.5.3 ENABLE_NETWORK命令處理
- 4.6 本章總結和參考資料說明
- 4.6.1 本章總結
- 4.6.2 參考資料說明
- 第5章 深入理解WifiService
- 5.1 概述
- 5.2 WifiService的創建及初始化
- 5.2.1 HSM和AsyncChannel介紹
- 5.2.2 WifiService構造函數分析
- 5.2.3 WifiStateMachine介紹
- 5.3 加入無線網絡分析
- 5.3.1 Settings操作Wi-Fi分析
- 5.3.2 WifiService操作Wi-Fi分析
- 5.4 WifiWatchdogStateMachine介紹
- 5.5 Captive Portal Check介紹
- 5.6 本章總結和參考資料說明
- 5.6.1 本章總結
- 5.6.2 參考資料說明
- 第6章 深入理解Wi-Fi Simple Configuration
- 6.1 概述
- 6.2 WSC基礎知識
- 6.2.1 WSC應用場景
- 6.2.2 WSC核心組件及接口
- 6.3 Registration Protocol詳解
- 6.3.1 WSC IE和Attribute介紹
- 6.3.2 802.11管理幀WSC IE設置
- 6.3.3 EAP-WSC介紹
- 6.4 WSC代碼分析
- 6.4.1 Settings中的WSC處理
- 6.4.2 WifiStateMachine的處理
- 6.4.3 wpa_supplicant中的WSC處理
- 6.4.4 EAP-WSC處理流程分析
- 6.5 本章總結和參考資料說明
- 6.5.1 本章總結
- 6.5.2 參考資料說明
- 第7章 深入理解Wi-Fi P2P
- 7.1 概述
- 7.2 P2P基礎知識
- 7.2.1 P2P架構
- 7.2.2 P2P Discovery技術
- 7.2.3 P2P工作流程
- 7.3 WifiP2pSettings和WifiP2pService介紹
- 7.3.1 WifiP2pSettings工作流程
- 7.3.2 WifiP2pService工作流程
- 7.4 wpa_supplicant中的P2P
- 7.4.1 P2P模塊初始化
- 7.4.2 P2P Device Discovery流程分析
- 7.4.3 Provision Discovery流程分析
- 7.4.4 GO Negotiation流程分析
- 7.5 本章總結和參考資料說明
- 7.5.1 本章總結
- 7.5.2 參考資料說明
- 第8章 深入理解NFC
- 8.1 概述
- 8.2 NFC基礎知識
- 8.2.1 NFC概述
- 8.2.2 NFC R/W運行模式
- 8.2.3 NFC P2P運行模式
- 8.2.4 NFC CE運行模式
- 8.2.5 NCI原理
- 8.2.6 NFC相關規范
- 8.3 Android中的NFC
- 8.3.1 NFC應用示例
- 8.3.2 NFC系統模塊
- 8.4 NFC HAL層討論
- 8.5 本章總結和參考資料說明
- 8.5.1 本章總結
- 8.5.2 參考資料說明
- 第9章 深入理解GPS
- 9.1 概述
- 9.2 GPS基礎知識
- 9.2.1 衛星導航基本原理
- 9.2.2 GPS系統組成及原理
- 9.2.3 OMA-SUPL協議
- 9.3 Android中的位置管理
- 9.3.1 LocationManager架構
- 9.3.2 LocationManager應用示例
- 9.3.3 LocationManager系統模塊
- 9.4 本章總結和參考資料說明
- 9.4.1 本章總結
- 9.4.2 參考資料說明
- 附錄