Try   HackMD

vwifi 背景知識

Management Architecture

80211 管理架構由三個元件組成

  • MAC layer management entity (MLME)
  • physical-layer management entity (PLME)
  • system management entity (SME)
    SME 是使用者或設備驅動程序跟 802.11 網路界面互動和取得狀態訊息的方式
    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →

MAC 與 PHY 協議層皆可訪問 management information base,簡稱 MIB,MIB 簡單來說可供查詢狀態信息。
圖中共有三個 SAP(Service Access Point, 用於資料轉送)

  • SME-MLME SAP
  • SME-PLME SAP
  • MLME-PLME SAP

在這些管理元件之間定義了三個界面(箭頭)。 SME 可通過 MLME 和 PLME 服務界面來更改 MAC 與 PHY MIB。此外,MAC 有所改變,相對地 PHY 也要有所變動,所以在 MLME 與 PLME 之間必須存在一層界面,讓 MAC 得以變更 PHY。

接下來簡單介紹規格書中的四種 Primitive(基礎呼叫)

  • Request
  • Indication
  • Response
  • Confirm

MLME 如何和 SME 溝通

一般來說,上層(網路層)會向 LLC(Logical Link Control) 提出服務要求,這時候就是透過 SME 向 MLME 提出 Request Primitive。
MLME 會用 Confirm Primitive 作為該 request 的回應。
至於 Indication Primitive 則是 MLME 要把通知傳給上層時使用。
而對應的回覆則是 Response Primitive。

以 Measurement request 為例

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

Request 代表要做 Measurement 的請求
Confirm 代表 Request 成功傳送出去
Indication 在這表示 MLME 收到 Measurement 請求,並把它轉傳給 SME
之後便是執行 Measurement
最後把 report 透過 Request 回傳給原本的 STA

MLME 規格, IEEE 802.11 2007 spec 第十章 Layer management

4 way handshake

4 way handshake 是用來在無線網路中的 authenticator(ex: AP) 和 supplicant(STA) 之間產生密鑰的過程,密鑰用來加密傳送的訊息。
首先間介紹會用到的密鑰,鑰匙是由圖片的上到下依序生成。

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

  • MSK (Master Session Key):The first level key(MSK) is generated by the process of 802.1X/EAP or PSK(pre-shared key, 可以理解成由 WI-FI 密碼生成) authentication.
  • GMK (Group Master Key) & PMK (Pairwise Master Key): The second level key is generated from MSK is PMK and GMK.
    要注意的是 PMK 是不需要共享的,authenticator 和 supplicant 雙方可以各自生成。
  • PTK (Pairwise Transient Key): PTK 用來加密所有 unicast 的流量,在每一組 authenticator 和 supplicant 之間的 PTK 都是唯一的。
    PTK 的生成公式: PTK = PRF (PMK + Anonce + SNonce + Mac (AA)+ Mac (SA))
    • Anonce: 由 authenticator 產生的隨機數
    • Snonce: 由 supplicant 產生的隨機數
    • MAC: 代表 MAC address
    • PRF: Pseudo-random function,把輸入當成種子,用來產生一組隨機數,也就是 PTK。
  • GTK (Group Temporal Key): 由 GMK 生成,GTK 用來加密所有 broadcast 和 multicast 流量,GTK 在 authenticator 和所有 supplicant 之間是共用的(也可以理解成每個 supplicant 都有屬於自己的 GTK)。

4 way handshake 流程
EAPOL (Extensible authentication protocol over LAN): 屬於無線網路協定裡 IP Layer 以下的通訊協定,可以讓使用者在未經過 EAP 認證以前的封包,透過 EAPOL 的傳送。

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

  1. authenticator 通過 unicast 的方式將 Anonce 傳送給 supplicant
  2. supplicant 收到後就可以組成 PTK,然後將 Snonce 和 MIC(Message integrity code, 用於檢驗訊息完整性) 傳給 authenticator。
  3. authenticator 收到後也可以生成 PTK,之後將加密的 GTK 和另一個 MIC 給 supplicant。
  4. supplicant 回覆 authenticator 密鑰已經安裝設定好了。

簡述 MIC(Message integrity code) 流程:
發送端在送出封包前,把未加密過的資料內容透過 Michael 演算法,求得一個 64 bits 的 MIC 值,對接收端來說,把收到的封包解密後,依樣針對資料內容透過 Michael 演算法計算一次 MIC 值,如果一致就表示封包正確無誤,如果不一致就表示封包在傳輸過程中發生錯誤。

reference: https://www.wifi-professionals.com/2019/01/4-way-handshake

Scan

