一、AODV 概念
論文英文地址:https://ieeexplore.ieee.org/document/992756?arnumber=992756&tag=1
AODV 是按需路由協議,當一個節點需要給網絡中的其他節點傳送信息時,如果沒有到達目標節點的路由,則必須先以多播的形式發出 RREQ 報文,鄰居節點收到 RREQ,首先判斷目標節點是否是自己,如果是,則向發起節點發送 RREP,如果不是,首先在路由表中查找是否有到達目標節點的路由,如果有,則向源節點單播 RREP,否則繼續轉發 RREQ 進行查找。
在網絡資源充分的情況下,AODV 協議可以通過定期廣播 HELLO 報文來維護路由,一旦發現某一個鏈路斷開,節點就發送 ERROR 報文通知那些因為鏈路斷開而不可到達的節點,刪除相應的記錄或者對已經存在的路由修復。
AODV 特點如下:
-
節點只存儲需要的路由
-
盡量減少廣播的需要
-
減少內存需求和不必要的重復
-
對活動路由中鏈路斷裂的快速響應
-
使用目標序列號維護的無循環路由
-
可擴展到大量節點群
二、AODV 功能
AODV 是在多個移動節點中建立和維護一個動態的、自啟動的、多跳路由的專屬網絡,使得移動節點能夠快速獲得通向新的目的節點的路由,並且節點僅需要維護通向鄰居節點的路由,更遠節點的路由信息則不需要維護。
其路由表字段包括:
- 目的節點IP地址
- 目的節點序列號
- 目的節點序列號的有效標志位
- 下一跳節點IP地址
- 本節點到達目的節點的跳數
- 前驅節點列表
- 生存時間
- 網絡層接口
- 其他的狀態和路由標志位(比如:有效,無效,可修復,正在修復)。
路由表特征如下:
-
路由表每項只記錄下一跳路由信息,而不是整條路由信息,簡化了路由表的建立和維護。
-
源節點和目的節點都維護各自的序列號,序列號是用來標識路由信息新舊程度,當源節點發起路由請求RREQ或者目的節點返回路由應答RREP時,都要更新各自的序列號。
-
中間節點依據序列號的大小判斷路由的新舊。
三、AODV 術語
-
發起節點:發出 AODV 路由請求消息的節點
-
轉發節點:願意為其他節點轉發數據包的節點,轉發節點會將數據包轉發給下一個節點。
-
目的節點:當一個節點看到自己的 IP 地址和數據包 IP 頭特定字段的 IP 地址一樣時,認定自己是數據包的目的節點。
-
活躍路由:能夠有效通向目的節點的路由,只有活躍路由能夠轉發數據包
-
返回路由:用於轉發回復包的路由,就是從目的節點返回到發起節點的路由。
-
無效路由:有效路由失效以后,會作為無效路由在路由表中保存一段時間,並不能轉發數據包。
四、AODV 消息格式
AODV 有三種基本的協議報文類型:RREQ(路由請求)報文、RREP(路由應答)報文和 RRER(路由錯誤)報文。
4.1 RREQ 路由請求報文
在兩個節點之間的路由有效,通信正常的情況下,AODV 路由協議不起任何作用,只有當源節點 S 需要向目的節點 D 發送數據包,但是又沒有 D 節點的路由入口時,才會發起路由請求(RREQ)。
當 RREQ 在網絡中傳播時,中間節點會更新各自到源節點的路由,稱為反向路由,RREQ 請求報文中包含源節點以前記錄的到目的節點的序列號,但是此序列號可能不是最新的,中間節點如果有到目的節點的路由時,只有該節點記錄的目的節點的序列號比 RREQ 中目的節點序列號更大,才認為這條路由是有效的。

報文格式說明:
- Type:1
- J:加入標志,為多播保留。
- R:修復標志,為多播保留。
- G 免費路由回復標志:是否向目標節點IP地址域指定的節點發一個免費路由回復消息。
- D 僅允許目的節點回復標志:標志位則僅允許目的節點回復本條路由請求。
- U 未知序列號:指的是目標節點序列號未知。
- Reserved:填充0,接收端忽略此字段。
- 跳數:從發起節點到處理該請求的節點的跳數。
- 路由請求標識:這是一個序列號,用它和源節點IP可以唯一標識一個RREQ消息。

4.2 RREP 路由應答報文
當 RREQ 最終到達目的節點時,目的節點通過向該反向路由(RREQ 傳播路線)發送 RREP 應答報文,建立通向目的節點的前向路由。
只有以下的情況節點才會產生 RREP 報文:
-
該節點本身就是目的節點。
-
該節點為中間節點,但是它有通向目的節點的活躍路徑。
當 RREP 傳播到源節點時,中間節點根據該 RREP 更新他們各自指向目的節點的路由信息。節點只對第一次收到的 RREQ 發送 RREP 應答報文。

