2019 年 11 月 25 日已分配完公網(wǎng) IPv4 地址,以后就沒(méi)有多余地址可以分配了。短期內可以使用 NAT 技術(shù)進(jìn)行緩解。長(cháng)期來(lái)看,還是要用 128 位的 IPv6 地址替代 32 位的 IPv4 地址,IPv6 有 3.4×10^38 個(gè)可用地址,多得不得了,可以滿(mǎn)足未來(lái) IP 地址的需求。
IPv6 地址不但比 IPv4 的地址長(cháng)度長(cháng),還其它方面的不同。
32 位的 IPv4 地址,分隔成 4 個(gè) 8 位段,每 8 位段的值在 0 ~ 255 之間,每個(gè) 8 位段之間用 “ . ” 分開(kāi),這就是 “ 點(diǎn)分十進(jìn)制表示法 ” 。舉個(gè)栗子:
192.168.0.1
而 128 位的 IPv6 地址,是 IPv4 地址的 4 倍,如果用點(diǎn)分十進(jìn)制表示法,那么會(huì )有 16 個(gè)八位組,地址過(guò)于冗長(cháng)。為了使用方便, 使用十六進(jìn)制表示法,分隔成 8 個(gè) 16 位段,每 16 位段的值在 0000 ~ FFFF 的十六進(jìn)制數之間,每個(gè) 16 位段之間用 “ : ” 分開(kāi)。舉個(gè)栗子:
2001:1111:0100:000a:0000:00bc:2500:0a0b
為了方便理解,可以查看下面的進(jìn)制轉換表。
但是 IPv6 地址還是太長(cháng),不方便記憶,看著(zhù)都頭暈,也不方便書(shū)寫(xiě),毫無(wú)規律可言。于是就有了兩條簡(jiǎn)化規則。第一條規則是:
每組十六進(jìn)制數中開(kāi)頭的 0 可以省略。
上面的 IPv6 地址可以寫(xiě)成:2001:1111:100:a:0:bc:2500:a0b
這里需要注意,開(kāi)頭的 0 才能省略,末尾的 0 是不能省略的,因為這樣會(huì )引起歧義,無(wú)法確定省略的 0 是在數字前還是數字后。
如果有個(gè) IPv6 地址有一串的 0 ,比如:
2001:0000:0000:0000:0000:0000:0000:0003
可以簡(jiǎn)寫(xiě)成:
2001:0:0:0:0:0:0:3
這時(shí),還可以使用第二個(gè)規則進(jìn)行簡(jiǎn)化,第二條規則是:
由全 0 組成的連續的 16 位段可以用一對冒號 “ :: ” 表示。
上面的地址還可以簡(jiǎn)化成:
2001::3
這里需要注意,一個(gè) IPv6 地址內,只能使用一次 “ :: ” 表示。如果使用兩次及以上,也會(huì )產(chǎn)生歧義。舉個(gè)栗子:
2001:0a0c:0000:0000:0021:0000:0000:0077
正確的寫(xiě)法有是:
2001:a0c::21:0:0:77
2001:a0c:0:0:21::77
如果使用了兩次 “ :: ” ,那么就是錯誤的:
2001:a0c::21::77
有兩個(gè)全 0 字符串,就無(wú)法確定它們的長(cháng)度,上面錯誤的地址會(huì )有幾種可能:
2001:0a0c:0000:0021:0000:0000:0000:0077
2001:0a0c:0000:0000:0021:0000:0000:0077
2001:0a0c:0000:0000:0000:0021:0000:0077
IPv4 的網(wǎng)段地址可以用子網(wǎng)掩碼表示,還可以用斜線(xiàn)法表示。IPv6 只能用斜線(xiàn)法表示網(wǎng)段地址,即在 IPv6 地址后面加上一個(gè)斜線(xiàn) “ / ” ,后面加上一個(gè)十進(jìn)制的數字,來(lái)表示前面多少位是網(wǎng)絡(luò )位。網(wǎng)絡(luò )位是 64 位的 IPv6 地址表示如下:
3001:2222:333:aa:bc::707:9900/64
對應的網(wǎng)段地址是:
3001:2222:333:aa::/64
全是 0 的 IPv6 地址可以寫(xiě)成一對冒號。當網(wǎng)絡(luò )位是 0 位時(shí),表示默認地址。
::/0
當網(wǎng)絡(luò )位是 128 位時(shí),表示未指定地址( unspecified address )。設備未分配 IPv6 地址時(shí),就用未指定地址作為標識進(jìn)行報文交互。
::/128
IPv6 地址根據使用范圍和功能,分為三種類(lèi)型:
單播( Unicast )
任意播( Anycast )
組播( Multicast )
對比 IPv4 ,IPv6 地址中沒(méi)有廣播地址,但是有一個(gè)包含全部節點(diǎn)的組播地址,跟 IPv4 中的廣播地址功能相同。
其中單播地址又細分為全球單播地址、唯一本地地址和鏈路本地地址等。
單播地址表示單臺設備的地址。全球單播地址是指這個(gè)單播地址是全球唯一的。也就是說(shuō),全球單播地址是可以在公網(wǎng)使用、全網(wǎng)可路由的 IPv6 地址,類(lèi)似于 IPv4 的公網(wǎng) IP 地址。全球單播 IPv6 地址是由 Internet 地址授權委員會(huì )( IANA )分配給地區 Internet 注冊機構( RIR ),再由 RIR 分配給 Internet 服務(wù)提供商( ISP )。
IANA 分配 128 位的 IPv6 地址時(shí),同 IPv4 一樣,也是分配一個(gè)網(wǎng)段,即網(wǎng)絡(luò )/子網(wǎng)位,不會(huì )分配 128 位的地址。IPv6 單播地址的通用格式如下:
全球單播 IPv6 地址的前 3 位固定為 001 ;第 4 ~ 48 位的這 45 位由地址分配機構分配;48 位之后的 16 位是網(wǎng)絡(luò )劃分子網(wǎng)位,稱(chēng)為子網(wǎng) ID ;剩余的 64 位 IPv6 地址就是主機位,但是叫做接口 ID( Interface ID )。因為一臺主機可以有幾個(gè)接口,用 IPv6 地址表示主機的一個(gè)接口更準確,而不是表示一臺主機。同時(shí),一個(gè)接口可以有多個(gè) IPv6 地址,還可以有一個(gè) IPv4 地址,接口 ID 只是這個(gè)接口的幾個(gè)標識符之一。
通常,全球 IPv6 地址的接口 ID 是 64 位,子網(wǎng) ID 是 16 位。一個(gè) 16 位的子網(wǎng) ID 可以劃分 65536 個(gè)不同的子網(wǎng)。很少有這么多子網(wǎng)的網(wǎng)絡(luò ),因此全球單播 IPv6 地址還有另外一種格式:前綴是 n 位,子網(wǎng) ID 是 64-n 位,接口 ID 也是 64 位。兩種格式也不是矛盾的。
將全球單播 IPv6 地址的前 3 位固定值轉換為 IPv6 表示法,可知全球單播地址的前綴為 2000::/3 。
IANA 和 RIR 把長(cháng)度 /32 或 /35 的 IPv6 前綴分配給本地 Internet 注冊機構( LIR )。LIR 通常是大型的 ISP ,LIR 分配前綴長(cháng)度 /48 的 IPv6 地址給各個(gè)客戶(hù)。也有一些例外,會(huì )分配不同長(cháng)度的前綴:
如果一個(gè)客戶(hù)非常龐大,那么可以分配一個(gè)長(cháng)度小于 /48 的前綴。
如果有且僅有一個(gè)子網(wǎng)需要地址,那么可以分配一個(gè)長(cháng)度是 /64 的前綴。
如果有且僅有一臺設備需要地址,那么可以分配一個(gè)長(cháng)度是 /128 的前綴。
IPv6 地址開(kāi)頭的二進(jìn)制標識地址類(lèi)型。比如:全球單播地址的前 3 位是 001 。
除了全球單播地址,還有幾種其它類(lèi)型的本地單播地址,分別應用在不同的場(chǎng)景。
有哪些本地單播地址呢?
本地單播地址有 4 種類(lèi)型,分別是唯一本地地址、鏈路本地地址、未指定地址、回環(huán)地址。
唯一本地地址
雖然 IPv6 地址非常充足,但是 IANA 還是分配了一段可以在私有網(wǎng)絡(luò )使用的私有 IP 地址空間。這種可以自行使用而不用申請的單播 IPv6 地址叫做唯一本地地址。唯一本地地址只能在私有網(wǎng)絡(luò )使用,不能在全球路由,不同的私網(wǎng)可以復用這類(lèi)地址。它的作用和范圍跟 IPv4 的私有 IP 地址相同。
唯一本地地址的前 7 為固定是 1111110 ,前綴為 FC00::/7 的 IPv6 地址。之前還有站點(diǎn)本地地址( Site Local Address ),前綴是 FEC0::/10 ,已被ULA取代。