使用任何網路之前,首先必須找出網路何在。使用有線網路,要找出網絡所在並不難,只要循著網線或者找到牆上的插座即可。
在無線領域中,工作站加入任何網路之前,必須先經過辨識的工作。這樣的程序稱為掃描(scanning)。
掃描時的參數:

  • BSSType: 指定要搜尋的網路類型是 independent ad hoc、infrastructure or both
  • BSSID(individual 或 broadcast): 工作站可以針對所要加入的特定網絡(individual)進行掃描,或者掃描允許該工作站加入的所有網絡(broadcast)。在掃描期間將 BSSID 設為 broadcast 不失為一項好主意,因為掃描的結果會將該地區所有的 BSS 涵蓋在內。
  • SSID ("network name"): SSID 用來指定某個延伸服務組合(extended service set)的位元串,一般來說都會被用來表示網路的名稱。
  • ScanType(active 或 passive): 主動掃描會主動傳送 Probe Request frame,以辨識該區有哪些網絡存在。被動掃描則是被動聆聽 Beacon frame,以節省電池的電力。
  • ChannelList: 進行被動掃描時就是在某個 Channel 聆聽目前有哪些網絡存在。 802.11 允許工作站指定所要嘗試的頻道表(ChannelList)。
  • ProbeDelay: 主動掃描探測某個頻道期間,為了避免工作站一直等不到 Probe Response frame,所設置的計時器,以微秒為單位。用來防止某個閒置的頻道讓整個程序停擺。
  • MinChannelTime & MaxChannelTime: 掃描每個特定頻道時,所使用的最小與最大的時間量。

被動掃描
被動掃描(passive scanning)可以節省電池的電力,因為不需要傳送任何信號。在被動掃描中,工作站會在頻道表(channel list)所列的各個頻道之間不斷切換,並且會記錄來自所收到的 Beacon frame。
Beacon 為了讓工作站(STA)得知,加入某個基本服務組合(basic service set,簡稱 BSS)所需要的參數,以便進行通訊。

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

行動式工作站以被動掃描找出該區所有 BSS
通過聆聽來自前三部基站的 Beacon frame。
如果該工作站並未收到來自第四部基站的 Beacon,
就會回報目前只發現三個 BSS。

主動掃描
在主動掃描(active scanning)中,工作站扮演比較積極的角色。在每個頻道上,工作站都會發出 Probe Request frame(通常都是 broadcast),請求某個特定網路予以回應。
以下為流程

  1. 跳至某個頻道,如果在這個頻道收得到 frame (任何一種 frame),就證明該頻道有人使用,因此可以加以探測。
    ProbeDelay 計時器用來防止某個閒置頻道讓整個程序停擺,所以工作站不會一直聽候 frame 到來。
  2. 利用基本的 DCF 訪問程序取得介質使用權,然後送出一個 Probe Request frame。
  3. 至少等候一段最短的頻道時間(MinChannelTime)
    • 如果介質並不忙碌 (AP 沒有回覆),表示沒有網路存在。因此可以跳至下個頻道。
    • 如果在 MinChannelTime 這段期間介質非常忙碌,就繼續等候一段時間,直到最長的頻道時間(即 MaxChannelTime),然後處理任何的 Probe Response frame。

當網路(例如基站)收到搜尋其所屬之延伸服務組合的 Probe Request,就會發出 Probe Response frame。
在 infrastructure(基礎型)網絡裡,是由基站負責傳送 Beacon frame,因此它也必須負責回應以 Probe Request 在該區搜尋網絡的工作站。
在 IBSS(獨立型基本服務組合)中,工作站彼此輪流負責傳送 Beacon frame,因此負責傳送 Probe Response 的工作站會經常改變。

單一 Probe Request 導致好幾個 Probe Response 的情況很常見。掃描程序的目的在於
找出工作站可以加入的所有基本服務區域(BSS),因此一個 broadcast Probe Request 會收到範圍內所有基站的回應,範圍內的獨立型 BSS 如果收到也會予以回應。

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

在圖中,某部行動式工作站發出 probe request,而有 2 部基站加以回應。在介質(medium)中進行的動作如圖所示。在取得介質使用權後,進行主動掃描的工作站會送出 Probe Request。接著有 2 部基站問時以 Probe Response 回覆,其中包含它們的網路參數。
第二個 Probe Response 受限於分散式協調功能(distributed coordination function)的規則,在傳送之前必須等待競爭時期(congestion window)結束。
第一個回應在最短回應時間(minimum response time)結束之前即已送出,因此工作站會繼續等候至最長回應時間(maximum response time)結束,才會去查看所收到的信息,所以調整 maximum response time 也是必須的。

Scan Report
掃描結束後會產生一份報告。這份報告列出了該次掃描所發現的所有 BSS 及其相關參數。進行掃描的工作站可以利用這份完整的參數清單,加入(join)其所發現的任何網絡。

Joining
掃描結彙整之後,工作站即可選擇其中一個 BSS 加入。加入網路(joining)是建立連接的前置過程。
不過此時還不能訪問網絡,訪問網絡之前,必須經過 authentication (身份認證)以及 association (連接)。

Authentication

IEEE 802.11 提供兩種認證方式:開放式系統(Open System)與共享式密鑰(Shared Key)

Open-System Authentication:

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

在 802.11 中,工作站是以 MAC 地址為身份證明。和 Ethernet 網絡一樣,網路上的 MAC 地址必須獨一無二,因此可作為工作站的身份證明。基站以這些 frame 的來源地址作為發送者的身份證明。
身份認證要求包含兩個信息元素,

  • 身份認證算法代號(Authentication gorithm Identification)被設置為 0,代表使用開放系統認證方式。
  • 身份認證交易順序編號 (Authentication Transaction Sequence number)被設置為 1,代表該 frame 實際上為交易順序中第一個 frame。

