王心源,程 鵬,吳 斌,李雪妍
(1.中國科學院微電子研究所,北京 100029;2.中國科學院大學,北京 100049)
WiFi是IEEE定義的一個無線網絡通信的工業標準(IEEE 802.11)[1],WiFi 是一種短程無線傳輸技術[2]。無線局域網(Wireless Local Area Networks,WLAN)技術或WiFi技術由于技術成熟、易于部署以及成本較低被廣泛地應用于短距離場景如家庭場景。但在某些遠距離特殊場景下不便于有線通信設備的安裝和部署,技術人員也渴望使用WiFi技術。增大WiFi的發射功率可以顯著增加傳輸距離,在傳輸功率方面滿足了遠距離傳輸的要求時仍存在一些問題,如隱藏節點等。這些問題的根源在于WiFi 所采用的媒體訪問控制(Media Access Control,MAC) 技術為載波監聽多路訪問/沖突避免(Carrier Sense Multiple,CSMA/CA),CSMA 基于競爭的設計原理導致了特定場景性能低下,且無法避免[3]。基于時分多址(Time Division Multiple Access,TDMA)的MAC 協議對共享的媒介在時間上進行精細的劃分,各個節點只在自己歸屬的時隙內發送數據,實現了無競爭機制,避免數據競爭信道時產生碰撞,很好地解決了遠距離傳輸下的隱藏節點問題[4]。在當前WiFi商用硬件設備上對TDMA模式支持較少。文中在開源網絡仿真器NS-3中基于WiFi組件實現了TDMA 的MAC協議仿真。
時分多址是一種無爭用的介質訪問協議。網絡中所有節點共享的信道帶寬被劃分為時間槽,每一個節點循環使用時間槽。各節點只在其分配的時間段內傳輸數據,傳輸槽通常是固定的時間間隔[5-6]。
每個傳輸槽之間插入保護間隔,以便傳輸不重疊。保護間隔的值通常是一個數據包傳輸到指定的傳輸范圍所需要的時間。在這個簡單的時分多址模型中,假設節點的時鐘是同步的。
在多節點網絡中,許多沖突都是由隱藏節點問題引起的。如圖1 所示,AP 為接入點,STA1 和STA2為兩個站點。在家庭場景中,STA1 和STA2 的距離較近,它們可以通過載波偵聽感受到彼此的存在,即STA1 或STA2 要發送數據包時會先檢測載波是否正在被使用,如果被使用會進行隨機退避,此時不會發生沖突。一旦STA1和STA2均距離AP較遠甚至為傳輸極限距離時,STA1 和STA2 將無法感受到彼此的存在,對于站點STA1 和STA2 來說載波是空閑的。若此時兩個站點同時向AP 發送數據,那么將會產生沖突導致數據的傳輸錯誤或失敗[7]。

圖1 隱藏節點問題
當兩個不在彼此傳輸范圍內的節點向同一接收器發送數據時,來自兩個發射器的數據包在接收器上發生碰撞。這就是所謂的隱藏節點問題。
IEEE 802.11 是一種基于爭用的MAC 協議,通過引入無競爭的TDMA協議可以有效地解決此類問題。
NS-3 將連續變化的網絡過程按照時間順序分割成一系列的離散事件[8]。完整的NS-3 網絡模擬過程就是按時間先后執行這些離散事件,如圖2 所示。

