ns學習筆記---AODV協議1

 

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


1、AODV簡介

AODV是由Nokia研究中心的Charles E.Perkins和加利福尼亞大學Santa BarbaraElizabeth M.Belding-Roryer以及Cincinnati大學Samir R.Das等共同開發,已經被 IETF MANET工作組於20037月正式公佈爲自組網路由協議的RFc標準。AODV實質上就是DSRDSDV的綜合,它借用了DSR中路由發現和路由維護的基礎程序,及DSDV的逐跳(Hop-by-Hop)路由、目的節點序列號和路由維護階段的週期更新機制,以DSDV爲基礎,結合DSR中的按需路由思想並加以改進。

AODV在每個中間節點隱式保存了路由請求和應答的結果,並利用擴展環搜索的辦法來限制搜索發現過的目的節點的範圍。AODV支持組播功能,支持QoS,而且AODV中可以使用IP地址,實現同Internet連接,但是不支持單向信道。和DSDV保存完整的路由表不同的是,AODV通過建立基於按需路由來減少路由廣播的次數,這是AODVDSDV的重要改進。和DSR相比,AODV的好處在於源路由並不需要包括在每一個數據分組中,這樣會使路由協議的開銷有所降低。AODV是一個純粹的按需路由系統,那些不在路徑內的節點不保存路由信息,也不參與路由表的交換。AODV協議可以實現在移動終端間動態的、自發的路由,使移動終端很快獲得通向所需目的的路由,同時又不用維護當前沒有使用的路由信息,並且還能很快對斷鏈的拓撲變化做出反應。AODV的操作是無環路的,在避免了通常Bellman-ford算法的無窮計數問題的同時,還提供了很快的收斂速度。AODV的路由表中每個項都使用了目的序列號(Destination Sequence Number)。目的序列號是目的節點創建,並在發給發起節點的路由信息中使用的。使用目的序列號可以避免環路的發生。

AODV使用3種消息作爲控制信息 :RouteRequest(RREQ)RouteReply(RREP) RouteError(RERR)。這些消息都在UDP上使用654端口號。

當源節點需要和目的節點通信時,如果在路由表中已經存在了對應的路由時,AODV不會進行任何操作。當源節點需要和新的目的通信時,它就會發起路由發現過程,通過廣播RREQ信息來查找相應路由。當這個RREQ到達目的節點本身,或者是一個擁有足夠新的到目的節點路由的中間節點時,路由就可以確定了。所謂足夠新就是通過目的序列號來判斷的。目的節點或中間節點通過原路返回一個RREP信息來向源節點確定路由的可用性。在維護路由表的過程中,當路由不再被使用時,節點就會從路由表中刪除相應的項。同時,節點會監視一個活動路由(activeroute,有限跳的,可用於數據轉發的路由表)中,下一跳節點的狀況。當發現有鏈路斷開的情況時,節點就會使用RERR通知上游的節點,而上游的節點就會使用該RERR分組拷貝通知更上游的節點。在RERR消息中,指明瞭由於斷鏈而導致無法達到目的節點。每個節點都保留了一個前驅列表”(precursor list)來幫助完成錯誤報告的功能,這個列表中保存了把自己作爲到當前不可達節點的下一跳的相鄰節點(可以通過記錄RERR很容易地獲得)。在路由表中,針對每一個表項,需要記錄相應的的特徵內容。其中,序列號是防止路由環路的關鍵所在。當發生斷鏈時,通過增加序列號和度量值(跳數)來使路由表項無效。

