天天看點

Linux Wireless基礎知識;IEEE802.11協定基礎知識

http://blog.csdn.net/myarrow/article/details/9271515

1. 基本概念

    • cfg80211:  用于對無線裝置進行配置管理。與FullMAC, mac80211和nl80211一起工作。(Kernel态)

    • mac80211: 是一個driver開發者可用于為SoftMAC無線裝置寫驅動的架構 (Kernel态)。

    • nl80211: 用于對無線裝置進行配置管理,它是一個基本Netlink的使用者态協定(User态)

    • WNIC : Wireless Network Interface Controller, 它總是指望硬體執行協定(如IEEE802.11)描述的功能。

    • MLME: 即MAC(Media Access Control ) Layer Management Entity,它管理實體層MAC狀态機。

    • SoftMAC: 其MLME由軟體實作,mac80211為SoftMAC實作提供了一個driver API。 即:SoftMAC裝置允許對硬體執行更好地控制,允許用軟體實作對802.11的幀管理,包括解析和産生802.11無線幀。目前大多數802.11裝置為SoftMAC,而FullMAC裝置較少。

    • FullMAC:  其MLME由硬體管理,當寫FullMAC無線驅動時,不需要使用mac80211。

    • wpa_supplicant: 是使用者空間一個應用程式,主要發起MLME指令,然後處理相關結果。

    • 

2. cfg80211

    cfg80211是Linux 802.11配置API。cfg80211用于代碼wext(Wireless-Extensions),nl80211用于配置一個cfg80211裝置,且用于kernel與userspace間的通信。wext現處理維護狀态,沒有新的功能被增加,隻是修改bug。如果需要通過wext操作,則需要定義CONFIG_CFG80211_WEXT。

      cfg80211 and nl80211: 基于消息機制,使用netlink接口

    wext: 基于ioctl機制

    • struct ieee80211_hw: 表示硬體資訊和狀态

    • ieee80211_alloc_hw:每個driver調用ieee80211_alloc_hw配置設定ieee80211_hw,且以ieee80211_ops為參數

    • ieee80211_register_hw:每個driver調用ieee80211_register_hw建立wlan0和 wmaster0,并進行各種初始化。

    • struct ieee80211_ops:每個driver實作它的成員函數,且它的成員函數都以struct ieee80211_hw做為第一個參數。在struct ieee80211_ops中定義了24個方法,以下7個方法必須實作:

       tx,start,stop,add_interface,remove_interface,config和configure_filter。

3. mac80211

    它是一個driver開發者可用于為SoftMAC無線裝置寫驅動的架構,mac80211為SoftMAC裝置實作了cfg80211回調函數,且mac80211通過cfg80211實作了向網絡子系統注冊和配置。配置由cfg80211通過nl80211和wext實作。

    mac80211在體系結構中的位置如下圖所示:

Linux Wireless基礎知識;IEEE802.11協定基礎知識
Linux Wireless基礎知識;IEEE802.11協定基礎知識

4. socket

Linux Wireless基礎知識;IEEE802.11協定基礎知識
Linux Wireless基礎知識;IEEE802.11協定基礎知識

http://wireless.kernel.org/en/developers/Documentation/

IEEE802.11協定基礎知識

http://blog.csdn.net/myarrow/article/details/9306961

1. 802.11管理功能–使用者接入過程

      STA (工作站)啟動初始化、開始正式使用、AP 傳送資料幀之前,要經過三個階段才能接入:

      (1) 掃描(SCAN) 

      (2) 認證(Authentication) 

      (3) 關聯(Association) 

Linux Wireless基礎知識;IEEE802.11協定基礎知識