圖2 發送過程從連續到離散的過程
一個分組從節點0到節點1,其步驟可總結如下:
1)T1時刻,節點0 開始向信道中發送分組的第一個字節,這時節點0 的網絡設備被占用,無法發送其他分組;
2)T2時刻,分組的最后一個字節發送完畢。網絡設備被釋放。T1到T2時刻這段時間就是分組的傳輸延時;
3)T3時刻,分組被節點1 接收,NS-3 假設節點沒有傳輸延遲,所有到達其網絡設備的分組被立即接收。T2到T3這段時間即使分組的傳播延遲。
物理網絡中所有分組發送過程都是連續的,NS-3 將這個連續過程抽象為3 個離散事件,也就是3 個函數[9]。
T1時刻的分組發送事件,節點0 在T1開始發送分組,與物理網絡不同的是,節點0 一次性將整個分組發送給信道的C++對象,通過鎖定網絡設備,使其無法發送其他分組(后續分組將進入到網絡設備對象的緩存中),直到T2時刻新的事件發生,即網絡設備解鎖。
通過在T1時刻鎖定網絡設備和T2時刻解鎖網絡設備兩件離散時間模擬出一個連續的分組發送過程。同樣模擬分組在信道中的傳輸過程,信道在T1時刻計劃一個新的事件,在T3時刻將分組一次性的轉發給目標節點1 網絡設備的C++對象[10]。
通過在腳本中設置分組大小、傳輸速率和傳播延遲的屬性,可以模擬不同的網絡仿真。
在NS-3 中將節點(node)、設備(device)、協議層(MAC)、物理層(PHY)以及信道(Channel)均抽象成一個個C++的類[11]。該文通過在NS-3 仿真平臺中加入TDMA 相關的類TdmaMac 類、TdmaQueue 類以及TdmaController 類,實現了簡單的TDMA 協議。
2.2.1 TdmaMac
上層的數據包(packe)由IP 層傳送到TdmaMac中,TdmaMac 在收到數據包后,調用Enqueue 函數將數據包放入隊列并等待。等待到屬于該節點的傳輸時隙到來,TdmaMac 通過Get QueueState 函數查詢TdmaQueue 中的入隊數據包packet,然后將數據包packet 循環地從隊列中取出,并附加上MAC 頭和尾,執行函數Start Transmission 將數據包發送給SimpleWireless Channel 類。同時在傳輸開始之前TdmaMac 中還需要根據packet 的大小(size)計算出傳輸所需的時間,把所有需要傳輸的packet 的時間總和和TdmaController 分配給該節點的傳輸時間進行比較,如果在該節點回合下不能再傳輸一個packet,則終止傳輸循環,即使還剩余一定的時間。
2.2.2 TdmaQueue
TdmaQueue 隊列主要實現丟包策略。查詢隊列的state 為full 時,將此時上層發送的packet 丟掉。TdmaQueue 中主要的兩個屬性變量為QueueLength和QueueTime。QueueLength 變量為隊列最大長度,QueueTime 為隊列最大延時。當隊列中數據包數達到QueueLength 數量時,后邊得到的數據包均丟掉。QueueTime 設定的時間為數據packet 在隊列中能夠存儲的最長時間,當數據包在隊列中存儲的時間大于QueueTime 時,數據包packet 同樣被丟掉。TdmaQueue 實現了以上兩種根據隊列長度以及數據包存儲時間的丟包策略。
2.2.3 TdmaController
TdmaController 負責管理和計劃實現TDMA 協議的控制,TdmaController 類初始化TDMA 傳輸參數,授權節點進行傳輸。在仿真開始前將分配給傳輸的插槽數量和插槽持續時間分配給每一個節點[12-14]。仿真開始后,仿真程序通過MAC 指針列表中調用TdmaMac,并指示節點它可以傳輸一個特定的SlotTime。當傳輸完成后,等待一個GuardTime,然后開始下一個節點,從列表中調用下一個節點。一旦所有節點全部遍歷完成,等待一個InterFrame Time 時間再開始下一個周期。
TdmaController 函數為Tdmacontroller 起始執行函數,Start 函數中首先啟動controller。Start 函數調用仿真器simulator 執行StartTdmaSessions 函數。Start TdmaSessions 函數在第0 秒執行ScheduleTdma Session 函數。ScheduleTdmaSession 函數中創建了一個mac 的map。在每一個slot 中不斷地循環執行ScheduleTdmaSession 函數,Start 函數調用關系如圖3 所示。

圖3 Start函數調用關系
ScheduleTdmaSession 函數通過調用 Tdma CentralMac::StartTransmission 函數,不斷地調用SendPacketDown 函數將packet 傳遞下去。Send PacketDown 函數調用lowmac 層的StartTransmission函數最終將packet傳輸出去進入到信道中[15-17]。
函數 TdmaController::CalculateTxTime 調用CalculateBytesTxTime 計算packet 的TX 時間,以供TdmaMac::StartTransmission 使用,判斷剩余packet 是否能在slot時間內傳輸完成。

圖4 傳輸函數執行過程
TdmaMac::StartTransmission 執行后,TdmaCon troller 先對packet 的傳輸時間進行計算得到packetTransmissionTime,然后將其與totalTransmi ssionSlot 進行比較。
該系統測試TDMA 性能采用一個接入點,4 個客戶端的應用場景,仿真參數設置如表1 所示。4 個客戶端STA1、STA2、STA3、STA4 按時隙順序分配,且時隙大小相同,每個客戶端均占用一個slottime 進行輪詢。

表1 仿真參數設置

圖5 TDMA仿真拓撲
通過配置上層的應用產生packet 的速率以及分別設置物理層的傳輸速率進行吞吐率測試,吞吐率仿真結果如表2 所示。

表2 吞吐率仿真結果
文中對WiFi 設備在特定場景下應用的缺點進行了簡要分析,簡單介紹了隱藏節點問題的定義,其根本原因來自協議的競爭機制,因此提出使用公平接入的TDMA 協議。同時在NS-3 開源仿真器中增加了相關模塊,Tdmamac 類,TdmaQueue 類 和Tdmacontroller 類,這3 類實現了基本TDMA 協議,并對其正確性進行了驗證。如有需要,可以在此基礎上添加TDMA 調度算法。