《部署IPv6网络(修订版)》一2.4 邻居发现协议
本節(jié)書摘來自異步社區(qū)《部署IPv6網(wǎng)絡(luò)(修訂版)》一書中的第2章,第2.4節(jié),作者【美】Ciprian Popoviciu , Eric Levy-Abegnoli , Patrick Grossetete,更多章節(jié)內(nèi)容可以訪問云棲社區(qū)“異步社區(qū)”公眾號(hào)查看
2.4 鄰居發(fā)現(xiàn)協(xié)議
部署IPv6網(wǎng)絡(luò)(修訂版)
大約在10年以前,RFC 1970初步設(shè)計(jì)并公布了IPv6鄰居發(fā)現(xiàn)。從那時(shí)之后在RFC 2461中進(jìn)行了修改,一個(gè)新的版本(重點(diǎn)在改錯(cuò)而不是修改)是在RFC 2461bis中進(jìn)行的。一些擴(kuò)展已經(jīng)在反向鄰居發(fā)現(xiàn)(RFC 3122)、缺省路由器選擇(RFC 4191)和自動(dòng)配置(RFC 2462)中描述。
在這10年當(dāng)中,Internet團(tuán)體的重點(diǎn)發(fā)生了重大轉(zhuǎn)變,原來沒有得到很多關(guān)注的領(lǐng)域,如安全性和移動(dòng)性,現(xiàn)在是大多數(shù)努力的重點(diǎn)。該重點(diǎn)的轉(zhuǎn)變導(dǎo)致了許多擴(kuò)展、修正和相互影響,這在許多RFC和Internet草案中作了描述:在MIPv6中的移動(dòng)性擴(kuò)展(RFC 3775)、在安全鄰居發(fā)現(xiàn)中的安全特征(SEND)(RFC 3971)、檢測網(wǎng)絡(luò)連接(DNA)(RFC 4135)、網(wǎng)絡(luò)訪問的攜帶認(rèn)證協(xié)議(PANA)(RFC 4058)和優(yōu)化的DAD(draft-ietf-ipv6-optimistic-dad)。
當(dāng)連接到相同鏈路時(shí),IPv6 NDP為路由器和主機(jī)運(yùn)行提供了許多集成的關(guān)鍵特征。這些特征中的某些特征,如地址解析和重定向,在IPv4中出現(xiàn)過,但分別在不同的具體協(xié)議如ARP和ICMP中重定向。其他特征——如前綴發(fā)現(xiàn)和鄰居不可達(dá)性檢測——是新的,雖然有些可以使用IPv4中的其他方式也能做到。表2-12列出這些特征和在IPv4中的對(duì)應(yīng)特征。
NDP以不同方式應(yīng)用到主機(jī)和路由器。依據(jù)前面列表中的特征,表2-13試圖將主機(jī)和路由器角色分開。
IPv6 ND和其相應(yīng)的IPv4協(xié)議組(ARP、IPCP等)之間的本質(zhì)差別之一是,在IP協(xié)議棧中的位置不同。雖然IPv4相同鏈路相關(guān)的協(xié)議在ARP/RARP(正好在鏈路層之上)和ICMP(運(yùn)行于IP之上)之間分割,而IPv6 ND完全在ICMPv6之內(nèi)實(shí)現(xiàn)。圖2-20重點(diǎn)突出了協(xié)議棧之間的差別。
ND在協(xié)議棧中的位置,其原因是多方面的,但如果僅有一個(gè)原因應(yīng)該提出的話,那就是簡單性。如果能夠避免的話,為什么要將地址解析作為一個(gè)特例(在IPv4中的ARP和RARP)?當(dāng)是ICMP內(nèi)部,而不是與IP并列時(shí),這種特性能夠從IP所提供的任何服務(wù)中受益,包括安全性(認(rèn)證頭部)、多播等。
為了確保NDP中各種功能的安全,安全鄰居發(fā)現(xiàn)引入了一組特定的ND選項(xiàng),它們用來保護(hù)NDP消息。雖然在回顧IPv6時(shí)沒有深入討論這些選項(xiàng)的細(xì)節(jié),但您可以參考RFC 3971獲得SEND的更多信息。
2.4.1 協(xié)議操作總結(jié)
NDP使鏈路上的每個(gè)節(jié)點(diǎn)能夠運(yùn)行ND,建立必要的做出正確判定的知識(shí),這些知識(shí)在發(fā)送IPv6分組到一個(gè)鄰居時(shí)用到。這種知識(shí)代表了從路由器和節(jié)點(diǎn)接收到的公告的匯總。這些公告可以是請(qǐng)求的或非請(qǐng)求的。這種信息存儲(chǔ)在由節(jié)點(diǎn)維護(hù)的下列列表中:
在線IPv6地址和相應(yīng)的鏈路層地址列表;
鄰居狀態(tài)(可達(dá)的,不可達(dá)的);
特定主機(jī):
在線前綴列表;
在線路由器列表;
缺省路由器列表(樂意成為缺省路由器的在線路由器)。
為了得到上述信息,在NDP中用到下列消息:
路由器請(qǐng)求(RS);
路由器公告(RA);
鄰居請(qǐng)求(NS);
鄰居公告(NA);
重定向;
反向鄰居請(qǐng)求(INS);
反向鄰居公告(INA)。
NDP直接位于IPv6/ICMP之上產(chǎn)生了一系列值得澄清的問題。
當(dāng)進(jìn)行匹配的一個(gè)給定目的地址的鏈路層地址不知道時(shí),尋求該關(guān)聯(lián)的節(jié)點(diǎn)必須將其請(qǐng)求發(fā)送到更廣大的偵聽節(jié)點(diǎn)。在IPv4中,使用MAC層廣播做到這點(diǎn)。在IPv6中,節(jié)點(diǎn)在這個(gè)請(qǐng)求中使用多播。使用的多播組是被請(qǐng)求節(jié)點(diǎn)多播組(具有鏈路本地范圍),如2.1節(jié)所描述。
注釋:
注意當(dāng)知道一個(gè)前綴的鏈路層地址之后,鄰居請(qǐng)求可能再次發(fā)送,以確認(rèn)關(guān)聯(lián)信息(IP地址,鏈路層地址)。在此情況下,請(qǐng)求直接單播到目的地。
當(dāng)一個(gè)節(jié)點(diǎn)使用NDP獲得其自己的地址時(shí)(參見“自動(dòng)配置”部分),出現(xiàn)了另一個(gè)問題。它需要用于其請(qǐng)求的一個(gè)源地址,但還沒有這樣的地址。在這樣的情況下,它能夠?qū)Pv6非指定地址(::)用做分組的SA。
鑒于地址解析消息發(fā)送到被請(qǐng)求節(jié)點(diǎn)多播地址(具有鏈路本地范圍),其他NDP消息則意圖到達(dá)所有節(jié)點(diǎn)或所有路由器。同時(shí),SA可能是發(fā)送者的一個(gè)全局的或鏈路本地地址:后者總是優(yōu)先使用,以最小化節(jié)點(diǎn)對(duì)重新編址的依賴。下面是所有特殊地址的列表,在NDP消息交換中節(jié)點(diǎn)能夠?qū)⒅米鲈春湍康牡氐刂?#xff1a;
所有節(jié)點(diǎn)多播地址(FF02::1,目的地);
所有路由器多播地址(FF02::2,目的地);
被請(qǐng)求節(jié)點(diǎn)多播地址(目的地);
鏈路本地地址(源或目的地);
非指定地址(::,源)。
最后,IPv6節(jié)點(diǎn)使用兩個(gè)算法來處理通過NDP搜集的信息:
下一跳確定算法;
缺省路由器選擇。
2.4.2 與IPv4的比較
在相應(yīng)的IPv4協(xié)議之上,IPv6 NDP提供了許多功能提升,如下所示:
路由器發(fā)現(xiàn)成為協(xié)議的不可分割部分,使主機(jī)能夠確定它們的缺省路由器。
在ND消息中插入了附加信息,如MTU或鏈路層地址,這減少了鏈路上需要的信息交換數(shù)量,卻取得IPv4中相同的結(jié)果。下面是一些示例:
在RA消息中攜帶路由器的鏈路層地址。因此鏈路上的所有節(jié)點(diǎn),在沒有任何額外的消息流的情況下,知道了這個(gè)地址;
目標(biāo)鏈路層地址,插入在重定向消息中,為接收者(被重定向的)節(jié)省了任何額外的地址解析信息交換;
MTU,在RA中攜帶,使鏈路上的所有節(jié)點(diǎn)使用一致的MTU。
地址解析使用多播組(被請(qǐng)求節(jié)點(diǎn)多播地址),內(nèi)嵌目標(biāo)地址的一部分。因此,大多數(shù)情況下可能只有少數(shù)(大部分時(shí)間僅有目標(biāo)地址所有者)節(jié)點(diǎn)將被這個(gè)地址解析請(qǐng)求打斷。將此與IPv4 ARP比較,其中除了廣播(鏈路層廣播)地址解析請(qǐng)求(因?yàn)锳RP直接位于鏈路層之上)之外別無他法。人們希望解析鏈路層地址的IPv6方法將使擁有大量主機(jī)的子網(wǎng)更具有管理性,其方式是通過大量限制鏈路層廣播范圍,以使主機(jī)軟件層能夠處理。
有些新的功能是基本協(xié)議的一部分,如地址自動(dòng)配置和鄰居不可達(dá)性檢測,簡化了配置并提高了分組分發(fā)的魯棒性。
路由器公告和重定向消息以鏈路本地地址形式攜帶路由器地址,這使在主機(jī)中的路由器關(guān)聯(lián)信息對(duì)重新編址(針對(duì)全局前綴)更具有魯棒性。在IPv4中,當(dāng)網(wǎng)絡(luò)每次更改其尋址機(jī)制時(shí),在主機(jī)上的缺省網(wǎng)關(guān)信息必須修改。
地址解析位于ICMP之上,使之在ND消息中可能使用標(biāo)準(zhǔn)的IP認(rèn)證和安全機(jī)制。在IPv4的ARP中不存在這樣的機(jī)制。
2.4.3 路由器和前綴發(fā)現(xiàn)
路由器發(fā)現(xiàn)使主機(jī)能夠定位鄰接(在線)的路由器,并學(xué)習(xí)和地址配置相關(guān)的前綴和參數(shù)。
為路由器和前綴發(fā)現(xiàn)定義了兩條消息:路由器請(qǐng)求(RS)消息和路由器公告(RA)消息。
通過在每個(gè)接口發(fā)送RA,路由器周期性地公告自身(引入一點(diǎn)隨機(jī)性以避免同步,這可能會(huì)出現(xiàn)在某些時(shí)間段內(nèi)沒有路由器被公告的情況發(fā)生)。這些非請(qǐng)求RA發(fā)送到所有節(jié)點(diǎn)“鏈路本地范圍多播地址”(FF02::1)。除了提供路由器地址外,RA能夠包含主機(jī)執(zhí)行下一跳判定的有用信息,如下所示:
缺省路由器的候選路由器列表(參見“缺省路由器選擇”部分所描述的算法)。
應(yīng)該用于自動(dòng)配置的參數(shù)(參見“自動(dòng)配置”部分)。
在線前綴列表(參見2.4.8小節(jié)),該信息使路由器發(fā)現(xiàn)消息在前綴發(fā)現(xiàn)過程中非常有用。
RA消息也能作為來自主機(jī)請(qǐng)求(RS)的一個(gè)響應(yīng)發(fā)送。這個(gè)選項(xiàng)在移動(dòng)性中證明非常有用,用來加速自動(dòng)配置。這些被請(qǐng)求的RA或者發(fā)往所有節(jié)點(diǎn)地址或發(fā)往RS的主機(jī)的單播地址。由于RS請(qǐng)求來自在線路由器的一個(gè)響應(yīng),典型情況下它發(fā)往所有路由器多播組。圖2-21給出了一個(gè)被請(qǐng)求的和一個(gè)非請(qǐng)求的RA信息交換的流程。
注釋:
在一種被請(qǐng)求的RA情況下,當(dāng)RS沒有提供任何IPv6 SA時(shí)(典型情況是依靠RA自動(dòng)配置自身的主機(jī)),RA響應(yīng)發(fā)送到所有節(jié)點(diǎn)。
圖2-22給出一個(gè)簡單示例,其中一臺(tái)Cisco路由器(Valbonne)發(fā)送周期性的RA給一臺(tái)主機(jī)(主機(jī)1)。接口配置是灰色的,打開了NDP排錯(cuò),debug輸出顯示在RA流程下面。
圖2-22顯示了和RA流程交織在一起的debug跟蹤信息。
show ipv6 routers命令在Cisco路由器上用來顯示從其他在線路由器接收到的RA信息。僅有1臺(tái)路由器發(fā)送RA,僅有1臺(tái)主機(jī)將之安裝到它們的數(shù)據(jù)庫(譯者注:路由數(shù)據(jù)庫)中。因此在圖2-22的配置中,這條命令僅適用于主機(jī)1(在主機(jī)模式中的一臺(tái)Cisco路由器)。例2-10顯示了該命令的輸出。
例2-10 從主機(jī)角度來看被公告的路由器
2.4.4 地址解析
鄰居請(qǐng)求和鄰居公告分組用來執(zhí)行幾個(gè)關(guān)鍵的節(jié)點(diǎn)操作:
鏈路層地址解析;
重復(fù)地址檢測(DAD);
鄰居不可達(dá)性檢測(NUD)。
DAD和NUD在下一小節(jié)中描述。ND鏈路層解析提供了與IPv4中ARP類似的服務(wù),雖然使用的方法有些不同。
為IPv6地址解析定義了兩條ICMPv6消息:鄰居請(qǐng)求(NS)消息和鄰居公告(NA)消息。NS是請(qǐng)求并包含目標(biāo)(被請(qǐng)求的)IPv6地址。NA是響應(yīng)且包含了匹配接口的鏈路層地址。
當(dāng)一個(gè)節(jié)點(diǎn)得知一個(gè)特定的下一跳或目的IPv6地址在線時(shí)(參見2.4.8小節(jié)的“下一跳判定”部分),它在確定的鏈路上發(fā)送一條NS,以獲得匹配IPv6地址的鏈路層地址。預(yù)期的響應(yīng)是一條NA。
NS是到被請(qǐng)求節(jié)點(diǎn)多播組的多播分組,內(nèi)嵌了被請(qǐng)求IPv6地址的右面24位。潛在地存在多個(gè)節(jié)點(diǎn)注冊到相同的被請(qǐng)求節(jié)點(diǎn)多播地址,該地址的“擁有者”是其中一個(gè)。擁有者和多播組的其他成員均收到這個(gè)NS,但只有擁有者以NA回答。
注釋:
NDP是一種可靠的協(xié)議。在大多數(shù)鏈路類型上,這工作得很好,因?yàn)椤皝G失”一條消息(如一條NS或NA)的概率較低。但在無線鏈路上,這可能成為一個(gè)問題。特別地,DAD可能斷定一個(gè)地址是可以自由使用的,但事實(shí)上,NA丟了。
一臺(tái)主機(jī)也能夠發(fā)送一條非請(qǐng)求的NA。當(dāng)然節(jié)點(diǎn)期望通知鏈路上的其他節(jié)點(diǎn),通知它的鏈路層地址發(fā)生了變化。非請(qǐng)求的NA發(fā)送到所有節(jié)點(diǎn)多播地址。
在節(jié)點(diǎn)接收到NA之后,斷定從其接收到這條信息的鄰居是“可達(dá)的”。監(jiān)測可達(dá)性是NUD的目的。參見2.4.8小節(jié)有關(guān)“鄰居不可達(dá)性檢測”和“可達(dá)性的狀態(tài)機(jī)”部分以了解細(xì)節(jié)。圖2-23顯示出地址解析過程的流程。
在Cisco路由器上,關(guān)聯(lián)(第3層地址,鏈路層地址)存儲(chǔ)在鄰居緩存中。在每臺(tái)路由器上運(yùn)行命令show ipv6 neighbor,列出鄰居緩存的內(nèi)容。在例2-11中,biot鄰居緩存有兩個(gè)條目與路由器valbonne相關(guān):地址是2001:200::72b和FE80::A8BB:CCFF:FE01:F600。它們列出的是“可達(dá)”狀態(tài),同時(shí)還有相應(yīng)的鏈路層地址。
2.4.5 將一臺(tái)主機(jī)重定向到一個(gè)更合適的下一跳
路由器發(fā)送重定向消息,通知主機(jī)一個(gè)更合適的下一跳,無論是另一臺(tái)路由器還是最后的目的地自身,它應(yīng)該在相同鏈路上。IPv6重定向機(jī)制類似于IPv4重定向機(jī)制。僅有一條消息,即重定向消息,是獲得重定向功能所必要的。它包含更合適下一跳的IP地址和重定向的目的地IP地址。如果更合適下一跳(R2)的鏈路層地址已知,它能夠插入到由發(fā)出重定向消息的路由器(R1)所發(fā)送的重定向分組中。
注釋:
在理論上,前面所描述的過程能夠在主機(jī)和路由器R2之間節(jié)省一次地址解析信息交換。在實(shí)際中,這可能受限。路由器R2在某些情況下可能將某些流量路由到主機(jī)。如這樣做的話,它將需要發(fā)起一個(gè)NS/NA交換以確定主機(jī)的鏈路層地址。如果主機(jī)已經(jīng)發(fā)起過一個(gè)尋找R2鏈路層地址的地址解析流,那么這個(gè)流就是不必要的。NS發(fā)起者的鏈路層地址可能確實(shí)作為一個(gè)選項(xiàng)已經(jīng)插入到NS分組中。
圖2-24顯示了重定向消息的流程。
2.4.6 反向鄰居發(fā)現(xiàn)
如前所述,ND為IPv6執(zhí)行了IPv4中ARP的相同功能。在此上下文中,驅(qū)使產(chǎn)生反向ARP協(xié)議的類似原因?qū)е聦?duì)IPv6 ND的擴(kuò)展,稱為IPv6反向鄰居發(fā)現(xiàn)(IND)。這個(gè)擴(kuò)展的詳細(xì)內(nèi)容在RFC 3122中規(guī)范。
IPv6 IND使一個(gè)節(jié)點(diǎn)能夠?qū)W習(xí)已知鏈路層地址的IPv6地址。為了獲得這個(gè)信息,它發(fā)送請(qǐng)求并接收公告。IND最早是為幀中繼網(wǎng)絡(luò)開發(fā)的,但也可以應(yīng)用到其他具有類似行為的數(shù)據(jù)鏈路層技術(shù)。兩條信息——反向鄰居發(fā)現(xiàn)請(qǐng)求(INS)和反向鄰居發(fā)現(xiàn)公告(INA)——已經(jīng)定義。INS包含源鏈路層地址和目標(biāo)鏈路層地址(發(fā)送者意圖得到它的IPv6地址)。應(yīng)答(INA)包含源鏈路層地址、目標(biāo)鏈路層地址和一個(gè)目標(biāo)地址列表。它包含接口的一個(gè)或多個(gè)IPv6地址列表,該接口由觸發(fā)INA的INS消息中的目標(biāo)鏈路層地址標(biāo)識(shí)。
請(qǐng)注意,在撰寫本書之時(shí),在Cisco路由器上不支持RFC 3122。
2.4.7 代理鄰居發(fā)現(xiàn)
一個(gè)IPv4節(jié)點(diǎn)具有為不理解子網(wǎng)的主機(jī)代理子網(wǎng)(或者被錯(cuò)誤配置)或缺省路由器的能力。這項(xiàng)功能有時(shí)指代理ARP,在RFC 1027中規(guī)范。IPv6沒有傳承該概念;相反,它要求IPv6主機(jī)處理RA并且在非本地流量能夠發(fā)送之處配置一臺(tái)缺省路由器。對(duì)多數(shù)系統(tǒng)而言,代理整個(gè)子網(wǎng)可能是不可操作的。它們將接口設(shè)置在混雜模式,或所有多播模式以接收所有NS,但是除了可能引發(fā)性能問題之外,不是所有系統(tǒng)都支持這些模式。
在一些情況下,對(duì)路由器可能證明是有用的,即它代替遠(yuǎn)離鏈路的節(jié)點(diǎn),但這些節(jié)點(diǎn)不想讓其鄰居知道它們不在線上。一個(gè)典型范例是一個(gè)移動(dòng)節(jié)點(diǎn)已經(jīng)離開鏈路。為了獲得這種有限的代理地址解析功能,路由器必須注冊到它想代理的被請(qǐng)求節(jié)點(diǎn)多播地址并代替它們應(yīng)答NS。
2.4.8 鄰居發(fā)現(xiàn)算法
已經(jīng)定義了許多ND算法描述主機(jī)和路由器在多種運(yùn)營環(huán)境中的預(yù)期行為。下面的小節(jié)討論了這些算法。
一、下一跳判定
像在IPv4中一樣,一個(gè)需要轉(zhuǎn)發(fā)分組的節(jié)點(diǎn)必須判斷目的地是在線還是離線。在后一種情況中,它之后必須找到一個(gè)在線鄰居(下一跳),該鄰居能夠?qū)⒎纸M轉(zhuǎn)發(fā)到目的地。最后,它必須解析在線目的地地址或在線下一跳,將之解析成一個(gè)鏈路層地址。
不像IPv4,一個(gè)目的地(或下一跳)能夠是在線的,不必轉(zhuǎn)發(fā)節(jié)點(diǎn)具有匹配目的地址的前綴。如果滿足下列情況,節(jié)點(diǎn)認(rèn)為一個(gè)地址是在線的:
通過它的鏈路地址前綴之一它將能被覆蓋到;
從那個(gè)地址收到一條NA;
從那個(gè)地址收到任意ND消息;
它收到一條RA,其中在前綴信息選項(xiàng)中有這個(gè)前綴;
它收到一條重定向消息,其目標(biāo)地址等于那個(gè)地址。
用來轉(zhuǎn)發(fā)分組的算法在主機(jī)和路由器上有不同設(shè)置。一臺(tái)路由器有一個(gè)路由選擇表和一個(gè)鄰居緩存(和IPv4的ARP緩存相同)。前者(路由信息庫或RIB)包含匹配給定目的地的下一跳(最長匹配);后者包含在線節(jié)點(diǎn)的鏈路層地址,或者是最終目的地或者是下一跳。Cisco路由器也有一個(gè)轉(zhuǎn)發(fā)表(轉(zhuǎn)發(fā)信息庫,或FIB),它將RIB更進(jìn)一步,通過預(yù)解析遞歸表項(xiàng)以加快轉(zhuǎn)發(fā)過程。在路由器中,常規(guī)路由機(jī)制優(yōu)先于從鄰居路由器通過前綴發(fā)現(xiàn)或路由器發(fā)現(xiàn)機(jī)制獲得的信息。之后NS/NA消息激活鏈路層解析。
例2-12顯示出圖2-24中一臺(tái)路由器的路由選擇表和鄰居。
例2-12 在一臺(tái)IPv6路由器上的路由選擇和鄰居信息
另一方面,在主機(jī)上,如路由選擇表或路由選擇協(xié)議等信息是不必要的。
RFC 2461描述了一組在主機(jī)中支持下一跳判定的概念性數(shù)據(jù)結(jié)構(gòu):
目的地緩存——包含最近有流量轉(zhuǎn)發(fā)到的目的地,還有下一跳(鄰居)選擇用來提供到鄰居緩存的連接。這個(gè)緩存由從重定向消息獲得的信息進(jìn)行更新。
前綴列表——包含匹配在線地址的前綴列表。這個(gè)列表從RA消息構(gòu)建而來。
缺省路由器列表——包含分組能夠發(fā)送到的在線路由器列表。
圖2-25顯示出基于RFC 2461的下一跳判定算法的主機(jī)模型。
主機(jī)首先在目的地緩存中進(jìn)行搜索,期望搜索到近期發(fā)送分組的目的地。如果是,目的地緩存給出使用的下一跳(可能是目的地自身),對(duì)鄰居緩存的后續(xù)搜索可能給出鏈路層地址。以粗線表示的路徑,在確定的流程中將最常用到。如果目的地不在目的地緩存中,將在前綴列表中搜索(由來自RA的信息維護(hù))。作為最后的方法,通過缺省路由器選擇從所有在線路由器(通過發(fā)送RA獲知)中選擇一臺(tái)缺省路由器。
二、缺省路由器選擇
這又是一個(gè)針對(duì)主機(jī)的算法。路由器僅依賴于路由選擇協(xié)議(和路由選擇表)做出正確的下一跳判定。
不像IPv4,在一臺(tái)IPv6主機(jī)上不必定義一個(gè)缺省網(wǎng)關(guān)。主機(jī)為轉(zhuǎn)發(fā)其流量選擇一臺(tái)路由器作為下一跳的過程,在Internet草案“缺省路由器優(yōu)先和更具體的路由”中描述。它確定了3種不同類型的主機(jī)如下:
A類——忽略缺省路由器優(yōu)先級(jí)以及在RA選項(xiàng)路由信息中的更具體路由的主機(jī)。(參見“路由器和前綴發(fā)現(xiàn)”部分以了解詳細(xì)信息)。這些主機(jī)簡單地運(yùn)行在RFC 2461中描述的路由器選擇算法。基本情況下,A類主機(jī)從其缺省路由器列表中(從和主機(jī)共享一條鏈路的路由器收到的RA中構(gòu)建的)選擇一臺(tái)缺省路由器。如果存在任何可達(dá)路由器(依據(jù)狀態(tài)機(jī),稱之為可達(dá)的;見“可達(dá)性狀態(tài)機(jī)”部分),它應(yīng)傾向于選擇之,否則如果存在任何其他在列表中的路由器,則選擇之。如果選中的路由器是不可達(dá)的,應(yīng)從列表中的所有其他路由器中按序選擇(因此,確保列表上的所有路由器由鄰居不可達(dá)性檢測算法進(jìn)行探測)。
B類——類似于A類主機(jī),其中缺省路由器列表由RA中接收到的優(yōu)先級(jí)(低、中、高)獲得增強(qiáng)。缺省路由器選擇能夠基于這個(gè)優(yōu)先級(jí)而不是基于輪詢方式。
C類——實(shí)現(xiàn)路由選擇表的主機(jī)。當(dāng)它們接收到一條含有多個(gè)路由信息選項(xiàng)的RA時(shí),它們安裝一條缺省路由::/0,指向發(fā)出RA的路由器;它們也安裝(或如果生命時(shí)間為0就卸載)指向在路由信息選項(xiàng)中發(fā)現(xiàn)的前綴路由,出現(xiàn)幾次就安裝幾次。當(dāng)一臺(tái)C類主機(jī)執(zhí)行下一跳判定并關(guān)于一個(gè)離線的目的地查詢它的路由選擇表時(shí),它首先傾向于選擇可達(dá)路由器,之后才是不可達(dá)路由器;之后它使用最長匹配前綴;再后,它使用路由優(yōu)先級(jí)數(shù)值。
注意,不同類型的主機(jī),在接收到相同RA分組時(shí)(在鏈路上的多播),選擇缺省路由器時(shí),可能最終作出不同的判定。
注釋:
如前所述,鏈路上的每臺(tái)路由器可能公告前綴的一個(gè)列表,并建議將自己作為缺省路由器。一臺(tái)雙接入的主機(jī)可能潛在地從兩臺(tái)或多臺(tái)路由器接收到不連續(xù)的前綴列表,并從一個(gè)列表中選擇一個(gè)前綴用于自動(dòng)配置,形成一個(gè)SA。它之后可能使用這個(gè)地址(使用SAS選定)離開子網(wǎng)(譯者注:發(fā)送分組),通過的路由器是不通告形成這個(gè)地址的前綴的。
三、重復(fù)地址檢測
如在RFC 2462中所描述的,NS和NA消息也用來執(zhí)行重復(fù)地址檢測(DAD)。在將所有單播地址配置到一個(gè)接口之前,都要對(duì)其執(zhí)行DAD。基本原則是節(jié)點(diǎn)發(fā)送一條NS,請(qǐng)求一個(gè)IPv6地址所有者,僅在沒有收到關(guān)于此請(qǐng)求的響應(yīng)時(shí)才將地址配置到其自身的一個(gè)接口上。
優(yōu)化的DAD正在建議對(duì)現(xiàn)有IPv6 ND(RFC 2461)和無狀態(tài)地址自動(dòng)配置(RFC 2462)算法進(jìn)行修改。其目的是最小化成功情況下的地址配置延遲(被節(jié)點(diǎn)選中的地址是唯一的),并在失敗情況下盡可能地減少中斷時(shí)間。優(yōu)化的DAD僅在自動(dòng)配置地址情況下執(zhí)行。它是一個(gè)有用的優(yōu)化,因?yàn)閷?duì)于良好分布的隨機(jī)地址或從唯一MAC以修改EUI-64格式構(gòu)建的基于接口ID的地址,DAD成功的幾率遠(yuǎn)高于失敗。
注釋:
DAD不必在任意播地址上執(zhí)行,因?yàn)閺亩x角度而言,一個(gè)任意播地址屬于多個(gè)節(jié)點(diǎn)。
四、鄰居不可達(dá)性檢測
與一個(gè)鄰居的通信由于多種原因可能失敗。如果到目的地的路徑(在鏈路上)已經(jīng)出現(xiàn)故障,恢復(fù)是可能的。當(dāng)檢測到故障時(shí)所觸發(fā)的恢復(fù)機(jī)制,依據(jù)鄰居是否是最終目的地而不同。如果是,應(yīng)該初始地址解析。否則,應(yīng)該選擇一個(gè)不同的下一跳。這就落在了下一跳判定算法范疇(在“下一跳判定”中已解釋),其中能夠使用兩種機(jī)制。路由器通常使用它們的路由選擇表,而主機(jī)運(yùn)行路由器選擇算法(參見“缺省路由器選擇”部分)。
鄰居不可達(dá)性檢測(NUD)用來處理檢測故障。一個(gè)鄰居的可達(dá)性以兩種可能的方式獲得。第一種方法是來自于高層的確認(rèn),即與這個(gè)鄰居的通信正在進(jìn)行(例如,接收到TCP分組確認(rèn)了以前發(fā)送的分組)。第二種方法是接收到一條NA,這是對(duì)一條NS的響應(yīng),由節(jié)點(diǎn)發(fā)出用于尋求可達(dá)性確認(rèn)。任何其他方法,例如RA,不能用來確認(rèn)一個(gè)鄰居的可達(dá)性。除非有新的確認(rèn)開始,鄰居之后保持一段有限時(shí)間的可達(dá)性。如果確認(rèn)不是按照時(shí)序方式接收到,鄰居就被認(rèn)為是不可達(dá)的,恢復(fù)機(jī)制就發(fā)生作用。在ND緩存中的鄰居表項(xiàng)的完全狀態(tài)圖在下面詳細(xì)描述。
五、可達(dá)性狀態(tài)機(jī)
鄰居緩存維持一個(gè)鄰居列表,其中流量最近向它們發(fā)送過。
圖2-26顯示出鄰居緩存的一個(gè)狀態(tài)圖。
在圖2-26中,下列事件將產(chǎn)生5個(gè)狀態(tài)之一的狀態(tài)遷移(INCOMPLETE、REACHABLE、DELAY、STALE和PROBE):
NA1——收到一條Solicited=0(被請(qǐng)求=0)的NA。
NA2——收到一條Solicited=1(被請(qǐng)求=1)的NA。
NA3——收到一條NA,其中Solicited=1(被請(qǐng)求=1)且
Override=1(改寫=1);
Override=0(改寫=0),鏈路層地址與緩存的內(nèi)容相同。
NA4——收到一條NA,其中Solicited=1(被請(qǐng)求=1)、Override=0(改寫=0),鏈路層地址不同于緩存內(nèi)容。
NA5——收到一條NA,其中Solicited=0(被請(qǐng)求=0)、Override=1(改寫=1),鏈路層地址不同于緩存內(nèi)容。
O——收到其他ND分組,例如NS、RS、RA、重定向,鏈路層地址不同于緩存內(nèi)容。
S——發(fā)送分組。
T——超時(shí)(注意每個(gè)狀態(tài)有一個(gè)定時(shí)器,進(jìn)入狀態(tài)時(shí)開始計(jì)時(shí))。
Te——超時(shí)且重試次數(shù)。
U——高層可達(dá)性確認(rèn)。
一個(gè)表項(xiàng)的典型生命期示于(以雙重方式)圖2-26中的狀態(tài)圖中。一個(gè)表項(xiàng)是一個(gè)IPv6地址和一個(gè)鏈路層地址間的映射。表項(xiàng)創(chuàng)建時(shí)狀態(tài)為INCOMPLETE(鏈路層地址不可知),這時(shí)發(fā)送一條NS以獲得鏈路層地址。一旦收到響應(yīng)(NA),表項(xiàng)就移到REACHABLE狀態(tài),并且流量被轉(zhuǎn)發(fā)。如果在某個(gè)時(shí)間段內(nèi)(通常為30s)路由器看不到鄰居流量,表項(xiàng)移到STALE狀態(tài)。從那里,表項(xiàng)可能直接移回REACHABLE(典型情況下是收到高層可達(dá)性確認(rèn))或者轉(zhuǎn)到DELAY(如果有分組發(fā)送到這個(gè)鄰居),其中要發(fā)送一條新的NS,或者在STALE狀態(tài)(典型情況以小時(shí)計(jì))一段時(shí)間之后被刪除(在我們的例子中)。
六、自動(dòng)配置
地址自動(dòng)配置用來自動(dòng)為一臺(tái)主機(jī)配置地址。在RFC 2462中規(guī)范了地址自動(dòng)配置。它使用NDP(更具體的是RA)來獲得前綴,基于這個(gè)前綴構(gòu)建地址,接著ND(更具體的是NS和NA消息)測試構(gòu)建的地址是否已經(jīng)在用。自動(dòng)配置的缺省機(jī)制是無狀態(tài)的。另外一種機(jī)制,即有狀態(tài)的,能夠使用且在RFC 3315中規(guī)范。這兩種機(jī)制在第3章的3.2.1小節(jié)中描述。
2.4.9 鄰居發(fā)現(xiàn)一瞥
表2-14總結(jié)了ND信息以備快速查閱。
表2-14 NDP一瞥
1SLLA:源鏈路層地址。
2TLLA:目標(biāo)鏈路層地址。
3必要的選項(xiàng)。
IPv6絲毫不限于本章所提到(回顧)的協(xié)議。但本章講到了基礎(chǔ)元素(基本協(xié)議),為您提供了理解IPv6和IPv4間大多數(shù)差異的工具。牢記這些內(nèi)容,下一章考察IPv6網(wǎng)絡(luò)服務(wù),這些協(xié)議全部構(gòu)建于IPv6尋址、ICMPv6和鄰居發(fā)現(xiàn)協(xié)議之上。
總結(jié)
以上是生活随笔為你收集整理的《部署IPv6网络(修订版)》一2.4 邻居发现协议的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Visual C++ 开发从入门到精通
- 下一篇: 《Linux设备驱动开发详解 A》一一2