IPv6 位址上的前置碼長度是斜線後方從 0 到 128 的整數,例如 2001:db8:1:2::1/64 中的 /64,它代表 128 個位址位元中有多少位元用於識別網路,其餘位元則列出該範圍內的位址。要找出 IPv6 號碼段長度,你可以直接從已設定的介面使用 ipconfig、ip -6 addr 或 ifconfig 讀取,也可以將位址輸入到 IPv6 子網路計算機 中,確認網路、規範化輸入、數值形式的第一個與最後一個位址、主機位元數,以及精確的位址總數。其餘的位元稱為主機位元,範圍的大小正好是該主機數的 2 次方,因此 /64 包含 2⁶⁴ 個數值,/128 包含一個位址,而 /0 則涵蓋完整的 128 位元空間。本地瀏覽器的 BigInt 運算即使在非常大的範圍下也能保持每個結果完全精確,這也是為什麼計算機是在不進行四捨五入、縮寫或參考介面狀態的情況下,驗證長度最安全的方式。讀者正在完成的工作不只是為這個數字命名:而是將前置碼長度對應到一個可用於文件或設定的網路邊界,並以作業系統或路由器所公告的同一個整數來確認該邊界。

IPv6 前置碼長度實際代表的意義
RFC 4291 所定義的 IPv6 位址架構,將每個位址視為一個 128 位元的整數。前置碼長度是介於 0 到 128 之間的整數,代表最高有效位元中有多少位元構成網路識別碼;剩餘的 128 減去該數字的位元稱為主機位元,定義了位址範圍的大小。當主機位元全為 0 時,該值即為網路位址。當每個主機位元都為 1 時,該值即為該範圍的數值上限。位址總數是 128 減去前置碼長度之差的 2 次方,並使用瀏覽器 BigInt 精確表示,因此 /0 會產生完整的 2¹²⁸ 位址空間而不會損失浮點精度,/128 則會產生單一位址。
RFC 5952 規範了文字表示法在線路上與文件中應有的格式:十六進位字母為小寫、八個 16 位元欄位中每個欄位內的前導零必須移除、最長的連續兩個以上全零欄位會被合併為雙冒號,平手時以第一個出現的為準。單一零欄位會保留為 0,因為該規則要求至少兩個欄位連續為零。讀寫前置碼長度因此在某種程度上變成文字一致性問題,而不只是數值問題,這也是為什麼當你把一個值貼到設定檔、RFC 範例或監控腳本中,並希望得到相同格式時,能輸出 RFC 5952 規範格式的計算機非常有用。
在主機或路由器上讀取前置碼長度
在實際環境中找出前置碼長度最快的方法,就是直接詢問作業系統或路由器剛才指派的內容。在 Windows 上,ipconfig /all 會列出每個 IPv6 位址及其後綴(例如 /64),而以 fe80:: 開頭的鏈路本地端位址旁邊也會顯示相同的後綴。在 Linux 上,ip -6 addr 或 ip -6 address show 會列出每個位址及其前置碼長度,ip -6 route 中預設路由與 on-link 路由的同一欄位也會顯示。在 macOS 上,ifconfig 輸出與 netstat -rn 都會顯示前置碼長度欄位。大多數消費型路由器的管理介面會在 WAN 狀態中顯示委派的前置碼,並在 LAN 設定中顯示每個 LAN 介面的前置碼,通常以 CIDR 形式書寫。
當尚未設定任何介面時,前置碼長度就是提供者、配置政策或文件所給定的值。文件中的前置碼(例如 2001:db8::/32)一律會附上所指派的長度,而 /64 是單一 LAN 區段上用於 SLAAC 的標準長度。如果你只有位址文字而沒有斜線,則前置碼長度是未知的:單獨一個位址無法告訴你它所在的範圍。這時就該使用數值計算機了。至於在已知斜線時如何取出網路部分這個密切相關的工作,找出位址的 IPv6 前置碼的逐步指南會以較長的形式說明計算的該部分。
| 前置碼長度 | 典型部署 | 主機位元 |
|---|---|---|
| /128 | 單一位址、回環、主機路由 | 0 |
| /64 | SLAAC 與大多數終端站點的標準 LAN 區段 | 64 |
| /60 | 住宅委派的細粒度 | 68 |
| /56 | 常見家用路由器的前置碼大小 | 72 |
| /48 | 單一站點的企業或客戶配置 | 80 |
| /32 | ISP 等級的區塊或大型組織配置 | 96 |
| /0 | 涵蓋整個位址空間的預設靜態路由 | 128 |
上表中每一列的精確位址總數都是主機位元欄位值的 2 次方,應在計算機中進行確認;本表僅列出常見配置指南中所描述的典型部署角色。
找出前置碼長度並計算其範圍
當你手邊有一個位址與一個候選前置碼長度時,可以將兩者一起輸入 IPv6 子網路計算機,本地查看精確的網路、規範化輸入格式與數值範圍。
- 開啟 IPv6 子網路計算機並貼上純 IPv6 位址。可以使用展開為八個十六進位欄位的完整形式,或最多包含一個雙冒號的 RFC 5952 壓縮形式。請移除所有方括號、通訊埠或後綴字元;該頁面會拒絕區域識別碼與點分十進位混合形式。
- 在號碼段欄位中輸入介於 0 到 128 之間的整數前置碼長度。不要包含斜線;計算機只接受純數字,介於 0 到 128 之外的值將會被拒絕。
- 選擇 Calculate subnet(計算子網路)。該頁面會將文字解析為 128 位元的 BigInt,在瀏覽器記憶體中套用號碼段遮罩,並在不將位址傳送給任何外部服務的情況下呈現結果。
- 檢視輸入的規範化形式、附帶自身 /length 的網路前置碼、數值形式的第一個位址、數值形式的最後一個位址、主機位元數與精確的位址總數。如果規範化形式與你貼上的內容不同,請先判斷原始內容是否被錯誤引用,再決定是否重複使用該結果。
- 對於生產環境的變更,請獨立在平台支援的工具中驗證計算出來的範圍,並保留先前的設定以便回滾,因為計算機不會查詢路由器表、BGP、DNS、WHOIS 或任何介面狀態。
解讀規範化的範圍輸出
計算機回傳的數值欄位描述了一個前置碼及其位址集合。規範化輸入是以小寫 RFC 5952 形式重新書寫的你所輸入的位址。網路前置碼是同一個整數,但所有主機位元皆為零,並附加 /length。數值形式的第一個位址等於網路前置碼本身,因為網路值的所有主機位元已經為零。數值形式的最後一個位址則是將網路前置碼的所有主機位元設為 1。主機位元欄位為 128 減去所選的前置碼長度,位址總數欄位則是該主機位元數的 2 次方,以精確整數字串表示。
當你把這些數字複製回文件中時,有幾個細節值得注意。/128 範圍恰好只包含一個位址,也就是你輸入的位址,因此第一個與最後一個欄位會顯示為相同,主機位元數為零。/64 會將精確總數顯示為 2⁶⁴;這是一個 20 位數的十進位數字,沒有任何試算表能在不使用科學記號的情況下顯示它,這也是為什麼應將該值保留在計算機中,或直接從其字串輸出原樣複製。最後一個位址只是數值上的上限;IPv6 並未定義廣播位址,因此該欄位永遠不會標示為 broadcast(廣播)。輸出也會將十六進位字母標準化為小寫,並僅合併兩個以上連續的零欄位,完全符合 RFC 5952 的要求。
計算機不會為你決定的部分
子網路計算機所回傳的數值答案只是 128 位元範圍的邊界,僅此而已。根據 RFC 5942,位址指派與 on-link 前置碼是兩個不同的概念,計算機不會查詢路由器、BGP、WHOIS、DNS 或任何地理位置資訊來源。它不會告訴你該前置碼是否可路由、是否已全域指派、是否保留供文件使用、是否為多播、任播,或是否適合用於 SLAAC,也不會判斷 SLAAC 在該鏈路上是否合理。
區域識別碼(例如 %eth0)以及內嵌 IPv4 的點分十進位形式會被明確拒絕並顯示清楚的錯誤訊息,因為解析器僅處理純 IPv6 文字。可達性、擁有權、介面情境與設定政策,仍屬於網路工程問題,需由路由器、配置政策與組織的位址規劃來回答。請將計算出的邊界當作數值檢查;對於任何生產環境的變更,請以網路設計作為事實來源。
/60 文件前置碼的算例
取文件中的位址 2001:0DB8:0:CD30:123:4567:89AB:CDEF,並搭配前置碼長度 60,取自 RFC 4291 的範例。主機位元數為 128 - 60 = 68,因此位址總數為 2⁶⁸。網路位址是將輸入值的每個主機位元清零後的結果:欄位 0 與 1 保持為 2001:0DB8,欄位 2 保持為 0000,欄位 3 保持為 CD30,欄位 4 到 7 折疊為零,得到規範化網路 2001:db8:0:cd30::/60。數值上限則將 68 個主機位元全部設為 1,這會將欄位 3 的低四位元從 0000 變為 1111(將 CD30 變為 CD3F),並將欄位 4 到 7 填滿 1,產生最後一個位址 2001:db8:0:cd3f:ffff:ffff:ffff:ffff。將同一組數值輸入計算機,會回傳相同的網路字串、相同的最後一個位址,以及精確的 2⁶⁸ 位址總數;這就是在你將已知的前置碼長度與已知位址一起貼上並讀回規範化輸出時,所應期待的結果。