2、AODV路由協議的運行方式
(a)AODV路由發現
  AODV路由協議是一種典型的按需驅動路由協議,該算法可被稱爲純粹的需求路由獲取系統,那些不在活躍路徑上的節點不會維持任何相關路由信息,也不會參與任何週期路由表的交換。此外,節點沒有必要去發現和維持到另一節點的路由,除非這兩個節點需要進行通信。移動節點間的局部連接性可以通過幾種方法得到,其中包括使用局部廣播Hello消息。這種算法的主要目的是:在需要時廣播路由發現分組一般的拓撲維護;區別局部連接管理(鄰居檢測)和一般的拓撲維護;向需要連接信息的鄰居移動節點散播拓撲變化信息。AODV使用廣播路由發現機制,它依賴中間節點動態建立路由表來進行分組的傳送。爲了維持節點間的最新路由信息,AODV借鑑了DSDV中的序列號的思想,利用這種機制就能有效地防止路由環的形成。當源節點想與另外一個節點通信,而它的路由表中又沒有相應的路由信息時,它就會發起路由發現過程。每一個節點維持兩個獨立的計數器:節點序列號計數器和廣播標識。源節點通過向自己的鄰居廣播 RREQ(Route Requests)分組來發起一次路由發現過程。
(b)反向路由的建立
  在RREQ分組中包含了兩個序列號:源節點序列號和源節點所知道的最新的目的序列號。源節點序列號用於維持到源的反向路由的特性,目的序列號表明了到目的地的最新路由。當RREQ分組從一個源節點轉發到不同的目的地時,沿途所經過的節點都要自動建立到源節點的反向路由。節點通過記錄收到的第一個RREQ分組的鄰居地址來建立反向路由,這些反向路由將會維持一定時間,一該段時間足夠RREQ分組在網內轉發以及產生的RREP分組返回源節點。當RREQ分組到達了目的節點,目的節點就會產生RREP分組,並利用建立的反向路由來轉發RREP
(c)正向路由的建立
  RREQ分組最終將到達一個節點,該節點可能就是目的節點,或者這個節點有到達目的節點的路由。如果這個中間節點有到達目的的路由項,它就會比較路由項裏的目的序列號和RREQ分組裏的目的序列號的大小來判斷自己已有的路由是否是比較新的。如果RREQ分組裏的目的序列號比路由項中的序列號大,則這個中間節點不能使用己有的路由來響應這個RREQ分組,只能是繼續廣播這個RREQ分組。中間節點只有在路由項中的目的序列號不小於RREQ中的目的序列號時,才能直接對收到的RREQ分組做出響應。如果節點有到目的地的最新路由,而且這個RREQ還沒有被處理過,這個節點將會沿着建立的反向路由返回RREP分組。

  在RREP轉發回源節點的過程中,沿着這條路徑上的每一個.節點都將建立到目的節點的同向路由,也就是記錄下RREP是從哪一個鄰居節點來的地址,然後更新有關源和目的路由的定時器信息以及記錄下RREP中目的節點的最新序列號。對於那些建立了反向路由,但RREP分組並沒有經過的節點,它們中建立的反向路由將會在一定時間(Active-Route-Timeout)後自動變爲無效。收到RREP分組的節點將會對到某一個源節點的第一個RREP分組進行轉發,對於其後收到的到同一個源的RREP分組,只有當後到的RREP分組中包含了更高的目的序列號或雖然有相同的目的序列號但所經過的跳數較少時,節點才一會重新更新路由信息,以及把這個RREP分組轉發出去。這種方法有效地抑制了向源節點轉發的RREP分組數,而且確保了最新及最快的路由信息。源節點將在收到第一個RREP分組後,就開始向目的節點發送數據分組。如果以後源節點瞭解到的更新的路由,它就會更新自己的路由信息。

