1. 程式人生 > >IPv6 NDP鄰居發現協議 2

IPv6 NDP鄰居發現協議 2

1、引言

  隨著IP網路規模和業務的迅速發展,IP網路的使用者數急劇增加,正因為如此,IP網路也暴露出越來越多的問題,如地址空間不足、QoS、安全問題等。為了解決Internet的這些問題,尤其是解決地址空間不足的問題,IETF於1992年在IPv4的基礎上定義了下一代的Internet協議,被稱之為“Ipng”或“IPv6”。   IPv6解決的最大問題是擴大了地址空間,另外,它與IPv4相比在其它許多方面都具有優勢,例如安全性、服務質量、移動性等。IPv6的一個顯著特點就是它具有“即插即用”功能。即插即用使節點直接連線到網路後,不需要經過任何人工配置就能夠使用,即插即用使網路的管理和控制變得更加簡單;其次,節點只需要知道自己的鏈路層地址及本地網路的子網字首,就能夠通過IPv6的無狀態或者全狀態自動配置得到惟一的IPv6地址,從而成為網路的一部分;另外,IPv6還實現了更好的對節點移動性的支援。這些功能都是通過鄰居發現協議來實現的,同一個子網內的所有主機和路由器之間的互動也都是通過鄰居發現協議來實現的。 

2
、工作原理 

  鄰居發現協議是IPv6協議的一個基本的組成部分,它實現了在IPv4中的地址解析協議(ARP)、控制報文協議(ICMP)中的路由器發現部分、重定向協議的所有功能,並具有鄰居不可達檢測機制。   鄰居發現協議實現了路由器和字首發現、地址解析、下一跳地址確定、重定向、鄰居不可達檢測、重複地址檢測等功能,可選實現鏈路層地址變化、輸入負載均衡、泛播地址和代理通告等功能。   鄰居發現協議採用5種類型的IPv6控制資訊報文(ICMPv6)來實現鄰居發現協議的各種功能。這5種類型訊息如下。   (1)路由器請求(Router Solicitation):當介面工作時,主機發送路由器請求訊息,要求路由器立即產生路由器通告訊息,而不必等待下一個預定時間。   (2)
路由器通告(Router Advertisement):路由器週期性地通告它的存在以及配置的鏈路和網路引數,或者對路由器請求訊息作出響應。路由器通告訊息包含在連線(on-link)確定、地址配置的字首和跳數限制值等。  (3)鄰居請求(Neighbor Solicitation):節點發送鄰居請求訊息來請求鄰居的鏈路層地址,以驗證它先前所獲得並儲存在快取中的鄰居鏈路層地址的可達性,或者驗證它自己的地址在本地鏈路上是否是惟一的。   (4)鄰居通告(Neighbor Advertisement):鄰居請求訊息的響應。節點也可以傳送非請求鄰居通告來指示鏈路層地址的變化。   (5)重定向(Redirect):路由器通過重定向訊息通知主機。對於特定的目的地址,如果不是最佳的路由,則通知主機到達目的地的最佳下一跳。 