基站接著會處理身份認證要求,然後傳回結果。和第一個 frame 一樣,類型為 authentication 的管理 frame。其中包含三個信息元素:

  • 身份認證算法代號 位被設置為 0,代表使用開放系統身份認證。
  • 順序編號為 2。
  • 另外還有一個狀態碼(status Code)用來顯示身份認證要求的結果。

Shared-Key Authentication

認證表示求證雙方都共同擁有一隻秘密鑰匙,認證時便依照此秘密鑰匙來證實對方的身分。這隻秘密鑰匙也許是透過某一個認證系統所分配,或是透過人工的傳遞,這已不是 IEEE 802.11 所管轄的範圍。

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

共享式密鑰的運作程序共四個步驟

  1. 第一個 frame 其中所包含的訊息有,用以識別所使用的認證算法以及順序編號;身份認證算法代號被設置為 1,代表使用「共享密鑰身份認證」。
  2. 共享密鑰交換程序的第二個 frame 扮演把關的角色。第二個 frame 最多包含四個訊息元素。這些訊息元素包括身份認證算法代號、順序編號,以及狀態碼。基站可能以此 frame 拒絕身份認證要求,從而中止整個交易程序。要進行下一個步驟,狀態碼必須為 0(代表成功)
    如果狀態碼顯示成功,則此 frame 還會包含第四個信息元素,亦即 Challenge Text。
    Challenge Text 的長度為 128 個位元組,由 WEP 密鑰串流產生器(keystream generator)利用隨機密鑰(random key)及初始向量(initialization vector)產生。
  3. 第三個 frame 是行動式工作站對 Challenge Text 所做出的答覆。為了證明本身俱備訪問網路的權限,行動式工作站將會以三項信息元素組成一個管理 frame:身份認證算法代號、值為 3 的順序編號,以及 Challenge Text。
    在傳送此 frame 之前,行動式工作站將會以 WEP 進行處理。標頭部分會保留不予處理,因為必須利用它來辨識,其是否為身份認證 frame,其餘部分則通過 WEP 予以加密。
  4. 收到第三個 frame 後,基站會試圖予以解密,然後驗證 WEP 的完整性。如果該 frame 可通過完整性檢查(integrity check)的驗證,而且可從中解讀出 Challenge Text,基站就會以成功的狀態代碼來回覆。
    若能成功解讀 Challenge Text,證明該行動式工作站已經設置好加入該網路所需的 WEP 密鑰,因此應該允許其訪問網絡。如果有任何問題發生,基站便會傳回代表失敗的狀態碼。

Preauthentication

事先身份認證( preauthentication ) 用來加速連接(association)關係的移轉。從工作站決定轉移至新基站,到新基站開始傳送 frame 給工作站,身份認證是這段期間內最容易造成延遲的因素。
Preauthentication 的目的就是縮短這段時間,在需要之前先進行這項費時的過程以建立彼此的關係。

在與基站連接之前,工作站必須先經過身份認證,不過 802.11 標準並未要求身份認證之後必須立即進行連接過程(association)。
在 scan 階段,工作站可以跟多個基站進行 802.11 身份認證,如此一來,當有需要時就可以立即進行連接過程(association)。這種做法稱為事先身份認證(preauthentication)。
事先身份認證的好處是,一旦進入基站的涵蓋範圍,工作站就可以立即與基站重新連接(reassociate),而不必等候認證交換程序。

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

Association

一旦完成身份認證,工作站就可以跟基站進行連接(或者跟新的基站進行重新連接),以便獲得網路的完全訪問權。連接(association)屬於一種記錄(recordkeeping)程序,它讓傳輸系統(distribution system)得以記錄每部行動式工作站的位置,以便將傳送給行動式工作站的 frame,轉送給正確的基站。
形成連接之後,基站必須為該行動式工作站在網絡上註冊,如此一來,發送給該行動式工作站的 frame,才會轉送至其所屬基站。

One method of registering is to send a gratuitous ARP so the station's MAC address is associated with the switch port connected to the access point.

連接只限於 infrastructure(基礎型)網絡,在邏輯上等同於在有線網絡中插入網線。
一旦完成此程序,無線工作站就可以通過傳輸系統(DS)與整個世界連接,而其他人也可以經由傳輸系統予以回應。
802.11 在規格中公開禁止工作站同時與一部以上的基站形成連接。

Association Procedure

  1. 一旦行動式工作站與基站完成身份認證,便可送出association request(連接要求)frame。
    尚未經過身份認證的工作站,基站會回覆一個 Deauthenticaton frame。
  2. 基站隨後會對連接要求進行處理(802.11 標準並未規範如何判定准許連接與否),一旦連接要求獲准,基站就會以代表成功的狀態代碼 0 及連接識別碼 (Association ID,簡稱 AID) 來回應。 AID 本身是數值形式的識別碼,在邏輯上則是用來辨識暫存 frame 所要傳遞的行動式工作站(More detail on the process can be found in Section 7.5 of this chapter),連接要求如果失敗,就只會傳回狀態碼,並且中止整個程序。
  3. 基站開始為行動式工作站處理 frame,所使用的傳輸系統介質通常是 Ethernet。當基站所收到的 frame 目的地為與之連接的行動式工作站時,就會將該 frame 從 Ethernet 橋接至無線介質,如果該行動式工作站處於省電狀態,則為之暫存 frame。
