802.11包括了MAC層和PHY層。根據圖3-4可知這兩層內部都對應有Entity,它們通過SAP(Service Access Point)為對應的上層提供服務。圖3-27展示了802.11中的Entity和SAP。
:-: 
圖3-27 802.11 Entity模型
由圖3-27可知:
* MAC_SAP為LLC層提供服務,其具體內容見3.3.5節“MAC服務定義”。
* MAC子層中還有專門負責管理的Entity,名為MLME(MAC Sublayer Management Entity),它對外提供的接口是MLME_SAP。
* PHY層還可細分為PLCP和PMD兩層(本書不討論)。
* 物理層對外提供的管理實體是PLME(PHY Sublayer Management Entity),對應的SAP縮寫為PLME_SAP。
* 為了方便對802.11 MAC及PHY層統一操作和管理,規范還定義一個SME(StationManagement Entity)。該實體獨立于MAC和PHY層。使用者可通過SME實體來操作MAC層和PHY層中的SAP。
本節重點關注MAC的管理Entity(即MLME)及其對應的SAP。規范中關于MLME_SAP一共有82個原語,其中一部分如圖3-28所示。
:-: 
圖3-28 MLME SAP部分內容
原語的定義曾在3.3.5節MAC服務定義中見過,它其實就是通過定義API來表達自己所具有的功能。MLME_SAP非常多,本章不可能全部覆蓋,此處僅介紹三個常用的原語。
* Scan:用于掃描周圍的無線網絡。
* Authenticate:關聯到某個AP前,用于STA的身份驗證。
* Associate:關聯某個AP。關聯成功后,STA就正式加入無線網絡了。
* * * * *
**提醒** 請讀者務必注意一點,理解MLME_SAP原語對掌握Wi-Fi技術非常重要。從編程角度來說,MLME_SAP相當于定義了一套接口函數,而后續章節將介紹的wpa_supplicant只是對它們的實現。
* * * * *
**1.Scan介紹**
原語的參數比較多,但并不是所有參數都需要(由對應的MIB項控制),本書僅介紹比較重要的參數(用加粗字體表示)。
(1)request
Scan.request原語用于掃描周圍的無線網絡,其原型如下。
~~~
MLME-SCAN.request(
BSSType,BSSID,SSID,ScanType,ProbeDelay,
ChannelList,MinChannelTime,MaxChannelTime,
RequestInformation, SSID List,
ChannelUsage,AccessNetworkType,HESSID,MeshID,VendorSpecificInfo
)
~~~
Scan參數中,比較幾個重要的分別如下。
* BSSType:類型為枚舉(Enumeration),可取值為INFRASTRUCTURE、INDEPENDENT、MESH、ANY_BSS。
* BSSID:類型為MAC地址。可以是某個指定的BSSID或者廣播BSSID。
* SSID:類型為字符串。0~32字節長。指定網絡名,如果長度為0,則為wild ssid。
* ScanType:類型為枚舉,可取值為ACTIVE(主動)、PASSIVE(被動)。詳情見下文。
* ProbeDelay:類型為整型,單位為微秒。用于ACTIVE模式的掃描,詳情見下文。
* ChannelList:類型為有序整數列表(Ordered set of integers),掃描時使用。
* MinChannelTime和MaxChannelTime:類型均為整型。用于指示掃描過程中在每個信道上等待的最小和最長時間。時間單位為TU。
由Scan.request的ScanType參數可知,802.11規定了兩種掃描模式。
* ACTIVE模式:這種模式下,STA在每個Channel(信道)上都會發出Probe Request幀用來搜索某個網絡。具體工作方式是,STA首先調整到某個信道,然后等待來幀指示(表明該信道有人使用)或超時時間ProbeDelay。兩個條件滿足任意一個,STA都將發送Probe Request幀,然后STA在該信道上等待最少MinChannelTime時間(如果在此時間內信道一直空閑),最長MaxChannelTime時間。
* PASSIVE模式:這種模式下,STA不發送任何信號,只是在ChannelList中各個信道間不斷切換并等待Beacon幀。根據前述介紹可知,在基礎結構型網絡中AP會定時發送Beacon幀以宣告網絡的存在。所以,PASSIVE模式下,STA能根據Beacon幀來了解周圍所存在的無線網絡。
(2)confirm
Scan.confirm用于通知掃描結果,其原型定義如下。
~~~
MLME-SCAN.confirm(
BSSDescriptionSet,BSSDescriptionFromMeasurementPilotSet,
ResultCode,VendorSpecificInfo
)
~~~
* BSSDescriptionSet:類型為BSSDescription列表。具體內容見下文。
* ResultCode:類型為枚舉,可取值為SUCCESS和NOT_SUPPORTED。
BSSDescription包含很多內容,常見項如表3-12所示。
:-: 
獲取周圍的無線網絡后,STA可以選擇加入(join)其中的一個BSS。規范沒有定義網絡加入的原語,但實際上大部分無線網卡在實現時,都需要join相關的處理。因為如果周圍存在多個無線網絡時,需要用戶參與來選擇加入哪一個網絡。BSSDescription全部取值列表請參考規范6.3.3.3.2節。
**2.Authenticate介紹**
關聯到某個AP前,STA必須通過身份驗證。該處理由Authenticate對應的原語來完成。由于身份驗證涉及兩個STA(以基礎結構型網絡為例,一個是STA,另一個是AP),所以Authenticate包含4個原語,分別如下。
* MLME-Authenticate.request:STA A向AP B發起身份驗證請求。
* MLME-Authenticate.confirm:STA A收到來自AP B的身份驗證處理結果。
* MLME-Authenticate.indication:AP B收到來自STA A的身份驗證處理請求。
* MLME-Authenticate.response:AP B向STA A發送身份驗證處理結果。
先來看request和confirm原語。
(1)request和confirm
request和confirm原語原型如下。
~~~
MLME-AUTHENTICATE.request(
PeerSTAAddress,AuthenticationType, AuthenticateFailureTimeout,
Content of FT Authentication elements,
Content of SAE Authentication Frame,
VendorSpecificInfo
)
// confirm原型
MLME-AUTHENTICATE.confirm(
PeerSTAAddress,AuthenticationType, ResultCode,
Content of FT Authentication elements,
Content of SAE Authentication Frame,
VendorSpecificInfo
)
~~~
上述原語定義說明如下。
- PeerSTAAddress:類型為MAC地址,代表對端STA的地址。以本例而言,則是AP B的MAC地址。
- AuthenticationType:類型為枚舉,可取值有OPEN_SYSTEN、SHARED_KEY、FAST_BSS_TRANSITION和SAE。用于表示認證過程中使用的認證類型。這部分內容見3.3.7節無線網絡安全相關介紹。
- AuthenticateFailureTimeout:類型為整型,代表認證超時時間,單位為TU。
- ResultCode:代表認證處理結果。
MLME-AUTHENTICATE.request將觸發STA A發送Authenticate幀。下面來看AP B如何處理收到的這個Authenticate幀呢?
(2)indication和response
這兩個原語定義和request以及confirm基本一樣。
~~~
MLME-AUTHENTICATE.indication(
PeerSTAAddress,AuthenticationType,
Content of FT Authentication elements,
Content of SAE Authentication Frame,
VendorSpecificInfo
)
// response原型
MLME-AUTHENTICATE.response(
PeerSTAAddress,AuthenticationType, ResultCode,
Content of FT Authentication elements,
Content of SAE Authentication Frame,
VendorSpecificInfo
)
~~~
indication和對應的response參數與request以及confirm一樣,此處不詳述。
**3.Associate介紹**
STA通過身份驗證后,就需要和AP關聯。只有關聯成功后,STA才正式成為無線網絡的一員。
* * * * *
**注意** 對于RSN,關聯成功后還需通過802.1X身份驗證。相關內容留待3.3.7節介紹。
* * * * *
Associate包含的原語和Authentication一樣,都有request、confirm、indication和response。我們先來看request和confirm。
(1)request和confirm
request和confirm原語定義如下。
~~~
MLME-ASSOCIATE.request(
PeerSTAAddress, AssociateFailureTimeout,CapabilityInformation,
ListenInterval,Supported Channels,
RSN,
QoSCapability,Content of FT Authentication elements,SupportedOperatingClasses,
HT Capabilities,Extended Capabilities,20/40 BSS Coexistence, QoSTrafficCapability,
TIMBroadcastRequest,EmergencyServices,VendorSpecificInfo
)
// confirm原語
MLME-ASSOCIATE.confirm(
ResultCode,CapabilityInformation,AssociationID,SupportedRates,
EDCAParameterSet,RCPI.request,RSNI.request,RCPI.response,
RSNI.response,RMEnabledCapabilities,Content of FT Authentication elements,
SupportedOperatingClasses,HT Capabilities,Extended Capabilities,
20/40 BSS Coexistence, TimeoutInterval,BSSMaxIdlePeriod,TIMBroadcastResponse,
QosMapSet,VendorSpecificInfo
)
~~~
上述原語中包含的參數信息如下。
- PeerSTAAddress:響應Association請求的STA的MAC地址,即AP的地址。
- AssociateFailureTimeout:類型為整型,代表關聯超時時間,單位為TU。
- CapabilityInformation:指定AP的性能信息。
- ListenInterval:用于告知AP,STA進入PS模式后,監聽Beacon幀的間隔時間。
- RSN:類型為RSNE,指示STA選設置的安全方面的信息。詳情見3.3.7節。
- ResultCode:AP返回的處理結果。
- AssociationID:AP返回的關聯ID。
- SupportedRates:AP返回的所支持的傳輸速率列表。速率以500kbps為單位。
(2)indication和response
indication和response原語定義如下。
~~~
MLME-ASSOCIATE.indication(
PeerSTAAddress,CapabilityInformation,ListenInterval,SSID,SupportedRates,
RSN,QoSCapability,RCPI,RSNI,RMEnabledCapabilities,
Content of FT Authentication elements,SupportedOperatingClasses,
DSERegisteredLocation,
HT Capabilities,Extended Capabilities,20/40 BSS Coexistence,QoSTrafficCapability,
TIMBroadcastRequest,EmergencyServices,VendorSpecificInfo
)
// response原語
MLME-ASSOCIATE.response(
PeerSTAAddress,ResultCode,CapabilityInformation,AssociationID,
EDCAParameterSet,RCPI,RSNI,RMEnabledCapabilities,
Content of FT Authentication elements,
SupportedOperatingClasses,DSERegisteredLocation,HTCapabilities,
Extended Capabilities,
20/40 BSS Coexistence, TimeoutInterval,BSSMaxIdlePeriod,TIMBroadcastResponse,
QoSMapSet,VendorSpecificInfo
)
~~~
上述原語和參數中,只有indication的SSID略有不同,它代表發起關聯請求的STA的MAC
地址。
**4.STA狀態轉換[24]**
上面原語操作成功后,STA狀態將發生變化。STA從最初到最終的狀態切換如圖3-29所示。
:-: 
圖3-29 STA狀態切換
圖3-29中包含很多知識點,下面一一介紹它們。首先是MAC幀Frame的類別(Class),規范定義MAC幀一共有三種類別,分別是Class 1、Class 2和Class 3,各自包含不同的MAC幀,如表3-13所示。
:-: 
結合圖3-29,可知STA在不同狀態下發送的MAC幀類別也不同。這主要是和網絡安全有關,沒有通過身份驗證的STA是不允許隨意傳輸數據的。圖3-29中,STA的狀態轉換如下(以基礎結構型網絡為例)。
- STA首先處于State 1,即未認證和未關聯的情況。為了能加入無線網絡,它需要發送Authentication幀給AP。如果認證成功,將轉入State 2。State 1情況下不能發送數據幀。
- State 2是已認證,未關聯狀態。STA將發送Association幀給AP進行關聯。成功后,進入State 3。State 2情況下也不能發送數據幀。
- State 3屬于已認證,已經關聯,但還未通過RSN(Robust Security Network,強健安全網絡)認證的狀態。RSN采用802.1X進行控制。由于未通過RSN認證,所以只能發送處理認證的數據幀,即4-Way Handshake(四次握手)幀。這部分內容在3.3.7節介紹。
- 4-Way Handshake成功后,STA進入State 4。此時它完全加入無線網絡,所有數據幀就能正常傳輸。
MAC管理實體包含的功能很多,不過對程序員來說,其理解難度反而較小,因為它定義的原語類似代碼中的API,而且每個參數的作用有詳盡的解釋。讀者以后在分析wpa_supplicant的時候,不妨多回顧本節內容。
- 前言
- 第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 參考資料說明
- 附錄