3、AODV路由表的管理
  節點的路由中除了存儲源和目的節點的序列號外,還存儲了其他有用的信息,這些信息成爲有關路由項的軟狀態。與反向路由相關的是路由請求定時器,這些定時器的目的是清除一定時間內沒有使用的反向路由項。定時器的設置依賴於自組網的規模大小,與路由表相聯繫的另外一個重要的參數是路由緩存時間,即在超過這個時間之後,對應的路由表就變爲無效。
  此外,在每一個路由表中,還要記錄本節點用於轉發分組的活躍鄰居。如果節點在最近一次活躍期間(Active-Timeout)發起或轉發了到某個目的節點的分組,那麼就可以稱這個節點爲活躍節點。這樣,當到達某一個目的節點的鏈路有問題時,所有與這條鏈路有關的活躍節點都可以被通知到。一個路由表還有活躍鄰居在使用,就可以認爲是有效的。通過各個活躍路由項所建立的源節點到目的節點的路徑,也就是一條活躍路徑。路由表中的目的節點序列號,正如在DSDV路由協議中所使用的那樣,可以在無序分組的傳送和節點高度移動的極端條件下避免路由環路的產生。

  移動節點爲每一個相關的目的節點維護了一個路由表。每一個路由表包含以下一些信息:目的地址、下一跳地址、跳數、目的序列號及路由項的生存時間。路由表在每一次被用來傳送一個分組時,它的生存時間都要重新開始計算,也就是用當前時間加上Aetive-Route-Timeout。如果一個移動節點被提供了到達某一個目的節點的新路由,那麼它就會把這個新路由的目的序列號與自己路由表中己有的目的序列號做比較,並將目的序列號大的作爲到達目的節點的路由表。如果目的序列號相同,則採用到目的節點所經過的節點數(跳數)最少的那個路由。

4、AODV路由維護
  如果節點的移動不是沿着活躍路徑進行的,那麼就不會影響己經建立的路由。如果一個源節點在活躍路徑上移動,它就要向目的節點重新發起一次路由發現過程。如果移動的節點是中間節點或目的節點,那麼一個特殊的RREP分組將轉發到那些受移動影響的源節點。週期性發送的Hello分組可以用來確保鏈路的對稱性,並檢測不能用的鏈路。如果不用Hello分組,也可以採用鏈路層通告機制來報告鏈路的無效性,這樣可以減少延遲。此外,節點在嘗試向下一跳節點轉發分組失敗後,也能檢測出鏈路的不可用性。

  一旦一個節點的下一跳節點變得不可達,這時它就要向利用該損壞鏈路的活躍上游節點發送未被請求的RREPRERR)分組,這個RREP(RERR)分組帶有一個新的序列號(即在目的序列號上加1),並將跳數值設置爲二。收到這個RREP(RERR)分組的節點再依次將RREP(RERR)分組轉發到它們各自的活躍鄰居,這個過程持續到所有的與損壞鏈路有關的活躍節點都被通知到爲止。源節點在收到斷鏈的通知後,如果它還要與目的節點聯繫,它就需要再次發起新的路由發現過程。這時,它將會廣播一個RREQ分組,這個RREQ分組中的目的序列號要在源節點已知的最新目的序列號之上加1,以確保那些還不知道目的節點最新位置的中間節點對這個RREQ分組做出響應,從而能保證建立一條新的、有效的路由。

5、AODV協議評價
  總之,AODV是一種距離矢量路由協議,採用的算法克服了以前提出的一些算法(DSDV)的缺點,具有如下優點:
  (a)基於傳統的距離向量路由機制,思路簡單、易懂。
  (b)支持中間節點應答,能使源節點快速獲得路由,有效減少了廣播數,但存在過時路由問題。
  (c)節點只存儲需要的路由,減少了內存的需求和不必要的複製。
  (d)快速響應活躍路徑上斷鏈。
  (e)通過使用目的序列號來避免路由環路,解決了傳統的基於距離向量路由協議存在的無限計數問題。
  (f)具有網絡的可擴充性。
  (g)需要週期性地廣播分組,需要消耗一定的電池能源和網絡帶寬。與DSDV以及其他持續存儲更新路由信息的算法相比,AODV需要相對較長的路由建立時延,不過AODV採取了以下的一些措施來加以改善:
  (a)到某個目的節點的路由可以由知道路由的中間節點進行響應。
  (b)鏈路失效能夠被立即報告,這樣路由可重新建立。
  (c)不活躍的路由在一定時間後會被刪除。

http://hi.baidu.com/jerry_916/blog/item/91342237a4e7402d0b55a963.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章