Reassociation Procedure

重新連接(reassociation)是指將連接關係自舊基站移轉至新基站的程序。
整個程序開始之前,行動式工作站必須已連接某部基站。工作站會持續監測從目前的基站以及同一個 ESS 中其他基站所收到的信號之品質。一旦行動式工作站檢測到其他基站或許是較好的連接對象時,就會啟動重新連接程序。
一般來說要轉台的因素可以用 Beacon frame 來做為參考。
再進行以下的程序之前,行動式工作站必須先完成身分認證(authentication)的步驟。

  1. 行動式工作站對新的基站發出 Reassociation Request(重新連接要求)。 Reassociation Request 的內容與 Association Request(連接要求)相同,唯一的差別在於 Reassociation Request frame 中包含了一個用來紀錄舊基站地址的字段。
    新基站必須與舊基站取得連繫,以判定該工作站之前的連接是否存在(基站間的溝通是用 inter-access point protocol, IAPP 來進行),如果新基站無法驗證舊基站是否已經對工作站進行過身份認證,新基站就會回應一個 Deauthenticatoin frame,同時中止整個程序。
  2. 基站開始處理 Reassociaton Request,回覆與 Reassociaton 相同。
  3. 新基站和舊基站取得連繫(透過 IAPP)
  4. 舊基站把「為該行動式工作站所暫存的 frame」移交給新基站。舊基站中止其與該行動式工作站間的連接關係。行動式工作站同時間只能與一部基站連接。
  5. 如果有暫存的 frame 從舊基站傳過來,新基站開始為該行動式工作站處理這些 frame。

802.11 frame types

主要有三種類別: data、control、management frame
data frame 負責在工作站之間傳輸數據。data frame 可能會因為所處的網路環境不同而有所差異。control frame 通常與 data frame 搭配使用,負責區域的清空、channel 的取得以及 carrier-sensing 的維護,並於收到數據時予以正面的應答(ACK),藉此促進工作站間數據傳輸的可靠性。management frame 負責監督,主要用來加入或退出無線網路,以及處理基站之間連接的轉移事宜。

Data Frames

Frame Control

  • Protocol Version:802.11 協定版本
  • Type and Subtype:Type 欄位表示此訊框型態,目前定義有三種:Data、Control 與 Management 訊框,每一種型態都包含若干種子型態,由 Subtype 欄位指定。
  • To DS, From DS: 後面會提。
  • More Frag:此旗號值若為 1,表示此訊框後面還有其他片段(Fragment)會繼續傳送過來。若後面已無其他片段訊框,則為 0。
  • Retry:此旗號值為 1,表示此 Data 訊框(或管理訊框)為重送的訊框,接收端可依此判斷接收或拋棄。
  • Pwr Mgt:此旗號用來顯示工作站是否處於電源管理模式(Power Management)。如其值為 1,表示此工作站正處於省電模式;其值為 0,表示此工作站處於正常工作狀態。
  • More Data: 為了服務處於省電模式的工作站,基站會將這些由“傳輸系統”接收而來的幀加以暫存。
  • Protected Frame bit:此旗號值為 1 時,表示該訊框所攜帶的資料已經過 WEP 加密處理,否則該值為 0。
  • Orderbit: 訊框與訊框片段可依序傳送,不過發送端與接收端的 MAC 必須付出額外的代價。一旦進行“嚴格依序”傳送,此 bit 被設定為 1。
Duration

位用來記載網路分配向量(NAV)的值。訪問介質的時間限制是由 NAV 所指定。data frame 之 Duration 的設定,必須依循四項規範

  1. 免競爭期間(contention-free period)所傳遞的任何 frame,必須將 Duration 設定為 32768。此規範適用於免競爭期間所傳遞的任何 data frame。
  2. broadcast 和 multicast frame,其 Duration 為 0。此類 frame 並非基本交換過程的一部分,接收端也不會加以應答,因此競爭式介質訪問可以在 broadcast 和 multicast 結束後立即開始。
  3. 如果 Frame Control 位中的 More Fragments bit 為 0,表示該 frame 已無其餘片段。最後的 frame 片段 只須為本身的應答預訂介質使用權(SIFS+ACK),之後就可以恢復競爭式訪問了。 倒數第二個片段的 Duration,會為最後一個片段鎖住介質使用權。
  4. 如果 Frame Control 位的 More Fragmentsbit 被設定為 1,表示其後還有 frame 片段。因此,Duration 便會被設定為發送兩個 ACK、加上三個 SIFS 及下一個 frame 片段所需要的時間。
Addressing and DS Bits

ToDS+FromDS 的四種組合:

  • 00: Data 訊框由一個工作站直接傳送給同一分散式系統下的另一個工作站
    在 IBSS 中,所使用的 address 位有三種。
    第一個地址代表接收端,同時也是 IBSS 網路中的目的地址。第二個地址是源地址。在這些地址之後是 IBSS 的 BSSID。
    當無線 MAC 收到一個 frame 時,首先會去檢查 BSSID,只有 BSSID 與工作站相同的 frame,才會交由上層協議加以處理。

  • 10: Data 訊框傳送給分散式系統

  • 01: Data 訊框由分散式系統傳下來

  • 11: 在無線分散式系統(Wireless Distribution System, WDS)下,由一個 AP 傳送給另一個 AP。