報文格式說明:
- Type:2
- R:修復標志,用於多播
- A:需要確認
- Reserved:填充0,接受端忽略此字段。
- Prefix Size:前綴長度,如果非零,代表下一跳節點可以作為任有具有相同路由前綴的節點被請求時的目的節點。
- 跳數:從發起節點到目的節點的跳數。
- 生命期:路由生命時間,在這個時間內,接收RREP的節點會認為這條路由是有效的。

4.3 RERR 路由錯誤報文

報文格式說明:
- Type:3
- N:不必刪除標志,當一個節點已經對這條連接做了本地修復時,上游的幾點就不用刪除這條路由。
- Reserved:保留字段,填充0,接收端不做處理。
- DestCount:本消息內包含的不可達的目的節點的數目,至少為1。
- Unreachable Destination IP Address:因為連接斷開而不可達的目的節點的IP地址。
- Unreachable Destination Sequence Number:路由表項里不可達目的節點的序列號。
五、AODV 工作過程
5.1 AODV 工作流程圖


5.2 路由發現過程
-
廣播 RREQ 路由請求幀。
-
中間節點更新各自到源節點的路由表。
-
如果收到 RREQ 的節點不是目的節點,並且沒有到達目的節點的更新的有效路由,則轉發該 RREQ。
-
中間節點維護指向路由源節點的反向路由。
-
目的節點或存在到目的節點有效路由的中間節點產生 RREP 路由應答幀。
-
RREP 通過之前建立的反向節點單播至源節點。
-
源節點收到 RREP 應答幀,至此源節點可以向目的節點發送數據包。
5.3 路由發現算法
源節點:應用層有數據發送請求,並且指向目的節點的路由有效,直接通過該路由發送數據包,如果沒有到達目的節點的有效路徑,則產生 RREQ 廣播幀,RREQ 的序列號、ID 字段加1,將源節點的 IP,序列號、目的節點的 IP、序列號等信息添加到 RREQ 中,廣播至網絡。
中間節點:如果中間節點路由表中記錄的到目的節點的路由有效,並且記錄的目的節點的序列號大於或者等於 RREQ 中的目的節點序列號,則該中間節點可以產生路由應答幀。如果該中間節點不產生應答幀,更改RREQ 中的目的節點序列號至當前最大,跳數字段加1,然后轉發。
目的節點:目的節點的序列號加1,產生 RREP 應答幀(包括源節點 IP、目的節點 IP 和更新后的序列號),單播發送至源節點。

5.4 路由維護算法
Hello 消息:Hello 消息幀就是 TTL=1時的 REEP 幀,Hello 消息幀用於檢測活躍路徑上相鄰節點的鏈接狀況。只有當某節點位於某活躍路徑之上時,他才能發送 Hello 消息幀。活躍路徑節點以 HELLO_INTERVAL 為周期發送 Hello 消息。
-
在DELETE_PERIOD的時間內沒有收到來自鄰居節點的Hello消息,則認為 該鏈路失效;發起一次指向該鄰居節點的局部修復。
-
路由修復超時以后,路有錯誤信息RERR向源節點和目的節點發送。
-
RERR在傳播過程中,各中間節點刪除該失效路徑上相應的路由信息。
5.5 路由信息新舊判斷
AODV 依賴網絡中每個節點維護自身的序列號,源節點在廣播路由請求幀 RREQ 之前要更新自己的序列號,即將序列號加1,目的節點在產生 RREP 應答幀之前也要將自身的序列號加1,每個節點在對各自的序列號加1的時候,是將其視為無符號數進行的。
通過比較來自目的節點路由控制幀中的序列號 SN1 和本節點維護的目的節點的序列號 SN2,就可以確定本鏈路的新舊程度。如果 SN2-SN1<0(有符號數相減),說明路由表中的維護信息已過時,應將路由信息更新至路由控制幀最新的路由信息。
六、擁塞控制
源節點在發送 RREQ 后,在規定的時間內沒有收到來自目的節點的RREP時,他可以選擇再次發送 RREQ 路由請求幀。
在嘗試了 RREQ_RETRIES 次之后,如果依舊收不到 RREP,則在路由表中標記該目的節點不可達,通知應用層。每次在重新發送 RREQ 請求幀時,等待 RREP 應答幀的時間要在原來時間的基礎上乘以2,避免擁塞。
本文參考https://blog.csdn.net/qq_40950957/article/details/104856419
