# Subnet Calculator

> 線上免費 CIDR 計算機，IPv6 完整支援：算出網路位址、廣播位址、可用主機範圍與數量，遮罩的點分十進位／16 進位／wildcard 互轉，還能把 /24 切成一堆 /26。

- URL: https://bytescope.dev/zh-Hant/subnet-calculator/
- Locale: zh-Hant · Also: [en](https://bytescope.dev/en/subnet-calculator.md) · [ja](https://bytescope.dev/ja/subnet-calculator.md)
- Runs: 全部在你的瀏覽器裡跑，什麼都不會上傳。
- Requires: Any modern browser (Chrome, Edge, Firefox, Safari), desktop and mobile.
- Updated: 2026-09-08

## What it does

貼上任何看起來像網路的東西，剩下的交給這台計算機：`192.168.1.0/24`、單獨一個位址、`10.0.0.1/255.255.255.0`、`10.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——你可以直接改輸入，不用猜。

## Limits

Does not look up who owns an address or scan a network; it does IPv4/IPv6 CIDR arithmetic.

## Machine output

Copy JSON copies an envelope `{ tool, url, generatedAt, userAgentHint, result }`. `tool` is `"subnet-calculator"`; `result` is the on-screen CIDR analysis below. Split-children tables are omitted. `totalAddresses` and `usableHosts` are decimal digit strings, not JSON numbers, because IPv6 counts can exceed Number.MAX_SAFE_INTEGER.

- `version` (number | null) — `4` or `6`. `null` = not analysed.
- `input` (string | null) — Trimmed text the user typed. `null` = not analysed.
- `address` (string | null) — Canonical address as typed (host bits kept). `null` = not analysed.
- `mixedNotation` (string | null) — RFC 5952 mixed form for IPv4-mapped addresses (e.g. `::ffff:192.0.2.1`). `null` = not IPv4-mapped or not analysed.
- `cidr` (string | null) — Canonical `network/prefix`. `null` = not analysed.
- `network` (string | null) — Network address (host bits cleared). `null` = not analysed.
- `firstHost` (string | null) — First assignable host. `null` = not analysed.
- `lastHost` (string | null) — Last assignable host. `null` = not analysed.
- `broadcast` (string | null) — IPv4 directed broadcast. `null` = IPv6 (IPv6 has no broadcast) or not analysed.
- `totalAddresses` (string | null) — Address count as a decimal digit string. `null` = not analysed.
- `usableHosts` (string | null) — Usable host count as a decimal digit string. `null` = not analysed.
- `hostBitsSet` (boolean | null) — Typed address had host bits set. `null` = not analysed.
- `isPointToPoint` (boolean | null) — `/31` or `/127`. `null` = not analysed.
- `isSingleAddress` (boolean | null) — `/32` or `/128`. `null` = not analysed.
- `prefixLength` (number | null) — Prefix length. `null` = not analysed.
- `netmaskDotted` (string | null) — IPv4 dotted netmask. `null` = IPv6 or not analysed.
- `netmaskHex` (string | null) — `0x`-prefixed hex mask. `null` = not analysed.
- `wildcard` (string | null) — Wildcard / host mask, same-family text. `null` = not analysed.
- `classificationName` (string | null) — Special-use range label (e.g. `"Private-Use"`). `null` = no matching range (ordinary / unassigned) or not analysed.
- `classificationRfc` (string | null) — Defining RFC (e.g. `"RFC 1918"`). `null` = no matching range or not analysed.

## FAQ

### 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%eth0` 和 `fe80::1%wlan0` 在你的筆電上是兩個不同的目的地，在我的機器上兩個都不代表任何東西，所以計算機對 zone 這一段沒辦法說出任何為真的事。把它拿掉、貼 `fe80::1`（要看前綴就貼 `fe80::/10`），其他一切照常。