Control Frames

Control frames 主要在協助 data frame 的傳遞。它們可用來監督無線介質的訪問(但非介質本身),以及提供 MAC 層次的可靠性。

Frame Control

Type 為 01
ToDS 和 FromDS: Control Frame 負責處理無線介質的訪問,因此只能夠由無線工作站產生。傳輸系統並不會收送 control frame,因此這兩個 bit 必然為 0。
More Fragments bit: control frame 不可被切割,這個 bit 必為 0。
Retry bit: 不像管理或數據 frame 那樣,必須在序列中等候重送,因此這個 bit 必然為 0。
More Data bit: 只用於 data frame,所以在此為 0。
Protected Frame bit: control frame 不須加密,因此為 0。
Order bit: Control frame 是 atomic frame exchange operation,也就是說會照順序傳送,所以這個 bit 為 0。

RTS(Request to send)

RTS frame 可用來取得介質的控制權。
RTS frame 只包含標頭。frame 主體中並未包含任何資料,標頭之後即為 FCS。


Frame Control 的 subtype 為 1011,代表 RTS。
Duration: RTS 會試圖預定介質使用權(以微秒為單位),讓後續的 frame 交換程序使用,整個過程需要三個 SIFS、一個 CTS、一個 ACK 和第一個 frame 的發送時間。

CTS (Clear to send)

CTS 用於應答 RTS,frame control 的 subtype 為 1100,代表 CTS,。

Duration: CTS 會以 RTS 的 duration 做為計算基準,

Acknowledgment (ACK)

ACK frame 就是任何數據傳輸(包括一般傳輸、RTS/CTS、fragmented frames)所需要的正面應答(positive acknowledgment)


Duration: 依照 ACK 在整個 frame 交換過程中位居何處,duration 的值可以有兩種設定方式。

  • 在完整的 data frame 及 一連串 frame 片段的最後一個片段中,duration 會被設定為 0。數據發送端會將 Frame Control 中的 More Fragments bit 設定為 0,表示數據傳輸已經結束。如果 More Fragments bit 為 0,表示整個傳輸已經完成,沒有必要再延長對介質的控制權,因此會將 duration 設定為 0。
  • 如果 More Fragments bit 為 1,表示尚有 frame 片段仍在發送中。此時 Duration 位的算法和 CTS frame 中的 Duration 計算方法相同。
    發送 ACK 以及 SIFS 所需要的時間,將由最近的 frame 片段所記載的 duration 中減去。
    所以 ACK 又稱為 virtual CTS。

Management Frames

802.11 將建立連線整個程序分解為三個步驟。

  1. 尋求連接的移動工作站,首先必須找出可供訪問的無線網絡。在有線網絡中,這個步驟相當於在牆上找出適當的插孔。
  2. 網絡系統必須對移動工作站進行身份認證。
  3. 最後才能決定是否讓工作站與網絡系統連接。
The Structure of Management Frames


為了限制廣播或多播 management frame 所造成的副作用,收到 frame 之後,工作站會透過 BSSID 過濾。只有在廣播或多播來自工作站目前所連接的 BSSID,才會被送至 MAC 管理層。
唯一的例外是 Beacon frame,因為它就是用來宣告 802.11 網路本身的存在。

Duration calculations
分為 免競爭和競爭兩個情況

  • 免競爭期間(contention-free period)所發送的任何 frame,均會將持續時間設為 32,768 毫秒。
  • 競爭式訪問期間,利用 DCF(Distributed Coordination Function) 所發送的 frame 會通過 Duration 防止別人訪問介質。確保基本 frame 交換程序得以完成。
    • 廣播或多播設為 0。
    • 如果不是 last fragment 那就是 3*SIFS + next fragment + ACK。
    • 如果是 last fragment 那就是 SIFS + ACK。

frame body

有分為長度固定(Mandatory field)跟不固定(Information Elements)
固定的長度類型有十個
這邊講一些會用到的

Beacon interval
802.11 網路每隔一段時間就會發出的 Beacon 訊號,用來宣布網路的存在。
Beacon interval 的長度有 16 個 bit,用來設定 Beacon 信號之間相隔多少時間單位。時間單位通常縮寫為 TU(一毫秒)。

Capability information

發送 Beacon 訊號的時候,它被用來通知各方,該網路具備哪種性能。
Capability information 也可以使用在 Probe Request 與 Probe Response frame。
每個 bit 各自代表一個 flag,對應到網路所具備的某種特殊功能。工作站會使用這些 flag 來判斷自己是否支持該 BSS 所有的功能。沒有實現公告中所有功能的工作站,就無法加入該 BSS。

  • ESS/IBSS: 這兩個 bit flag 彼此互斥,基站(AP)會將 ESS bit 設定為 1,而將 IBSS bit 設定為 0,表示基站屬於基礎網路的一部分。IBSS 中的工作站則會將 ESS bit 設定為 0,而將 IBSS bit 設定為 1。
  • Privacy: 將 Privacy bit 設定為 1,代表需要使用 WEP(Wired Equivalent Privacy) 加密以維持機密性
  • Contention-free polling
    工作站與基站使用這兩個 bit (CF-Pollable 與 CF-Poll Request) 當作標籤

