ByteScope

Subnet Calculator

貼上 CIDR、單一位址,或位址加遮罩——IPv4 與完整的 IPv6,全部在你的瀏覽器裡算完。

檔案不會離開你的瀏覽器 — 全部在本機處理。

可以只打位址,也可以用 address/prefix、address/netmask、位址加空白再接遮罩,或十六進位遮罩,IPv4 IPv6 都吃。

關於這個工具

貼上任何看起來像網路的東西,剩下的交給這台計算機:192.168.1.0/24、單獨一個位址、10.0.0.1/255.255.255.010.0.0.1 255.255.255.0/0xffffff00 這種 16 進位遮罩,IPv6 則不管你用哪種寫法都吃。它會給你網路位址、廣播位址、第一與最後一個可用主機、總位址數與可用主機數、各種表示法的遮罩,以及這個位址到底是什麼身分 — private、loopback、link-local、multicast、documentation 保留範圍、CGNAT — 判斷依據是 RFC 定義的 32 個特殊用途範圍,不是課本上那套 class A/B/C。

IPv6 在這裡是正規主角,不是事後補上的裝飾——市面上多數 subnet calculator 到今天還是只算 IPv4。前綴會正規化成 RFC 5952 的寫法(小寫 16 進位、只在最長的一串零上放一個 ::),::ffff:192.0.2.1 用混合表示法呈現,數量一律用大整數精算:一個 /48 真的是 1,208,925,819,614,629,174,706,176 個位址,而不是 1.2e24。這樣一來,規劃時真正會問的那些問題就都有答案了:一個 /56 或 /48 能切出幾個 /64、某個前綴是 ULA(fc00::/7)還是可全球路由、link-local 的 fe80::/10 落在哪裡。

子網路分割器會把上層前綴切成一樣大的下層:/24 切成四個 /26、/48 切成 256 個 /56,並列出每一個的網路位址、範圍與廣播位址。它是分頁產生而不是把整份清單做出來,所以你要求把 /8 切成 /30 也是即時回應——總數(4,194,304)用算術算出來,只組出你正在看的那一頁。遮罩轉換是雙向的:給前綴長度,回你點分十進位、16 進位與 wildcard 三種寫法;給 255.255.254.0 或 wildcard 0.0.1.255,回你前綴長度。而 255.0.255.0 這種不連續的遮罩會被擋下並附上理由,因為它不是合法的 CIDR。

所有計算都在你的瀏覽器裡完成——這頁是靜態檔案,背後沒有 API。這件事比一般的隱私宣示更實際:內部的定址規劃本身就是偵察材料,把 10.42.7.0/23 — 金流閘道 貼進一個會送到別人伺服器的表單,等於把自家網路的地圖交給陌生人。輸入亂打也不會讓頁面掛掉,它會直接指出問題在哪——192.168.01.1 開頭多一個零、一個 IPv6 位址裡出現兩個 ::、你說是網路位址但主機位元卻是 1——你可以直接改輸入,不用猜。

常見問題

IPv6 的廣播位址是什麼?

沒有這種東西。RFC 4291 把廣播從 IPv6 徹底移除,改用全節點 multicast 群組 ff02::1 取代;一段連線上最後那個位址,就只是另一個可用的介面位址。所以這台計算機對任何 IPv6 前綴都把廣播欄位留空。如果別的工具給你看 IPv6 的「廣播位址」,那它其實是把範圍裡的最後一個位址,掛上一個根本不存在的名字。

為什麼 /31 有 2 個可用主機、/32 有 1 個?

因為 /31 是 RFC 3021 這樣定的,而 /32 就是一條主機路由。點對點連線上的 /31 既不需要網路位址也不需要廣播位址——兩端各拿一個位址直接用——所以它是路由器對接的標準做法,每條連線比 /30 省下兩個位址。再往下,/32 就是一個位址:loopback、VIP,或只對一台主機生效的防火牆規則。課本那條 2^主機位元 − 2 的公式對這兩者都會算出 0,所以這裡特別處理,而不是印出一個沒有意義的數字。

為什麼 IPv6 的 /64 只少一個位址,不是兩個?

少掉的那一個是 Subnet-Router anycast 位址,也就是介面 ID 全為零的那個(2001:db8::/64 就是 2001:db8::),RFC 4291 把它保留給這段連線上的路由器。另一頭沒有廣播位址可以扣,所以只扣一次。實務上這個數字接近學術問題:一個 /64 有 18,446,744,073,709,551,615 個可用位址,而且反正 SLAAC 要求 /64,每段連線本來就該給一個 /64。

把 /8 切成 /30 會不會讓瀏覽器卡死?

不會。分割器用算術算出總數(4,194,304 個子網路),只組出你正在看的那幾列,預設一次 256 筆,你可以一頁一頁翻,也可以直接跳到某個 offset。它不會把全部結果塞進記憶體,所以再誇張的要求都和合理的要求一樣快。

100.64.0.0/10 是什麼?為什麼我沒辦法對它做 port forwarding?

那段是 CGNAT 用的範圍(RFC 6598):電信商沒辦法幫每個客戶配一個公開 IPv4 位址之後發出來的位址,也就是 carrier-grade NAT 的空間。如果你路由器的 WAN 位址落在 100.64.0.0/10,那它除了自家 NAT 之外還被電信商的 NAT 包了一層,從外面進來的 port forwarding 就不可能成立——因為沒有任何公開位址通到你這裡。這台計算機會把這種位址標成 CGNAT 而不是「公開」,通常看到那一行就懂了。解法只有三種:向電信商申請真正的公開 IPv4、改用 IPv6(有 CGNAT 的環境通常也給 IPv6),或自己往外開一條 tunnel。

為什麼 fe80::1%eth0 會被拒絕?

問題出在 %eth0:那是 zone id,指的是某一台機器上的某個介面,而不是這個位址本身的性質。fe80::1%eth0fe80::1%wlan0 在你的筆電上是兩個不同的目的地,在我的機器上兩個都不代表任何東西,所以計算機對 zone 這一段沒辦法說出任何為真的事。把它拿掉、貼 fe80::1(要看前綴就貼 fe80::/10),其他一切照常。