3
、主機的資料結構 

  IPv6的一個設計要求是:即使在一個有限的網路內,主機也必須正確工作,而不像路由器不能儲存路由表,不能有永久的配置,因此主機必須能自動配置,必須能學到交換資料的有關目的地的最小資訊。這些資訊儲存的儲存器叫做快取,這些資料結構是一系列記錄的排列,稱作表項。每個表項儲存的資訊有一定的有效期,需要週期性地清除快取中的表項,以保證快取的空間大小。   主機需要為每一介面維護以下資訊:
  ·鄰居快取:一組有關單個鄰居的表項,這些鄰居接收到了最新的資料流。表項是連線單播地址的關鍵,它包括的資訊有:其鏈路層地址、指示鄰居是路由器還是主機的標誌、指向任何排隊等待完成地址解析資料包的指標等。鄰居快取表項還包括由鄰居不達檢測演算法所使用的資訊,如可達狀態、探測無應答的次數以及下一次鄰居不達檢測發生的時間。 

  ·目的地快取:一組有關最近收到資料流的目的地節點表項。目的地快取包括“在連線(on-link)”和“非連線(off-link)”目的地,並在其中提供一定程度的間接定址。目的地快取能把目的地IP地址對映成下一跳鄰居的IP地址該快取通過重定向訊息進行資訊更新。如果在目的地快取表項中儲存與鄰居發現沒有直接關係的附加資訊,例如路徑MTU(PMTU)以及由傳輸協議設定的往返時間,則執行時會更加方便。 

  ·字首列表:規定一組“在連線(on-link)”地址的字首組成的列表。字首列表表項產生於路由器通告接收到的資訊。每一個表項都有一個相關的失效計時器值(由通告資訊確定),它用於在字首失效時廢棄這些字首。除非在後續通告中收到了一個新的(有限)值,否則特殊的“無限”計時器值規定字首永久有效。本地鏈路(1ink-local)字首位於帶有無限失效計時器的字首列表,而不管路由器是否正在向其通告字首。接收的路由器通告不應該修改本地鏈路字首的失效計時器。 

  ·預設路由器列表:接收資料包的路由器列表。路由器列表的表項指向鄰居快取中的相應的表項。預設路由器的選擇演算法是:選擇那些已知可達的路由器,而不選擇可達性還不確定的路由器。每一個表項還有一個相關的失效計時器值(從路由器通告資訊中得到),它的作用是刪除不再通告的表項。 

  上述資料結構可以用不同的方法實現。其中一種實現方法是對所有資料結構使用單個最長匹配路由表。不管採用哪種特定的實現方法,為了防止重複性的鄰居不可達檢測,路由器的鄰居快取表項可以由使用該路由器的所有目的地快取表項共享。 

  鄰居快取包含有鄰居不可達檢測演算法維護的資訊。鄰居可達性狀態是最關鍵的資訊,它的取值是下列的5個值之一。 
  ·不完整性(INCOMPLETE):正在進行地址解析,鄰居的鏈路層地址還沒確定。   ·可達性(REACHABLE):鄰居在最近處於可達狀態(在小於10s以前)。   ·失效性(STALE):在資料流傳送給該鄰居以前鄰居是不可達的,並無法驗證其可達性。   ·延遲(DELAY):鄰居不再是可達的,同時資料流在最近已經發送給鄰居,但不立即對該鄰居進行探測,而在一個短時延後傳送探測資訊,這樣就可以為上層協議提供可達性確認。   ·探測(PROBE):鄰居不再是可達的,同時傳送單播鄰居請求探測以驗證可達性。 

4、資料包的傳送演算法

  節點向目的地傳送資料包時,使用目的地快取、字首列表、預設路由器列表確定合適的下一跳的IP地址然後路由器查詢鄰居快取確定鄰居的鏈路層地址。   IPv6單播地址的下一跳確定操作如下:傳送者使用字首列表中的字首進行最長字首匹配,確定包的目的地是在連線的還是非連線的。如果下一跳是在連線的,下一跳地址就和目的地地址相同,否則傳送者從預設路由器列表中選擇下一跳。如果預設路由器列表為空,則傳送者認為目的地是在連線的。   下一跳確定的資訊儲存在目的地快取中,下一個包可以使用這些資訊。當路由器傳送包時,首先檢查目的地快取,如果目的地快取沒有相關資訊存在,就啟用下一跳確定過程,生成一個Destination Cache條目。   在學習到下一跳路由器的IPv6地址後,傳送者檢查鄰居快取以決定鏈路層地址。如果沒有下一跳IPv6地址的表項存在,路由器的工作如下:   ·建立一個新表項,並設定其狀態為不完全。   ·開始進行地址解析。   ·對傳送的包進行排隊。   當地址解析結束時,獲得鏈路層地址,儲存在鄰居快取中。此時表項到達新的可達狀態,排隊的包能夠傳送。   對於組播包,下一跳總是認為在連線,確定組播IPv6地址的鏈路層地址取決於鏈路型別。當鄰居快取開始傳送單播包時,傳送者根據鄰居不可達檢測演算法檢測相關的可達性資訊,驗證鄰居的可達性。當鄰居不可達時,再次執行下一跳確定,驗證到達目的地的另一條路徑是否是可達的。   如果知道了下一跳節點的IP地址,傳送方就檢查鄰居快取中有關鄰居的鏈路層資訊。如果沒有表項存在,傳送方就建立一條,並設定其狀態為“不完整性”,同時啟動地址解析,然後對沒有完成地址解析的資料包進行排隊。對具有組播功能的介面來說,地址解析的過程是傳送一個鄰居請求資訊,以及等待一個鄰居通告。當收到一個鄰居通告應答時,鏈路層地址被表項在鄰居快取中,同時傳送排隊的資料包。   在傳輸單播資料包期間每次讀取鄰居發現快取的表項,傳送方根據鄰居不可達性檢測的演算法檢查鄰居不可達性檢測的相關資訊,但不可達性檢測會使傳送方發出單播鄰居請求,以驗證該鄰居還是可達的。   資料流第一次送往目的地時就執行下一跳確定的操作,隨後該目的地如果仍能正常通訊,目的地快取的表項就可以繼續使用。如果鄰居不可達演算法決定在某一點終止通訊,則需要重新執行下一跳確定,例如故障路由器的流量應該切換到正常工作的路由器,流向移動節點的資料流可能要重新路由到“移動代理”。   當節點重做下一跳確定時,不需要丟棄整個目的地快取的表項,其中PMTU和往返計時器值的資訊是很有用的。 