Current AP Address
移動工作站可以使用 Current AP Address(目前基站的地址)位來表明目前所連接的基站的 MAC 地址。這個位的用途是便於連接(association)與重新連接(reassociation)的進行。工作站會藉此發送上一次所連接的基站的地址。當工作站打算與不同的基站建立連接時,可用來轉換連接,以及取回所有暫存的 frame。

Listen interval

當工作站與基站連接時,基站會將 Listen Interval 記錄下來(讓移動工作站告知基站必須為它暫存 frame 多久的時間),之後工作站為了節省電池的電力,可以暫時關閉 802.11 網絡介面。
當工作站處於休眠狀態,基站必須為之暫存 frame,休眠中的工作站會定期醒來聆聽是否有暫存 frame。
因此 Listen Interval,其實就是以 Beacon interval 為單位所計算出的休眠時間。

Association ID

長度 16 bit 的 Association ID。
當工作站與基站連接時,就會被賦予一個Association ID,用以協助控制與管理功能。雖然連接識別碼可用 bit 數為 14 個 bit,不過只有 1-2007 可以使用。為了與 MAC 標頭的 Duration/ID 相容,最高位的兩個 bit 均被設定為 1。

Timestamp
用來同步一個 BSS 中的所有工作站,計時器以微秒為單位。

Reason Code

當對方不適合加入網路時,工作站會送出 Disassociation 或 Deauthentication frame 作為應答。這些 frame 當中包含一個長度 16 bit 的 Reason Code,表示錯誤的原因。

Status Code

Status Code 用來表示某項過程成功或失敗。
如果過程成功,該位的值就會被設定為 0,否則設為非零值。

Management Frame Information Elements

接下來是 management frame body 裡長度不固定元件,又稱為 Information Elements

information element 是 Management Frame 的組成元件,其長度不定。信息元素通常包含 Element ID、Length 以及一個 variable-length component。

Types of Management Frames

Beacon

Beacon frame 是相當重要的維護機制,主要用來宣告某個網路的存在。定期發送的 Beacon,可讓移動工作站得知該網路的存在,從而調整加入該網路所必要的參數。

Probe Request
移動工作站將會利用 Probe Request,掃描所在區域內目前有哪些 802.11 網路。


Probe Request frame 包含兩個欄位:SSID 以及 Supported Rates(移動工作站所支持的速率),收到 Probe Request 的工作站會依此判定對方能否加入網路。
SSID 表示所想要加入的網路,SSID 可設定為特定網路的 SSID,或設定為任何相容網路的 SSID。

Probe Response


如果 Probe Request 所探查的網路與之相容,該網路就會以 Probe Response 應答。
送出最後一個 Beacon 的工作站,必須負責回覆所收到的 Probe Request。
Probe Response 中包含了 Beacon 的所有參數。

QoS(Quality of Service)

當前的主要網路架構都是基於 best-effort 的思想設計的,best-effort 的一種理解即盡力發送,但是無法保證穩定的服務的傳輸質量(QoS),包含延遲,丟包率,抖動等等。
QoS frame 的概念與 Beacon frame 相近
以下簡述 AP 發送 Beacon 的競爭過程:

  1. AP 發送 Beacon 時候等待的時間為 PIFS,PIFS 實際上就是 SIFS 加上一個 SLOT,即監聽到一次頻道空閒即可。由於 PIFS < DIFS,AP 能夠更快的進入連接過程。
  2. 此時又因為 AP 選擇的 backoff counter 為 0,所以立刻佔據頻道,發送 Beacon。在 AP 發送 Beacon 時,頻道變為 busy 狀態,所有節點都需要接收該 Beacon。
  3. 由於 Beacon 是一個廣播,所以沒有接收 ACK 的環節。當 Beacon 發送完後,該輪傳輸完成,節點再次等待 DIFS 時間後,再次競爭頻道。

EDCA(Enhanced Distributed Channel Access)

由於在初始的 802.11 中,DCF 這種工作模式不支援 QoS,所以在 802.11e 中,支援 QoS 的 DCF 就是 EDCA。

EDCA 就是對 DCF 上的幾個參數加以了控制,一個是競爭 backoff 前等待的 IFS 時間,另外一個是 backoff 時候選擇隨機數的 contention window 大小。

在標準的 DCF 中,每一個節點在競爭前都需要等待一段 DIFS 時間,DIFS 實際上是包含了 1 個 SIFS 和 2 個 SLOT 時間,每一個 SLOT 可以看做一次檢測頻道的 CCA(Clear Channel Assessment) 時間。

AIFS(arbitration interframe space):在 EDCA 中,為了分出優先度,等待幾個 SLOT 時間是可以配置的,這個就是 EDCA 裡面的 AIFSN (arbitration interframe space number)
從 SIFS 這個基本時間開始,

