1. 程式人生 > >802.11常見的幀

802.11常見的幀

1、802.11 幀型別

802.11協議有規定三種類型的幀,分別時管理幀,控制幀和資料幀。

(1)管理幀
有線通訊和無線通訊的最大區別是什麼?那就是有沒有用網線!有線客戶端如果想連線某個網路,只要將網線接到對應的路由器上就好了,但是無線客戶端想完成這個“接入”動作應該怎麼辦呢?這就需要管理幀的幫忙,管理幀的主要工作就是管理無線客戶端的接入和斷開。有線連線並不太需要管理幀的幫忙,插拔網線的動作也很簡單,但是無線接入卻複雜得多。管理幀是不帶上層payload資訊的,但是它攜帶一些固定大小的Information felds和可變大小的Information elements (IE)

管理幀主要包括下面這些種類:

Association request
Association response
Reassociation request
Reassociation response
Probe request
Probe response
Beacon
Announcement traffic indication message (ATIM)
Disassociation
Authentication
Deauthentication
Action

(2)控制幀

有線通訊和無線通訊另外一個區別是傳輸媒介的穩定性,無線因為傳輸媒介是電磁波,容易受到各種幹而變得不穩定,為了保證資料的穩定傳輸,就需要控制幀的幫忙。控制幀不僅可以控制傳輸的速率,還可以用來清空通道(CTS/RTS),協商channel(DFS/ACS)和提供單播通知(PS-Poll/ACK)等功能

Power Save Poll (PS-Poll)
Request to send (RTS)
Clear to send (CTS)
Acknowledgment (ACK)
Contention Free-End (CF-End)
CF-End + CF+ACK
Block ACK Request (BlockAckReq)
Block ACK (BlockAck)

(3)資料幀

在802.11協議中,大部分資料幀都是通過攜帶MSDU來傳輸資料的,當然有一些特殊用途的空幀不會攜帶MSDU(比如用來通知power save status的幀),所以傳輸時不會對它進行加密。一般來說,控制幀、管理幀和空的資料幀都是不需要加密的。資料幀的型別主要包括下面這些:

Data (simple data frame)
Null function (no MSDU payload)
Data + CF-ACK
Data + CF-Poll
Data + CF-ACK + CF-Poll
CF-ACK (no MSDU payload)
CF-Poll (no MSDU payload)
CF-ACK + CF-Poll (no MSDU payload)
QoS data
QoS Null (no MSDU payload)
QoS data + CF-ACK
QoS data + CF-Poll
QoS data + CF-ACK + CF-Poll
QoS CF-Poll (no MSDU payload)

2、常見的幀
在802.11中的幀有三種類型:管理幀(Management Frame,例如Beacon幀、Association幀)、控制幀(Control Frame,例如RTS幀、CTS幀、ACK幀)、資料幀(Data Frame,承載資料的載體,其中的DS欄位用來標識方向很重要)。幀頭部中的型別欄位中會標識出該幀屬於哪個欄位。

(1)ACK幀
單播(unicast)幀都需要用ACK來確認 ,ACK本身不是廣播幀,ACK在MAC上是unicast的,幀中有receive地址欄位(用來標識是對誰的確認),但是它卻不需要再確認了。ACK只有接收地址(receive)而無源地址(src)和序號(sequence) ,因為傳送和接受是一個整體,傳送之後,其他人(除了這個傳送的接受者)都不會再發送資料了(無線協議中的衝突避免機制),所以接受者會發送一個沒有src的ack幀給receiver,而接收ACK的一端會根據這個知道它收到了一個ACK幀(其實根據協議,應當把傳送單播幀和收到它相應的ACK看作一個原子的不可分割的整體,表示一次成功的通訊)。

(2)Beacon幀
Beacon幀定時廣播發送,主要用來通知網路AP的存在性。Station和AP建立Association的時候,也需要用到Beacon。Station可以通過Scan來掃描到Beacon,從而得知AP的存在,也可以在掃描的時候通過主動傳送Probe來探尋AP是否存在。也就是說,建立Association的時候有主動的掃描或者被動的掃描兩種方式。另外,Beacon還包含了關於Power Save、以及地區等資訊。

(3)Association幀
通常Association幀都有Probe Request和相應的Probe Response。Association的Request中有其所需要的Channel以及Data Rate等狀態,以便讓AP決定是否讓它與自己建立Association。而關聯是否成功,主要是看Response中的Status code是否為Success

