IPv4和IPv6的鏈路本地地址的自動分配

鏈路本地地址(Link-local Address)是一類特殊的IP地址,僅用於在網段內、同一廣播域內的主機相互通信使用,這類主機可認爲是不需要外部互聯網服務的。其中IPv4的鏈路本地地址定義在169.254.0.0/16範圍內,IPv6定義在fe80::/10範圍。

什麼時候使用鏈路本地地址?其在兩種IP協議中的角色稍有不同。

IPv4中通常只用於網絡接口沒有外部的、有狀態的IP地址的情況下(比如沒有DHCP服務或其他地址配置失效的情況),即各種外部獲取IP地址的途徑失敗時,主機會隨機在169.254.0.0範圍內隨機選擇一個地址(除兩端的169.254.0.0/16和169.254.255.0/16,用作保留),用隨機選的地址進行ACD(衝突地址檢測),直到發現一個不發生衝突的隨機地址則將其使用。這也是無狀態地址自動配置的一種,IPv4的這個可以稱作APIPA(自動專用IP尋址)。因爲僞隨機數的生成與種子相關,種子不變化時僞隨機數基本也是固定的,所以有的主機會使用MAC地址作爲僞隨機數的生成種子,降低同一網段內隨機選取的鏈路本地地址在ACD後發現衝突的概率。

IPv6中的鏈路本地地址的生成是強制的。即主機如果支持IPv6協議棧則強制性的需要生成一個鏈路本地地址,這與IPv6本身的設計有關。IPv4中有廣播的概念,域內廣播到達路由器時是不會被轉發到其他網段的,但IPv6沒有廣播的概念,IPv6儘可能用組播來代替IPv4的這一特性。如何實現的?IPv6中使用鏈路本地地址表示該報文不需要被跨網段轉發,其最常見的應用即在於鄰居發現協議,IPv6的ND協議是用於替代IPv4的ARP協議的從協議地址向硬件地址映射的功能。所以某種角度上看IPv6的鏈路本地地址其實就是一個用在二層的協議地址,與主機的MAC地址一一對應,效果上也與IPv4的鏈路本地地址一致,即只能在本網段內通信,不考慮互聯網服務,儘管這不是它最常見的用法。

IPv6的鏈路本地地址需要強制生成,其生成方式與IPv4有顯著區別,不是用隨機生成方式獲得,畢竟對於IPv6即使是定義了fe80的前綴,要在後面的數量宏大的地址內隨機選地址再發起ACD顯得有點多餘。IPv6的鏈路本地地址以IID(接口標識符)爲基礎來分配,IID長度通常爲64位,內容由主機的MAC地址按一定格式規則形成,常見的格式規則有EUI-48和EUI-64兩種。EUI(擴展唯一標識符)由IEEE定義,EUI-48和EUI-64分別屬於短格式和長格式,其開頭24位都是OUI(組織唯一標識符),由IEEERA機構統一向全球廠商分配,後面的24位或40位由各個組織自行分配,顯然EUI-64爲組織提供更多的分配空間,但EUI-48還是很常用的。兩種EUI格式中,第一個字節的低兩位用於表示全局管理/本地管理、個人地址/組地址,分別叫做u位和g位。u位置1時表示該地址是本地管理的,否則是統一管理的(通常在互聯網環境下);g位置1時表示該地址是組地址,否則是個人地址。在最終的IPv6鏈路本地地址中,EUI都是在低位的。

EUI-48地址基本可以理解爲就是48位的MAC地址,格式也一樣,即前24位是OUI,後24位是組織自己分配的。EUI-48向EUI-64的轉換則另有一些規則:首先前24位的OUI保留,然後緊接着的第4、5字節替換爲FFFE,EUI-48的後24位再補到第6字節及以後,便得到EUI-64地址。從EUI-64得到IPv6的IID還需要將u位取反,最終得到的地址就是我們抓包時比較常見的那個鏈路本地地址。

舉例說明以上過程:

1、主機MAC地址爲00-11-22-33-44-55

2、對應EUI-48地址即同爲00-11-22-33-44-55

3、替換第4、5字節,得到EUI-64地址爲00-11-22-FF-FE-33-44-55

4、u位取反,得到02-11-22-FF-FE-33-44-55

5、鏈路本地地址前綴爲fe80,把EUI-64放在低位,中間部分用0補全

6、最終得到鏈路本地地址:fe80::211:22ff:fe33:4455/10

鏈路本地地址的生成方式不只有以上這種,主機在無狀態配置地址時生成的IPv6地址也能改一下前綴作爲鏈路本地地址,具體待更。

 

附:

Windows Vista生成IPv6地址的介紹:

https://docs.microsoft.com/zh-cn/previous-versions/technet-magazine/cc137983(v=msdn.10)?redirectedfrom=MSDN

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章