網(wǎng)絡(luò)網(wǎng)絡(luò)層之(3)IPv6協(xié)議
Author: Once Day Date: 2024年4月2日
一位熱衷于Linux學(xué)習(xí)和開發(fā)的菜鳥,試圖譜寫一場冒險(xiǎn)之旅,也許終點(diǎn)只是一場白日夢…
漫漫長路,有人對你微笑過嘛…
全系列文檔可參考專欄:通信網(wǎng)絡(luò)技術(shù)_Once-Day的博客-CSDN博客。
參考文章:
- 《TCP/IP詳解卷一》
- IEEE RA Guidelines for Use of EUI, OUI, and CID
- IPv6本地鏈路地址生成方式_ipv6_addr_gen_mode-CSDN博客
- RFC 2373: IP Version 6 Addressing Architecture (rfc-editor.org)
- RFC 2464: Transmission of IPv6 Packets over Ethernet Networks (rfc-editor.org)
- RFC 4291: IP Version 6 Addressing Architecture (rfc-editor.org)
1. 概述
1.1 基礎(chǔ)信息
IPv6地址是互聯(lián)網(wǎng)協(xié)議第六版(Internet Protocol Version 6)的一部分,它是為了解決IPv4地址耗盡問題而設(shè)計(jì)的新一代互聯(lián)網(wǎng)地址協(xié)議。
IPv6地址使用128位地址長度,相較于IPv4的32位,大幅增加了地址空間,可以為地球上幾乎每一粒沙子分配一個唯一的網(wǎng)絡(luò)地址。
它通常使用十六進(jìn)制表示,并且通過冒號(:)分隔成8組,每組4個十六進(jìn)制數(shù)。例如,一個IPv6地址可能看起來像這樣:2001:0db8:85a3:0000:0000:8a2e:0370:7334
。
IPv6很多地方規(guī)則與IPv4一致,因此本文不再描述那些與IPv4一樣的內(nèi)容,而是談?wù)処Pv6比較獨(dú)特的地方。
1.2 IPv6地址簡化表示方法
IPv6地址由于其128位的長度,以標(biāo)準(zhǔn)方式表示時非常長,因此在實(shí)際使用中,人們通常會采用簡化表示法來減少地址的復(fù)雜性。IPv6地址簡化的基本規(guī)則包括以下方面[RFC4291]:
-
省略前導(dǎo)零:在IPv6地址的每個16位字段中,可以省略字段起始部分的所有零。例如,“0042"可以簡化為"42”,“0A00"可以簡化為"A00”。
-
雙冒號縮寫:在IPv6地址中,一連串的零可以被替換為"::“(雙冒號)。這個簡化規(guī)則只能使用一次,因?yàn)槎啻问褂脮斐傻刂凡幻鞔_。例如,
2001:0db8:0000:0000:0000:0000:1428:57ab
可以被簡化為2001:0db8::1428:57ab
。如果地址中有多個零段,通常會將最長的連續(xù)零段替換為”::"以進(jìn)行最大程度的簡化。 -
在IPv6格式中嵌入IPv4地址可以采用混合符號形式,緊接著IPv4部分的地址塊的值為ffff,地址其與部分使用點(diǎn)分四組格式。如
::ffff:10.0.0.1
表示由IPv4地址(10.0.0.1
)映射的IPv6地址。 -
IPv6地址的低32位通常采用點(diǎn)分四組表示法,例如
::0102:f001
可以表示為::1.2.240.1
,稱為IPv4兼容的IPv6地址。
例如,完整的IPv6地址2001:0db8:0000:0000:0000:0000:0000:0001
可以被簡化為2001:0db8::1
。
需要注意的是,"::"不能用于省略單個零段,因?yàn)檫@會導(dǎo)致地址的歧義。
[RFC5952]制定了一些規(guī)則,以縮小選擇范圍,減少不必要的混淆。
- 前導(dǎo)的零必須被壓縮,例如
2001::0001
變成2001::1
。 -
::
用于影響最大的地方,以壓縮最多的零,如果多個塊中包含等長度的零,順序靠前的塊將被替換為::
。 - a到f的十六進(jìn)制數(shù)字應(yīng)該使用小寫表示。
在URL等場景下,IPv6的冒號會和端口號沖突,因此需要使用括號包圍IPv6地址,如下表示:
https://[2001:6666]:443
2. IPv6地址
2.1 IPv6地址構(gòu)成
IPv6地址比IPv4長了四倍,因此能表示的地址數(shù)目范圍非常大,也沒有像IPv4一樣分為A/B/C/D類地址。
IPv6吸取了IPv4子網(wǎng)劃分的優(yōu)點(diǎn),直接一步到位,使用CIDR表示,通過前綴表示法,來劃分許多特殊地址范圍,如fe80::/10
范圍內(nèi)的地址全都是本地鏈路地址,不能用于公共互聯(lián)網(wǎng)。
IPv6也沒有廣播地址,因此不用像IPv4一樣去區(qū)分子網(wǎng)號和主機(jī)號,直接根據(jù)地址范圍劃分作用。
常見IPv6地址范圍劃分如下:
前綴 | 描述 |
---|---|
::/0 |
默認(rèn)路由條目,不用于尋址。 |
::/128 |
未指定地址 (Unspecified Address),可用于源IP地址。 |
::1/128 |
環(huán)回地址 (Loopback Address),類似于IPv4中的127.0.0.1。 |
fc00::/7 |
唯一本地地址 (Unique Local Address, ULA),不用于公共互聯(lián)網(wǎng)。 |
fe80::/10 |
鏈路本地地址 (Link-Local Address),只在單個鏈路上有效,不會被路由器轉(zhuǎn)發(fā)到其他鏈路。 |
ff00::/8 |
多(組)播地址 (Multicast Address),僅作為目的IP地址使用。 |
::ffff:0:0/96 |
IPv4映射地址 (IPv4-mapped IPv6 Address),只用于內(nèi)部主機(jī)。 |
64:ff9b::/96 |
IPv4-IPv6轉(zhuǎn)換地址 (IPv4-IPv6 Translation Address),用于自動IPv4/IPv6轉(zhuǎn)換機(jī)制(如NAT64)。 |
通常一個網(wǎng)絡(luò)接口上會有多個IPv6地址(本地鏈路地址+全球單播地址+組播地址等等),而IPv4一般只有一個地址。
2.2 IPv6本地鏈路地址
鏈路本地IPv6地址使用接口標(biāo)識符(IID)作為組成之一,通常直接由接口的鏈路層MAC地址形成,如下:
在IEEE標(biāo)準(zhǔn)中,EUI表示擴(kuò)展唯一標(biāo)識符,分成EUI-64和EUI-48版本。以太網(wǎng)中常用的是EUI-48的短格式版本,兩者區(qū)別是其長度不一樣。
EUI-48也就是常說的MAC地址,其第一個字節(jié)最低倒數(shù)第二位(U/G)表示該MAC地址是全局MAC地址還是本地MAC地址。
EUI-48通過在第三個字節(jié)和第四個字節(jié)中插入兩個字節(jié)(0xFFFE)可以轉(zhuǎn)化成EUI-64地址,再取反(U/G)位,便可以用于鏈路本地IPv6地址的接口標(biāo)識符組成。反轉(zhuǎn)目的是將原來的全局MAC地址變成本地MAC地址,正好對應(yīng)鏈路本地IPv6地址含義。
例如,接口MAC地址是00:11:22:33:44:55
,那么其IPv6鏈路本地地址是fe80::0211:22ff:fe33:4455
。
下面是Linux設(shè)備上的IPv6鏈路本地地址實(shí)例:
ubuntu->~:$ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.4.17 netmask 255.255.252.0 broadcast 10.0.7.255
inet6 fe80::5054:ff:fe85:f022 prefixlen 64 scopeid 0x20<link>
ether 52:54:00:85:f0:22 txqueuelen 1000 (Ethernet)
RX packets 52199351 bytes 16755548321 (16.7 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 47234618 bytes 12477606055 (12.4 GB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Mac地址是52:54:00:85:f0:22
,有0x52=b'01010010
,這是一個本地MAC地址,取反之后,即52:54:00:85:f0:22
。
然后添加0xFFFE
,便構(gòu)造出實(shí)際的鏈路本地IPv6地址fe80::5054:ff:fe85:f022
。
對于其他鏈路層或者IP隧道協(xié)議,會使用各自獨(dú)特的標(biāo)識符來創(chuàng)建,例如隧道IP地址。
注意,這里細(xì)心的人也許發(fā)現(xiàn)了,52:54:00:85:f0:22
是個本地MAC地址,反轉(zhuǎn)之后不就變成了全局MAC地址呢?
確實(shí)如此,這是實(shí)踐帶來的問題,上述設(shè)備是qemu虛擬設(shè)備,因此使用了本地MAC地址。在[RFC 4291]中,明確表示EUI-64地址反轉(zhuǎn)U/G
位后,其含義僅供參考,不強(qiáng)行要求對應(yīng)本地鏈路含義。
簡單來說,修改后的EUI-64地址能對應(yīng)上“鏈路本地”含義最好,不能對應(yīng)也不算是錯誤,只是一串描述符而已。
3. IPv4和IPv6地址轉(zhuǎn)換
3.1 單播地址轉(zhuǎn)換
在一些IPv6和IPv4過渡的網(wǎng)絡(luò)中,需要在IPv4和IPv6之間進(jìn)行轉(zhuǎn)換,相關(guān)內(nèi)容可以參考[RFC6144]和[RFC6052]。
該方案使用一種特殊地址格式,稱為嵌入IPv4的IPv6地址,可采用如下的六種格式來進(jìn)行編碼:
其中64:ff9b::/96
是一個非常有名的轉(zhuǎn)換前綴,正好對應(yīng)這里面的/96
情況。除了知名前綴之外,也可以是組織為轉(zhuǎn)換器分配的唯一前綴。標(biāo)識對應(yīng)的8位必須全為0,以保持與[RFC4291]指定標(biāo)識符的兼容性,后綴位被保留,并且也應(yīng)該設(shè)置為0。
4. IPv6組播地址
4.1 組播地址格式
IPv6中,前綴ff00::/8
已被預(yù)留給組播地址,其中后面的112位可用于保存組號,如下所示。
基本的IPv6組播格式包含4個標(biāo)志位:
-
0
,保留位。 -
R
,包含會合點(diǎn)。 -
P
,使用單播前綴。 -
T
,臨時的地址。
4位的范圍值用于表示組播的范圍(全球/本地等),如下所示:
范圍值 | 描述 |
---|---|
0/3/4/6/7/9-d/f | 保留和未分配的值 |
1 | 接口和機(jī)器本地 |
2 | 鏈路和子網(wǎng)本地 |
5 | 站點(diǎn)本地 |
8 | 組織本地 |
e | 全球 |
例如,對于IANA分配的NTP服務(wù)協(xié)議組播地址,可以跨越多個地址范圍,即可變范圍的組播地址ff0x::101
,如下所示:
地址 | 描述 |
---|---|
ff01::101 |
同一機(jī)器中的所有NTP服務(wù)器 |
ff02::101 |
同一鏈路/子網(wǎng)中的所有NTP服務(wù)器 |
ff04::101 |
某些管理定義范圍內(nèi)的所有NTP服務(wù)器 |
ff05::101 |
同一站點(diǎn)中的所有NTP服務(wù)器 |
ff08::101 |
同一組織中的所有NTP服務(wù)器 |
ff0e::101 |
Internet中的所有NTP服務(wù)器 |
標(biāo)志位(P/R/T)含義如下:
位字段(標(biāo)志) | 描述 |
---|---|
R | 會合點(diǎn)標(biāo)志(0-常規(guī)的,1-包括RP地址) |
P | 前綴標(biāo)志(0-常規(guī)的,1-基于單播前綴的地址) |
T | 臨時標(biāo)志(0-永久分配的,1-臨時的) |
當(dāng)P位設(shè)置為1時,無須基于每個組的全球性許可,可以采用以下兩個方法確定地址:
- 基于單播前綴的IPv6組播地址分配,提前拿到一個分配的單播前綴,然后同時分配一個有效的組播地址集合。
- 鏈路范圍的IPv6組播,使用接口標(biāo)識符,組播地址基于主機(jī)的IID標(biāo)識。
P位設(shè)置為1通常也要求T位也為1,上述兩種組播地址格式如下所示:
例如,一個組織分配了一個單播前綴3ffe:ffff:1::/48
,同時也會分配一個基于單播的組播前綴ff3x:30:3ffe:ffff:1::/96
。
-
x
表示組播范圍可以由該組織自行選擇,例如鏈路本地(2)和組織本地(8)。 -
3
表明P和T位同時設(shè)置,這個地址是基于單播前綴的IPv6組播地址分配,并且是動態(tài)的。 -
30
是指單播地址前綴長度為48,然后后面接著單播前綴3ffe:ffff:1
。
在創(chuàng)建唯一的鏈路本地范圍的組播地址,可以使用接口標(biāo)識符IID構(gòu)建組播地址,前綴長度需要固定為255,范圍只能為接口本地和鏈路本地。
當(dāng)R和P字段設(shè)置為1時,表示組播路由協(xié)議需要知道一個會合點(diǎn)(RP),即可以處理一個或者多個組播組的組播路由器的IP地址。其格式如下:
RIID字段值是RP的IP地址的低4位,其余部分用零填充。
例如,對于組播地址ff75:940:2001:db8:dead:beef:f00d:face
,其范圍為5(站點(diǎn)本地),RIID值為9,前綴長度為64(0x40),所以單播前綴為2001:db8:dead:beef/64
,RP地址則為2001:db8:dead:beef::9
。
4.1 特殊組播地址
這些地址用于IPv6協(xié)議的不同方面,包括路由協(xié)議、網(wǎng)絡(luò)管理以及特定的網(wǎng)絡(luò)服務(wù)。例如,ff02::1地址用于標(biāo)識同一鏈路上的所有節(jié)點(diǎn),而ff02::2用于標(biāo)識同一鏈路上的所有路由器。Solicited-Node地址有助于IPv6鄰居發(fā)現(xiàn)過程,它是通過在IPv6地址的最后24位前添加ff02::1:ff前綴來構(gòu)造的。
組播地址 | 范圍 | 描述 |
---|---|---|
ff01::1 |
節(jié)點(diǎn) | 所有節(jié)點(diǎn) |
ff01::2 |
節(jié)點(diǎn) | 所有路由器 |
ff01::fb |
節(jié)點(diǎn) | mDNSv6 |
ff02::1 |
鏈路 | 所有節(jié)點(diǎn) |
ff02::2 |
鏈路 | 所有路由器 |
ff02::4 |
鏈路 | DVMRP路由器 |
ff02::5 |
鏈路 | OSPFIGP |
ff02::6 |
鏈路 | 基于OSPFIGP設(shè)計(jì)的路由器 |
ff02::9 |
鏈路 | RIPng路由器 |
ff02::a |
鏈路 | EIGRP路由器 |
ff02::d |
鏈路 | PIM路由器 |
ff02::16 |
鏈路 | 支持MLDv2的路由器 |
ff02::6a |
鏈路 | 所有探測器 |
ff02::6d |
鏈路 | LL-MANET路由器 |
ff02::fb |
鏈路 | mDNSv6 |
ff02::1:2 |
鏈路 | 所有DHCP代理 |
ff02::1:3 |
鏈路 | LLMNR |
ff02::1:ffxx:xxxx |
鏈路 | 請求節(jié)點(diǎn)地址范圍 |
ff05::2 |
站點(diǎn) | 站點(diǎn)本地作用域的所有路由器 |
ff05::fb |
站點(diǎn) | mDNSv6 |
ff05::1:3 |
站點(diǎn) | 所有DHCP服務(wù)器 |
ff0x:: |
可變的 | 保留 |
ff0x::fb |
可變的 | mDNSv6 |
ff0x::101 |
可變的 | NTP |
ff0x::133 |
可變的 | 聚合服務(wù)器訪問協(xié)議 |
ff0x::18c |
可變的 | 所有AC的地址 |
ff3x::/32 |
(特殊范圍) | SSM塊 |
Once Day
也信美人終作土,不堪幽夢太匆匆......
如果這篇文章為您帶來了幫助或啟發(fā),不妨點(diǎn)個贊??和關(guān)注,再加上一個小小的收藏?!文章來源:http://www.zghlxwxcb.cn/news/detail-850978.html
(?????)感謝您的閱讀與支持~~~文章來源地址http://www.zghlxwxcb.cn/news/detail-850978.html
到了這里,關(guān)于網(wǎng)絡(luò)網(wǎng)絡(luò)層之(3)IPv6地址的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!