唯一本地地址的第 8 位比較特殊。第 8 位為 0 時(shí),未定義,也就是說(shuō),FC00::/8 這個(gè) IPv6 地址前綴屬于保留的地址空間。目前私有網(wǎng)絡(luò )使用的 IPv6 地址是以 11111101 開(kāi)頭的,即前綴為 FD00::/8 的 IPv6 地址。

鏈路本地地址
IPv6 的鏈路本地地址( Link-Local Address ),是 IPv4 地址中沒(méi)有的類(lèi)型,是 IPv6 新定義的地址類(lèi)型。
鏈路本地地址是只在鏈路內有效的地址。啟動(dòng) IPv6 時(shí),網(wǎng)絡(luò )接口會(huì )自動(dòng)配置這樣的一個(gè) IPv6 地址,就可以直接和同一鏈路上的其它設備通信。因為鏈路本地地址只在鏈路本地有效,所以這些數據包不會(huì )被發(fā)送到其它鏈路上。
鏈路本地地址的前 10 位固定是 1111111010 ,之后的 54 位固定為 0 ,最后 64 位是接口 ID 。也就是說(shuō),鏈路本地地址的前綴為 FE80::/10 。

如果鏈路本地地址的前 64 位都是相同的,那么接口如何使用 64 位的接口 ID 進(jìn)行標識,才能確保鏈路本地地址在鏈路中不會(huì )出現 IP 地址沖突呢?答案是接口使用自己的物理 MAC 地址來(lái)填充接口 ID 字段。理論上接口的 MAC 地址是唯一的,因此通過(guò) MAC 地址生成的接口 ID 和鏈路本地地址也是唯一的。
把 MAC 地址轉換成接口 ID ,使用 MAC-to-EUI64 轉換法。簡(jiǎn)單的講,就是使用接口的 48 位 MAC 地址,在 MAC 地址中間,也就是 OUI 后面,插入一個(gè)固定的十六進(jìn)制數 0xFFFE ,并把第 7 位的 U/L (全局/本地)位設置為 1 ,這樣就轉換為一個(gè) 64 位的接口 ID 。