1.1 802.11管理–掃描(SCAN)

      1)  若無線站點 STA 設成 Ad-hoc (無AP)模式:

         STA先尋找是否已有 IBSS(與STA所屬相同的SSID)存在,如有,則參加(join);若無, 則會自己建立一個IBSS,等其他站來 join。 

      2) 若無線站點 STA 設成 Infrastructure (有AP)模式:

           --主動掃描方式 (特點:能迅速找到)

              •依次在每個信道上發送Probe request封包,從Probe Response中擷取BSS的基本資訊, Probe Response包含的資訊和Beacon幀類似

           -- 被動掃描方式 (特點:找到時間較長,但STA節電)              

              • 通過偵聽AP定期發送的Beacon幀來發現網絡, Beacon幀中包含該AP所屬的BSS的基本資訊以及AP的基本能力級,包括: BSSID(AP的MAC位址)、 SSID、支援的速率、支援的認證方式,加密算法、 Beacons幀發送間隔,使用的信道等               • 當未發現包含期望的SSID的BSS時,STA可以工作于IBSS狀态

Linux Wireless基礎知識;IEEE802.11協定基礎知識

1.2  802.11管理功能–認證(Authentication) 

       802.11支援兩種基本的認證方式:         • Open-system Authentication           1) 等同于不需要認證,沒有任何安全防護能力           2) 通過其他方式來保證使用者接入網絡的安全性,例如Address filter、使用者封包中的SSID

      • Shared-Key Authentication          1) 采用WEP加密算法          2) Attacker可以通過監聽AP發送的明文Challenge text和STA回複的密文Challenge text計算出WEP KEY

      另外, STA可以通過Deauthentication來終結認證關系。

Linux Wireless基礎知識;IEEE802.11協定基礎知識

1.3 802.11管理功能–關聯(Association) 

     1) Association

         • STA通過Association和一個AP建立關聯,後續的資料封包的收發隻能和建立Association關系的AP進行      2) Reassociation          • STA在從一個老的AP移動到新AP時通過Reassociation和新AP建立關聯          • Reassociation前必須經曆Authentication過程      3) Deassociation          • STA通過Deassociation和AP解除關聯關系

Linux Wireless基礎知識;IEEE802.11協定基礎知識

2. 802.11相關協定

Linux Wireless基礎知識;IEEE802.11協定基礎知識

3. 802.11幀格式

Linux Wireless基礎知識;IEEE802.11協定基礎知識

3.1 802.11 MAC Header(MAC頭)

     • Frame Control(幀控制域)

     • Duration/ID(持續時間/辨別)

     • Address(位址域)

     • Sequence Control(序列控制域)

3.1.1 Frame Control(幀控制域)

     • Protocol Version(協定版本):通常為0;

     • Type(類型域)和Subtype(子類型域):共同指出幀的類型;

     • To DS:表明該幀是BSS向DS發送的幀;

     • From DS:表明該幀是DS向BSS發送的幀;

     • More Frag:用于說明長幀被分段的情況,是否還有其它的幀;

     • Retry(重傳域):用于幀的重傳,接收STA利用該域消除重傳幀;

     • Pwr Mgt(能量管理域):1:STA處于power_save模式;0:處于active模式;

     • More Data(更多資料域):1:至少還有一個資料幀要發送給STA ;

     • Protected Frame: 1:幀體部分包含被密鑰套處理過的資料;否則:0;

     • Order(序号域):1:長幀分段傳送采用嚴格編号方式;否則:0。

3.1.2 Duration/ID(持續時間/辨別)

     表明該幀和它的确認幀将會占用信道多長時間;對于幀控制域子類型為:Power Save-Poll的幀,該域表示了STA的連接配接身份(AID, Association Indentification)。

3.1.3 Address(位址域)

       Address(位址域):源位址(SA)、目的位址(DA)、傳輸工作站位址(TA)、接收工作站位址(RA),SA與DA必不可少,後兩個隻對跨BSS的通信有用,而目的位址可以為單點傳播位址(Unicast address)、多點傳播位址(Multicast address)、廣播位址(Broadcast address)。

3.1.4 Sequence Control(序列控制域)

      Sequence Control(序列控制域):由代表MSDU(MAC Server Data Unit)或者MMSDU(MAC Management Server Data Unit)的12位序列号(Sequence Number)和表示MSDU和MMSDU的每一個片段的編号的4位片段号組成(Fragment Number)。

