摘要:網絡仿真是一種專門對實際網絡進行模擬與分析的工具,是網絡研究者研究新理論新算法經濟而有效的手段#65377;本文研究網絡仿真軟件NS2的功能擴展及網絡仿真實現過程,并將其應用于網絡擁塞控制的研究中,研究了模糊自適應PID網絡擁塞控制算法,取得了較好的效果#65377;
關鍵詞:網絡仿真;網絡擁塞;網絡擁塞控制
中圖分類號:TP393
文獻標識碼:A
1引言近
十幾年來,計算機網絡飛速發展,其應用領域不斷拓展,應用模式不斷豐富,網絡數據流量激增,網絡擁塞問題也變得越來越嚴重#65377;擁塞控制是保證網絡魯棒性的關鍵因素,同時又牽涉到網絡運行的經濟性,也是為網絡提供QoS保證的必要前提#65377;因此,對網絡擁塞控制的研究具有重要的理論意義和實際應用價值,是當前網絡研究的一個熱點問題[1,2]#65377;
NS2(Network Simulator Version2)是由UC Berkely大學開發的基于事件驅動的仿真器,是一種免費的開放源代碼的網絡仿真軟件[3],用C++和Otcl語言編寫而成,能近乎真實地模擬網絡環境,支持的協議廣泛可以在各個層次上模擬網絡的運行,可運行在Linux#65380;Unix#65380;Solaris#65380;Windows等平臺上供研究人員進行二次研發#65377;NS2采用開放的體系結構,用戶可以根據需要進行功能擴展,但現有的一些中文文獻重在討論NS2的模塊組成#65380;仿真腳本的編寫技巧等方面[4-7],對NS2擴展原理的討論相對較少#65377;本文研究了網絡仿真軟件NS2的功能擴展及網絡仿真實現過程,并將其應用于網絡擁塞控制的研究中,研究了模糊自適應PID網絡擁塞控制算法,取得了較好的控制效果#65377;
2NS2網絡仿真及實現
2.1NS2網絡仿真過程
網絡仿真一般要經過建立模型#65380;模擬實現和結果分析三個過程#65377;NS2仿真分兩個層次:一個是基于Otcl編程的用戶層次,利用已有的網絡元素實現仿真,只需編寫Otcl腳本;另一個層次是基于C++和Otcl編程的系統層次,如果沒有所需的網絡元素,就需先進行功能擴展,添加所需的網絡元素#65377;這就要利用分裂對象模型,增加新的C++和Otcl類,然后再編寫Otcl腳本#65377;仿真過程如圖1所示#65377;圖1NS2網絡仿真過程
2.2NS2網絡仿真的功能擴展與實現
已有的NS2軟件往往不能直接提供新的協議和算法,網絡研究者要不斷研究新的協議和算法,為網絡的發展作前瞻性的研究分析,就需要對NS2的功能進行擴展,一般步驟如下:
#8226;定義或繼承C++協議類;
#8226;編寫該類成員函數和協議算法;
#8226;建立這個類在TCL中連接類;
#8226;把C++代碼綁定到TCL,即將C++類中的成員變量和成員函數影射到TCL類中;
#8226;修改makefile文件,用make命令重新編譯生成ns.exe文件,則新建的對象被加入到NS2的網絡組件庫中,可以被用戶在TCL中調用#65377;
3NS2在網絡擁塞控制研究中的應用
網絡擁塞是一種持續過載的狀態,此時用戶對網絡資源(包括鏈路帶寬#65380;存儲空間和處理器處理能力等)的需求超過了其固有的容量#65377;網絡擁塞控制算法對保證Internet的穩定具有十分重要的作用#65377;目前,已提出多種網絡擁塞控制算法,本文對NS2進行功能擴展,并應用于網絡擁塞控制研究中,研究了一種模糊自適應PID網絡擁塞控制算法,取得了較好效果#65377;
3.1模糊自適應PID網絡擁塞控制算法
模糊自適應PID網絡擁塞控制算法運用模糊數學的基本理論和方法,把規則#65380;條件及操作用模糊集表示,并把這些模糊控制規則及有關信息(如評價指標#65380;初始PID參數等)作為知識存入計算機知識庫,然后計算機根據系統實際響應情況(即專家系統的輸入條件),運用模糊推理,自動實現對PID參數的自動修改和完善,以達到最佳控制效果#65377;
網絡丟包概率表達式如下:為實現模糊自適應PID網絡擁塞控制算法,需建立一個新的fuzzyQueue類#65377;由式(3)(4)可看出,在fuzzyQueue的結構中應有一組變量來記錄相關參數的初始值,如控制器初始值a#65380;b#65380;c及采樣頻率等#65377;此外,還需另有一組參數記錄fuzzyQueue的一些歷史狀態(如上一時刻隊列長度及丟包率等)以便計算新的丟包率#65377;所以用如下兩個結構:edp和edv,其中edp(early drop parameters)記錄初始參數情況,這些參數值由用戶提供,程序運行中不再改變;edv(early drop variables)記錄隊列的歷史狀態信息,這些變量值在程序運行中會動態改變,由該段代碼是edp結構,其中mean-pktsize為平均包大小,bytes和setbit為兩個標志,bytes通過0#65380;1設置指出隊列長度是通過緩存中包的個數來計算還是通過字節來計算,setbit指出當檢測到擁塞時是否采用標記位的辦法,a#65380;b#65380;c為模糊自適應PID算法中的參數,w為采樣頻率,qref為期望隊列長度#65377;
該段代碼是edv結構,其中v-prob為丟包概率,count和count-bytes分別為目前丟包的個數和丟包字節數,eold為上一時刻隊列誤差,eoldold為上兩時刻隊列誤差#65377;該算法每隔一段時間要對丟包概率更新一次#65377;為保證這個過程周期性進行,需要建立一個fuzzyCalcTimer類,它是timer-handler的子類#65377;以上結構是建立最重要的類fuzzyQueue的必要支持#65377;在fuzzyQueue類中,最主要成員變量包括:fuzzyCalcTimer CalcTimer#65380;edp edp-#65380;edv edv-#65380;int curq(當前隊列長度)#65380;PacketQueue q-#65377;
程序中要先得到當前隊列長度:int qlen = qib- ? q-->byteLength() : q-->le ngth(),然后更新丟包概率:
其中qib-標志隊列長度是用包的個數來表示還是用字節數來表示#65377;當qib-為1時,表示用字節數來表示隊列長度#65377;edv-.v-prob為上一時刻的丟包概率,edv-.qold為上一時刻隊列長度,eoldold為上兩時刻隊列誤差#65377;而edp-.mean-pktsize為平均包大小,edp-.qref為期望隊列長度,edp-.a#65380;edp-.b#65380;edp-.c為算法和模型提供的參數#65377;隨后添加以下代碼,以對狀態變量進行更新:
在ns-allinone-2.29下的ns-default.tcl文件里對TCL變量初始化:隊列長度使用包進行計算,采樣頻率為170Hz,期望隊列長度為300個包,平均包大小為600字節,檢測到擁塞時直 接丟包,初始的丟包率和隊列長度為0#65377;
最后打開ns-allinone-2.29下的makefile文件,在其輸出文件列表中加入新協議的輸出文件queue/fuzzy.o,然后執行命令make#65377;NS2的功能得以擴充,即可仿真網絡擁塞控制算法的效果#65377;
4仿真實驗
考慮如圖2所示的網絡拓撲結構,瓶頸鏈路位于路由器R1和R2之間,鏈路容量15 Mbps(3750packets/s,分組缺省大小為500 bytes),延時10 ms#65377;假設圖中連接數n為500,所有的500個TCP連接均為持久性的FTP業務源,發送節點與R1之間的鏈路容量均為10 Mbps,傳輸延時10 ms,R2與接收節點之間的鏈路容量也均為10 Mbps,傳輸延時10 ms#65377;除R1的隊列管理采用各種AQM算法外,其余隊列管理算法均為DropTail,所有節點的隊列緩存大小為600Packets,隊列大小期望值為300Packets#65377;圖2網絡拓撲結構圖3兩種算法的控制效果圖3給出了PID和模糊自適應PID兩種網絡擁塞控制算法下的控制效果#65377;由仿真結果可以看出,模糊自適應PID網絡擁塞控制算法在調節時間上明顯優于PID網絡擁塞控制算法,且該算法始終將隊列保持在目標隊列附近,同時隊列的抖動也明顯小于PID網絡擁塞控制算法的隊列抖動,模糊自適應PID網絡擁塞控制算法的控制效果比PID網絡擁塞控制算法的控制效果好#65377;
5小結
本文研究和探討了網絡仿真軟件NS2的功能擴展及仿真實現過程,并將其應用于網絡擁塞控制的研究中,研究了模糊自適應PID網絡擁塞控制算法,從仿真結果可以看出,模糊自適應PID網絡擁塞控制算法具有較好的控制效果#65377;
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文。