Learning Objectives
- 說明 IPv6 位址的長度與寫法:8 組、每組 16 位元的十六進位數字,用冒號分隔
- 依規則縮寫與展開 IPv6 位址(省略前導零、:: 只能用一次),寫出標準的最短寫法
- 從位址與前綴長度分出網路前綴與介面識別碼,說明為什麼主機所在的網段用 /64
- 判斷位址類型:全域單播、鏈路本地、唯一本地、多播、迴路,並說明 IPv6 沒有廣播
- 說明 SLAAC 怎麼自動產生位址、EUI-64 的步驟與隱私問題,以及雙堆疊與轉換機制
為什麼需要 IPv6
上一課看到 IPv4 靠私有位址與 NAT 撐過位址不足,但也付出了代價:點對點連線困難、來源位址失真、路由器要維護轉換表。 IPv6(Internet Protocol version 6,目前的規格是 RFC 8200)的位址是 128 位元,最多 2128 個,大約 3.4×1038。 這個數字大到每一台設備都可以有自己的公有位址,不需要靠 NAT 共用。
| IPv4 | IPv6 | |
|---|---|---|
| 位址長度 | 32 位元 | 128 位元 |
| 寫法 | 十進位,點分隔:192.0.2.10 |
十六進位,冒號分隔:2001:db8::10 |
| 一個網段的大小 | 依遮罩,常見 /24(254 台主機) | 主機所在的網段幾乎一律用 /64 |
| 廣播 | 有 | 沒有,改用多播 |
| 自動設定 | 主要靠 DHCP | 可以不靠伺服器,自己產生位址(SLAAC),也可以用 DHCPv6 |
| 找鄰居的 MAC | ARP | 鄰居探索(NDP,用 ICMPv6 訊息) |
IPv6 不是 IPv4 的新版本號而已,兩者的封包格式不相容:只支援 IPv4 的設備看不懂 IPv6 封包。所以兩者會長期並存,這一課最後會講怎麼並存。
這一課的範例位址都在 2001:db8::/32 裡,這一段保留給文件與書籍使用(RFC 3849),不會分配給任何人,就像 IPv4 的 192.0.2.0/24。 2024 年的 RFC 9637 又多保留了一段更大的 3fff::/20,同樣只用在文件裡。
位址的寫法與縮寫規則
128 位元分成 8 組,每組 16 位元,每組寫成 4 個十六進位數字,用冒號隔開:
2001:0db8:0000:0000:0000:ff00:0042:8329
這樣太長,所以有兩條縮寫規則:
| 規則 | 說明 | 例子 |
|---|---|---|
| 一、省略前導零 | 每組開頭的 0 可以省略,但每組至少留一個數字 | 0db8 → db8、0042 → 42、0000 → 0 |
二、用 :: 代替連續的全 0 組 |
連續一組以上的 0 可以換成 :: |
2001:db8:0:0:0:ff00:42:8329 → 2001:db8::ff00:42:8329 |
:: 在一個位址裡只能用一次。 展開時,:: 代表「補上剛好讓總數變成 8 組的 0」;如果出現兩次,就不知道各補幾組。
例如 2001:db8::1::5 可能是 2001:db8:0:1:0:0:0:5,也可能是 2001:db8:0:0:0:1:0:5,所以是錯的寫法。
同一個位址可以有好幾種合法的縮寫,為了讓大家寫出一樣的結果(方便搜尋、比對紀錄),RFC 5952 建議一種標準寫法:
- 前導零一定要省略
::用在最長的一段連續 0;一樣長時用第一段- 只有一組 0 時寫
0,不要用:: - 英文字母一律小寫
| 位址(完整) | 標準寫法 | 說明 |
|---|---|---|
2001:0db8:0000:0000:0000:0000:0000:0001 |
2001:db8::1 |
連續 6 組 0 |
2001:0db8:0000:0001:0000:0000:0000:0001 |
2001:db8:0:1::1 |
第 3 組只有一組 0 寫 0;第 5~7 組換成 :: |
2001:0db8:0000:0000:0001:0000:0000:0001 |
2001:db8::1:0:0:1 |
兩段都是 2 組,用第一段 |
0000:0000:0000:0000:0000:0000:0000:0001 |
::1 |
迴路位址 |
展開時反過來做:先數已經寫出來幾組,:: 補上缺的組數,每組再補成 4 個數字。
小測驗:IPv6 的寫法
下列哪一個是合法的 IPv6 位址寫法?
2001:0db8:0000:00a0:0000:0000:0000:0010 的標準寫法是?
fe80::1 的 :: 代表幾組 0?
前綴、/64 與位址類型
IPv6 和 IPv4 的 CIDR 一樣用前綴長度表示網路的部分,例如 2001:db8:acad:1::25/64:
前 64 位元 2001:db8:acad:1 是網路前綴,後 64 位元 ::25 是介面識別碼(interface ID,相當於 IPv4 的主機部分)。
主機所在的網段幾乎一律用 /64。 一個 /64 有 264 個位址,用不完也沒關係;固定 64 位元的介面識別碼,主機才能自己產生位址(後面的 SLAAC)。 所以 IPv6 不需要像 IPv4 那樣精打細算遮罩:電信業者通常分給一個單位或家庭一整段(常見 /48 或 /56),單位內再切成很多個 /64。
| 分到的前綴 | 可以切出幾個 /64 |
|---|---|
| /48 | 216=65,536 個 |
| /56 | 28=256 個 |
| /64 | 1 個 |
IPv6 的位址類型由開頭的位元決定(位址架構定義在 RFC 4291):
| 類型 | 前綴 | 開頭看起來像 | 用途 |
|---|---|---|---|
| 全域單播 | 2000::/3 | 2xxx、3xxx |
網際網路上唯一、可以路由,相當於 IPv4 的公有位址 |
| 鏈路本地 | fe80::/10 | fe80 |
只在同一個網段有效,路由器不轉送;每個介面都會自動有一個,鄰居探索、路由器之間的通訊都用它 |
| 唯一本地(ULA) | fc00::/7 | fdxx |
組織內部使用,不在網際網路上路由(RFC 4193),角色類似 IPv4 的私有位址 |
| 多播 | ff00::/8 | ffxx |
送給一群介面 |
| 迴路 | ::1/128 | ::1 |
自己,同 127.0.0.1 |
| 未指定 | ::/128 | :: |
還沒有位址時當作來源 |
IPv6 沒有廣播。 IPv4 用廣播做的事(例如 ARP 問「誰是某某位址」)改用多播:只送給可能有關的那一群,不必打擾網段上的每一台。
常見的多播位址:ff02::1 是這個網段上的所有節點、ff02::2 是所有路由器。
一個 IPv6 介面通常同時有好幾個位址:一個鏈路本地位址,加上一個或多個全域單播位址,另外還加入幾個多播群組。這和 IPv4 一個介面通常一個位址很不一樣。
SLAAC 與 EUI-64:自己產生位址
IPv6 的主機可以不靠 DHCP 伺服器,自己產生位址,叫做無狀態位址自動設定(SLAAC,stateless address autoconfiguration,RFC 4862):
- 介面啟用後,先用
fe80::/64加上自己的介面識別碼,產生鏈路本地位址 - 確認網段上沒有別人用同一個位址(重複位址偵測,DAD)
- 向
ff02::2(所有路由器)送出路由器請求;路由器回覆路由器通告(RA),裡面有這個網段的前綴(例如2001:db8:acad:1::/64)與預設閘道 - 用「前綴+自己的介面識別碼」組成全域單播位址,同樣先做重複位址偵測再使用
介面識別碼怎麼來?早期常用 EUI-64:從網路卡 48 位元的 MAC 位址變出 64 位元。
| 步驟 | 例子(MAC 00:1a:2b:3c:4d:5e) |
|---|---|
| 1. 從中間分成兩半 | 00:1a:2b | 3c:4d:5e |
2. 中間插入 ff:fe |
00:1a:2b:ff:fe:3c:4d:5e |
| 3. 第一個位元組的第 7 個位元(U/L 位元)反轉 | 00=0000 0000 → 0000 0010=02 |
| 4. 寫成 4 組,接在 /64 前綴後面 | 2001:db8:acad:1:21a:2bff:fe3c:4d5e |
問題是:MAC 位址是固定的,用它產生的介面識別碼到哪個網路都一樣,網站只要看位址的後半段就能認出「又是這台設備」,追蹤使用者。
所以現在的作業系統大多改用不含 MAC、看起來隨機的介面識別碼:RFC 8064 建議穩定使用的位址不要內嵌 MAC,RFC 8981 再定義定期更換的臨時位址,用來主動連出。
看到位址中間有 ff:fe,就很可能是 EUI-64 產生的。
SLAAC 只給位址與閘道。需要集中管理、記錄誰用了哪個位址時,網路也可以改用 DHCPv6,或 SLAAC 搭配 DHCPv6 提供 DNS 等其他設定(RA 裡也可以直接帶 DNS 伺服器的資訊)。
小測驗:前綴、類型與自動設定
fe80::1a2b:3cff:fe4d:5e6f 是哪一種位址?
IPv4 用廣播做的事,在 IPv6 改用什麼?
電信業者分給實驗室 2001:db8:acad::/48。實驗室最多可以切出幾個 /64 網段?
主機透過 SLAAC 產生全域單播位址時,前綴從哪裡來?
雙堆疊與轉換:IPv4 和 IPv6 怎麼共存
IPv4 和 IPv6 的封包互不相容,網際網路不可能在某一天全部切換。實際的做法有三類:
| 做法 | 怎麼做 | 什麼時候用 |
|---|---|---|
| 雙堆疊(dual stack) | 設備同時有 IPv4 和 IPv6 位址,兩套協定一起跑;對方兩種都有時優先用 IPv6 | 最常見;現在多數作業系統、手機與大型網站都支援 |
| 通道(tunneling) | 把 IPv6 封包裝在 IPv4 封包裡,穿過只支援 IPv4 的網路(或反過來) | 中間某一段還不支援時的過渡做法 |
| 轉換(translation) | 在邊界的設備把 IPv6 封包改寫成 IPv4(例如常見的 NAT64,搭配 DNS64 產生對應的位址) | 只有 IPv6 的網路要連到只有 IPv4 的服務,例如部分行動網路 |
雙堆疊時,DNS 會同時查名稱的 A 記錄(IPv4 位址)與 AAAA 記錄(IPv6 位址),第 18 課會再談 DNS 的記錄類型。 瀏覽器拿到兩種位址時,通常同時嘗試、優先使用 IPv6,失敗時很快改用 IPv4,使用者不會感覺到差別。
改用 IPv6 時也要注意:每台設備都有公有位址、沒有 NAT 擋在前面,能不能從外面連進來完全由防火牆決定,所以 IPv6 的防火牆規則和 IPv4 一樣重要,不能只設定了 IPv4 那一套。
重點整理
- IPv6 位址 128 位元,寫成 8 組、每組 4 個十六進位數字,用冒號分隔;範例與文件用 2001:db8::/32。
- 縮寫:每組省略前導零、連續的全 0 組換成
::(只能用一次);標準寫法用最長(同長取第一段)的一段 0、單獨一組 0 寫0、字母小寫。 - 前綴長度分出網路前綴與介面識別碼;主機所在的網段用 /64,單位常分到 /48 或 /56 再切。
- 類型:全域單播 2000::/3、鏈路本地 fe80::/10、唯一本地 fc00::/7、多播 ff00::/8、迴路 ::1;沒有廣播。
- SLAAC:從路由器通告拿前綴,自己產生介面識別碼;EUI-64 由 MAC 插入 ff:fe、反轉第 7 個位元,但會洩漏 MAC,現在多改用隨機的介面識別碼。
- IPv4 與 IPv6 透過雙堆疊、通道與轉換長期並存。
下一課回到診斷工具:ICMP,以及由下往上找出網路問題的排錯流程。