(4)Data幀
Data Frame具有方向,這個方向用DS(分散式系統)欄位來標識,以區分不同型別幀中關於地址的解析方式;其它的型別Frame例如 Control Frame或者管理幀中,這個欄位是全零。這個欄位用兩位表示,這兩個位的含義分別表示“To Ds”和“From Ds”,大致含義如下:
(a)To DS:表示Station->AP,一般也叫Upload。
(b)From DS表示AP->Station,一般也叫Download。
這裡,我們可以大致將DS看做AP,To/From是從AP的角度來考慮的。To DS就是讓AP幹活。另外Data Frame中還有一個比較重要的欄位就是Sequence,表示幀的序號。重傳幀序號一樣,但是多了一個Retry的欄位表示該幀是重傳的。
為了便於理解,這裡再次詳細解釋一下DS欄位的含義:
To DS=0,From DS=0:表示Station之間的AD Hoc類似的通訊,或者控制偵、管理偵。
To DS=0,From DS=1:Station接收的偵。
To DS=1,From DS = 0:Station傳送的偵。
To DS=1,From DS = 1:無線橋接器上的資料偵。
這裡,我們主要關注To DS和From DS分別是01和10的情況,DS雖然大致等於AP但是它不是AP,它其實是一個系統,從Station的角度來看,比較容易理解。並且To DS和From DS一定是無線網路上面資料偵才有的欄位。

3、幀和大端小端
Ethernet和802.11都是按照Little Endian的方式來傳輸資料,也就是說,而MAC層傳輸的時候,是採用Little Endian的方式,一個位元組一個位元組的傳輸的,前面的低位位元組先傳輸,後面的高位位元組後傳輸(傳輸單位不是按位而是位元組);在協議標準上描述一個幀的時候,一般是先按照Little Endian的方式對其進行總體描述,然後具體細節說每個欄位的值,這時候這個欄位值是Big Endian方式表示的,這一點應當注意。

例如,協議標準中可能能對某個幀格式做如下的描述:
|b0|b1|b2|b3|b4|b5|b6|b7|b8|b9|…|…|

這裡,最低位b0在最前面,所以這裡採用的就是小端的方式來描述幀的總體格式資訊。傳輸的時候,就按照這裡的方式,以位元組為單位向物理層進行傳輸(先傳b0b7然後b8b16等等)。 但是,在解釋這個幀的各個域的時候卻採用大端的方式進行描述。假設b3=0,b2=1,b1=0,b0=0四者共同組成一個名字為“FLAG”的域,那麼會有類似如下的描述:
FLAG=4(即FLAG為0100):表示XXX。
所以,協議標準中具體描述某個域的時候,一般直接用大端方式表示的數值(b3b2b1b0=0100)來描述;而傳輸資料幀或者在協議標準中描述整體幀的時候,中給出的卻是小端的方式(b0b1b2b3=0010)。 這裡的每個欄位都是幀的一個部分,在管理幀(後面會說)中長度不固定的部分又叫IE(information Element) 。

另外注意,記憶體地址是用來標記每個位元組的而不是位,所以記憶體裡面大端小端也是以位元組而不是位為單位的(前面描述“大端“、”小端”的時候卻以位序而非位元組序,這一點需要明辨,不要混淆)。假設奔騰的機器,CPU為32位,採用Little Endian方式,那麼表示1這個int型別整數的時候,假設它在數值上是十六進位制的"00000001",那麼存放在記憶體中卻是由低位到高位依次存放的,由低到高地址依次為:“01”、“00”、“00”、“00”(也就是說小端方式存放在記憶體中的時候,是按照含有最低位的位元組存放在低地址,注意是位元組,在記憶體中“位”沒有地址,所以沒有大端小端一說)。在傳遞幀的時候,也是按照一個位元組一個位元組的傳輸,而一個位元組內部在實際上其實沒有什麼端的分別,但是wireshark一律使用“b7b6b5b4b3b2b1b0”這樣的方式來用大端的方式顯示。

總之,需要注意網路層下面的幀的大端小端問題(不是網路中的位元組序,TCP/IP中規定的網路位元組序是Big Endian),大致就是:協議規定,傳輸的時候使用Little Endian;標準描述的時候用Big Endian和Little Endian都用;另外,Wire shark軟體抓的包中,好象全都用Big Endian來進行標示(無論是資訊視窗還是記憶體視窗都這樣展示)。