PIFS = SIFS + 1*SLOT
DIFS = SIFS + 2*SLOT
AIFS = SIFS + n*SLOT

如果 n 越大,那麼意味著每一次連接上頻道前需要等待更多的時間,代表優先級更低。

CW(Contention Window): 除了 backoff 前的 AIFS 時間以外,就是對應的競爭 Contention Windows 的選擇範圍了。
傳統的 DCF 中,CWmin = 15,CWmax = 1023,這個是所有的競爭節點都是相同設置的。
但是在 EDCA 中,會針對不同的 AC(Admission Control),其 CWmin 和 CWmax 設置會不同。

linux kernel - sk_buff

The struct sk_buff (socket buffer) describes a network packet. The structure fields contain information about both the header and packet contents, the protocols used, the network device used, and pointers to the other struct sk_buff.

sk_buff 用來描述一個網路封包,整個結構包含的資訊有 header、packet content、使用的 protocols 以及網路裝置。

This structure is used by several different network layers (MAC or another link protocol on the L2 layer, IP on L3, TCP or UDP on L4), and various fields of the structure change as it is passed from one layer to another.

sk_buff 可以在不同的層之間使用(例如: L2 的 MAC、L3 的 IP、L4 的 TCP),sk_buff 最大的特點就是在層與層之間切換的時候是不需要資料的複製的,只需要移動指標即可,如此一來便可以減少 CPU cycle 數。

sk_buff 整體來看就是一個雙向鏈結串列
它的資料主要可以分為 Layout、General、Feature-specific、Management functions 這四類。

Layout 類的資料主要是用來搜尋資料和建構整個結構體本身

sk_buff 的 Head 結構如下:

struct sk_buff_head {
	/* These two members must be first to match sk_buff. */
	struct_group_tagged(sk_buff_list, list,
		struct sk_buff	*next;
		struct sk_buff	*prev;
	);

	__u32		qlen;
	spinlock_t	lock;
};

struct_group_tagged 的程式如下

#define struct_group_tagged(TAG, NAME, MEMBERS...) \
	__struct_group(TAG, NAME, /* no attrs */, MEMBERS)

然後 __struct_group 如下

#define __struct_group(TAG, NAME, ATTRS, MEMBERS...) \
	union { \
		struct { MEMBERS } ATTRS; \
		struct TAG { MEMBERS } ATTRS NAME; \
	}

可以發現 sk_buff_head 最後會建一個結構體名稱叫做 sk_buff_list,然後裡面放 next 和 prev 指標。
qlen 用來表示整個 list 的長度。
lock 用來防止一次有多個程序想要同時存取這個 list。

接著講主要的結構體 sk_buff
sk_buff 結構體有個成員 list,用來指向佇列的 Head。

struct sock *sk

這個指標只有在當 data(header、packet content) 是由自己產生或是自己是 receiver 的時候才會需要,因為 data 只有在 L4 (TCP or UDP) 或 user 端的應用程式才會拿來使用,其他時候(例如轉送時)是不需要的,也就是這個指標會指向 NULL。

unsigned int len
代表 data 在整個 buffer 的長度,也就是 main buffer + fragments 的 data 大小。

unsigned int data_len
fragments 的 data 大小。

mac_len
MAC header 的長度。

atomic_t users
考慮到會同時有多個使用者在使用這個 sk_buff 結構體,所以引用這個 reference count 來判斷甚麼時候可以釋放 sk_buff 空間。

unsigned int truesize
表示 buffer struct 本身 + data 的大小。

unsigned char *head, *end, *data, *tail

用來動態表示 sk_buff 的 data(header、packet content),在 sk_buff 初始化的時候會配置一塊空間用來存放 data。
最初 head 和 end 分別指向這塊空間的開頭和尾端,而 data 和 tail 也會指向開頭。

下面的圖是將封包複製進 sk_buff 的 data 後一步步加上每層的 header 的過程(不考慮 fragment)。

from the TCP layer down to the link layer


( a ) 先初始化一塊記憶體空間,然後 head、data、tail 指向開頭,end 指向尾端。
( b ) 先用 skb_reserve 函式預留一部分的空間給所有 header,圖中的 MAX_TCP_HEADER 代表所有層的 header size 的最大總和,此時 data 和 tail 指標都指向從頭位移 MAX_TCP_HEADER 長度後的空間。
( c ) 接著放入封包的資料,放入的同時要移動 tail 指標。
( d ) 從 data 指標起往上放入 TCP(L4) header,並把 data 指標往上移。
( e ) 加入 IP(L3) header,同樣把 data 指標往上移。
( f ) 最後是 MAC(L2) header,然後把 data 指標往上移。

順便簡單講一下哪些函式負責做這些事

__alloc_skb 函式用來宣告整個 sk_buff 的結構體(header)和 data buffer 的空間。

首先可以看到配置 sk_buff 結構體的部分
考慮到會配置多個相同的 sk_buff 結構體,所以用 Slab Allocator 來配置,這麼做的好處有:

  • 不用每次要一個 sk_buff 就做一次 kmalloc(以 page size 為單位),可以避免 internal fragmentation。
  • 在 cache 儲存的物件,系統不需要花時間做重複的事,例如: allocating, initialising and destroying objects。

