ns2,AODV協議解析

2021-06-16 23:41:04 字數 2862 閱讀 5975

在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。

此外,路由表、日誌記錄和佇列三個類就相對比較簡單了,都只實現了一些非常基本的功能,在此就不做介紹了。

**csdn部落格:

ns2 AODV協議分析

2 協議從接收到乙個分組開始的基本流程 aodv 路由協議主要包括以下幾個元件 1 協議實體 2 路由表 3 定時器 1 廣播定時器 2 週期hello 報文廣播定時器 3 用於鄰居管理的定時器 4 用於路由快取的定時器 5 用於本地修復的定時器 6 快取廣播id 的定時器 4 日誌記錄器 5 路由...

ns2中AODV協議HDR CMN p 的含義

剛開始看 aodv 協議就被兩個函式難到 hdr cmn p 和hdr ip p 經查功能都差不多,以 hdr cmn p 為例說明。struct hdr cmn ch hdr cmn p 結構體hdr cmn 的定義在 ns allinone 2.34 ns 2.34 common packet....

NS2 TORA協議修正

ns2.35中自帶了經典的tora路由協議,但是無法正常執行,需要對其c 原始檔進行修改。需要修改3個c 原始檔 ns ns 2.35 tora tora.h,ns ns 2.35 tora tora.cc,ns ns 2.35 imep imep.cc 1 修改 ns ns 2.35 tora t...