3.2 Frame Body(幀體部分)

    包含資訊根據幀的類型有所不同,主要封裝的是上層的資料單元,長度為0~2312個位元組,可以推出,802.11幀最大長度為:2346個位元組;

3.3 FCS(校驗域)

    包含32位循環備援碼。

3.4 位址格式

1) 方案一:

Linux Wireless基礎知識;IEEE802.11協定基礎知識

     A和B 在同一個IBSS,A->B (Ad hoc無線自組網中的資料幀的位址格式)。

2) 方案二:

Linux Wireless基礎知識;IEEE802.11協定基礎知識

    從AP發出的無線資料幀中的位址格式。

3) 方案三:

Linux Wireless基礎知識;IEEE802.11協定基礎知識

    發到AP的無線資料幀中的位址格式。

4) 方案四:

Linux Wireless基礎知識;IEEE802.11協定基礎知識

    通過無線分布系統傳輸的無線資料幀中的位址格式。

4. WLAN拓撲結構

   WLAN有以下三種網絡拓撲結構:

     1) 獨立基本服務集(Independent BSS, IBSS)網絡(也叫ad-hoc網絡);

     2) 基本服務集(Basic Service Set, BSS)網絡;

     3) 擴充服務集(Extent Service Set, ESS)網絡。

    其各自的特點如下所示:

4.1 IBSS-無AP

Linux Wireless基礎知識;IEEE802.11協定基礎知識

也叫Ad Hoc 網(無線自組網):IBSS (Independent BSS,獨立基本服務集),無AP,站點間直接通信。

4.2 BSS-有AP

Linux Wireless基礎知識;IEEE802.11協定基礎知識

又名Infrastructured網(基礎設施網):有AP(Access Point, 接入點),無線站點通信首先要經過AP。

4.3 ESS-有AP和DS

Linux Wireless基礎知識;IEEE802.11協定基礎知識

    ESS:屬 Infrastructured 網 ( DS:配置設定系統,AP:接入點, SSID:ESS擴充服務集辨別符。一個移動節點使用某 ESS 的 SSID 加入到該擴充服務集中,一旦加入ESS,移動節點便可實作從該ESS的一個BSS到另一個BSS的漫遊)

5. 802.11幀類型

    針對幀的不同功能,可将802.11中的MAC幀細分為以下3類:

    • 資料幀:用于在競争期和非競争期傳輸資料;

    • 控制幀:用于競争期間的握手通信和正向确認(RTS信道預約、CTS預約成功、ACK等)、結束非競争期等,為資料幀的發送提供輔助功能;

    • 管理幀:主要用于STA與AP之間協商、關系的控制,如關聯、認證、同步等。

     Frame Control(幀控制域)中的Type(類型域)和Subtype(子類型域)共同指出幀的類型,當Type的B3B2位為00時,該幀為管理幀;為01時,該幀為控制幀;為10時,該幀為資料幀。而Subtype進一步判斷幀類型,如管理幀裡頭細分為關聯和認證幀

5.1 管理幀 (Management Frame)

Type SubType FrameType
00 0000 Association request (連接配接請求)
00 0001 Association response (連接配接響應)
00 0010 Reassociation request(重連接配接請求)
00 0011 Reassociation response(重連接配接聯響應)
00 0100 Probe request(探測請求)
00 0101 Probe response(探測響應)
00 1000 Beacon(信标,被動掃描時AP 發出,notify)
00 1001 ATIM(通知傳輸訓示消息)
00 1010 Disassociation(解除連接配接,notify)
00 1011 Authentication(身份驗證)
00 1100 Deauthentication(解除認證,notify)
00 1101~1111 Reserved(保留,未使用)

    ATIM:Announcement Traffic Indication Message,ATIM僅在ATIM視窗期間傳送,ATIM沒有負載。

5.2 控制幀 (Control Frame)

