AODV路由協(xié)議的路由緩存隊(duì)列詳解
AODV路由協(xié)議的使用往往在一些復(fù)雜的程序當(dāng)中。那么我們?nèi)绾卫斫膺@些協(xié)議的使用和一些代碼函數(shù)的含義呢?下面我們就來闡述一下這方面的問題。首先了解一下在NS2.27中,AODV路由協(xié)議主要包括以下幾個(gè)組件:
1、協(xié)議實(shí)體
2、路由表
3、定時(shí)器
(1)廣播定時(shí)器
(2)周期Hello報(bào)文廣播定時(shí)器
(3)用于鄰居管理的定時(shí)器
(4)用于路由緩存的定時(shí)器
(5)用于本地修復(fù)的定時(shí)器
(6)緩存廣播ID的定時(shí)器
4、日志記錄器
5、路由緩存隊(duì)列
首先來看AODV路由協(xié)議從接收到一個(gè)分組開始的基本流程。
當(dāng)協(xié)議接收到一個(gè)分組,即recv(Packet*, Handler*)函數(shù)被調(diào)用,函數(shù)根據(jù)分組類型調(diào)用不同的處理函數(shù)進(jìn)行處理。
1、如果是協(xié)議分組,則將分組的ttl值減1,并調(diào)用recvAODV(Packet*)函數(shù)進(jìn)行處理。recvAODV函數(shù)再根據(jù)分組的不同類型來調(diào)用不同的函數(shù)進(jìn)行處理。
(1)如果接收到的是路由請(qǐng)求分組,則調(diào)用recvRequest(Packet*)函數(shù)進(jìn)行處理。
如果該分組由節(jié)點(diǎn)自身產(chǎn)生或已經(jīng)接收過的,會(huì)被節(jié)點(diǎn)丟棄,并結(jié)束處理。
否則,節(jié)點(diǎn)將緩存該分組的序列號(hào),并將該分組發(fā)送來的路徑添加到反向路由中,轉(zhuǎn)發(fā)相應(yīng)分組。然后,節(jié)點(diǎn)根據(jù)該分組的目的地址進(jìn)行判斷并調(diào)用不同函數(shù)進(jìn)行處理。
如果節(jié)點(diǎn)自身即為目的節(jié)點(diǎn),則調(diào)用sendReply(nsaddr_t, u_int32_t, nsaddr_t, u_int32_t, u_int32_t, double)函數(shù)進(jìn)行響應(yīng)。如果節(jié)點(diǎn)不是目的節(jié)點(diǎn),但知道通往目的節(jié)點(diǎn)的路由,則調(diào)用sendReply函數(shù)進(jìn)行響應(yīng),并在源和目的前驅(qū)列表中分別插入到源和目的的下一跳節(jié)點(diǎn)。否則,不能直接響應(yīng)該請(qǐng)求,將跳數(shù)加1,并調(diào)用forward(AODV_rt_entry*, Packet*, double)函數(shù)轉(zhuǎn)發(fā)該分組。
在sendReply函數(shù)中,節(jié)點(diǎn)首先查找到達(dá)目的節(jié)點(diǎn)(即發(fā)送路由請(qǐng)求分組的節(jié)點(diǎn))的路由,創(chuàng)建并填充分組,然后調(diào)用Scheduler::instance().schedule()函數(shù)來發(fā)送該分組。
(2)如果接收到的是路由響應(yīng)分組,則調(diào)用recvReply(Packet*)函數(shù)進(jìn)行處理。
節(jié)點(diǎn)首先查詢前往分組目的節(jié)點(diǎn)的路由,如果不存在則新增一條路由項(xiàng)。然后,節(jié)點(diǎn)更新到該目的節(jié)點(diǎn)的路由項(xiàng),并發(fā)送所有相關(guān)分組。
如果節(jié)點(diǎn)為目的節(jié)點(diǎn)則更新路由發(fā)現(xiàn)延遲并發(fā)送所有相關(guān)的分組。如果節(jié)點(diǎn)不是目的節(jié)點(diǎn),但知道通往目的節(jié)點(diǎn)的路由,則將跳數(shù)加1,調(diào)用forward函數(shù)轉(zhuǎn)發(fā)該分組,并修改響應(yīng)的前驅(qū)列表。如果節(jié)點(diǎn)不是目的節(jié)點(diǎn),也不知道通往目的節(jié)點(diǎn)的路由,則丟棄該分組。
(3)如果接收到的是路由錯(cuò)誤分組,AODV路由協(xié)議則調(diào)用recvError(Packet*)函數(shù)進(jìn)行處理。#p#
節(jié)點(diǎn)首先清除所有受到影響的路由項(xiàng),丟棄所有受影響的分組。然后,如果前驅(qū)節(jié)點(diǎn)中存在會(huì)受該路由錯(cuò)誤影響的分組,則調(diào)用sendError(Packet*, bool)函數(shù)轉(zhuǎn)發(fā)該分組。
sendError函數(shù)創(chuàng)建并填充分組,然后調(diào)用Scheduler::instance().schedule()函數(shù)來發(fā)送該分組。
(4)如果接收到的是Hello消息分組,則調(diào)用recvHello(Packet*)函數(shù)進(jìn)行處理。
節(jié)點(diǎn)會(huì)將該鄰居的信息添加到鄰居列表中(或更新該鄰居的信息)。
2、如果是數(shù)據(jù)分組,則節(jié)點(diǎn)丟棄已經(jīng)發(fā)送過或者ttl為0的分組,并結(jié)束處理。如果分組是由上層協(xié)議產(chǎn)生的,則節(jié)點(diǎn)添加IP報(bào)頭。隨后,節(jié)點(diǎn)根據(jù)目的路由進(jìn)行不同處理。
(1)如果目的節(jié)點(diǎn)路由未知,則調(diào)用rt_resolve(Packet*)函數(shù)進(jìn)行路由解析和轉(zhuǎn)發(fā)。
如果目的節(jié)點(diǎn)路由在路由表中存在,則直接調(diào)用forward函數(shù)進(jìn)行轉(zhuǎn)發(fā)。如果分組是由節(jié)點(diǎn)自身產(chǎn)生的,則將分組保存到緩沖隊(duì)列中,并調(diào)用 sendRequest(nsaddr_t)函數(shù)查詢目的路由。如果目的路由已知,但正在進(jìn)行本地修復(fù),則將分組保存到緩沖隊(duì)列中。否則,丟棄該分組,并調(diào)用sendError函數(shù)報(bào)錯(cuò)。
(2)如果目的節(jié)點(diǎn)路由已知,則調(diào)用forward進(jìn)行轉(zhuǎn)發(fā)。
節(jié)點(diǎn)丟棄ttl為0的分組,并根據(jù)分組類型決定下一步操作。
如果接收到的是數(shù)據(jù)分組,且自身為目的節(jié)點(diǎn),則通過調(diào)用PortClassifier對(duì)象的recv(Packet*, Handle*)函數(shù)將分組交遞給高層協(xié)議,并結(jié)束處理。否則,節(jié)點(diǎn)設(shè)置分組屬性,并調(diào)用Scheduler::instance().schedule (Handler*, Event*, double)函數(shù)來發(fā)送分組。其中,Handler為基類中的屬性target_(會(huì)根據(jù)腳本中的設(shè)置指向相應(yīng)的協(xié)議實(shí)體),Event為要發(fā)送的分組即可。
以上就是AODV路由協(xié)議在節(jié)點(diǎn)收到分組后的一個(gè)處理過程。接下來看看各個(gè)定時(shí)器所做的工作。
1、廣播定時(shí)器BroadcastTimer在到時(shí)后調(diào)用id_purge()函數(shù)刪除廣播項(xiàng)中已超時(shí)的項(xiàng)目,并通過調(diào)用Scheduler:: instance().schedule()函數(shù)來設(shè)置下次被調(diào)用的時(shí)間(Handler為this指針,Event為類屬性intr)。
2、周期Hello報(bào)文廣播定時(shí)器HelloTimer在到時(shí)后調(diào)用sendHello()函數(shù)向鄰居創(chuàng)建并發(fā)送Hello消息,并調(diào)用schedule()函數(shù)來設(shè)置下次被調(diào)用的時(shí)間。
3、鄰居管理定時(shí)器NeighborTimer在到時(shí)后調(diào)用nb_purge()函數(shù)來清除鄰居列表中已超時(shí)的鄰居項(xiàng),并調(diào)用schedule()來設(shè)置下次被調(diào)用的時(shí)間。nb_purge會(huì)調(diào)用nt_delete(nsaddr_t)函數(shù)來清除超時(shí)的鄰居項(xiàng),其又會(huì)調(diào)用 handle_link_failure(nsaddr_t)函數(shù)來處理由于鄰居節(jié)點(diǎn)被刪除而引起的路由變化。
4、路由緩存定時(shí)器RouteCacheTimer在到時(shí)后調(diào)用rt_purge()函數(shù)來清除路由表中已超時(shí)的路由項(xiàng),并丟棄相關(guān)的分組,再調(diào)用schedule()來設(shè)置下次被調(diào)用的時(shí)間。
5、本地修復(fù)定時(shí)器LocalRepairTimer在調(diào)用后根據(jù)傳遞的分組的目的地址關(guān)閉相應(yīng)的路由項(xiàng)。
6、緩存廣播ID定時(shí)器BroadcastID用來保存廣播分組的ID。
此外,AODV路由協(xié)議的路由表、日志記錄和隊(duì)列三個(gè)類就相對(duì)比較簡(jiǎn)單了,都只實(shí)現(xiàn)了一些非常基本的功能,在此就不做介紹了