IPv6基礎(chǔ)篇:鄰居發(fā)現(xiàn)協(xié)議NDP
本期我們將基于ICMPv6介紹IPv6體系中基礎(chǔ)的鄰居發(fā)現(xiàn)協(xié)議,即IPv6 ND。鄰居發(fā)現(xiàn)協(xié)議代替了IPv4協(xié)議棧中的ARP和路由發(fā)現(xiàn)的功能,實(shí)現(xiàn)了地址解析,重復(fù)地址檢測(cè),路由器發(fā)現(xiàn)以及路由重定向等功能。
一、IPv6鄰居發(fā)現(xiàn)協(xié)議使用的ICMPv6消息類型
IPv6鄰居發(fā)現(xiàn)協(xié)議使用5種類型的ICMPv6消息類型,用來實(shí)現(xiàn)地址解析,重復(fù)地址檢測(cè),路由器發(fā)現(xiàn)以及路由重定向等功能。具體的ICMPv6的消息類型及具體作用如下:
1、ICMPv6鄰居請(qǐng)求(Neighbor Solicitation)消息

鄰居請(qǐng)求報(bào)文NS(Neighbor Solicitation)報(bào)文:Type字段值為135,Code字段值為0,在地址解析中的作用類似于IPv4中的ARP請(qǐng)求報(bào)文。用來獲取鄰居的鏈路層地址,驗(yàn)證鄰居是否可達(dá),進(jìn)行重復(fù)地址檢測(cè)等。
2、ICMPv6鄰居通告(Neighbor Adivertisment)消息

鄰居通告報(bào)文NA(Neighbor Adivertisment)報(bào)文:Type字段值為136,Code字段值為0,在地址解析中的作用類似于IPv4中的ARP應(yīng)答報(bào)文。用來對(duì)NS消息進(jìn)行響應(yīng)。另外,當(dāng)節(jié)點(diǎn)在鏈路層變化的時(shí)候主動(dòng)發(fā)出NA消息,告知鄰居本節(jié)點(diǎn)的變化。
3、ICMPv6路由器請(qǐng)求(Router Solicitation)消息

ICMPv6路由器請(qǐng)求(Router Solicitation)消息:Type字段值為133,節(jié)點(diǎn)啟動(dòng)后,通過RS消息向路由器發(fā)出請(qǐng)求,請(qǐng)求前綴和其他配置信息,用于節(jié)點(diǎn)的自動(dòng)配置。
4、ICMPv6路由器通告(Router Advertisement)消息

ICMPv6路由器通告(Router Advertisement)消息:Type字段值為134,對(duì)RS消息進(jìn)行回應(yīng)。在沒有抑制RA消息發(fā)布的條件下,路由器會(huì)周期性地發(fā)布RA消息,其中包括前綴信息選項(xiàng)和一些標(biāo)志位的信息。
5、ICMPv6重定向(Redirect)消息

ICMPv6重定向(Redirect)消息:Type字段值為137,當(dāng)滿足一定的條件時(shí),缺省網(wǎng)關(guān)通過向源主機(jī)發(fā)送重定向消息,使主機(jī)重新選擇正確的下一跳地址進(jìn)行后續(xù)報(bào)文的發(fā)送。
二、地址解析
獲取同一鏈路上鄰居節(jié)點(diǎn)的鏈路層地址(與IPv4的ARP功能相同),通過鄰居請(qǐng)求消息NS和鄰居通告消息NA實(shí)現(xiàn)。節(jié)點(diǎn)1要獲取節(jié)點(diǎn)節(jié)點(diǎn)2的鏈路層地址。

節(jié)點(diǎn)1在向節(jié)點(diǎn)2發(fā)送報(bào)文之前要解析出節(jié)點(diǎn)2的鏈路層地址。地址解析的過程主要如下(我們使用HCL模擬器來模擬這個(gè)過程):
組網(wǎng)如下:

整體報(bào)文交互總覽(NS和NA):