Type Subtype Frametype
01 1010 Power Save(PS)- Poll(省電-輪詢)
01 1011 RTS(請求發送,即: Request To Send ,預約信道,幀長20位元組)
01 1100 CTS(清除發送,即:Clear To Send ,同意預約,幀長14位元組)
01 1101 ACK(确認)
01 1110 CF-End(無競争周期結束)
01 1111 CF-End(無競争周期結束)+CF-ACK(無競争周期确認)

     RTS和CTS用于信道預約,CF-End+CF_ACK和ACK用于确認正确接收到幀。

    1) ACK幀

Linux Wireless基礎知識;IEEE802.11協定基礎知識

5.3 資料幀 (Data Frame)

Type Subtype Frametype
10 0000 Data(資料)
10 0001 Data+CF-ACK
10 0010 Data+CF-Poll
10 0011 Data+CF-ACK+CF-Poll
10 0100 Null data(無資料:未傳送資料)
10 0101 CF-ACK(未傳送資料)
10 0110 CF-Poll(未傳送資料)
10 0111 Data+CF-ACK+CF-Poll
10 1000 Qos Data
10 1001 Qos Data + CF-ACK
10 1010 Qos Data + CF-Poll
10 1011 Qos Data + CF-ACK+ CF-Poll
10 1100 QoS Null(未傳送資料)
10 1101 QoS CF-ACK(未傳送資料)
10 1110 QoS CF-Poll(未傳送資料)
10 1111 QoS CF-ACK+ CF-Poll(未傳送資料)

Linux Wireless子系統初始化

http://blog.csdn.net/myarrow/article/details/9300823

1. cfg80211_init

    • cfg80211_wq工作隊列主要處理以下工作:

       1) 清除:wireless_dev.cleanup_work

       2) 掃描:cfg80211_registered_device.scan_done_wk

       3) 事件:cfg80211_registered_device.event_work

    • 注冊netlink,其名為:"nl80211",其操作為:nl80211_ops

net/wireless/core.c

[cpp]  view plain copy

  1. static int __init cfg80211_init(void)  
  2. {  
  3.     int err;  
  4.         // 注冊網絡命名空間  
  5.     err = register_pernet_device(&cfg80211_pernet_ops);  
  6.     if (err)  
  7.         goto out_fail_pernet;  
  8.         // 注冊ieee80211_class類  
  9.     err = wiphy_sysfs_init();  
  10.     if (err)  
  11.         goto out_fail_sysfs;  
  12.         // 注冊網絡通知,以接收網絡事件  
  13.     err = register_netdevice_notifier(&cfg80211_netdev_notifier);  
  14.     if (err)  
  15.         goto out_fail_notifier;  
  16.         // 注冊netlink "nl80211",其操作為nl80211_ops  
  17.     err = nl80211_init();  
  18.     if (err)  
  19.         goto out_fail_nl80211;  
  20.         // 建立sys/class/ieee80211目錄  
  21.     ieee80211_debugfs_dir = debugfs_create_dir("ieee80211", NULL);  
  22.     err = regulatory_init();  
  23.     if (err)  
  24.         goto out_fail_reg;  
  25.         // 建立名為“cfg80211”的核心線程  
  26.     cfg80211_wq = create_singlethread_workqueue("cfg80211");  
  27.     if (!cfg80211_wq)  
  28.         goto out_fail_wq;  
  29.     return 0;  
  30. out_fail_wq:  
  31.     regulatory_exit();  
  32. out_fail_reg:  
  33.     debugfs_remove(ieee80211_debugfs_dir);  
  34. out_fail_nl80211:  
  35.     unregister_netdevice_notifier(&cfg80211_netdev_notifier);  
  36. out_fail_notifier:  
  37.     wiphy_sysfs_exit();  
  38. out_fail_sysfs:  
  39.     unregister_pernet_device(&cfg80211_pernet_ops);  
  40. out_fail_pernet:  
  41.     return err;  
  42. }  
  43. subsys_initcall(cfg80211_init);