未指定地址
未指定地址是 128 位全為 0 的前綴地址,簡(jiǎn)寫(xiě)成 ::/128 ,相當于 IPv4 中的 0.0.0.0/32 。這個(gè)地址不能分配給接口使用,只有當 IPv6 設備還沒(méi)獲取到地址時(shí),才將未指定地址作為數據包的源 IPv6 地址。
回環(huán)地址
回環(huán)地址是前 127 位全為 0 ,最后一位是 1 的 128 位前綴地址,簡(jiǎn)寫(xiě)成 ::1/128 ,相當于 IPv4 中的回環(huán)地址 127.0.0.1/8 ?;丨h(huán)地址表示節點(diǎn)自己,不能分配給接口使用。只要設備的協(xié)議棧狀態(tài)正常,設備就可以收到發(fā)送給回環(huán)地址的數據包。
IPv6 定義了一種任性的功能,通過(guò)任意播地址( Anycast Address )實(shí)現。任意播地址是根據功能定義的,而不是根據報文格式,IPv6 沒(méi)有定義任意播的地址空間,與單播使用相同的地址空間。所以,無(wú)法根據地址判斷是單播地址還是任意播地址。
單播是一對一,組播是一對多,廣播是一對全體,那么任意播就是一對最近的通信方式。

一個(gè)任意播地址可以分配給多臺設備,路由器會(huì )有多條路由到達相同的目的地,選擇代價(jià)最小的路由進(jìn)行數據轉發(fā)。在大型網(wǎng)絡(luò )中,流量可以發(fā)送到最近的設備,數據傳輸效率更高。而且當最近的設備故障時(shí),路由器可以把路由指向下一臺最近的路由器。