4、幀的來源和目的地址
因為無線網路中沒有采用有線電纜而是採用無線電波做為傳輸介質,所以需要將其網路層以下的幀格式封裝的更復雜,才能像在有線網路那樣傳輸資料。其中,僅從標識幀的來源和去向方面,無線網路中的幀就需要有四個地址,而不像乙太網那樣簡單隻有有兩個地址(源和目的)。這四個地址分別是:

SRC:源地址(SA),和乙太網中的一樣,就是發幀的最初地址,在乙太網和wifi中幀格式轉換的時候,互相可以直接複製。
DST:目的地址(DA),和乙太網中的一樣,就是最終接受資料幀的地址,在乙太網和wifi中幀格式轉換的時候,互相可以直接複製。
TX:也就是Transmiter(TA),表示無線網路中目前實際傳送幀者的地址(可能是最初發幀的人,也可能是轉發時候的路由)。
RX:也就是Receiver(RA),表示無線網路中,目前實際接收幀者的地址(可能是最終的接收者,也可能是接收幀以便轉發給接收者的ap)。
注意,其實,還有一個BSSID,用來區分不同網路的標識。

在802.11幀中,有四個地址欄位,一般只用到其中的三個,並且,這四個欄位對應哪種地址或者使用哪些地址,根據幀中的另外一個DS欄位以及幀的型別而有不同的解釋。

舉例:
(1)無線網路中的Station和乙太網中的Host進行通訊:
Station<- - - - ->AP<---------->Host
a)當Station->Host的時候:
首先Station->AP,這時候Src=Station,Dst=Host,Tx=Station,Rx=AP,然後AP->Host,這時候Src=Station,Dst=Host,因為AP轉發的時候,是在乙太網中,所以沒有Tx和Rx

b)當Host->Station的時候:
首先Host->AP,這時候Src=Host,Dst=Station,然後AP->Station,這時候,Src=Host,Dst=Station,Tx=AP,Rx=Station。

(2)無線網路中的Station之間進行通訊:

Station1<- - - - ->AP<- - - - ->Station2
a)當Station1->Station2時

首先Station1->AP,Src=Station1,Dst=Station2,Tx=Station1,Rx=AP,然後AP->Station2,Src=Station1, Dst=Station2, Tx=AP, Rx=Station2。

可見,在無線網路中,始終存在Tx和Rx,但是,這四個地址中還是隻有三個地址足矣。

(3)當兩個無線網路中的Station進行通訊的時候:
Station1<- - - - ->AP1<- - - - ->AP2<- - - - - ->Station2
當Station1->Station2時:

首先Station1->AP1,Src=Station,Dst=Station2,Tx=Station1,Rx=AP1,然後AP1->AP2,Src=Station, Dst=Station2, Tx=AP1, Rx=AP2,然後AP2->Station2,Src=Station1,Dst=Station2,Tx=AP2,Rx=Station2。

注意,這個時候,AP起到橋接的作用,所以四個地址各不相同,同時,AP之間或者Station和AP之間的那部分連線,也可以是乙太網。

綜上可知, 無線網路中的Station想要通訊,必須經過AP來進行“轉發”,其實,Tx和Rx是無線網路中的發和收,也就是Radio;而Src和Dst是真正的傳送源和接收者。

上面四個為4種可能性,具體用到那個,需要在規定的場景下使用,如下所示:

使用示例

1) 方案一:


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

2) 方案二:


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

3) 方案三:


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

4) 方案四:


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

5、建立Association
下面是Station和Ap建立開放Association的過程:

    (0)Ap週期性地廣播Beacon幀

    (1)Station廣播Probe Request到達Ap

    (2)Ap向Station傳送Probe Reponse

    (3)Station向Ap傳送ACK

    (4)Station向Ap傳送Authentication Request

    (5)Ap向Station傳送ACK

    (6)Ap向Station傳送Authentication Reponse

    (7)Station向Ap傳送ACK

    (8)Station向Ap傳送Association Request

    (9)Ap向Station傳送ACK

    (10)Ap向Station傳送Association Reponse

    (11)Station向Ap傳送ACK

    (12)Station和Ap開始相互通訊。

可見,廣播幀不用回覆,單播幀需要用ACK確認,ACK本身不用被確認。