5、鄰居發現協議的功能 

  (1)路由器和字首發現 

  路由器必須無條件丟棄不滿足有效性檢查的路由器請求和路由器通告訊息。   路由器發現功能用來標識與給定鏈路相連的路由器,並獲取與地址自動配置相關的字首和配置引數。   作為對請求訊息的響應,路由器應週期地傳送組播路由器通告訊息,來通告鏈路上節點的可達性。每個主機從鏈路上相連的路由器上接收路由器通告訊息,並建立預設路由器列表(當到達目的地的路徑不可知時所使用的路由器)。如果路由器很頻繁地產生路由器通告訊息,那麼主機就能在幾分鐘內學習到路由器的存在,否則就要使用鄰居不可達檢測。   路由器通告訊息應包含用來確定在連線可達性的字首列表。主機通過使用從路由器通告訊息中提取的字首,來確定目的地是否在連線,能否直接可達,或者是否非連線,還是僅通過一個路由器就可達。目的地是在連線的,但這個目的地沒有被路由器通告訊息學到的字首覆蓋,在這種情況下,主機認為目的地是非連線的,路由器傳送重定向訊息給傳送者。   路由器通告訊息應包含一些標誌位,這些標誌位通知主機怎樣執行地址的自動配置,例如路由器能指定主機是使用有狀態地址配置還是無狀態地址配置。   另外,路由器通告訊息中還應包含簡化網路集中管理的引數,例如主機產生的資料包中使用的跳數限制引數的預設值,或鏈路MTU值。   當主機向路由器發出路由器請求訊息時,路由器應立刻傳送路由器通告訊息,通過這種方式能加速節點的配置過程。 

  (2)地址解析 

  IPv6節點通過鄰居請求和鄰居通告訊息將IPv6地址解析成鏈路層地址,對組播地址不執行地址解析。   節點通過組播鄰居請求訊息來啟用地址解析過程,鄰居請求訊息用來請求目標路由器返回它的鏈路層地址。源路由器在鄰居請求訊息中包含了它的鏈路層地址,並將鄰居請求訊息組播到與目標地址相關的請求節點組播地址,目標路由器在單播的鄰居通告訊息中返回它的鏈路層地址。這一對訊息使源和目標路由器能解析出相互的鏈路層地址。 

  (3)重定向功能 

  當包必須傳送到一個非連線的目的地時,需要選擇轉發包的路由器。當選擇的路由器作為訊息傳送的下一跳並不是最好的下一跳時,路由器需產生重定向訊息,通知源節點到達目的地存在一個更佳的下一跳路由器。   路由器必須能夠確定每個鄰居路由器的本地鏈路(1ink-local)地址,以保證重定向訊息裡的目標地址根據本地鏈路地址來識別鄰居路由器。   在源端沒有正確應答重定向訊息,或者源端選擇忽略沒有被驗證的重定向訊息的情況下,為了節省頻帶和處理的費用,路由器必須限定傳送重定向訊息的速率。   在收到重定向訊息時,路由器不能更新路由表。 

  (4)鄰居不可達檢測 

  任何時候通過鄰居或到達鄰居的通訊,會因各種原因而中斷,包括硬體故障、介面卡的熱插入等。如果目的地失效,則恢復是不可能的,通訊失敗;如果路徑失效,則恢復是可能的。因此節點應該主動跟蹤資料包發向鄰居的可達性狀態。   主機與鄰居節點之間所有路徑都應進行鄰居不可達性檢測,包括主機到主機、主機到路由器以及路由器到主機之間的通訊,也可用於路由器之間,以檢測鄰居或鄰居前向路徑發生的故障。   如果路由器最近收到確認,鄰居的IP層已經收到最近傳送到它的資料包,那麼該鄰居是可達的。鄰居不可達檢測使用兩種方法進行確認:一種是從上層協議來的提示,提供“連線正在處理”的確認;另一種是路由器傳送單播鄰居請求訊息,收到了應答的鄰居通告訊息。為了減少不必要的網路流量,探測訊息僅傳送到鄰居。   鄰居不可達性檢測與向鄰居傳送資料包同時進行。在鄰居可達性確認期間,路由器繼續向快取鏈路層地址的鄰居傳送資料包;如果沒有資料包發向鄰居,則不傳送檢測。 