組播地址不是標識一臺設備,而是一組設備:一個(gè)組播組( Multicast Group )。發(fā)送組播數據包通常是單臺設備,可以是組播組成員,也可以是其它主機,數據包的目的地址是組播地址。
組播組成員有可能是一臺設備,也可能是這個(gè)網(wǎng)絡(luò )上的所有設備。IPv6 沒(méi)有廣播地址,但是有一個(gè)包含所有節點(diǎn)的組播組,和廣播地址做相同的事情:所有節點(diǎn)都是這個(gè)組播組的成員。
組播地址的前 8 位全是 1 ,后面跟著(zhù) 4 位標記位,再后面就是 4 位表示地址范圍。最后的 112 位作為組 ID ( Group ID ),標識不同的組播組。前面的 80 位是 0 ,只使用后面的 32 位。

4 位標記位中,第 1 位是保留標記位,未使用,使用固定值 0 。第 2 位用于匯集點(diǎn)( Rendezvous Point ),匯集點(diǎn)是組播的一個(gè)概念,叫做 R 位,通常取值為 0 。第 3 位表示組播地址是否帶了前綴,叫做 P 位。組播地址沒(méi)前綴,取值為 0 。大多數情況是 0 。最后一位是 T 位,值為 0 時(shí)表示是已定義的、永久的組播地址;值為 1 時(shí)是臨時(shí)充當一些設備的組播組。因此,各個(gè)協(xié)議使用的組播組是以 FF0 開(kāi)頭的 IPv6 地址,而自定義的組播組是以 FF1 開(kāi)頭的。
組播地址和單播地址一樣,有一個(gè)有效范圍,4 為范圍位定義了組播地址的使用范圍。不同取值的范圍表如下:

常見(jiàn)的 IPv6 組播地址的格式是標記位的值是 0 ,范圍位的值是 2 ,即前綴為 FF02 的組播地址。

在 IPv6 地址的環(huán)境中使用 IPv4 地址,需要用到轉換技術(shù),把 IPv4 地址轉換成 IPv6 地址。比如 6to4 技術(shù)就是將 IPv4 地址轉換成 16 進(jìn)制數,再嵌入到 IPv6 地址的最后 32 位。
IPv6 也是使用 ICMP 來(lái)管理網(wǎng)絡(luò ),實(shí)現錯誤檢查和報告機制功能。IPv4 協(xié)議中 ICMP 使用的協(xié)議號是 1 ,而 IPv6 協(xié)議中 ICMPv6 使用的值是 58 。ICMPv6 對于頭部字段的定義也與 ICMP 相同。