會依照輸入的 flag 來判斷要使用哪一個 kmem_cache (skbuff_fclone_cache 或 skbuff_cache)
skbuff_fclone_cache 應該是指如果這個 sk_buff 是複製來的。

cache = (flags & SKB_ALLOC_FCLONE)
        ? skbuff_fclone_cache : skbuff_cache;

向 cache 要求一塊 sk_buff 結構體空間

skb = kmem_cache_alloc_node(cache, gfp_mask & ~GFP_DMA, node);

關於 prefetchw()
定義在 /include/linux/prefetch.h
其原理是通過在存取資料之前先將資料移動到 cache 中,用來減少 cache miss 所造成的延遲。

#ifndef ARCH_HAS_PREFETCHW
#define prefetchw(x) __builtin_prefetch(x,1)
#endif

接下來是配置 data buffer 的空間

data = kmalloc_reserve(&size, gfp_mask, node, &pfmemalloc);

kmalloc_reserve 會先對 size 做 aignment,再開始配置空間

obj_size = SKB_HEAD_ALIGN(*size);

skb_reserve 透過移動 data 和 tail 指標來預留一段空間。

static inline void skb_reserve(struct sk_buff *skb, int len)
{
	skb->data += len;
	skb->tail += len;
}

skb_put 往下移動 tail 指標用來增加 data 的空間

void *skb_put(struct sk_buff *skb, unsigned int len)
{
	void *tmp = skb_tail_pointer(skb);
	SKB_LINEAR_ASSERT(skb);
	skb->tail += len;
	skb->len  += len;
	if (unlikely(skb->tail > skb->end))
		skb_over_panic(skb, len, __builtin_return_address(0));
	return tmp;
}
EXPORT_SYMBOL(skb_put);

skb_push 透過往上移動 data 指標來增加 data 的空間

void *skb_push(struct sk_buff *skb, unsigned int len)
{
	skb->data -= len;
	skb->len  += len;
	if (unlikely(skb->data < skb->head))
		skb_under_panic(skb, len, __builtin_return_address(0));
	return skb->data;
}
EXPORT_SYMBOL(skb_push);

skb_pull 透過往下移動 data 指標來減少 data 的空間

static inline void *__skb_pull(struct sk_buff *skb, unsigned int len)
{
	skb->len -= len;
	if (unlikely(skb->len < skb->data_len)) {
#if defined(CONFIG_DEBUG_NET)
		skb->len += len;
		pr_err("__skb_pull(len=%u)\n", len);
		skb_dump(KERN_ERR, skb, false);
#endif
		BUG();
	}
	return skb->data += len;
}

net_device

net_device 儲存網路設備的所有資訊,包含對硬體的操作,例如: start_xmitget_statsopenstop, etc.
所有的 net_device 結構體分別放在一個 global list (由 dev_base_lock(用來讀取) 和 rtnl semaphore(用來寫入) 保護)以及兩個 hash table 中(用 device 的 name 跟 index 當 key)

struct list_head    dev_base_head;
struct hlist_head   *dev_name_head;
struct hlist_head   *dev_index_head;

接下來講 net_device 如何在 kernel 上註冊
alloc_netdev 定義在 /include/linux/netdevice.h 中

#define alloc_netdev(sizeof_priv, name, name_assign_type, setup) \
	alloc_netdev_mqs(sizeof_priv, name, name_assign_type, setup, 1, 1)

可以發現是由 alloc_netdev_mqs 來執行
alloc_netdev_mqs 定義在 /net/core/dev.c
alloc_netdev_mqs 會負責分配 net_device 結構體以及 private data 的空間,之後再做基本的初始化。
alloc 後接下來就是 register,這邊要注意的是註冊和解除註冊之前都要先拿到鎖(rtnl semaphore)才可以進行。

rtnl_lock();
...
register_netdevice(x1);
register_netdevice(x2);
...
unregister_netdevice(y1);
unregister_netdevice(y2);
...
rtnl_unlock();
free_netdev(y1);
free_netdev(y2);

register_netdev 只是一個對外的函式,真正在執行的是 register_netdevice。

int register_netdev(struct net_device *dev)
{
	int err;

	if (rtnl_lock_killable())
		return -EINTR;
	err = register_netdevice(dev);
	rtnl_unlock();
	return err;
}

register_netdevice 會先檢查有沒有拿到鎖在繼續執行

int register_netdevice(struct net_device *dev)
{
    ...
    ASSERT_RTNL();
    ...
}

unregister_netdevice 最後透過 net_set_todo(dev) 將 dev 放入 todo_list 後交由 netdev_run_todo 解除註冊,而 netdev_run_todo 是由 rtnl_unlock 呼叫。

但是我去看了 netdev_run_todo 程式碼發現大部分都是在處理 unregistering 的部分,所以我認為 netdev_run_todo 在 register_netdev 應該是只有解鎖的功能。

void rtnl_unlock(void)
{
	/* This fellow will unlock it for us. */
	netdev_run_todo();
}

reference

802.11@Wireless Networks- The Definitive Guide
IEEE 802.11 認證與保密
Integrity Check Value
linux kernel networking
https://linux-kernel-labs.github.io/refs/heads/master/labs/networking.html