鐘 輝,周甜甜
(沈陽(yáng)建筑大學(xué) 信息與控制工程學(xué)院,沈陽(yáng) 110168)
無(wú)線路由協(xié)議由先驗(yàn)式和和按需路由協(xié)議組成.按需路由協(xié)議不需要周期性與鄰接點(diǎn)交換路由信息來(lái)維護(hù)整個(gè)網(wǎng)絡(luò)的路由表,而是在節(jié)點(diǎn)需要給目的節(jié)點(diǎn)發(fā)送數(shù)據(jù)分組時(shí)來(lái)尋找到達(dá)目的節(jié)點(diǎn)的路由,因此控制開銷較小.路由信息可以得到有效的利用[1].在按需路由協(xié)議中,AODV(Ad Hoc on-demand distance vector)協(xié)議的路由開銷相對(duì)較少,收斂性快,有明顯的優(yōu)勢(shì),但隨著數(shù)據(jù)量的激增,單路徑路由協(xié)議AODV顯然已不能滿足需求,在基于AODV擴(kuò)展的多路徑路由協(xié)議中,AOMDV多路徑路由協(xié)議在AODV協(xié)議基礎(chǔ)上,實(shí)現(xiàn)了獲取多條無(wú)環(huán)路、且節(jié)點(diǎn)不相交路徑完成路由表包含多條有效路徑[2].其主要缺點(diǎn)是沒(méi)有考慮鏈路的傳輸壓力,緩存隊(duì)列長(zhǎng)度有限,若隊(duì)列中緩存的分組沒(méi)有被及時(shí)發(fā)送出去,后到達(dá)的分組將會(huì)因?yàn)楫?dāng)前隊(duì)列占有率過(guò)大而被丟棄,造成數(shù)據(jù)包的丟失,降低網(wǎng)絡(luò)的吞吐量,隊(duì)列中沒(méi)有被及時(shí)發(fā)送出去的分組也會(huì)增加不必要的排隊(duì)時(shí)延,增加端到端延時(shí),浪費(fèi)網(wǎng)絡(luò)資源.針對(duì)AOMDV路由協(xié)議對(duì)此造成的不良影響,本文提出一種基于啟用實(shí)時(shí)監(jiān)測(cè)鏈路傳輸壓力的多路徑路由協(xié)議QE_AOMDV.
AOMDV路由協(xié)議是對(duì)AODV單路徑路由協(xié)議進(jìn)行了多路擴(kuò)展,它是充分將RREQ請(qǐng)求分組的泛洪特性使用在路由請(qǐng)求過(guò)程,促使多條節(jié)點(diǎn)不相交路徑在廣播中建立[3].
在路由請(qǐng)求過(guò)程中,AOMDV多路徑路由協(xié)議和AODV協(xié)議相似,基于序列號(hào)來(lái)表明路徑的新舊,以保證不產(chǎn)生環(huán)路路徑.AOMDV協(xié)議中為了使目的節(jié)點(diǎn)序列號(hào)保持單調(diào)遞增,協(xié)議定義了“廣告跳數(shù)(Advertised HopCount)”的概念來(lái)產(chǎn)生目的節(jié)點(diǎn)序列號(hào).任何源節(jié)點(diǎn)到目的節(jié)點(diǎn)的廣告跳數(shù)使用其間多條路徑中有“最大”跳數(shù)的有效路徑來(lái)表達(dá).確定了最大跳數(shù),任何目的節(jié)點(diǎn)序列號(hào)廣告跳數(shù)都始終不變.而AOMDV協(xié)議只使用跳數(shù)小于最大跳數(shù)的備選路由表項(xiàng).源節(jié)點(diǎn)尋早目的節(jié)點(diǎn)路由時(shí)就開始廣播 RREQ 分組,當(dāng)RREQ分組到達(dá)中間節(jié)點(diǎn)時(shí),可能有多個(gè)RREQ分組到達(dá),檢查每個(gè)RREQ分組中firsthop字段和節(jié)點(diǎn)的最后一跳列表,檢查此路由是否來(lái)自源節(jié)點(diǎn)的不同鄰居節(jié)點(diǎn),因此來(lái)判斷RREQ分組內(nèi)容能否提供沒(méi)有使用過(guò)的節(jié)點(diǎn)不相交路徑[4].據(jù)此目的節(jié)點(diǎn)或者具有有效路由中間節(jié)點(diǎn)產(chǎn)生RREP分組,將RREP 分組單播回傳到源節(jié)點(diǎn).多個(gè)RREP分組到達(dá)源節(jié)點(diǎn),最后多條節(jié)點(diǎn)不相交路徑在源節(jié)點(diǎn)路由表中產(chǎn)生出來(lái).AOMDV協(xié)議的路由發(fā)現(xiàn)機(jī)制選擇跳數(shù)最少的路徑作為傳輸主路徑,剩余的路徑稱為備份路徑.若輸主路徑失效,分組的傳輸就用備份路徑來(lái)代替主路徑進(jìn)行,一直至運(yùn)行至路由表中所有備份路徑都失效,再由源節(jié)點(diǎn)開啟一輪新的尋路過(guò)程[5].
路由維護(hù)發(fā)生在鏈路斷裂時(shí),如果當(dāng)前節(jié)點(diǎn)到目的節(jié)點(diǎn)的跳數(shù)小于源節(jié)點(diǎn)到當(dāng)前節(jié)點(diǎn)的跳數(shù),則進(jìn)行本地路由修復(fù).即如果當(dāng)前節(jié)點(diǎn)正在傳輸數(shù)據(jù),鏈路發(fā)生異常,則緩存數(shù)據(jù),將該節(jié)點(diǎn)標(biāo)記為RTF_IN_REPAIR,并向目的節(jié)點(diǎn)發(fā)送一個(gè)路由發(fā)現(xiàn)請(qǐng)求.如果在定時(shí)器規(guī)定時(shí)間內(nèi),沒(méi)有找到當(dāng)前節(jié)點(diǎn)到目的節(jié)點(diǎn)的有效路由,將該路由釋放,丟棄緩存的數(shù)據(jù)包,發(fā)送RRER錯(cuò)誤分組至上流節(jié)點(diǎn),通知上游節(jié)點(diǎn)避免使用所有經(jīng)過(guò)該節(jié)點(diǎn)的路由[6].
首先數(shù)據(jù)包在應(yīng)用層(Application::send)向下發(fā)送到代理Agent層;代理Agent層(UdpAgent::sendmsg)初始化Agent代理生成其代理對(duì)象UdpAgent.UdpAgent對(duì)象產(chǎn)生對(duì)應(yīng)的數(shù)據(jù)分組,并將分組傳入到Node節(jié)點(diǎn)的分類器Classifier(Classifier::recv)對(duì)象,該對(duì)象調(diào)用find()函數(shù)返回下一跳地址.在Packet包對(duì)象內(nèi)容中是由Find()函數(shù)查找獲得Packet包的下一跳地址的,分類器recv 函數(shù)分組的下一跳地址后調(diào)用節(jié)點(diǎn)node->recv()函數(shù)進(jìn)入connector對(duì)象;然后再調(diào)用connector::recv函數(shù)和 connector::send函數(shù)后確定數(shù)據(jù)包是否可發(fā)送,之后進(jìn)入Trace::recv函數(shù),此時(shí)將這個(gè)數(shù)據(jù)包加入隊(duì)列的記錄保存起來(lái);之后再由 connector::send函數(shù)進(jìn)入Queue::recv 函數(shù),將數(shù)據(jù)包正式加入發(fā)送隊(duì)列,判定是否加入隊(duì)列成功或被丟棄;然后再調(diào)用 DequeTrace::recv函數(shù)將數(shù)據(jù)包彈出隊(duì)列的記錄保存起來(lái);最后再通過(guò)connector::send函數(shù)調(diào)用進(jìn)入LinkDelay::recv方法,首先進(jìn)行目的節(jié)點(diǎn)是否可達(dá)的判斷,再根據(jù)不同結(jié)果將事件寫入scheduler對(duì)象,等待NS事件調(diào)度執(zhí)行.
隊(duì)列代表存放(或者丟棄)包的地方,在網(wǎng)絡(luò)中DropTail管理機(jī)制是最廣泛使用的隊(duì)列管理機(jī)制[7].當(dāng)某個(gè)數(shù)據(jù)包到達(dá)隊(duì)列時(shí),增加包到隊(duì)列尾部而等待,考慮存儲(chǔ)空間限制造成等待隊(duì)列長(zhǎng)度設(shè)置有限,大量數(shù)據(jù)流通過(guò)網(wǎng)絡(luò)時(shí),由于隊(duì)列沒(méi)有足夠的空間,這些剛到達(dá)的數(shù)據(jù)包就無(wú)法進(jìn)入隊(duì)列保存,因此簡(jiǎn)單的將隊(duì)列尾部的數(shù)據(jù)包丟棄,稱這樣的管理機(jī)制為DropTail.整個(gè)運(yùn)作方式為:包傳送的順序與包進(jìn)入隊(duì)列的順序相同,先進(jìn)入隊(duì)列的包先傳送出去,后進(jìn)入隊(duì)列的包等待前面的包傳送完成后再傳送出去.如果隊(duì)列長(zhǎng)度超過(guò)暫存空間的大小,就會(huì)把隊(duì)列最尾端的包丟棄[8].
DropTail在丟棄包時(shí),并不會(huì)去考慮要丟棄的包屬于哪個(gè)數(shù)據(jù)流,只是單純的把超過(guò)暫存空間大小的數(shù)據(jù)流丟棄,因此DropTail隊(duì)列管理機(jī)制的最大優(yōu)點(diǎn)就是實(shí)際操作簡(jiǎn)單.但是,有利有弊,在相當(dāng)長(zhǎng)一段時(shí)間內(nèi),這種單一特性的操作使得隊(duì)列處于滿負(fù)荷或幾乎滿負(fù)荷狀態(tài).本文提出的隊(duì)列管理機(jī)制最重要目的是降低穩(wěn)定狀態(tài)下隊(duì)列的長(zhǎng)度,因?yàn)榇蟛糠侄它c(diǎn)到端點(diǎn)的延遲其主要原因是數(shù)據(jù)包在緩存隊(duì)列中排隊(duì)等待造成的[9].
DropTail隊(duì)列列管理也容易產(chǎn)生TCP全局同步(TCP Global Synchronization)現(xiàn)象.因?yàn)榫W(wǎng)絡(luò)上數(shù)據(jù)流都具有突發(fā)性,因此到達(dá)每個(gè)路由器的包也是突發(fā)的.當(dāng)每個(gè)路由器暫存隊(duì)列處于滿負(fù)荷或幾乎滿負(fù)荷狀態(tài),大量的數(shù)據(jù)包會(huì)在短時(shí)間內(nèi)被丟棄.而在TCP協(xié)議下數(shù)據(jù)流具有自適應(yīng)特性,發(fā)送端檢測(cè)出數(shù)據(jù)包丟失就會(huì)立刻降低發(fā)送速度,緩解網(wǎng)絡(luò)擁塞狀況.發(fā)送端發(fā)現(xiàn)網(wǎng)絡(luò)擁塞緩解后又開始增加發(fā)送速度,最終又造成網(wǎng)絡(luò)擁塞.這種現(xiàn)象形成一個(gè)循環(huán),周而復(fù)始的進(jìn)行下去,會(huì)致使網(wǎng)絡(luò)長(zhǎng)期處于鏈路利用率很低的狀態(tài),降低了整體的吞吐量[10].為了克服這種TCP全局同步現(xiàn)象,如果能實(shí)時(shí)檢測(cè)到隊(duì)列中緩存區(qū)的狀態(tài),則可以及時(shí)掌握網(wǎng)絡(luò)擁塞情況,對(duì)全局同步現(xiàn)象做出預(yù)判,改善網(wǎng)絡(luò)性能.對(duì)此在第4部分提出基于DropTail的主動(dòng)丟包隊(duì)列管理機(jī)制.
本文提出的基于DropTail的主動(dòng)丟包隊(duì)列管理機(jī)制吸取了RED算法的思想,事先在隊(duì)列中隨機(jī)檢測(cè)隊(duì)列容量.隨機(jī)提前檢測(cè)RED算法使用主動(dòng)的管理隊(duì)列的方式.其主要算法過(guò)程是:在網(wǎng)絡(luò)路由器存滿接收到的包之前隨機(jī)檢測(cè)隊(duì)列容量,按事先確定的規(guī)則隨機(jī)丟棄包分組,這樣能夠事先告訴發(fā)送端縮小擁塞窗口,對(duì)進(jìn)入網(wǎng)絡(luò)包分組加以控制,防止路由器將更多的分組隨意丟棄.
RED算法主要分為兩種計(jì)算內(nèi)容:1)平均隊(duì)列長(zhǎng)度計(jì)算,指在時(shí)間上平均,該算法路由器的各個(gè)接口只有一個(gè)隊(duì)列;2)分組丟失概率計(jì)算.第一部分決定了路由器能夠允許的突發(fā)分組發(fā)送的程度,第二部分決定了路由器在當(dāng)前滿隊(duì)列狀態(tài)下分組丟棄的頻度,主要目的是讓路由器在時(shí)間間隔均勻的情況下丟棄分組,避免對(duì)突發(fā)性數(shù)據(jù)流的不公平性,同時(shí)防止TCP全局同步產(chǎn)生,還要能足夠頻繁地丟棄分組以控制隊(duì)列的平均長(zhǎng)度.使用平均隊(duì)列長(zhǎng)度比使用隊(duì)長(zhǎng)的瞬時(shí)值更能準(zhǔn)確的觀測(cè)到網(wǎng)絡(luò)的擁塞情況[11].
Drop Tail是廣泛使用的隊(duì)列管理機(jī)制.它類似于FIFO(先入先出)的管理,先到達(dá)路由器的分組先被傳輸,原理相對(duì)簡(jiǎn)單.路由器緩存隊(duì)列充滿數(shù)據(jù)時(shí),利用丟包進(jìn)行擁塞檢測(cè).但路由器隊(duì)列緩存空間收大小限制,如果在路由緩存充滿時(shí)還有分組到達(dá),那就丟棄該分組.若發(fā)生丟棄分組現(xiàn)象,立即告知發(fā)送端網(wǎng)絡(luò)出現(xiàn)擁塞,調(diào)整發(fā)送速率.這種方法的缺點(diǎn)是不考慮被丟棄包的重要程度.
隊(duì)列類是由一個(gè)連接器基類派生的,該基類可以派生出各種隊(duì)列類.隊(duì)列類Queue部分偽代碼如下:
Queue 繼承Connector{
純虛函數(shù)enque()
純虛函數(shù)deque()
接收函數(shù)recv()
獲取隊(duì)列初始長(zhǎng)度limit()
獲取隊(duì)列實(shí)時(shí)長(zhǎng)度length()
隊(duì)列最大包個(gè)數(shù)qlim_
……
}
enque和deque函數(shù)是純虛函數(shù),代表包的入列和出列,任何類型的隊(duì)列在實(shí)現(xiàn)Queue這個(gè)基類時(shí),都必須實(shí)現(xiàn)enque和deque兩個(gè)函數(shù).其中,qlim_代表隊(duì)列所允許的最大的包的個(gè)數(shù),limit()函數(shù)返回值是qlim_,即limit()函數(shù)的返回值是隊(duì)列設(shè)定的初始長(zhǎng)度,length()函數(shù)返回當(dāng)前隊(duì)列中緩存區(qū)的包的個(gè)數(shù),即緩存區(qū)的隊(duì)列長(zhǎng)度.DropTail繼承自Queue類,本文通過(guò)調(diào)用limit()和length()這兩個(gè)函數(shù)在路由層跨層獲取MAC層的隊(duì)列長(zhǎng)度來(lái)改進(jìn)包的發(fā)送策略.
網(wǎng)絡(luò)Mac層就是用接收來(lái)的包充滿緩沖區(qū)時(shí),看是否丟棄包來(lái)判斷網(wǎng)絡(luò)擁塞.遵循先進(jìn)先出原則,位于隊(duì)列中前面的包將率先被發(fā)送出去[12].如果此時(shí)隊(duì)列緩沖區(qū)已滿,那么后到達(dá)的包將被丟棄.
只有一個(gè)先進(jìn)先出(FIFO)隊(duì)列存在于DropTail管理機(jī)制,由包隊(duì)列類的對(duì)象實(shí)現(xiàn).DropTail隊(duì)列機(jī)制實(shí)現(xiàn)了自己的enque()函數(shù)和deque()函數(shù).enque()函數(shù)首先在隊(duì)列內(nèi)部判斷qlim_參數(shù)檢測(cè)隊(duì)列的容量,當(dāng)隊(duì)列中的包數(shù)量達(dá)到或者超過(guò)隊(duì)列最大長(zhǎng)度時(shí),丟棄最近接收的包.隊(duì)列類實(shí)現(xiàn)了緩沖區(qū)管理,但是卻不能在特定隊(duì)列上實(shí)現(xiàn)低層次的操作.解決這個(gè)問(wèn)題的有效方法是使用包隊(duì)列類.
該類是設(shè)置成一個(gè)包的鏈表,包的順序一般用特殊的調(diào)度和緩沖管理規(guī)則用來(lái)存儲(chǔ).其中,length()函數(shù)返回當(dāng)前隊(duì)列中包的數(shù)量,即隊(duì)列此時(shí)緩沖區(qū)的長(zhǎng)度,enque()函數(shù)將特定的包加在隊(duì)尾并修改成員變量len_,deque()函數(shù)返回隊(duì)列頭部的包.lookup()函數(shù)返回從隊(duì)列首部第n個(gè)包,若找不到,則返回空.
原始的隊(duì)列管理機(jī)制DropTail原理非常簡(jiǎn)單,就是當(dāng)路由器緩沖存滿時(shí)用丟包來(lái)警示網(wǎng)絡(luò)擁塞,包先到先被傳輸,若包到達(dá)時(shí)緩存已滿,丟棄分組,告知發(fā)送端網(wǎng)絡(luò)擁塞,調(diào)整發(fā)送端發(fā)送速率[13].
綜上所述,在原AOMDV路由協(xié)議中,包隊(duì)列始終處于隊(duì)列達(dá)到最大值就丟棄后來(lái)的包,無(wú)法利用隊(duì)列狀態(tài)對(duì)即將到來(lái)的包做出預(yù)判.無(wú)論當(dāng)前節(jié)點(diǎn)是否處于滿載狀態(tài),都將采用當(dāng)前節(jié)點(diǎn)進(jìn)行包的傳輸.如果節(jié)點(diǎn)此時(shí)的隊(duì)列緩沖區(qū)空閑,即時(shí)發(fā)送,如果有未發(fā)送的包且隊(duì)列未達(dá)到最大長(zhǎng)度,則將該包入列,等待前向包發(fā)送完成之后在發(fā)送.如果此時(shí)隊(duì)列中已達(dá)到最大長(zhǎng)度,則直接丟棄該包.原始的隊(duì)列管理機(jī)制沒(méi)有充分利用隊(duì)列狀態(tài),對(duì)節(jié)點(diǎn)是否是傳輸包的適宜節(jié)點(diǎn)作出明確說(shuō)明.導(dǎo)致后到的包仍然選擇負(fù)載較大的節(jié)點(diǎn)參與傳輸,造成不必要的丟包,降低網(wǎng)絡(luò)性能.
通過(guò)3.2的分析,本文發(fā)現(xiàn)在DropTail類中定義了指向PacketQueue的對(duì)象,通過(guò)該對(duì)象可以獲取包隊(duì)列中的隊(duì)列長(zhǎng)度及初始長(zhǎng)度.原AOMDV路由協(xié)議的隊(duì)列管理機(jī)制也采用了這一點(diǎn).在原DropTail隊(duì)列管理機(jī)制基礎(chǔ)上,引進(jìn)主動(dòng)丟包思想,改進(jìn)隊(duì)列管理機(jī)制.
4.3.1 設(shè)定節(jié)點(diǎn)的隊(duì)列接收閾值
由上所述,隊(duì)列的初始長(zhǎng)度手動(dòng)設(shè)置為N.獲取到的實(shí)時(shí)的隊(duì)列長(zhǎng)度為n.定義:如果獲取的實(shí)時(shí)隊(duì)列長(zhǎng)度n小于0.9*N,即n∈0.9*N認(rèn)為當(dāng)前隊(duì)列滿足傳輸要求,可以參與傳輸.
4.3.2 跨層獲取隊(duì)列緩沖區(qū)長(zhǎng)度
1)配置用于運(yùn)行的tcl腳本文件,在tcl腳本中進(jìn)行初始化.首先找到對(duì)應(yīng)的路由層協(xié)議,set router [$n0 agent 255].其中255是端口號(hào),agent 255代表是路由代理.其次初始化queue對(duì)象,set queue [$n0 set ifq_(0)].ifq_(0)中一般情況默認(rèn)為0(單信道).最后,綁定路由和隊(duì)列,$router attach-queue $queue.在路由層訪問(wèn)隊(duì)列信息.
2)在QE_AOMDV頭文件中加入“drop-tail.h”.在QE_AOMDV類中定義DropTail的指針queue_,以便操作DropTail的屬性.
3)修改command函數(shù),增加if(argc == 3)
{
if(strcmp(argv[1],"attach-queue")== 0){
queue_=(DropTail*)TclObject::lookup(argv[2]);
printf("I have attach to the queue! ");
return(TCL_OK);
}
}
通過(guò)tcl腳本建立的TclObject,建立實(shí)例過(guò)程cmd()激活影子對(duì)象的方法command(),并將定義的queue參數(shù)以向量形式傳遞給command()方法.
4)當(dāng)節(jié)點(diǎn)收到一個(gè)包時(shí),首先用queue_指針調(diào)用基類的limit()函數(shù)即queue_->limit()獲取隊(duì)列的初始長(zhǎng)度.然后用指針queue_調(diào)用基類的length()函數(shù)即queue_->length()獲取隊(duì)列的實(shí)時(shí)長(zhǎng)度,計(jì)算隊(duì)列緩沖區(qū)長(zhǎng)度的占有率.具體過(guò)程會(huì)在第5部分?jǐn)⑹?
4.3.3 基于DropTail的主動(dòng)丟包的隊(duì)列管理
當(dāng)?shù)玫疥?duì)列緩沖區(qū)長(zhǎng)度的占有率后,與隊(duì)列的接收閾值進(jìn)行比較,如果達(dá)到接收閾值,表明隊(duì)列當(dāng)前的緩沖區(qū)長(zhǎng)度較長(zhǎng),負(fù)載較大,鏈路壓力較大,則丟棄數(shù)據(jù)包;反之,將該包放在隊(duì)列尾部,等待發(fā)送.
本文提出的隊(duì)列管理機(jī)制吸取了RED隨機(jī)提前檢測(cè)隊(duì)列思想.在隊(duì)列長(zhǎng)度達(dá)到閾值90%*N時(shí),提前檢測(cè)出隊(duì)列負(fù)載,不使其達(dá)到滿負(fù)荷;閾值也不宜過(guò)小,使數(shù)據(jù)包丟棄數(shù)量過(guò)大,以免影響網(wǎng)絡(luò)傳輸速度.和RED隨機(jī)提前檢測(cè)隊(duì)列不同的是,本文改進(jìn)后的隊(duì)列管理機(jī)制只丟棄在接收閾值以外的數(shù)據(jù)包,不是隨機(jī)丟棄,而且,不需要定時(shí)丟棄包,只在需要時(shí)進(jìn)行丟包,既考慮到盡量減少丟失隊(duì)列數(shù)據(jù),又要防止隊(duì)列充滿后造成網(wǎng)絡(luò)擁塞,是一個(gè)綜合利弊因素后的一個(gè)擇中選擇,從而達(dá)到提高網(wǎng)絡(luò)性能.
5.1.1 節(jié)點(diǎn)結(jié)構(gòu)
在NS2中,節(jié)點(diǎn)和鏈路都占用適當(dāng)?shù)拇鎯?chǔ)空間.一個(gè)單播節(jié)點(diǎn)由地址分類器和端口分類器組成.節(jié)點(diǎn)一般表示主機(jī)或路由器,有些節(jié)點(diǎn)會(huì)根據(jù)需要綁定相關(guān)代理和應(yīng)用[14].
本文中,建立節(jié)點(diǎn)以set node($i)[$ns node]執(zhí)行.實(shí)例過(guò)程node建立包含多個(gè)classifier對(duì)象的節(jié)點(diǎn),該節(jié)點(diǎn)本身也是OTcl中單獨(dú)的一個(gè)類.單播節(jié)點(diǎn)包含一個(gè)地址分類器(classifier_)和一個(gè)端口分類器(dmux_).這些分類器的功能是將包分派到相應(yīng)的代理或鏈路中去.但要注意的是,Node_entry僅是一個(gè)標(biāo)志變量,而不于classifier,是一個(gè)真實(shí)的對(duì)象.
5.1.2 節(jié)點(diǎn)設(shè)置
本文的節(jié)點(diǎn)參數(shù)如表1所示.
表1 節(jié)點(diǎn)參數(shù)表
Table 1 Node parameter table
參數(shù)類型參數(shù)值路由協(xié)議QE_AOMDV鏈路類型llMac類型Mac/802_11隊(duì)列類型Queue/DropTail隊(duì)列長(zhǎng)度30天線類型Antenna/OmniAntenna無(wú)線信號(hào)傳輸模型Propagation/TwoRayGround物理類型Phy/WirelessPhy信道Channel/WirelessChannel拓?fù)鋘ew Topography路由跟蹤ON代理跟蹤ONMAC跟蹤OFF場(chǎng)景跟蹤OFF
節(jié)點(diǎn)初始化已經(jīng)設(shè)置了仿真參數(shù),所以節(jié)點(diǎn)要運(yùn)行的路由協(xié)議隊(duì)列長(zhǎng)度等參數(shù)已經(jīng)在仿真參數(shù)中獲得.所有在node-config 命令執(zhí)行之后創(chuàng)建的節(jié)點(diǎn)都擁有同樣的性質(zhì),直到node-config命令中的一部分參數(shù)發(fā)生改變且執(zhí)行之后.
NS是一個(gè)事件(event)驅(qū)動(dòng)模擬器,利用一個(gè)名為Simulator的Tcl類來(lái)定義和控制整個(gè)模擬過(guò)程.
圖1 事件調(diào)度示意圖Fig.1 Event scheduling diagram
NS2實(shí)際仿真時(shí),調(diào)度對(duì)象的Scheduler::run()函數(shù)不間斷處理隊(duì)列中事件,將隊(duì)列中的其它事件派出并放入事件隊(duì)列中,Scheduler::run()再調(diào)用Scheduler::dispatch()函數(shù)將一個(gè)事件從隊(duì)列中彈出來(lái),執(zhí)行事件中Handler句柄處理函數(shù)handle()處理該事件.完成一個(gè)事件產(chǎn)生、排隊(duì)、彈出被處理過(guò)程,值得注意的是,ns只支持單線程,故在任何時(shí)刻只有一個(gè)事件執(zhí)行.圖1為事件調(diào)度器的工作過(guò)程示意圖.首先從事件隊(duì)列中找到時(shí)間最先事件,用本身handler()函數(shù)處理完畢,在處理下一事件,不斷重復(fù)執(zhí)行最早事件,若有事件時(shí)間相同,按事件代碼進(jìn)入隊(duì)列順序執(zhí)行.
NS2鏈路仿真包含部分網(wǎng)絡(luò)層、鏈路層和物理層功能.仿真鏈路由DelayLink,Queue,TTL等多個(gè)組件(連接器子類)組合形成,如圖2所示,它以隊(duì)列緩存方式管理包到達(dá)、離開和丟棄,接收節(jié)點(diǎn)上層發(fā)來(lái)的數(shù)據(jù),經(jīng)過(guò)傳播和發(fā)送延遲,將包發(fā)給下一節(jié)點(diǎn)或丟棄.
圖2 鏈路中包傳輸示意圖Fig.2 Packet transmission in the link
包在鏈路中的傳輸過(guò)程如下:來(lái)自節(jié)點(diǎn)的包先由Queue隊(duì)列處理,隊(duì)列不滿則排隊(duì),否則丟棄.服務(wù)器判斷鏈路Queue隊(duì)列是否包發(fā)送,有包就根據(jù)相關(guān)包調(diào)度策略發(fā)給DelayLink對(duì)象.DelayLink對(duì)象計(jì)算所需要的傳輸延遲,將包傳給調(diào)度器.調(diào)度器負(fù)責(zé)調(diào)度事件隊(duì)列的調(diào)度,包在相應(yīng)時(shí)間延遲后,發(fā)給TTL對(duì)象,調(diào)度器改變鏈路狀態(tài),鏈路便可處理下一個(gè)包.TTL收到包,將包的ttl值減1,判斷ttl值若ttl大于0,則將包傳給下一節(jié)點(diǎn),否則將包丟棄.
而在實(shí)現(xiàn)上,LL類繼承自LinkDelay類,聲明Queue的指針ifq_,Queue的子類DropTail中又聲明了PacketQueue類的指針q_,從而可以通過(guò)q_來(lái)獲取到隊(duì)列中的長(zhǎng)度.
隨著網(wǎng)絡(luò)負(fù)荷的增加,吞吐量與網(wǎng)絡(luò)負(fù)荷大致成正比遞增[12].
Smax=
(1)
Smax表示當(dāng)前節(jié)點(diǎn)的最大歸一化吞吐量.E[P]表示鏈路層平均分組負(fù)荷.公式(1)表征802.11協(xié)議吞吐量Smax隨著鏈路層平均分組負(fù)荷E[P]的增加而增加.假設(shè)節(jié)點(diǎn)處理數(shù)據(jù)的能力相同,節(jié)點(diǎn)負(fù)荷越大,節(jié)點(diǎn)越繁忙,網(wǎng)絡(luò)出現(xiàn)擁塞的可能性越大[13].網(wǎng)絡(luò)各層之間息息相關(guān),彼此聯(lián)系.每一層都留有各自的隊(duì)列棧和緩存區(qū).同一節(jié)點(diǎn)在同一時(shí)間既是數(shù)據(jù)包的承載者又是控制包的承載者.在同一時(shí)間維度內(nèi),共享該層的隊(duì)列資源.網(wǎng)絡(luò)層通過(guò)實(shí)時(shí)監(jiān)控鏈路層的隊(duì)列資源,動(dòng)態(tài)調(diào)整本層數(shù)據(jù)包和控制包的發(fā)送策略,最有效的利用鏈路層資源.既不因?yàn)轭l繁發(fā)包使鏈路層應(yīng)接不暇而丟包也不至于使鏈路層隊(duì)列處于空閑狀態(tài)等待時(shí)間過(guò)長(zhǎng)而浪費(fèi)資源[14].
因此,本算法引入節(jié)點(diǎn)的實(shí)時(shí)隊(duì)列長(zhǎng)度即當(dāng)前節(jié)點(diǎn)的實(shí)時(shí)負(fù)荷提前檢測(cè).探討在均衡網(wǎng)絡(luò)負(fù)載狀態(tài)下的網(wǎng)絡(luò)性能.隊(duì)列閾值設(shè)置0.9×N是根據(jù)隨機(jī)提前檢測(cè)度列原理,既考慮到少丟失隊(duì)列數(shù)據(jù),又要防止隊(duì)列充滿后造成網(wǎng)絡(luò)擁塞,是一個(gè)綜合利弊因素后的一個(gè)擇中選擇.隊(duì)列數(shù)據(jù)充滿90%以上的機(jī)會(huì)在一般網(wǎng)絡(luò)流量下很小,所以包丟棄概率也很小.從實(shí)驗(yàn)結(jié)果證明看,在一定的網(wǎng)絡(luò)流量下,該閾值取值效果最好.如果閾值取0.8N,數(shù)據(jù)包丟失過(guò)大造成網(wǎng)速減慢,流量減少.
QE_AOMDV路由協(xié)議主要修改了RREP和路由表的數(shù)據(jù)結(jié)構(gòu),新增“隊(duì)列緩存區(qū)長(zhǎng)度累加和”字段表征鏈路壓力大小.
RREQ數(shù)據(jù)結(jié)構(gòu)如表2所示.在正向轉(zhuǎn)發(fā)RREQ包時(shí),通過(guò)實(shí)時(shí)監(jiān)測(cè)獲取鏈路層隊(duì)列資源情況,決定當(dāng)前節(jié)點(diǎn)是否參與轉(zhuǎn)發(fā)并設(shè)置延時(shí).
表2 RREQ消息格式
Table 2 RREQ message format
類型JRGDU保留跳數(shù)目的節(jié)點(diǎn)IP地址目的節(jié)點(diǎn)序列號(hào)源節(jié)點(diǎn)IP地址源節(jié)點(diǎn)序列號(hào)路由請(qǐng)求識(shí)別碼第一跳
RREP數(shù)據(jù)結(jié)構(gòu)如表3所示.若當(dāng)前節(jié)點(diǎn)即為目的節(jié)點(diǎn)或有到目的節(jié)點(diǎn)的有效路由項(xiàng),需要將路徑上節(jié)點(diǎn)的隊(duì)列緩存區(qū)長(zhǎng)度依次累加在一起,向源節(jié)點(diǎn)沿反向路徑發(fā)送RREP應(yīng)答消息.
表3 RREP消息格式
Table 3 RREP message format
類型RA保留前綴長(zhǎng)度跳數(shù)目的節(jié)點(diǎn)IP地址目的節(jié)點(diǎn)序列號(hào)源節(jié)點(diǎn)IP地址壽命第一跳隊(duì)列緩存長(zhǎng)度累加和
路由表結(jié)構(gòu)如表4所示.節(jié)點(diǎn)的緩存路由表中記錄多條路徑,當(dāng)源節(jié)點(diǎn)收到多條路徑時(shí),選擇隊(duì)列緩存區(qū)長(zhǎng)度累加和最小即鏈路壓力最小的路徑作為主路徑進(jìn)行數(shù)據(jù)的傳輸.
表4 路由表格式
Table 4 Routing table format
目的節(jié)點(diǎn)IP地址目的節(jié)點(diǎn)序列號(hào)廣告跳數(shù)路由列表{(第一條路徑下一跳,最后一跳,跳數(shù),隊(duì)列緩存區(qū)長(zhǎng)度累加和),(第二條路徑下一跳,最后一跳,跳數(shù),隊(duì)列緩存區(qū)長(zhǎng)度累加和)…}壽命
AOMDV協(xié)議主要過(guò)程是:為了尋找到目的節(jié)點(diǎn)的路由,源節(jié)點(diǎn)廣播RREQ 請(qǐng)求分組,節(jié)點(diǎn)路由表使用lasthop 和nexthop來(lái)唯一表示某條路徑,通過(guò)該標(biāo)志判斷是否與其它路徑相交.中間節(jié)點(diǎn)收到各鄰居節(jié)點(diǎn)發(fā)送的RREQ分組,并檢查RREQ分組的firsthop標(biāo)識(shí)和節(jié)點(diǎn)的最后一跳列表,以此來(lái)判斷該RREQ分組是否從源節(jié)點(diǎn)的不同鄰居節(jié)點(diǎn)發(fā)送出來(lái),即是否是一條新路徑.中間節(jié)點(diǎn)收到來(lái)自上游的RREQ請(qǐng)求報(bào)文后,會(huì)向源節(jié)點(diǎn)發(fā)送RREP分組;而目的節(jié)點(diǎn)收到來(lái)自源節(jié)點(diǎn)的請(qǐng)求報(bào)文后,會(huì)馬上向源節(jié)點(diǎn)發(fā)送RREP回復(fù),RREP沿著正向路徑逆向發(fā)送到源節(jié)點(diǎn),當(dāng)源節(jié)點(diǎn)收到第一個(gè)來(lái)自于目的節(jié)點(diǎn)的RREP后,正向路徑便建立.把收到的第一條路徑設(shè)為主路徑[14,15].
如圖3所示,原AOMDV多路徑路由協(xié)議找到S-1-3-5-7-D,S-11-9-D,S2-4-6-8-10-D三條節(jié)點(diǎn)不相交路徑.其中S-11-9-D為4跳路徑,跳數(shù)最小,將此路徑作為主路徑,優(yōu)先主路徑傳輸.通過(guò)對(duì)AOMDV多路徑路由協(xié)議的分析,當(dāng)路由表中存在有效路由時(shí),可以利用已有的路由傳輸數(shù)據(jù),而當(dāng)前路由中9號(hào)節(jié)點(diǎn)可能正在參與其他傳輸任務(wù),路徑負(fù)載較大,這就可能造成這條路徑的擁堵,造成網(wǎng)絡(luò)擁塞.難以保證數(shù)據(jù)的穩(wěn)定傳送,而此時(shí)適宜的空閑路徑可能存在卻沒(méi)有得到有效利用,造成資源浪費(fèi).為解決以上問(wèn)題,QE_AOMDV路由協(xié)議對(duì)AOMDV多徑路由協(xié)議的路由發(fā)現(xiàn)過(guò)程提出以下兩點(diǎn)改進(jìn),路由維護(hù)過(guò)程提出一點(diǎn)改進(jìn).
圖3 路由尋路結(jié)構(gòu)圖Fig.3 Route maintenance structure
在路由發(fā)現(xiàn)過(guò)程中,中間節(jié)點(diǎn)收到來(lái)自鄰居節(jié)點(diǎn)的RREQ請(qǐng)求報(bào)文,根據(jù)自身的負(fù)載狀態(tài)來(lái)決定是否轉(zhuǎn)發(fā)該報(bào)文或直接響應(yīng).如圖4所示.
圖4 中間節(jié)點(diǎn)收到RREQ的處理過(guò)程Fig.4 Process of receiving the RREQ at the intermediate node
在QE_AOMDV路由協(xié)議中,節(jié)點(diǎn)的緩存區(qū)初始隊(duì)列長(zhǎng)度為N,若實(shí)時(shí)的隊(duì)列緩存區(qū)長(zhǎng)度n達(dá)到90%*N并且已經(jīng)收到過(guò)相同的RREQ包,那么該節(jié)點(diǎn)不適合繼續(xù)參與傳輸,丟棄該報(bào)文.縱使有到目的節(jié)點(diǎn)的有效路由,也不繼續(xù)參與傳輸.
i.在路由發(fā)現(xiàn)過(guò)程中,隊(duì)列占有率為獲取的節(jié)點(diǎn)實(shí)時(shí)隊(duì)列長(zhǎng)度和隊(duì)列初始長(zhǎng)度的百分比,用rationodei表示,如公式(2):
(2)
其中queuelhcurrent=queue_->length();
queuelhinitial=queue_->limit();
queue_->length()和queue_->limit()在3.3.2部分中已經(jīng)提到,此不贅述.
ii.在路由發(fā)現(xiàn)過(guò)程中,報(bào)文的轉(zhuǎn)發(fā)延時(shí)為節(jié)點(diǎn)緩存區(qū)實(shí)時(shí)隊(duì)列長(zhǎng)度的占比,用e2enodei表示.如公式(3):
e2enodei=rationodei
(3)
圖5 中間節(jié)點(diǎn)收到RREP的處理過(guò)程Fig.5 Process of receiving the RREP at the intermediate node
如果中間節(jié)點(diǎn)通過(guò)實(shí)時(shí)監(jiān)測(cè)隊(duì)列獲取到隊(duì)列長(zhǎng)度在90%*N以下,且沒(méi)有到目的節(jié)點(diǎn)的有效路由,如圖3所示,那么將RREQ請(qǐng)求報(bào)文封裝好,延時(shí)轉(zhuǎn)發(fā)給鄰居節(jié)點(diǎn).
通過(guò)獲取節(jié)點(diǎn)實(shí)時(shí)的隊(duì)列長(zhǎng)度,計(jì)算隊(duì)列占用率,中間節(jié)點(diǎn)處理好收到的RREQ包后,將隊(duì)列占用率填充到RREP消息中,向源節(jié)點(diǎn)發(fā)送RREP路由應(yīng)答.如圖3所示,當(dāng)目的節(jié)點(diǎn)收到RREQ消息后,依次累加路徑上的隊(duì)列占用率,用Totalratiopathi表示,如公式(4):
Totalratiopathi=∑rationodei
(4)
中間節(jié)點(diǎn)收到RREP后的處理過(guò)程如圖5所示.當(dāng)源節(jié)點(diǎn)收到第一條路徑時(shí),第一條路徑是鏈路壓力最小的路徑.最小化延時(shí)的同時(shí)最優(yōu)化了路徑負(fù)載情況.路徑 S-2-4-6-8-10-D的鏈路壓力為0.8,S-1-3-5-7-D的鏈路壓力為 1.2.如圖3所示.因此,主路徑被確定為 S-2-4-6-8-10-D,次路徑為 S-1-3-5-7-D.
QE_AOMDV按需多路徑路由協(xié)議和AOMDV路由協(xié)議的路由維護(hù)過(guò)程類似.不同的是在QE_AOMDV路由協(xié)議中,當(dāng)一個(gè)節(jié)點(diǎn)在傳輸報(bào)文時(shí),通過(guò)Hello包探測(cè)到鏈路受損,首先獲取自身的緩存區(qū)隊(duì)列長(zhǎng)度m,如果當(dāng)前長(zhǎng)度m未達(dá)到隊(duì)列初始長(zhǎng)度N的90%,那么進(jìn)行本地維修,如果達(dá)到90%,則向源節(jié)點(diǎn)發(fā)送RRER錯(cuò)誤分組包,告訴路徑上游前面的節(jié)點(diǎn),和本節(jié)點(diǎn)相連鏈路出現(xiàn)錯(cuò)誤.為了不再使用這些受損鏈路和節(jié)點(diǎn),必要時(shí)由源節(jié)點(diǎn)開啟新一輪路由發(fā)現(xiàn)過(guò)程.
圖3中,Hello包探測(cè)到9號(hào)節(jié)點(diǎn)發(fā)生故障,9號(hào)節(jié)點(diǎn)的隊(duì)列緩存區(qū)占有率為90%,超過(guò)閾值,由9號(hào)節(jié)點(diǎn)向上游節(jié)點(diǎn)沿反向路徑發(fā)送RRER包,直至源節(jié)點(diǎn),由源節(jié)點(diǎn)開啟一輪新的尋路過(guò)程.如果9號(hào)節(jié)點(diǎn)的隊(duì)列占比不超過(guò)閾值,那么將由11號(hào)節(jié)點(diǎn)發(fā)起一輪到目的節(jié)點(diǎn)的尋路過(guò)程.
本文采用NS-2仿真,仿真節(jié)點(diǎn)隨機(jī)放置在600m×600m的矩形范圍內(nèi),仿真時(shí)間為200s,在多節(jié)點(diǎn)仿真中,設(shè)置10個(gè)仿真場(chǎng)景,cbr發(fā)送速率恒為30kb/s,節(jié)點(diǎn)個(gè)數(shù)分別為14/24/34/44/54/64/74/84/94/104.將本文提出的改進(jìn)方法和原AOMDV路由協(xié)議從端到端延時(shí),網(wǎng)絡(luò)吞吐量以及丟包率三方面進(jìn)行對(duì)比.
圖6 平均延時(shí)、吞吐量、丟包率隨節(jié)點(diǎn)個(gè)數(shù)變化圖Fig.6 Average delay,throughput,and packet loss rate as a function of the number of nodes
在多節(jié)點(diǎn)數(shù)目的仿真中,圖6顯示協(xié)議改進(jìn)前后分別在平均延時(shí),吞吐量、丟包率三方面的比較.其端到端延時(shí)總體降低9.1%.在較少的節(jié)點(diǎn)數(shù)目下,原有協(xié)議和QE_AOMDV路由協(xié)議在端到端延時(shí)不相上下.當(dāng)節(jié)點(diǎn)數(shù)超過(guò)44時(shí),隨著節(jié)點(diǎn)數(shù)目的增多,節(jié)點(diǎn)的隨機(jī)運(yùn)動(dòng)更復(fù)雜,碰撞幾率更大,由于考慮了節(jié)點(diǎn)的負(fù)載情況,緩解了鏈路擁塞,QE_AOMDV路由協(xié)議的端到端延時(shí)始終小于AOMDV路由協(xié)議.
QE_AOMDV路由協(xié)議的吞吐量較原AOMDV路由協(xié)議提高20.1%.在不同的節(jié)點(diǎn)數(shù)目下,QE_AOMDV路由協(xié)議均呈現(xiàn)出較高的吞吐量,網(wǎng)絡(luò)中拓?fù)洵h(huán)境較復(fù)雜時(shí),原AOMDV因鏈路頻繁斷裂,無(wú)效路徑的使用導(dǎo)致分組大范圍丟棄,性能的差別變得更明顯.
在網(wǎng)絡(luò)中節(jié)點(diǎn)個(gè)數(shù)少于24之前,協(xié)議改進(jìn)前后的丟包率持平.當(dāng)節(jié)點(diǎn)數(shù)達(dá)到24后,兩種協(xié)議的丟包率趨于平穩(wěn),且QE_AOMDV路由協(xié)議的丟包率始終小于AOMDV路由協(xié)議.改進(jìn)的QE_AOMDV路由協(xié)議具有明顯的優(yōu)勢(shì).
在NS-2中仿真參數(shù)選擇節(jié)點(diǎn)隨機(jī)放置在600m×600m的矩形范圍內(nèi),仿真時(shí)間為200s,在多速率仿真中,設(shè)置10個(gè)仿真場(chǎng)景,節(jié)點(diǎn)數(shù)恒為20,cbr發(fā)送速率分別為30(kb/s)/40(kb/s)/50(kb/s)/60(kb/s)/70(kb/s)/80(kb/s)/90(kb/s)/100(kb/s)/110(kb/s)/120(kb/s).
在多發(fā)送速率的仿真中,圖7顯示協(xié)議改進(jìn)前后分別在平均延時(shí),吞吐量、丟包率三方面的比較。協(xié)議改進(jìn)后其延時(shí)降低9.0%。仿真開始時(shí)由于節(jié)點(diǎn)移動(dòng)速度緩慢,網(wǎng)絡(luò)拓?fù)湎鄬?duì)變化小,節(jié)點(diǎn)鏈路出現(xiàn)斷開機(jī)會(huì)偏小.兩種協(xié)議時(shí)延較小.當(dāng)cbr發(fā)送速率逐漸變大,隊(duì)列的占用率逐漸增加,相應(yīng)的轉(zhuǎn)發(fā)延時(shí)漸增加,兩種協(xié)議的端到端延時(shí)均呈現(xiàn)上升趨勢(shì).在不同的cbr發(fā)送速率下,QE_AOMDV路由協(xié)議有較高的吞吐量,吞吐量提高15.7%.隨著發(fā)送速率的增加,節(jié)點(diǎn)的發(fā)送任務(wù)繁重,隊(duì)列中待發(fā)送的數(shù)據(jù)包堆積,造成后到達(dá)的數(shù)據(jù)包因前向數(shù)據(jù)包未及時(shí)發(fā)送出去而被丟棄,造成數(shù)據(jù)包的意外丟失.QE_AOMDV路由協(xié)議將節(jié)點(diǎn)的隊(duì)列緩存引入到路由發(fā)現(xiàn)中,原AODMV因鏈路頻繁斷裂,無(wú)效路徑的使用導(dǎo)致分組大范圍丟棄,性能的差別變得更加明顯.改進(jìn)后的QE_AOMDV路由協(xié)議具有明顯的優(yōu)勢(shì).QE_AOMDV多路徑路由協(xié)議較AOMDV路由協(xié)議的丟包率總體降低9.0%.QE_AOMDV多路徑路由協(xié)議由于將節(jié)點(diǎn)的隊(duì)列緩存區(qū)長(zhǎng)度加以考慮,使得部分?jǐn)?shù)據(jù)包避免了使用緩存隊(duì)列長(zhǎng)度較長(zhǎng)的節(jié)點(diǎn)參與傳送任務(wù),有效降低了丟包率.
圖7 平均延時(shí)、吞吐量、丟包率隨發(fā)送速率變化圖Fig.7 Average delay,throughput,and packet loss rate as a function of transmission rate
本文結(jié)合原有AOMDV多路徑路由協(xié)議,將隊(duì)列緩存區(qū)長(zhǎng)度引入QE_AOMDV多路徑路由協(xié)議.通過(guò)考慮緩存區(qū)的隊(duì)列空間,避免負(fù)載較重的節(jié)點(diǎn)參與傳輸,同時(shí),根據(jù)負(fù)載情況進(jìn)行延時(shí)轉(zhuǎn)發(fā)和鏈路的修復(fù).結(jié)果表明:改進(jìn)后的QE_AOMDV多路徑路由協(xié)議較原AOMDV協(xié)議相比,吞吐量整體提高,延時(shí)大大降低.QE_AOMDV多路徑路由協(xié)議的性能優(yōu)于原AOMDV路由協(xié)議.