ping 功能也是使用 Echo 請求和 Echo 應答報文。除此之外,還有一個(gè)基于 ICMP 的新協(xié)議:鄰居發(fā)現協(xié)議。
IPv6 的鄰居發(fā)現協(xié)議( NDP )相當于 IPv4 的 ARP 、ICMP 的路由器發(fā)現和 ICMP 的重定向,還可以發(fā)現網(wǎng)絡(luò )中使用的 IPv6 地址前綴等參數,并實(shí)現地址自動(dòng)配置等。IPv6 協(xié)議通過(guò) NDP 功能實(shí)現即插即用特性:
路由器發(fā)現( Router Discovery ):當一個(gè)節點(diǎn)接入到 IPv6 鏈路時(shí),它可以發(fā)現鏈路上的路由器,而不需要借助使用 DHCP 。
前綴發(fā)現( Prefix Discovery ):當一個(gè)節點(diǎn)接入到 IPv6 鏈路時(shí),它能夠發(fā)現鏈路的前綴。
參數發(fā)現( Parameter Discovery ):節點(diǎn)能夠發(fā)現所在鏈路的參數,像鏈路的 MTU 和跳數限制等。
地址自動(dòng)配置( Address Autoconfiguration ):節點(diǎn)能夠自動(dòng)配置,不需要使用 DHCP 。
地址解析( Address Resolution ):節點(diǎn)不需要通過(guò) ARP 就能夠獲取鏈路上其它節點(diǎn)的 MAC 地址。
下一跳確定( Next-Hop Determination ):能夠確定到達目的節點(diǎn)的下一跳鏈路層節點(diǎn),或者所在鏈路的目的節點(diǎn),或是到達目的節點(diǎn)的路由器。
鄰居不可達檢測( Neighbor Unreachability Detection ):節點(diǎn)上能夠檢測到鏈路上的鄰居何時(shí)不可達,鄰居有可能是主機,也可能是路由器。
地址沖突檢測( Duplicate Address Detection ):節點(diǎn)能夠檢測到要使用的地址是否已經(jīng)被其它節點(diǎn)占用。
重定向( Redirect ):對于非連接的目的節點(diǎn),路由器能夠通知主機存在更好的下一跳路由。
NDP 報文是在數據鏈路內接收和發(fā)送,因此封裝 NDP 的數據包是使用 IPv6 鏈路本地地址,或者是鏈路范圍內的組播地址。在安全性上也有加強,NDP 報文的跳數限制是 255 。如果收到的數據包的跳數限制值小于 255 ,那么這個(gè)數據包至少經(jīng)過(guò)了一臺路由器,因此丟棄這個(gè)數據包。這樣可以阻止 NDP 不會(huì )受到非本地鏈路的攻擊或欺騙。
NDP 定義了 5 種報文類(lèi)型,且跳數限制字段值都是 255 。如果收到的 NDP 報文中跳數限制字段值不是 255 ,那么會(huì )丟棄這個(gè) NDP 報文。在 ICMPv6 封裝這 5 種 NDP 報文時(shí),編碼字段都是 0 ,不同報文類(lèi)型通過(guò)類(lèi)型值來(lái)標識:
路由器請求( Router Solicitation ,RS ):路由器請求報文是由主機發(fā)出的,用來(lái)請求鏈路中的路由器發(fā)送一個(gè) RA 。類(lèi)型字段值是 133 。
路由器通告( Router Advertisement ,RA ):路由器通告報文是路由器發(fā)出的,用來(lái)通告路由器的存在和鏈路參數,比如:鏈路前綴、鏈路 MTU ,以及跳數限制等。這些報文周期性的發(fā)送,也用于響應路由器請求報文。類(lèi)型字段值是 134 。
鄰居請求( Neighbor Solicitation ,NS ):也是有主機發(fā)起,用來(lái)請求另一臺主機的 MAC 地址,也用于地址沖突檢測、鄰居不可達檢測。類(lèi)型字段值是 135 。
鄰居通告( Neighbor Advertisement ,NA ):用于響應鄰居請求報文。如果一個(gè)節點(diǎn)改變了 MAC 地址,那么它通過(guò)發(fā)送一個(gè)未請求的鄰居通告報文來(lái)告知這個(gè)新地址。類(lèi)型字段值是 136 。
重定向( Redirect ):跟 IPv4 協(xié)議中的 ICMP 用法相同,只不過(guò)是移植到 NDP 中。類(lèi)型字段值是 137 。
路由器在所在的鏈路上周期性發(fā)送 RA ,告知它的存在和配置的所有參數。未收到請求的 RA 的源地址是路由器接口的鏈路本地 IPv6 地址,目的地址是所有節點(diǎn)的組播地址( FF02::1 )。
剛接入到鏈路的主機,需要等待一個(gè) RA ,用來(lái)發(fā)現鏈路上的路由器和鏈路參數。默認等待 200 秒的時(shí)間太長(cháng)。所以,主機激活時(shí),就會(huì )發(fā)送一個(gè) RS ,這個(gè)報文的源地址可以是未指定地址( :: ),也可以是主機的鏈路本地 IPv6 地址。目的地址就是所有路由器的組播地址( FF02::2 ),請求鏈路本地路由器為主機提供一些信息。
只有路由器才會(huì )監聽(tīng)鏈路本地路由器組播地址,當路由器收到 RS 時(shí),就會(huì )發(fā)送一條 RA 作為響應。如果收到報文的源地址是鏈路本地地址,那么使用鏈路本地地址單播發(fā)送。如果源地址是未指定地址( :: ),那么會(huì )以組播方式發(fā)送給所有節點(diǎn)( FF02::1 )。

