在ns2.27中,aodv路由協議主要包括以下幾個元件:
1、協議實體
2、路由表
3、定時器
(1)廣播定時器
(2)週期hello報文廣播定時器
(3)用於鄰居管理的定時器
(4)用於路由快取的定時器
(5)用於本地修復的定時器
(6)快取廣播id的定時器
4、日誌記錄器
5、路由快取佇列
首先來看協議從接收到乙個分組開始的基本流程。
當協議接收到乙個分組,即recv(packet*, handler*)函式被呼叫,函式根據分組型別呼叫不同的處理函式進行處理。
1、如果是協議分組,則將分組的ttl值減1,並呼叫recvaodv(packet*)函式進行處理。recvaodv函式再根據分組的不同型別來呼叫不同的函式進行處理。
(1)如果接收到的是路由請求分組,則呼叫recvrequest(packet*)函式進行處理。
如果該分組由節點自身產生或已經接收過的,會被節點丟棄,並結束處理。
否則,節點將快取該分組的序列號,並將該分組傳送來的路徑新增到反向路由中,**相應分組。然後,節點根據該分組的目的位址進行判斷並呼叫不同函式進行處理。
如果節點自身即為目的節點,則呼叫sendreply(nsaddr_t, u_int32_t, nsaddr_t, u_int32_t, u_int32_t, double)函式進行響應。如果節點不是目的節點,但知道通往目的節點的路由,則呼叫sendreply函式進行響應,並在源和目的前驅列表中分別插入到源和目的的下一跳節點。否則,不能直接響應該請求,將跳數加1,並呼叫forward(aodv_rt_entry*, packet*, double)函式**該分組。
在sendreply函式中,節點首先查詢到達目的節點(即傳送路由請求分組的節點)的路由,建立並填充分組,然後呼叫scheduler::instance().schedule()函式來傳送該分組。
(2)如果接收到的是路由響應分組,則呼叫recvreply(packet*)函式進行處理。
節點首先查詢前往分組目的節點的路由,如果不存在則新增一條路由項。然後,節點更新到該目的節點的路由項,並傳送所有相關分組。
如果節點為目的節點則更新路由發現延遲並傳送所有相關的分組。如果節點不是目的節點,但知道通往目的節點的路由,則將跳數加1,呼叫forward函式**該分組,並修改響應的前驅列表。如果節點不是目的節點,也不知道通往目的節點的路由,則丟棄該分組。
(3)如果接收到的是路由錯誤分組,則呼叫recverror(packet*)函式進行處理。
節點首先清除所有受到影響的路由項,丟棄所有受影響的分組。然後,如果前驅節點中存在會受該路由錯誤影響的分組,則呼叫senderror(packet*, bool)函式**該分組。
senderror函式建立並填充分組,然後呼叫scheduler::instance().schedule()函式來傳送該分組。
(4)如果接收到的是hello訊息分組,則呼叫recvhello(packet*)函式進行處理。
節點會將該鄰居的資訊新增到鄰居列表中(或更新該鄰居的資訊)。
2、如果是資料分組,則節點丟棄已經傳送過或者ttl為0的分組,並結束處理。如果分組是由上層協議產生的,則節點新增ip報頭。隨後,節點根據目的路由進行不同處理。
(1)如果目的節點路由未知,則呼叫rt_resolve(packet*)函式進行路由解析和**。
如果目的節點路由在路由表中存在,則直接呼叫forward函式進行**。如果分組是由節點自身產生的,則將分組儲存到緩衝佇列中,並呼叫sendrequest(nsaddr_t)函式查詢目的路由。如果目的路由已知,但正在進行本地修復,則將分組儲存到緩衝佇列中。否則,丟棄該分組,並呼叫senderror函式報錯。
(2)如果目的節點路由已知,則呼叫forward進行**。
節點丟棄ttl為0的分組,並根據分組型別決定下一步操作。
如果接收到的是資料分組,且自身為目的節點,則通過呼叫portclassifier物件的recv(packet*, handle*)函式將分組交遞給高層協議,並結束處理。否則,節點設定分組屬性,並呼叫scheduler::instance().schedule(handler*, event*, double)函式來傳送分組。 其中,handler為基類中的屬性target_(會根據指令碼中的設定指向相應的協議實體),event為要傳送的分組即可。
以上就是在節點收到分組後的乙個處理過程。接下來看看各個定時器所做的工作。
1、廣播定時器broadcasttimer在到時後呼叫id_purge()函式刪除廣播項中已超時的專案,並通過呼叫scheduler::instance().schedule()函式來設定下次被呼叫的時間(handler為this指標,event為類屬性intr)。
2、週期hello報文廣播定時器hellotimer在到時後呼叫sendhello()函式向鄰居建立並傳送hello訊息,並呼叫schedule()函式來設定下次被呼叫的時間。
3、鄰居管理定時器neighbortimer在到時後呼叫nb_purge()函式來清除鄰居列表中已超時的鄰居項,並呼叫schedule()來設定下次被呼叫的時間。nb_purge會呼叫nt_delete(nsaddr_t)函式來清除超時的鄰居項,其又會呼叫handle_link_failure(nsaddr_t)函式來處理由於鄰居節點被刪除而引起的路由變化。
4、路由快取定時器routecachetimer在到時後呼叫rt_purge()函式來清除路由表中已超時的路由項,並丟棄相關的分組,再呼叫schedule()來設定下次被呼叫的時間。
5、本地修復定時器localrepairtimer在呼叫後根據傳遞的分組的目的位址關閉相應的路由項。
6、快取廣播id定時器broadcastid用來儲存廣播分組的id。
此外,路由表、日誌記錄和佇列三個類就相對比較簡單了,都只實現了一些非常基本的功能,在此就不做介紹了。
AODV協議分析
1 aodv簡介 aodv ad hoc on demand distance vector routing 是由nokia研究中心的charles e.perkins和加利福尼亞大學的elizabeth m.belding roryer等共同開發,已經被 ietf manet工作組於2003年7月...
Ad Hoc 貳 AODV 協議詳解
aodv 是按需路由協議,當乙個節點需要給網路中的其他節點傳送資訊時,如果沒有到達目標節點的路由,則必須先以多播的形式發出 rreq 報文,鄰居節點收到 rreq,首先判斷目標節點是否是自己,如果是,則向發起節點傳送 rrep,如果不是,首先在路由表中查詢是否有到達目標節點的路由,如果有,則向源節點...
ns2 AODV協議分析
2 協議從接收到乙個分組開始的基本流程 aodv 路由協議主要包括以下幾個元件 1 協議實體 2 路由表 3 定時器 1 廣播定時器 2 週期hello 報文廣播定時器 3 用於鄰居管理的定時器 4 用於路由快取的定時器 5 用於本地修復的定時器 6 快取廣播id 的定時器 4 日誌記錄器 5 路由...