摘要 分析了鄰居發(fā)現協(xié)議主機使用的數據結構和數據包的發(fā)送算法,闡述了鄰居發(fā)現協(xié)議的功能,最后將鄰居發(fā)現協(xié)議與ARP進(jìn)行了比較。
關(guān)鍵詞 IPv6 鄰居發(fā)現 ARP
1、引言
隨著(zhù)IP網(wǎng)絡(luò )規模和業(yè)務(wù)的迅速發(fā)展,IP網(wǎng)絡(luò )的用戶(hù)數急劇增加,正因為如此,IP網(wǎng)絡(luò )也暴露出越來(lái)越多的問(wèn)題,如地址空間不足、QoS、安全問(wèn)題等。為了解決Internet的這些問(wèn)題,尤其是解決地址空間不足的問(wèn)題,IETF于1992年在IPv4的基礎上定義了下一代的Internet協(xié)議,被稱(chēng)之為“Ipng”或“IPv6”。
IPv6解決的最大問(wèn)題是擴大了地址空間,另外,它與IPv4相比在其它許多方面都具有優(yōu)勢,例如安全性、服務(wù)質(zhì)量、移動(dòng)性等。IPv6的一個(gè)顯著(zhù)特點(diǎn)就是它具有“即插即用”功能。即插即用使節點(diǎn)直接連接到網(wǎng)絡(luò )后,不需要經(jīng)過(guò)任何人工配置就能夠使用,即插即用使網(wǎng)絡(luò )的管理和控制變得更加簡(jiǎn)單;其次,節點(diǎn)只需要知道自己的鏈路層地址及本地網(wǎng)絡(luò )的子網(wǎng)前綴,就能夠通過(guò)IPv6的無(wú)狀態(tài)或者全狀態(tài)自動(dòng)配置得到惟一的IPv6地址,從而成為網(wǎng)絡(luò )的一部分;另外,IPv6還實(shí)現了更好的對節點(diǎn)移動(dòng)性的支持。這些功能都是通過(guò)鄰居發(fā)現協(xié)議來(lái)實(shí)現的,同一個(gè)子網(wǎng)內的所有主機和路由器之間的交互也都是通過(guò)鄰居發(fā)現協(xié)議來(lái)實(shí)現的。
2、工作原理
鄰居發(fā)現協(xié)議是IPv6協(xié)議的一個(gè)基本的組成部分,它實(shí)現了在IPv4中的地址解析協(xié)議(ARP)、控制報文協(xié)議(ICMP)中的路由器發(fā)現部分、重定向協(xié)議的所有功能,并具有鄰居不可達檢測機制。
鄰居發(fā)現協(xié)議實(shí)現了路由器和前綴發(fā)現、地址解析、下一跳地址確定、重定向、鄰居不可達檢測、重復地址檢測等功能,可選實(shí)現鏈路層地址變化、輸入負載均衡、泛播地址和代理通告等功能。
鄰居發(fā)現協(xié)議采用5種類(lèi)型的IPv6控制信息報文(ICMPv6)來(lái)實(shí)現鄰居發(fā)現協(xié)議的各種功能。這5種類(lèi)型消息如下。
(1)路由器請求(Router Solicitation):當接口工作時(shí),主機發(fā)送路由器請求消息,要求路由器立即產(chǎn)生路由器通告消息,而不必等待下一個(gè)預定時(shí)間。
(2)路由器通告(Router Advertisement):路由器周期性地通告它的存在以及配置的鏈路和網(wǎng)絡(luò )參數,或者對路由器請求消息作出響應。路由器通告消息包含在連接(on-link)確定、地址配置的前綴和跳數限制值等。
(3)鄰居請求(Neighbor Solicitation):節點(diǎn)發(fā)送鄰居請求消息來(lái)請求鄰居的鏈路層地址,以驗證它先前所獲得并保存在緩存中的鄰居鏈路層地址的可達性,或者驗證它自己的地址在本地鏈路上是否是惟一的。
(4)鄰居通告(Neighbor Advertisement):鄰居請求消息的響應。節點(diǎn)也可以發(fā)送非請求鄰居通告來(lái)指示鏈路層地址的變化。
(5)重定向(Redirect):路由器通過(guò)重定向消息通知主機。對于特定的目的地址,如果不是最佳的路由,則通知主機到達目的地的最佳下一跳。
3、主機的數據結構
IPv6的一個(gè)設計要求是:即使在一個(gè)有限的網(wǎng)絡(luò )內,主機也必須正確工作,而不像路由器不能儲存路由表,不能有永久的配置,因此主機必須能自動(dòng)配置,必須能學(xué)到交換數據的有關(guān)目的地的最小信息。這些信息儲存的存儲器叫做緩存,這些數據結構是一系列記錄的排列,稱(chēng)作表項。每個(gè)表項儲存的信息有一定的有效期,需要周期性地清除緩存中的表項,以保證緩存的空間大小。
主機需要為每一接口維護以下信息。
·鄰居緩存:一組有關(guān)單個(gè)鄰居的表項,這些鄰居接收到了最新的數據流。表項是連接單播地址的關(guān)鍵,它包括的信息有:其鏈路層地址、指示鄰居是路由器還是主機的標志、指向任何排隊等待完成地址解析數據包的指針等。鄰居緩存表項還包括由鄰居不達檢測算法所使用的信息,如可達狀態(tài)、探測無(wú)應答的次數以及下一次鄰居不達檢測發(fā)生的時(shí)間。
·目的地緩存:一組有關(guān)最近收到數據流的目的地節點(diǎn)表項。目的地緩存包括“在連接(on-link)”和“非連接(off-link)”目的地,并在其中提供一定程度的間接尋址。目的地緩存能把目的地IP地址映射成下一跳鄰居的IP地址,該緩存通過(guò)重定向消息進(jìn)行信息更新。如果在目的地緩存表項中存儲與鄰居發(fā)現沒(méi)有直接關(guān)系的附加信息,例如路徑MTU(PMTU)以及由傳輸協(xié)議設定的往返時(shí)間,則執行時(shí)會(huì )更加方便。
·前綴列表:規定一組“在連接(on-link)”地址的前綴組成的列表。前綴列表表項產(chǎn)生于路由器通告接收到的信息。每一個(gè)表項都有一個(gè)相關(guān)的失效計時(shí)器值(由通告信息確定),它用于在前綴失效時(shí)廢棄這些前綴。除非在后續通告中收到了一個(gè)新的(有限)值,否則特殊的“無(wú)限”計時(shí)器值規定前綴永久有效。本地鏈路(1ink-local)前綴位于帶有無(wú)限失效計時(shí)器的前綴列表,而不管路由器是否正在向其通告前綴。接收的路由器通告不應該修改本地鏈路前綴的失效計時(shí)器。
·缺省路由器列表:接收數據包的路由器列表。路由器列表的表項指向鄰居緩存中的相應的表項。缺省路由器的選擇算法是:選擇那些已知可達的路由器,而不選擇可達性還不確定的路由器。每一個(gè)表項還有一個(gè)相關(guān)的失效計時(shí)器值(從路由器通告信息中得到),它的作用是刪除不再通告的表項。
上述數據結構可以用不同的方法實(shí)現。其中一種實(shí)現方法是對所有數據結構使用單個(gè)最長(cháng)匹配路由表。不管采用哪種特定的實(shí)現方法,為了防止重復性的鄰居不可達檢測,路由器的鄰居緩存表項可以由使用該路由器的所有目的地緩存表項共享。
鄰居緩存包含有鄰居不可達檢測算法維護的信息。鄰居可達性狀態(tài)是最關(guān)鍵的信息,它的取值是下列的5個(gè)值之一。
·不完整性(INCOMPLETE):正在進(jìn)行地址解析,鄰居的鏈路層地址還沒(méi)確定。
·可達性(REACHABLE):鄰居在最近處于可達狀態(tài)(在小于10s以前)。
·失效性(STALE):在數據流發(fā)送給該鄰居以前鄰居是不可達的,并無(wú)法驗證其可達性。
·延遲(DELAY):鄰居不再是可達的,同時(shí)數據流在最近已經(jīng)發(fā)送給鄰居,但不立即對該鄰居進(jìn)行探測,而在一個(gè)短時(shí)延后發(fā)送探測信息,這樣就可以為上層協(xié)議提供可達性確認。
·探測(PROBE):鄰居不再是可達的,同時(shí)發(fā)送單播鄰居請求探測以驗證可達性。
4、數據包的發(fā)送算法
節點(diǎn)向目的地發(fā)送數據包時(shí),使用目的地緩存、前綴列表、默認路由器列表確定合適的下一跳的IP地址,然后路由器查詢(xún)鄰居緩存確定鄰居的鏈路層地址。
IPv6單播地址的下一跳確定操作如下:發(fā)送者使用前綴列表中的前綴進(jìn)行最長(cháng)前綴匹配,確定包的目的地是在連接的還是非連接的。如果下一跳是在連接的,下一跳地址就和目的地地址相同,否則發(fā)送者從默認路由器列表中選擇下一跳。如果默認路由器列表為空,則發(fā)送者認為目的地是在連接的。
下一跳確定的信息存儲在目的地緩存中,下一個(gè)包可以使用這些信息。當路由器發(fā)送包時(shí),首先檢查目的地緩存,如果目的地緩存沒(méi)有相關(guān)信息存在,就激活下一跳確定過(guò)程。
在學(xué)習到下一跳路由器的IPv6地址后,發(fā)送者檢查鄰居緩存以決定鏈路層地址。如果沒(méi)有下一跳IPv6地址的表項存在,路由器的工作如下:
·創(chuàng )建一個(gè)新表項,并設置其狀態(tài)為不完全。
·開(kāi)始進(jìn)行地址解析。
·對傳送的包進(jìn)行排隊。
當地址解析結束時(shí),獲得鏈路層地址,存儲在鄰居緩存中。此時(shí)表項到達新的可達狀態(tài),排隊的包能夠傳送。
對于組播包,下一跳總是認為在連接,確定組播IPv6地址的鏈路層地址取決于鏈路類(lèi)型。當鄰居緩存開(kāi)始傳送單播包時(shí),發(fā)送者根據鄰居不可達檢測算法檢測相關(guān)的可達性信息,驗證鄰居的可達性。當鄰居不可達時(shí),再次執行下一跳確定,驗證到達目的地的另一條路徑是否是可達的。
如果知道了下一跳節點(diǎn)的IP地址,發(fā)送方就檢查鄰居緩存中有關(guān)鄰居的鏈路層信息。如果沒(méi)有表項存在,發(fā)送方就創(chuàng )建一條,并設置其狀態(tài)為“不完整性”,同時(shí)啟動(dòng)地址解析,然后對沒(méi)有完成地址解析的數據包進(jìn)行排隊。對具有組播功能的接口來(lái)說(shuō),地址解析的過(guò)程是發(fā)送一個(gè)鄰居請求信息,以及等待一個(gè)鄰居通告。當收到一個(gè)鄰居通告應答時(shí),鏈路層地址被表項在鄰居緩存中,同時(shí)發(fā)送排隊的數據包。
在傳輸單播數據包期間每次讀取鄰居發(fā)現緩存的表項,發(fā)送方根據鄰居不可達性檢測的算法檢查鄰居不可達性檢測的相關(guān)信息,但不可達性檢測會(huì )使發(fā)送方發(fā)出單播鄰居請求,以驗證該鄰居還是可達的。
數據流第一次送往目的地時(shí)就執行下一跳確定的操作,隨后該目的地如果仍能正常通信,目的地緩存的表項就可以繼續使用。如果鄰居不可達算法決定在某一點(diǎn)終止通信,則需要重新執行下一跳確定,例如故障路由器的流量應該切換到正常工作的路由器,流向移動(dòng)節點(diǎn)的數據流可能要重新路由到“移動(dòng)代理”。
當節點(diǎn)重做下一跳確定時(shí),不需要丟棄整個(gè)目的地緩存的表項,其中PMTU和往返計時(shí)器值的信息是很有用的。
5、鄰居發(fā)現協(xié)議的功能
(1)路由器和前綴發(fā)現
路由器必須無(wú)條件丟棄不滿(mǎn)足有效性檢查的路由器請求和路由器通告消息。
路由器發(fā)現功能用來(lái)標識與給定鏈路相連的路由器,并獲取與地址自動(dòng)配置相關(guān)的前綴和配置參數。
作為對請求消息的響應,路由器應周期地發(fā)送組播路由器通告消息,來(lái)通告鏈路上節點(diǎn)的可達性。每個(gè)主機從鏈路上相連的路由器上接收路由器通告消息,并建立默認路由器列表(當到達目的地的路徑不可知時(shí)所使用的路由器)。如果路由器很頻繁地產(chǎn)生路由器通告消息,那么主機就能在幾分鐘內學(xué)習到路由器的存在,否則就要使用鄰居不可達檢測。
路由器通告消息應包含用來(lái)確定在連接可達性的前綴列表。主機通過(guò)使用從路由器通告消息中提取的前綴,來(lái)確定目的地是否在連接,能否直接可達,或者是否非連接,還是僅通過(guò)一個(gè)路由器就可達。目的地是在連接的,但這個(gè)目的地沒(méi)有被路由器通告消息學(xué)到的前綴覆蓋,在這種情況下,主機認為目的地是非連接的,路由器發(fā)送重定向消息給發(fā)送者。
路由器通告消息應包含一些標志位,這些標志位通知主機怎樣執行地址的自動(dòng)配置,例如路由器能指定主機是使用有狀態(tài)地址配置還是無(wú)狀態(tài)地址配置。
另外,路由器通告消息中還應包含簡(jiǎn)化網(wǎng)絡(luò )集中管理的參數,例如主機產(chǎn)生的數據包中使用的跳數限制參數的缺省值,或鏈路MTU值。
當主機向路由器發(fā)出路由器請求消息時(shí),路由器應立刻發(fā)送路由器通告消息,通過(guò)這種方式能加速節點(diǎn)的配置過(guò)程。
(2)地址解析
IPv6節點(diǎn)通過(guò)鄰居請求和鄰居通告消息將IPv6地址解析成鏈路層地址,對組播地址不執行地址解析。
節點(diǎn)通過(guò)組播鄰居請求消息來(lái)激活地址解析過(guò)程,鄰居請求消息用來(lái)請求目標路由器返回它的鏈路層地址。源路由器在鄰居請求消息中包含了它的鏈路層地址,并將鄰居請求消息組播到與目標地址相關(guān)的請求節點(diǎn)組播地址,目標路由器在單播的鄰居通告消息中返回它的鏈路層地址。這一對消息使源和目標路由器能解析出相互的鏈路層地址。
(3)重定向功能
當包必須發(fā)送到一個(gè)非連接的目的地時(shí),需要選擇轉發(fā)包的路由器。當選擇的路由器作為消息傳送的下一跳并不是最好的下一跳時(shí),路由器需產(chǎn)生重定向消息,通知源節點(diǎn)到達目的地存在一個(gè)更佳的下一跳路由器。
路由器必須能夠確定每個(gè)鄰居路由器的本地鏈路(1ink-local)地址,以保證重定向消息里的目標地址根據本地鏈路地址來(lái)識別鄰居路由器。
在源端沒(méi)有正確應答重定向消息,或者源端選擇忽略沒(méi)有被驗證的重定向消息的情況下,為了節省頻帶和處理的費用,路由器必須限定發(fā)送重定向消息的速率。
在收到重定向消息時(shí),路由器不能更新路由表。
(4)鄰居不可達檢測
任何時(shí)候通過(guò)鄰居或到達鄰居的通信,會(huì )因各種原因而中斷,包括硬件故障、接口卡的熱插入等。如果目的地失效,則恢復是不可能的,通信失??;如果路徑失效,則恢復是可能的。因此節點(diǎn)應該主動(dòng)跟蹤數據包發(fā)向鄰居的可達性狀態(tài)。
主機與鄰居節點(diǎn)之間所有路徑都應進(jìn)行鄰居不可達性檢測,包括主機到主機、主機到路由器以及路由器到主機之間的通信,也可用于路由器之間,以檢測鄰居或鄰居前向路徑發(fā)生的故障。
如果路由器最近收到確認,鄰居的IP層已經(jīng)收到最近發(fā)送到它的數據包,那么該鄰居是可達的。鄰居不可達檢測使用兩種方法進(jìn)行確認:一種是從上層協(xié)議來(lái)的提示,提供“連接正在處理”的確認;另一種是路由器發(fā)送單播鄰居請求消息,收到了應答的鄰居通告消息。為了減少不必要的網(wǎng)絡(luò )流量,探測消息僅發(fā)送到鄰居。
鄰居不可達性檢測與向鄰居發(fā)送數據包同時(shí)進(jìn)行。在鄰居可達性確認期間,路由器繼續向緩存鏈路層地址的鄰居發(fā)送數據包;如果沒(méi)有數據包發(fā)向鄰居,則不發(fā)送檢測。
6、鄰居發(fā)現協(xié)議與ARP的比較
鄰居發(fā)現協(xié)議比IPv4協(xié)議的相應部分在許多方面有了更大的改善。
在IPv4中,由IP層到鏈路層地址的解析(ARP)是基于鏈路層的廣播機制來(lái)實(shí)現的,數據包由LLC網(wǎng)橋進(jìn)行轉發(fā),在一個(gè)比較大的站點(diǎn)范圍內會(huì )占用大量的帶寬,有時(shí)還會(huì )引起“廣播風(fēng)暴”。而在IPv6中,這一過(guò)程是基于IP層的組播機制實(shí)現的,這樣,在地址解析的過(guò)程中受到地址解析發(fā)送包影響的節點(diǎn)數大大減少,而且非IPv6節點(diǎn)根本不受影響。
另外,IPv6的鄰居發(fā)現協(xié)議中路由器通告消息會(huì )帶著(zhù)自己的鏈路層地址,還會(huì )帶著(zhù)本地鏈路的前綴,從而避免了每個(gè)節點(diǎn)配置自己的子網(wǎng)掩碼。
IPv4的ARP是不安全的,無(wú)法保證回應ARP探測消息的節點(diǎn)是需要的節點(diǎn),這樣會(huì )導致發(fā)往一個(gè)節點(diǎn)的數據包被另一個(gè)節點(diǎn)竊聽(tīng)到。而鄰居發(fā)現協(xié)議運行在IPv6之上,它屬于網(wǎng)絡(luò )層協(xié)議,它的安全性可由IPv6的安全性來(lái)保證。
IPv4的ARP運行在數據鏈路層,不同的網(wǎng)絡(luò )介質(zhì)需要有不同的ARP協(xié)議,例如Ethernet ARP與FDDI ARP就不完全相同。而鄰居發(fā)現協(xié)議運行在網(wǎng)絡(luò )層,與介質(zhì)無(wú)關(guān),任何網(wǎng)絡(luò )媒介都可以運行相同的鄰居發(fā)現協(xié)議。
與IPv4協(xié)議不同,通過(guò)鄰居發(fā)現協(xié)議得到的各種地址信息都有一定的生存期,這些生存期由這些信息的發(fā)送者規定。路由器能夠通知主機如何執行地址配置,例如路由器能指示主機是使用狀態(tài)地址配置還是使用無(wú)狀態(tài)地址配置。路由器能夠通告鏈路的最大傳輸單元信息(MTU),以使同一鏈路上的所有節點(diǎn)使用相同的MTU值。對于無(wú)狀態(tài)地址自動(dòng)配置來(lái)說(shuō),鄰居發(fā)現協(xié)議能夠提供主機進(jìn)行無(wú)狀態(tài)地址自動(dòng)配置所需要的全部信息。
在IPv4到IPv6的早期過(guò)渡階段,所有實(shí)現IPv6的節點(diǎn)都應該被配制成一種雙棧結構。雙棧結構使節點(diǎn)能夠與IPv4保持兼容,因此現存的IPv4協(xié)議層應該被一種既支持IPv4又支持IPv6的協(xié)議層所取代,而且TCP和UDP層應該被升級支持IPv6。支持兩個(gè)版本的IP協(xié)議的最大困難在于同時(shí)處理兩種不同結構的地址,鄰居發(fā)現中的鄰居自動(dòng)發(fā)現功能可以很容易地處理這種功能。
7、結束語(yǔ)
自從IETF在1998年12月制定了鄰居發(fā)現協(xié)議的標準文本RFC2461后,鄰居發(fā)現就成為IPv6節點(diǎn)使用的重要協(xié)議,它解決了連接在同一條鏈路上的所有節點(diǎn)之間的互操作問(wèn)題。
雖然目前IPv6的標準已經(jīng)比較穩定,國內外廠(chǎng)商研制的相關(guān)產(chǎn)品和設備也已經(jīng)成熟,但由于IPv6技術(shù)在我國的市場(chǎng)需求還不是很明朗,因此IPv6技術(shù)在我國還處于試驗網(wǎng)的實(shí)踐和運行階段。隨著(zhù)IPv6網(wǎng)絡(luò )應用商業(yè)化進(jìn)程的加快,鄰居發(fā)現協(xié)議的使用將會(huì )越來(lái)越廣泛。