當主機收到 RS 時(shí),會(huì )把路由器的鏈路本地地址作為默認路由地址,添加到自己的路由表中。如果路由器列表有多條默認路由器條目,那么主機要給出選定默認路由器的方法。要么是整個(gè)默認路由器列表依次輪詢(xún),要么選擇單臺路由器作為默認路由。
當一臺 IPv6 的設備第一次接入鏈路時(shí),它能夠自動(dòng)配置自己的接口地址。這個(gè)過(guò)程的第一步就是確定 64 位接口 ID 部分,使用 MAC-to-EUI64 轉換法獲取接口 ID 。
當然,接口 ID 只是 IPv6 地址的一半,還需要一個(gè) 64 位的前綴。前面提到過(guò),鏈路本地前綴是 0xFF80::/10 。用它作為 64 位前綴( 0xFF80::/64 ),再加上轉換后的接口 ID ,就是一個(gè)完整的 IPv6 地址,可以和同一鏈路上設備進(jìn)行通信。
如果一臺主機只需要和所在鏈路上的設備通信,那么它自動(dòng)配置的鏈路本地地址就已經(jīng)滿(mǎn)足了。但是如果主機需要和鏈路之外的設備通信,那么它就需要一個(gè)更大范圍的地址,通常是一個(gè)全球 IPv6 地址。有兩種途徑獲取這類(lèi)地址:有狀態(tài)或無(wú)狀態(tài)的地址自動(dòng)配置。
使用 DHCPv6 服務(wù)器來(lái)分配 IPv6 地址,稱(chēng)為有狀態(tài)地址自動(dòng)配置。主機要么根據預先的配置查找 DHCPv6 服務(wù)器,要么收到字段 M 置位的路由器通告報文來(lái)獲取 DHCPv6 服務(wù)器。
更有趣的是無(wú)狀態(tài)地址自動(dòng)配置( Stateless Address Autoconfiguration ,SLAAC ),不依賴(lài)服務(wù)器、不需要手動(dòng)配置。這個(gè)過(guò)程非常簡(jiǎn)單,當一臺 IPv6 設備接入網(wǎng)絡(luò )時(shí),會(huì )發(fā)送 RS 來(lái)查詢(xún)網(wǎng)絡(luò )中是否存在路由器。RA 有一個(gè)字段可以告訴 IPv6 設備使用哪種方式配置自己的 IPv6 地址,這個(gè)字段稱(chēng)為 M 位。如果 M 位置位,值為 1 時(shí),表示設備通過(guò) DHCPv6 協(xié)議動(dòng)態(tài)配置 IPv6 地址;如果 M 位不置位,值為 0 時(shí),則表示設備通過(guò) SLAAC 來(lái)配置 IPv6 地址。
IPv6 設備從收到的 RA 中獲取一個(gè)或多個(gè)鏈路前綴,再加上之前確定的接口 ID ,就得到了一個(gè)全球唯一的 IPv6 地址。
IPv6 設備執行 SLAAC 的過(guò)程,不需要人工干預,也沒(méi)有 DHCP 服務(wù)器參與,設備自行完成配置。也就是說(shuō),這種機制為 IPv6 網(wǎng)絡(luò )提供了即插即用功能。
IPv4 通過(guò) ARP 獲取 MAC 地址,然而 ARP 協(xié)議無(wú)法照搬到 IPv6 環(huán)境中,IPv6 沒(méi)有定義廣播地址。為了解決查詢(xún)目的設備的 MAC 地址問(wèn)題, IPv6 通過(guò) NDP 獲取 MAC 地址。IPv6 設備使用 NS 和 NA 來(lái)實(shí)現 MAC 地址的查詢(xún)和響應。IPv6 使用目的節點(diǎn)組播地址作為 NS 的目的地址。
目的節點(diǎn)的組播地址的前 104 位固定是 FF02::1:FF ,后 24 位使用目的單播 IPv6 地址接口 ID 的后 24 位。當接口獲取一個(gè)單播或任意播 IPv6 地址時(shí),就會(huì )同時(shí)監聽(tīng)發(fā)送給這個(gè)單播地址對于的目的節點(diǎn)組播地址。
如果目的節點(diǎn)是鏈路之外的節點(diǎn),那么可以通過(guò)路由器通告報文,獲取默認路由器的 MAC 地址。如果目的節點(diǎn)在鏈路內,那么節點(diǎn)會(huì )先查找鄰居緩存看一下是否已經(jīng)學(xué)到這個(gè)地址。IPv6 的鄰居緩存和 IPv4 的 ARP 緩存相似,記錄 IP 地址和 MAC 地址的對應關(guān)系。
如果地址不在鄰居緩存中,節點(diǎn)會(huì )發(fā)送一個(gè) NS 。目的節點(diǎn)收到報文后,就知道源節點(diǎn)的 MAC 地址,并回復鄰居通告報文。
如果目的節點(diǎn)存在并且收到了 NS ,那么它會(huì )回復一個(gè) NA 。這個(gè) NA 的目的地址就是源節點(diǎn)的源地址。收到響應的 NA 后,源節點(diǎn)就把目的節點(diǎn)的 MAC 地址添加到鄰居緩存的條目中。
NDP 的 NA 還有另一種用法,當 IPv6 節點(diǎn)的 MAC 地址發(fā)生變化時(shí),也可以在未收到 NS 的情況下,直接向本地鏈路發(fā)生一條 NA ,向本地鏈路上其它設備通告新的 IPv6 地址和 MAC 地址的對應關(guān)系。因為目的是通告給鏈路中所有設備,而不是某一臺設備,所有 NA 的目的地址就是鏈路本地所有節點(diǎn)組播地址( FF02::1 )。
雖然通過(guò) MAC 地址轉換成接口 ID ,大多數情況下可以保證是設備地址是唯一的,但是也可能存在重復 MAC 地址的情況,因此不管設備是如何獲取地址的,都需要在使用之前進(jìn)行地址沖突檢測。
獲取一個(gè)地址的節點(diǎn)會(huì )把新地址作為臨時(shí)狀態(tài)的地址。在地址沖突檢測完成前,地址不能被使用。節點(diǎn)會(huì )發(fā)送目的地址是新地址的 NS 來(lái)驗證。NS 的源地址是未指定地址,目的地址是目的節點(diǎn)的組播地址。
如果節點(diǎn)收到一個(gè) NS ,并且目的地址是這個(gè)節點(diǎn)已經(jīng)使用的地址,就會(huì )發(fā)送一個(gè)目的地址為已使用地址的 NA 。源節點(diǎn)收到 NA 后,就會(huì )知道這個(gè)地址是沖突的,并且不能使用。
無(wú)狀態(tài)地址自動(dòng)配置會(huì )有一個(gè)安全隱患:即使一臺設備從一個(gè)子網(wǎng)轉移到另一個(gè)子網(wǎng),它的接口 ID 始終保持不變。那么就可以通過(guò)接口 ID 來(lái)識別用戶(hù),推斷出用戶(hù)的所在位置,追蹤用戶(hù)的活動(dòng)和位置記錄,暴露個(gè)人隱私信息。
這個(gè)問(wèn)題可以通過(guò) IPv6 私有地址來(lái)解決。私有地址是隨機生成的接口 ID 。接口 ID 通常一天變化一次,也會(huì )在獲取一個(gè)新的 IPv6 地址時(shí)改變。
但是服務(wù)器的地址不需要經(jīng)常變化。跟服務(wù)器通信的節點(diǎn),以及 DNS 服務(wù)器必須通過(guò)靜態(tài)地址了解服務(wù)器的位置。因此,標準的無(wú)狀態(tài)配置的 IPv6 地址保留“公共”地址,任何一個(gè)向服務(wù)器發(fā)送數據時(shí),使用這個(gè)地址作為目的地址。但是服務(wù)器發(fā)送數據時(shí),使用的卻是私有地址。這就像公司的分機短號一樣,你能看見(jiàn)是誰(shuí)在打你電話(huà),但是別人看不到你的號碼。
聯(lián)系客服