80211 管理架構由三個元件組成
MAC 與 PHY 協議層皆可訪問 management information base,簡稱 MIB,MIB 簡單來說可供查詢狀態信息。
圖中共有三個 SAP(Service Access Point, 用於資料轉送)
在這些管理元件之間定義了三個界面(箭頭)。 SME 可通過 MLME 和 PLME 服務界面來更改 MAC 與 PHY MIB。此外,MAC 有所改變,相對地 PHY 也要有所變動,所以在 MLME 與 PLME 之間必須存在一層界面,讓 MAC 得以變更 PHY。
接下來簡單介紹規格書中的四種 Primitive(基礎呼叫)
MLME 如何和 SME 溝通
一般來說,上層(網路層)會向 LLC(Logical Link Control) 提出服務要求,這時候就是透過 SME 向 MLME 提出 Request Primitive。
MLME 會用 Confirm Primitive 作為該 request 的回應。
至於 Indication Primitive 則是 MLME 要把通知傳給上層時使用。
而對應的回覆則是 Response Primitive。
以 Measurement request 為例
Request 代表要做 Measurement 的請求
Confirm 代表 Request 成功傳送出去
Indication 在這表示 MLME 收到 Measurement 請求,並把它轉傳給 SME
之後便是執行 Measurement
最後把 report 透過 Request 回傳給原本的 STA
MLME 規格, IEEE 802.11 2007 spec 第十章 Layer management
4 way handshake 是用來在無線網路中的 authenticator(ex: AP) 和 supplicant(STA) 之間產生密鑰的過程,密鑰用來加密傳送的訊息。
首先間介紹會用到的密鑰,鑰匙是由圖片的上到下依序生成。
4 way handshake 流程
EAPOL (Extensible authentication protocol over LAN): 屬於無線網路協定裡 IP Layer 以下的通訊協定,可以讓使用者在未經過 EAP 認證以前的封包,透過 EAPOL 的傳送。
簡述 MIC(Message integrity code) 流程:
發送端在送出封包前,把未加密過的資料內容透過 Michael 演算法,求得一個 64 bits 的 MIC 值,對接收端來說,把收到的封包解密後,依樣針對資料內容透過 Michael 演算法計算一次 MIC 值,如果一致就表示封包正確無誤,如果不一致就表示封包在傳輸過程中發生錯誤。
reference: https://www.wifi-professionals.com/2019/01/4-way-handshake
使用任何網路之前,首先必須找出網路何在。使用有線網路,要找出網絡所在並不難,只要循著網線或者找到牆上的插座即可。
在無線領域中,工作站加入任何網路之前,必須先經過辨識的工作。這樣的程序稱為掃描(scanning)。
掃描時的參數:
被動掃描
被動掃描(passive scanning)可以節省電池的電力,因為不需要傳送任何信號。在被動掃描中,工作站會在頻道表(channel list)所列的各個頻道之間不斷切換,並且會記錄來自所收到的 Beacon frame。
Beacon 為了讓工作站(STA)得知,加入某個基本服務組合(basic service set,簡稱 BSS)所需要的參數,以便進行通訊。
行動式工作站以被動掃描找出該區所有 BSS
通過聆聽來自前三部基站的 Beacon frame。
如果該工作站並未收到來自第四部基站的 Beacon,
就會回報目前只發現三個 BSS。
主動掃描
在主動掃描(active scanning)中,工作站扮演比較積極的角色。在每個頻道上,工作站都會發出 Probe Request frame(通常都是 broadcast),請求某個特定網路予以回應。
以下為流程
當網路(例如基站)收到搜尋其所屬之延伸服務組合的 Probe Request,就會發出 Probe Response frame。
在 infrastructure(基礎型)網絡裡,是由基站負責傳送 Beacon frame,因此它也必須負責回應以 Probe Request 在該區搜尋網絡的工作站。
在 IBSS(獨立型基本服務組合)中,工作站彼此輪流負責傳送 Beacon frame,因此負責傳送 Probe Response 的工作站會經常改變。
單一 Probe Request 導致好幾個 Probe Response 的情況很常見。掃描程序的目的在於
找出工作站可以加入的所有基本服務區域(BSS),因此一個 broadcast Probe Request 會收到範圍內所有基站的回應,範圍內的獨立型 BSS 如果收到也會予以回應。
在圖中,某部行動式工作站發出 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 (連接)。
IEEE 802.11 提供兩種認證方式:開放式系統(Open System)與共享式密鑰(Shared Key)
在 802.11 中,工作站是以 MAC 地址為身份證明。和 Ethernet 網絡一樣,網路上的 MAC 地址必須獨一無二,因此可作為工作站的身份證明。基站以這些 frame 的來源地址作為發送者的身份證明。
身份認證要求包含兩個信息元素,
基站接著會處理身份認證要求,然後傳回結果。和第一個 frame 一樣,類型為 authentication 的管理 frame。其中包含三個信息元素:
認證表示求證雙方都共同擁有一隻秘密鑰匙,認證時便依照此秘密鑰匙來證實對方的身分。這隻秘密鑰匙也許是透過某一個認證系統所分配,或是透過人工的傳遞,這已不是 IEEE 802.11 所管轄的範圍。
共享式密鑰的運作程序共四個步驟
事先身份認證( preauthentication ) 用來加速連接(association)關係的移轉。從工作站決定轉移至新基站,到新基站開始傳送 frame 給工作站,身份認證是這段期間內最容易造成延遲的因素。
Preauthentication 的目的就是縮短這段時間,在需要之前先進行這項費時的過程以建立彼此的關係。
在與基站連接之前,工作站必須先經過身份認證,不過 802.11 標準並未要求身份認證之後必須立即進行連接過程(association)。
在 scan 階段,工作站可以跟多個基站進行 802.11 身份認證,如此一來,當有需要時就可以立即進行連接過程(association)。這種做法稱為事先身份認證(preauthentication)。
事先身份認證的好處是,一旦進入基站的涵蓋範圍,工作站就可以立即與基站重新連接(reassociate),而不必等候認證交換程序。
一旦完成身份認證,工作站就可以跟基站進行連接(或者跟新的基站進行重新連接),以便獲得網路的完全訪問權。連接(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 在規格中公開禁止工作站同時與一部以上的基站形成連接。
重新連接(reassociation)是指將連接關係自舊基站移轉至新基站的程序。
整個程序開始之前,行動式工作站必須已連接某部基站。工作站會持續監測從目前的基站以及同一個 ESS 中其他基站所收到的信號之品質。一旦行動式工作站檢測到其他基站或許是較好的連接對象時,就會啟動重新連接程序。
一般來說要轉台的因素可以用 Beacon frame 來做為參考。
再進行以下的程序之前,行動式工作站必須先完成身分認證(authentication)的步驟。
主要有三種類別: data、control、management frame
data frame 負責在工作站之間傳輸數據。data frame 可能會因為所處的網路環境不同而有所差異。control frame 通常與 data frame 搭配使用,負責區域的清空、channel 的取得以及 carrier-sensing 的維護,並於收到數據時予以正面的應答(ACK),藉此促進工作站間數據傳輸的可靠性。management frame 負責監督,主要用來加入或退出無線網路,以及處理基站之間連接的轉移事宜。
位用來記載網路分配向量(NAV)的值。訪問介質的時間限制是由 NAV 所指定。data frame 之 Duration 的設定,必須依循四項規範
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 主要在協助 data frame 的傳遞。它們可用來監督無線介質的訪問(但非介質本身),以及提供 MAC 層次的可靠性。
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 frame 可用來取得介質的控制權。
RTS frame 只包含標頭。frame 主體中並未包含任何資料,標頭之後即為 FCS。
Frame Control 的 subtype 為 1011,代表 RTS。
Duration: RTS 會試圖預定介質使用權(以微秒為單位),讓後續的 frame 交換程序使用,整個過程需要三個 SIFS、一個 CTS、一個 ACK 和第一個 frame 的發送時間。
CTS 用於應答 RTS,frame control 的 subtype 為 1100,代表 CTS,。
Duration: CTS 會以 RTS 的 duration 做為計算基準,
ACK frame 就是任何數據傳輸(包括一般傳輸、RTS/CTS、fragmented frames)所需要的正面應答(positive acknowledgment)
Duration: 依照 ACK 在整個 frame 交換過程中位居何處,duration 的值可以有兩種設定方式。
802.11 將建立連線整個程序分解為三個步驟。
為了限制廣播或多播 management frame 所造成的副作用,收到 frame 之後,工作站會透過 BSSID 過濾。只有在廣播或多播來自工作站目前所連接的 BSSID,才會被送至 MAC 管理層。
唯一的例外是 Beacon frame,因為它就是用來宣告 802.11 網路本身的存在。
Duration calculations
分為 免競爭和競爭兩個情況
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。
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。
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 的所有參數。
當前的主要網路架構都是基於 best-effort 的思想設計的,best-effort 的一種理解即盡力發送,但是無法保證穩定的服務的傳輸質量(QoS),包含延遲,丟包率,抖動等等。
QoS frame 的概念與 Beacon frame 相近
以下簡述 AP 發送 Beacon 的競爭過程:
由於在初始的 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 這個基本時間開始,
如果 n 越大,那麼意味著每一次連接上頻道前需要等待更多的時間,代表優先級更低。
CW(Contention Window): 除了 backoff 前的 AIFS 時間以外,就是對應的競爭 Contention Windows 的選擇範圍了。
傳統的 DCF 中,CWmin = 15,CWmax = 1023,這個是所有的競爭節點都是相同設置的。
但是在 EDCA 中,會針對不同的 AC(Admission Control),其 CWmin 和 CWmax 設置會不同。
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_group_tagged 的程式如下
然後 __struct_group 如下
可以發現 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 來配置,這麼做的好處有:
會依照輸入的 flag 來判斷要使用哪一個 kmem_cache (skbuff_fclone_cache 或 skbuff_cache)
skbuff_fclone_cache 應該是指如果這個 sk_buff 是複製來的。
向 cache 要求一塊 sk_buff 結構體空間
關於 prefetchw()
定義在 /include/linux/prefetch.h
其原理是通過在存取資料之前先將資料移動到 cache 中,用來減少 cache miss 所造成的延遲。
接下來是配置 data buffer 的空間
kmalloc_reserve 會先對 size 做 aignment,再開始配置空間
skb_reserve 透過移動 data 和 tail 指標來預留一段空間。
skb_put 往下移動 tail 指標用來增加 data 的空間
skb_push 透過往上移動 data 指標來增加 data 的空間
skb_pull 透過往下移動 data 指標來減少 data 的空間
net_device 儲存網路設備的所有資訊,包含對硬體的操作,例如: start_xmit
、get_stats
、open
、stop
, etc.
所有的 net_device 結構體分別放在一個 global list (由 dev_base_lock(用來讀取) 和 rtnl semaphore(用來寫入) 保護)以及兩個 hash table 中(用 device 的 name 跟 index 當 key)
接下來講 net_device 如何在 kernel 上註冊
alloc_netdev 定義在 /include/linux/netdevice.h 中
可以發現是由 alloc_netdev_mqs 來執行
alloc_netdev_mqs 定義在 /net/core/dev.c
alloc_netdev_mqs 會負責分配 net_device 結構體以及 private data 的空間,之後再做基本的初始化。
alloc 後接下來就是 register,這邊要注意的是註冊和解除註冊之前都要先拿到鎖(rtnl semaphore)才可以進行。
register_netdev 只是一個對外的函式,真正在執行的是 register_netdevice。
register_netdevice 會先檢查有沒有拿到鎖在繼續執行
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 應該是只有解鎖的功能。
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