序言
在802.11的MAC層中。分成了兩種基本工作模式:
- DCF(Distributed Coordination Function)
- PCF(Point Coordination Function)
本文所討論的主要內容即有關DCF模式以及其核心CSMA/CA機制。
CSMA/CA機制
因為無線信道唯獨一個沖突域的特性,所以須要設置一種隨機接入機制,以避免多個節點同一時候訪問網絡所帶來的沖突問題,在WiFi協議中,該隨機接入機制即是CSMA/CA。CSMA/CA的全稱是Carrier Sense Multiple Access with Collision Avoidance。即載波偵聽多路訪問/沖突避免。假設熟悉有線網絡的能夠知道。在集線器與中繼器中也會採用一種CSMA/CD的機制。從協議設計的大思路上,兩者是類似的,或者說兩個都是基於CSMA機制的,而細節上。兩者有非常多的出入,在本文中。我們尚不仔細討論兩者協議的詳細區別,而只敘述CSMA/CA的工作機制。
為了方便文中討論。我們首先假定一個網絡拓撲環境例如以下:
在該拓撲中。存在一個AP。與兩個節點(STA 1與STA 2),假設對於無線術語不是非常熟悉的話,能夠把AP理解成無線路由器。因為無線環境下的廣播特性。若STA 1與STA 2同一時候向AP發送數據,那么就會在AP處發生沖突,從而兩者都無法正確接收。終於傳輸失敗。CSMA/CA就是提供一種避免沖突發生的接入規則。
接下來我們須要詳細描寫敘述CSMA/CA的工作機制,為了方便理解,我們這里首先要給出四個概念:
- DIFS與SIFS:該兩種都是屬於Inter-frame Spacing(IFS)。即幀間間隙。
DIFS全稱為Distributed Inter-frame Spacing,即分布式幀間間隙,SIFS稱為Short inter-frame space,即短幀間間隔。
在CSMA/CA中,發一個幀之前,都須要"等待"一個對應的幀間間隔,比方發送數據之前至少要等待DIFS時間。發送ACK之前須要等待SIFS時間。在802.11中還存在其它的一些幀間間隔,比方RIFS,PIFS。AIFS。EIFS,本文不再一一贅述。(注:該段落中所提到的等待,不是真正意義上節點什么都不做,詳細的功能會在后文對應位置進行描寫敘述)
- Slot Time:時隙是指的一個時間片段,在CSMA/CA中。節點競爭接入信道之前須要經過對應的隨機回退(backoff)過程,當中backoff過程就是由非常多個時隙所組成的。
- Contention window:競爭窗體是用來讓節點選擇隨機回退計數值(backoff counter)的范圍。
- Backoff:隨機回退過程是指每個節點在競爭信道時,所經歷的隨機退避過程。在這一過程開始時,節點首先在競爭窗體中選擇一個隨機數為基准的隨機回退計數值,同一時候每個時隙,節點為"監聽"信道是否空暇,若信道空暇,那么進行一次倒數,即計數值減1,若信道忙,則不進行對應倒數。
當該隨機回退計數值回退到0時,節點能夠發送數據。(注:1.該段落中所提到的監聽,不僅包括了物理監聽,也包括了虛擬監聽機制,詳細功能后文對應位置進行描寫敘述。2.該文中所討論的一些概念與有線網絡中的概念會存在一些差別。我們這里並不加以細節對照,還請見諒)
接着。我們利用時序圖描寫敘述CSMA/CA的詳細工作機制:

- 當STA 1與STA 2相繼存在數據,須要在競爭信道進行發送時,其首先須要"等待" DIFS時間,若DIFS時間內,信道保持空暇狀態。那么就能夠進行backoff過程。
- 若STA 1與STA 2進入backoff過程時,其首先須要從競爭窗體(Contention window)選擇一個隨機數。在802.11協議中,默認的初始競爭窗體為31,即隨機回退計數值的范圍即是[0,31]。在上圖中,STA 1則是選擇了8,而STA 2選擇了2。
- 在backoff過程中。每經過一個slot time。節點會"監聽" 一次信道,若信道空暇。則對應的隨機回退計數器的值減1。
如上圖中。經過3個slot time后,STA 1的隨機倒數計數器從8遞減至5,而STA 2對應從2遞減至0。
- 當節點的隨機倒數計數器倒數至0時,節點競爭獲得信道。從而能夠發送數據。如上圖,STA 2獲得信道后,發送PACKET A給AP。在AP接收到數據后。會採用CRC機制對數據進行校驗,若校驗通過。AP會在SIFS后,反饋ACK確認幀。
- 當STA 2成功發送完數據, "等待" 了SIFS的時間之后,AP會向節點反饋ACK確認幀。當STA 2成功接收到ACK幀之后,這一次傳輸完畢。
- 當這一次傳輸完畢后,節點須要再次 "等待" DIFS的時間后,又一次開始backoff過程。若節點剛剛發送完數據。那么在backoff過程開始時,須要又一次從競爭窗體中選擇一個隨機數進行倒數。若節點沒有發送數據。那么直接從上一次的倒數結果繼續倒數。
如上圖中,STA 1沒有競爭到信道,那么其在第二次的backoff過程中,直接基於上次的5直接進行倒數至4。這種設計目的是為了保證網絡傳輸的公平性。
若在上述的第5步中。AP沒有成功接收節點的數據,或者AP對數據進行CRC校驗錯誤。那么其不會反饋對應的ACK給節點。
節點在ACK timeout之后,則知道對方沒有成功接收數據,該ACK timeout時間在理論分析時,一般與ACK接收時間相等,在詳細project設計中。可能會大一點點。那么發送錯誤的節點,須要等待EIFS時間才干夠再次接入信道,EIFS>DIFS。這樣是為了避免一些較差的節點持續爭搶信道資源。
比方圖中STA 2即須要在等待EIFS之后,節點首先進行BEB(該機制我們后面具體討論),然后又一次開始backoff過程。而STA 1則直接在DIFS之后進行backoff。
注:在這里的描寫敘述中,我們所述,在介質忙時,節點通過監聽信道。推斷介質忙,從而掛起隨機回退計數值。這也是非常多學術研究中能夠看到的常見描寫敘述。
有關掛起機制,筆者還存在一些理解。我們知道在節點競爭信道的過程中,也有可能會接收數據。因為802.11協議的特殊性,節點僅僅有在完整解調整個數據包之后,經過CRC校驗后,才干夠完整推斷數據幀是不是自己的。從而進行丟包處理。
故掛起機制實際上是一種接收機制。即不管信道中的數據幀是不是發給節點的,該節點都須要對此數據幀進行接收,進而推斷是否丟棄該幀。
故節點因為處於接收狀態。從而無法繼續進行backoff回退操作,故這里即是處於掛起的動作。
同一時候在《CWNA教材第三版》中。這里有可能會產生一種誤導的理解,即利用Duration字段,即詳細採用NAV機制來完畢這里掛起隨機回退計數值的工作。在該書中,Duration字段用來保留之后SIFS+ACK的時間。而不是用來作為NAV字段保護該數據幀傳輸過程中掛起其它節點的。換言之,我們前面所提到的ACK timeout的機制,即是採用數據幀中的duration字段來詳細設置的。只是除了CWNA書本上的樣例外,現實中筆者沒有抓到過數據幀MAC頭部中Duration存在填充的情況,在這樣的默認情況下,ACK timeout可能就是SIFS+ACK的標准時間。
BEB機制
這里BEB機制的全稱為Binary Exponential Back off。即二進制指數退避算法。在CSMA/CA的機制中,還是存在發生沖突的可能性,從而為了避免在CSMA/CA機制下的再次沖突。故這里引入了BEB機制。我們舉例進行說明:

與之前所述CSMA/CA過程類似,在 "等待" DIFS后,STA 1與STA 2從各自的競爭窗體CW中選擇一個隨機數。只是碰巧的是,兩者隨機到了一樣的數值,如圖中,STA 1與STA 2都是隨機到了3作為隨機回退計數值。在經過3個slot time之后,因為兩者同一時候倒數至0。那么意味着兩者會同一時候發送數據。如圖中的紅色虛線框表示,在AP處因為兩者信號互相干擾,從而都無法正確解碼,從而CRC校驗錯誤。即發生沖突。在沖突之后,即若AP處CRC校驗失敗,則不會給隨意節點反饋ACK數據包。故兩節點在ACK timeout之后,則等待EIFS之后,准備進入下一次競爭。
而在正式進入下一次競爭之前,節點須要對競爭窗體(CW)採用BEB機制。按我們之前所述,在初始競爭時,節點的默認CW范圍是[0,31]。而假設在節點數較多的情況下。那么就有可能引發之前我們所述的沖突問題,從而我們須要擴大競爭窗體CW。詳細在CSMA/CA中,我們則是採用二進制指數退避的方法對競爭窗體CW進行擴展,即發生一次沖突后,那么CW范圍就會從[0,31]變化到[0,63],如圖中。在沖突之后,STA 1又一次隨機選擇50,STA 2又一次隨機選擇32。在802.11中,一共同意回退6次,第7次不倍增窗體。再次嘗試重發,若再次失敗,則丟包。
參考CWNA教材,有給出詳細每一次回退的CW窗體大小,例如以下:

RTS/CTS模式
在DCF模式下,我們還須要知道存在兩種子模式:Basic模式與RTS/CTS模式。
在之前CSMA/CA討論中,我們所描寫敘述的都是Basic模式。這一章我們理解RTS/CTS模式。
為了更好的理解RTS/CTS模式,我們首先要介紹無線網絡中著名的隱藏終端問題(hidden terminal problem)。
在上圖中。還是僅僅有一個AP和兩個節點(STA 1與STA 2)。圖中藍色虛線代表STA 1的發送范圍,綠色虛線代表STA 2的發送范圍。
從圖中,我們能夠得知,因為兩個節點的發送范圍無法互相覆蓋。從而兩者在發送數據時,是無法通過物理監聽的方法,探測對方是否有發送數據。從而依照我們之前所述的CSMA/CA機制,STA 1和STA 2一直會誤覺得信道空暇。從而不斷倒數,當計時器到0時。則發送數據。例如以下圖:
在上圖中,因為STA 1與STA 2無法互相監聽,即STA 2發送數據后,STA 1還繼續進行backoff過程,從而繼續倒數。當STA 1的隨機回退計數值倒數至0時。STA 1也會發送數據。
因為STA 1與STA 2的發送存在重疊區域,即也是發生了沖突,AP無法正確接收數據。即不會反饋ACK,終於這一輪傳輸失敗。這一輪失敗之后,STA 1與STA 2採用BEB算法又一次選擇隨機數進行回退,可是因為兩者沒有辦法互相監聽,所以非常easy再次出現同一時候傳輸的現象。
所以在隱藏終端的情況下,網絡性能最差時是無法傳遞數據包的,換言之。STA 1與STA 2的吞吐量都趨近於0。
為了解決問題。故在DCF中,引入了RTS/CTS機制。
- RTS:Request To Send,即請求發送。RTS幀是一個單播幀,沒有加密,其duration字段中填充包括興許發送過程中整體所須要時間。
- CTS:Clear To Send,即信道清除幀。
節點在收到CTS后。確認信道是空暇的,能夠發送。CTS也是一個單播幀,沒有加密,其duration字段包括除去RTS以及一個SIFS后,發送過程整體所須要時間。
接着我們採用下圖解釋RTS/CTS詳細的工作方法:
在上圖中,STA 2已經倒數至0,其首先發送RTS數據幀給AP。若在AP處沒有沖突,即AP成功解調出STA 2的RTS,AP會在等待SIFS之后發送CTS幀給STA 2。
因為無線信道是一個廣播信道,要是幀沒有加密的話。那么全部節點都是能夠解析其信息的,所以這里AP盡管是發送CTS給STA 2,只是STA 1也能夠解析該CTS信息。這也是非常多書上寫,RTS/CTS都是一個廣播過程的原因。
- 當STA 1接收到CTS之后,該CTS不是我所請求所獲得的,或者說,該CTS不是相應發給我的CTS。從而STA 1會將CTS數據幀的duration給提出。並設置在自己本地的NAV(Network Allocation Vector)上。若NAV沒有倒數到0,那么其會主動懸掛其隨機回退計數值,在NAV沒有倒數到0之前,其隨機回退計數值不再繼續倒數。
- 當STA 2接收到CTS后。其發現該其是之前發送RTS的反饋。故節點已知信道空暇,在等待SIFS后,STA 2發送數據。當傳輸數據完畢之后,AP向STA 2反饋ACK,從而終於完畢一次傳輸。
RTS/CTS工作機制相應的時序圖例如以下:
在上圖中。我們能夠發現,NAV的部分和我們在CSMA/CA的流程圖中的Busy medium是一樣的,其差別在於一者是物理載波監聽(即之前的Busy medium是因為物理載波監聽所引起的)。而另者是虛擬載波監聽(即NAV是由虛擬載波監聽所引起的)。在下一節。我們會討論物理載波監聽與虛擬載波監聽機制。
在實際的路由器中,RTS/CTS模式不是以開關的形式存在。而是以RTS_threshold的形式存在的。RTS/CTS另外一個思維就是 "採用小的數據包碰撞。來避免大的數據包碰撞" 。從而假設數據包太小,那么則不須要採用RTS/CTS機制。設置RTS_threshold的范圍一般為2347,其單位是byte,即假設數據包大小假設大於2347 byte,那么才會採用RTS/CTS模式。在現實應用中。能夠依據詳細的情況,設置一個最適合的值。
注:在本段中,我們所述RTS/CTS着重解決隱藏終端問題,同一時候RTS/CTS也是利用小數據包碰撞來避免大數據包碰撞的方法,該方法對於在沒有隱藏終端,可是節點數非常多的網絡中,也時非常有效果的。
同一時候,本章節中,我們提到採用RTS/CTS模式來設置NAV。這里須要強調的是。RTS/CTS能夠設置NAV,可是NAV不是僅僅僅僅能用RTS/CTS來設置。僅僅要數據幀MAC頭部的duration字段有數值。那么就能夠設置NAV。該機制在802.11協議中,有非常廣泛的應用,比方PCF的Contention Free周期。EDCA中的TXOP機制等。
物理載波監聽和虛擬載波監聽
在這一章節,我們討論物理載波監聽和虛擬載波監聽機制,兩者是在CSMA/CA過程中同一時候使用的,在《CWNA第一版》一書中,對此有較好的描寫敘述:
從該圖中。我們能夠明顯看出。物理載波監聽和虛擬載波監聽是同一時候運行推斷的,當中僅僅要有一個是出於Busy狀態,那么就不會觸發隨機回退計數值減1的過程,換言之,即是掛起了隨機回退計數值。從該圖中,我們能夠明顯得知。虛擬載波監聽就是相應的NAV機制,而物理載波監聽則是相應到了CCA(Clear Channel Assessment)機制。
以下我們着重關注物理載波監聽的CCA機制:
在CSMA/CA中。CCA由能量檢測和載波檢測一起完畢:
- 能量檢測(Energy Detection):是直接用物理層接收的能量來推斷是否有信號進行接入,若信號強度大於ED_threshold,則覺得信道是忙,若小於ED_threshold。則覺得信道是閑。同一時候該ED_threshold的設置與發送功率有關。比方發送功率大於100mW。那么ED_threhold約為-80dBm,發送功率在50mW至100mW之間。那么ED_threshold應該為-76dBm。只是至於詳細的數值。須要查看其詳細所相應版本號的802.11協議。
- 載波偵聽(Carrier Sense):載波監聽的方法指的是用來識別802.11數據幀的物理層頭部(PLCP header)中的preamble部分。簡單的說,802.11中的preamble部分採用特定的序列所構造,該序列對於發送方和接收方都是已知的,其用來做幀同步以及符號同步。在實際監聽過程中。節點會不斷採樣信道信號,用其做自相關或者互相關運算。當中自相關在基於OFDM的802.11技術中經常使用。比方802.11a。而互相關在基於DSSS技術中經常使用,比方802.11b。與能量檢測類似,相關計算值須要與一個閾值進行推斷,若大於,則覺得檢測到了一個信號。若小於則沒有檢測到。
協議中規定,兩種檢測方式同一時候採用。且僅僅要兩者檢測方式中。有一種推斷信道是busy的話,那么就覺得信道是busy的,僅僅有兩者都覺得信道空暇時,那么再推斷虛擬載波監聽機制是否為0。以上條件都滿足時,那么才干夠進行backoff倒數。
DIFS,SIFS與Slot time
最后我們淺談下DIFS,SIFS與Slot time的具體功能。在前面的敘述中,我們使用"等待" 這一詞來描寫敘述節點在DIFS與SIFS過程中的動作,同一時候我們描寫敘述slot time內持續監聽信道。在實際過程中。DIFS與SIFS不是純粹的等待動作。而slot time也不是整個周期都是監聽信道。我們首先談談slot time的構造,因為筆者這一部分沒有具體翻閱協議,參考一篇論文《WiFi-Nano: Reclaiming WiFi Efficiency Through 800 ns Slots》,其舉例一個9us的slot time的組成例如以下:
即Slot time由電磁波傳播時延(Propagation),信道檢測CCA時間(Clear Channel Assessment)以及天線的發送/接收切換(Rx/Tx Hardware Turnaround)組成。故這里就明白回答了。在一個slot time內不是整個周期都在監聽信道。而僅僅有CCA時間這一部分在監聽信道。而最后一個天線發送轉換也好理解一些。這里我們在說CCA監聽信道的過程中,除了為了之前我們所述的backoff過程,實際上節點也在利用CCA來監聽。是不是有給我的數據包。假設該數據包不是給我的,那么CCA監聽結果就是忙,然后等一個slot以后繼續監聽。假設監聽該數據包是給我的,那么就直接轉換到接收狀態。而不是繼續進行每個slot監聽的動作了。
同一時候。這里我們之所以將DIFS,SIFS與Slot time放在一起討論。是因為DIFS = SIFS + 2*Slot time。SIFS的功能我們能夠理解成,包括天線發送接收轉換,以及上層處理數據所須要的延遲時間。而DIFS中,因為正巧包括了兩倍的Slot time,所以非常大程度上。在DIFS內,應該運行了兩次信道監聽過程,可是這兩次的監聽過程沒有觸發backoff。僅僅有監聽到連續兩次信道空暇后,那么DIFS之后才會進行backoff過程,該設計思想應該是源於P堅持-CSMA的,同一時候,這個思路也是和我們在討論物理載波監聽和虛擬載波監聽中的插圖所符合的。類似的,在802.11協議中,其它的部分幀間間隔也是基於slot time和SIFS計算所得,比方PIFS = SIFS + SLOT。EIFS = ACK time + SIFS + DIFS。
PS:在協議中,SIFS和Slot time組成例如以下:
aSIFSTime= aRXRFDelay+aRXPLCPDelay+aMACProcessingDelay+aRxTxTurnaroundTime
aSlotTime= aCCATime+aRxTxTurnaroundTime+aAirPropagationTime+aMACProcessingDelay
從其名字能夠大致看出其詳細的包括內容。
注:以上就是筆者對於DCF與CSMA/CA的基本理解,大部分內容都是參考筆者前一篇資料總結中所列之參考文獻。
上述表述中,或許存在一些錯誤,還請見諒,也有一些細節,並沒有在這一篇中展開敘述。有空筆者再繼續進行整理。同一時候,筆者所學有限,若文中出現了的錯誤的地方。還請指出。謝謝。