6、鄰居發現協議與ARP的比較 

  鄰居發現協議比IPv4協議的相應部分在許多方面有了更大的改善。   在IPv4中,由IP層到鏈路層地址的解析(ARP)是基於鏈路層的廣播機制來實現的,資料包由LLC網橋進行轉發,在一個比較大的站點範圍內會佔用大量的頻寬,有時還會引起“廣播風暴”。而在IPv6中,這一過程是基於IP層的組播機制實現的,這樣,在地址解析的過程中受到地址解析傳送包影響的節點數大大減少,而且非IPv6節點根本不受影響。   另外,IPv6的鄰居發現協議中路由器通告訊息會帶著自己的鏈路層地址,還會帶著本地鏈路的字首,從而避免了每個節點配置自己的子網掩碼。   IPv4的ARP是不安全的,無法保證迴應ARP探測訊息的節點是需要的節點,這樣會導致發往一個節點的資料包被另一個節點竊聽到。而鄰居發現協議執行在IPv6之上,它屬於網路層協議,它的安全性可由IPv6的安全性來保證。   IPv4的ARP執行在資料鏈路層,不同的網路介質需要有不同的ARP協議,例如Ethernet ARP與FDDI ARP就不完全相同。而鄰居發現協議執行在網路層,與介質無關,任何網路媒介都可以執行相同的鄰居發現協議。   與IPv4協議不同,通過鄰居發現協議得到的各種地址資訊都有一定的生存期,這些生存期由這些資訊的傳送者規定。路由器能夠通知主機如何執行地址配置,例如路由器能指示主機是使用狀態地址配置還是使用無狀態地址配置。路由器能夠通告鏈路的最大傳輸單元資訊(MTU),以使同一鏈路上的所有節點使用相同的MTU值。對於無狀態地址自動配置來說,鄰居發現協議能夠提供主機進行無狀態地址自動配置所需要的全部資訊。   在IPv4到IPv6的早期過渡階段,所有實現IPv6的節點都應該被配製成一種雙棧結構。雙棧結構使節點能夠與IPv4保持相容,因此現存的IPv4協議層應該被一種既支援IPv4又支援IPv6的協議層所取代,而且TCP和UDP層應該被升級支援IPv6。支援兩個版本的IP協議的最大困難在於同時處理兩種不同結構的地址,鄰居發現中的鄰居自動發現功能可以很容易地處理這種功能。 

7、結束語 

  自從IETF在1998年12月制定了鄰居發現協議的標準文字RFC2461後,鄰居發現就成為IPv6節點使用的重要協議,它解決了連線在同一條鏈路上的所有節點之間的互操作問題。   雖然目前IPv6的標準已經比較穩定,國內外廠商研製的相關產品和裝置也已經成熟,但由於IPv6技術在我國的市場需求還不是很明朗,因此IPv6技術在我國還處於試驗網的實踐和執行階段。隨著IPv6網路應用商業化程序的加快,鄰居發現協議的使用將會越來越廣泛。