①節(jié)點(diǎn)1會(huì)發(fā)送一個(gè)NS報(bào)文,Type值為135,源地址為節(jié)點(diǎn)1的IPv6地址。目的地址為節(jié)點(diǎn)2的被請(qǐng)求節(jié)點(diǎn)組播地址,要請(qǐng)求的為節(jié)點(diǎn)2的鏈路層地址。同時(shí)NS的報(bào)文的Options字段中攜帶了節(jié)點(diǎn)1的鏈路層地址。如下圖:

②節(jié)點(diǎn)2收到NS消息后,會(huì)回應(yīng)NS消息,源地址為節(jié)點(diǎn)2的IPv6地址,目的地址為節(jié)點(diǎn)1的IPv6地址,節(jié)點(diǎn)2的鏈路層地址會(huì)被放在Option字段里。

③節(jié)點(diǎn)1獲取到了節(jié)點(diǎn)2的鏈路層地址。
最后我們?cè)诼酚善魃峡梢圆榭吹絉outerA的IPv6地址信息和所有的鄰居信息:


在Ping鏈路本地地址時(shí),需要使用-i參數(shù),來指定鏈路本地地址的接口。

三、重復(fù)地址檢測(cè)
當(dāng)節(jié)點(diǎn)獲取到一個(gè)IPv6地址后,需要使用重復(fù)地址檢測(cè)功能確定該地址是否已被其他節(jié)點(diǎn)使用(與IPv4的免費(fèi)ARP功能相似)。通過NS和NA可以實(shí)現(xiàn)重復(fù)地址檢測(cè)。
在進(jìn)行DAD檢測(cè)時(shí),一個(gè)IPv6單播地址在分配給一個(gè)接口之后且通過重復(fù)地址檢測(cè)之前稱為試驗(yàn)地址(Tentative Address)。此時(shí)該接口不能使用這個(gè)試驗(yàn)地址進(jìn)行單播通信,但是仍然會(huì)加入兩個(gè)組播組:ALL-NODES組播組和實(shí)驗(yàn)地址所對(duì)應(yīng)的Solicited-Node組播組。
IPv6重復(fù)地址檢測(cè)技術(shù)和IPv4中的免費(fèi)ARP類似:節(jié)點(diǎn)向一個(gè)自己將使用的試驗(yàn)地址所在的Solicited-Node組播組發(fā)送一個(gè)以該實(shí)驗(yàn)地址為請(qǐng)求的目標(biāo)地址的NS報(bào)文,如果收到節(jié)點(diǎn)回應(yīng)的NA報(bào)文,就證明該地址已被網(wǎng)絡(luò)上使用,節(jié)點(diǎn)將不能使用該實(shí)驗(yàn)地址通訊。

DAD檢測(cè)過程:
PC1的IPv6地址2000::1為新配置地址,即2000::1為PC1的試驗(yàn)地址。PC1向2000::1的Solicited-Node組播組發(fā)送一個(gè)以2000::1為請(qǐng)求的目標(biāo)地址的NS報(bào)文進(jìn)行重復(fù)地址檢測(cè),由于2000::1并未正式指定,所以NS報(bào)文的源地址為未指定地址。當(dāng)PC2收到該NS報(bào)文后,有兩種處理方法:
如果PC2發(fā)現(xiàn)2000::1是自身的一個(gè)實(shí)驗(yàn)地址,則PC2放棄使用這個(gè)地址作為接口地址,并且不會(huì)發(fā)送NA報(bào)文。
如果PC2發(fā)現(xiàn)2000::1是一個(gè)已經(jīng)正常使用的地址,那么PC2會(huì)向該地址的ALL-NODES組播組發(fā)送一個(gè)NA報(bào)文,該消息中會(huì)包含2000::1。這樣,PC1收到這個(gè)消息后就會(huì)發(fā)現(xiàn)自身的實(shí)驗(yàn)地址是重復(fù)的,從而棄用該地址。