AODV路由協議的路由快取佇列詳解

2021-09-30 07:28:23 字數 2970 閱讀 9752

****:

aodv路由協議的使用往往在一些複雜的程式當中。那麼我們如何理解這些協議的使用和一些**函式的含義呢?下面我們就來闡述一下這方面的問題。首先了解一下在ns2.27中,aodv路由協議主要包括以下幾個元件:

1、協議實體

2、路由表

3、定時器

(1)廣播定時器

(2)週期hello報文廣播定時器

(3)用於鄰居管理的定時器

(4)用於路由快取的定時器

(5)用於本地修復的定時器

(6)快取廣播id的定時器

4、日誌記錄器

5、路由快取佇列

首先來看aodv路由協議從接收到乙個分組開始的基本流程。

當協議接收到乙個分組,即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)如果接收到的是路由錯誤分組,aodv路由協議則呼叫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為要傳送的分組 即可。

以上就是aodv路由協議在節點收到分組後的乙個處理過程。接下來看看各個定時器所做的工作。

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路由協議的路由表、日誌記錄和佇列三個類就相對比較簡單了,都只實現了一些非常基本的功能,在此就不做介紹了

AODV路由協議主要包括以下幾個元件

在ns2.27中,aodv路由協議主要包括以下幾個元件 1 協議實體 2 路由表 3 定時器 1 廣播定時器 2 週期hello報文廣播定時器 3 用於鄰居管理的定時器 4 用於路由快取的定時器 5 用於本地修復的定時器 6 快取廣播id的定時器 4 日誌記錄器 5 路由快取佇列 首先來看協議從接收...

路由交換 OSPF路由協議

ospf協議特性 鏈路狀態資料結構 鏈路狀態路由選擇協議 鏈路狀態路由器比距離向量路由器包含跟多的關於本網路的資訊,每一台路由器都有本網路的完整路由表,因此,鏈路狀態路由器能夠做出更好的路由選擇。鏈路狀態資料結構 網路層次 鏈路狀態路由選擇演算法 如 osdf 需要層次化的網路結構,這層結構包括以下...

路由協議與靜態路由

路由 路由是將分組從乙個裝置通過網際網路絡發往位於不同網路上的另外乙個裝置的操作 路由表 到達所有目標位址的所有路徑,是由一條條路由條目組成的 路由協議 到達所有目標網段的最佳路徑 路由條目 到達某乙個具體網段的最佳路由 一條路由條目 2.如何構建路由表 網段 網路號 掩碼 192.169.1.0 ...