子網計算器
計算 IPv4/IPv6 網路位址、廣播位址、遮罩、主機範圍與 CIDR——全程在瀏覽器本地完成。
什麼是子網計算器?
子網計算器接收一個 IP 位址搭配 CIDR 前綴或子網遮罩,從中推導出該網路的結構性屬性:網路位址、廣播位址、可用主機範圍、總主機數,以及網路位元與主機位元之間的二進位邊界。網路工程師、系統管理員與開發者在規劃 VLSM 配置、撰寫防火牆規則、排查「為什麼這些主機彼此連不上」或設定路由表時,幾乎都會用到。背後的數學就是與遮罩做位元 AND/OR——原理簡單,實際手算卻容易出錯,IPv4 與 IPv6 位址分別為 32 位元和 128 位元時更是如此。本計算器完全在瀏覽器中執行,使用 BigInt 運算來處理完整的 IPv6(/0 到 /128)而不會損失精度,且不會把你貼上的位址傳送到任何伺服器。
使用方法
使用步驟
- 用頂部的切換按鈕選擇 IPv4 或 IPv6。
- 在輸入框中輸入 IP 位址,例如 10.0.0.42 或 2001:db8::1。
- 用數字輸入框或滑桿調整前綴長度,結果會即時更新。
- 點擊任一結果方塊,即可將該值複製到剪貼簿。
- IPv4 模式下,可選擇設定更長的目標前綴,將網路切分為更小的子網。
常見誤區
- /31 網路並非無效——RFC 3021 明確允許在點對點鏈路上使用,兩個位址都可作主機。
- /32 代表單一主機(主機路由),而非空網路。IPv6 的 /128 也是同樣道理。
- IPv6 沒有「廣播位址」的概念,該欄位顯示的是前綴的最後一個位址,在範圍判斷上扮演相同角色。
- 萬用字元遮罩(用於 Cisco ACL)就是子網遮罩的位元 NOT——0.0.0.255 即 255.255.255.0 對應的萬用字元。
使用場景
技術原理
IPv4 位址是 32 位元,IPv6 是 128 位元。CIDR 標記法(RFC 4632,2006 年 8 月)在位址後附加前綴長度 /n,宣告最左邊 n 位元為網路識別碼,其餘位元為主機識別碼。子網遮罩是一段位元樣式:n 個連續的 1 後接 32−n(或 128−n)個 0——/24 對應的就是 11111111.11111111.11111111.00000000,點分十進位寫法是 255.255.255.0。CIDR 取代了 RFC 791 較早的分類定址(0.0.0.0–127.255.255.255 屬於 A 類(隱含 /8),其中 0.0.0.0/8 保留作「本網路」、127.0.0.0/8 保留作迴路;128.0.0.0–191.255.255.255 屬於 B 類(/16);192.0.0.0–223.255.255.255 屬於 C 類(/24)),分類定址浪費位址相當嚴重:一家 1,000 人規模的公司分到 B 類就會拿到 65,534 個主機位址,導致 IPv4 空間支離破碎。CIDR 允許任意前綴長度,催生了 VLSM(可變長度子網遮罩,最早在 1985 年的 RFC 950 中正式定義)與路由聚合(supernetting)。 核心運算是位元層級的:network = address AND mask;broadcast = network OR (NOT mask) = network OR wildcard。以 192.168.1.100/24 為例,位址 0xC0A80164 與 0xFFFFFF00 做 AND 得到 0xC0A80100(192.168.1.0),與 0x000000FF 做 OR 得到 0xC0A801FF(192.168.1.255)。IPv4 的可用主機數是 2^(32−n) − 2(扣掉網路與廣播位址);這個 −2 在 /31 時不成立(RFC 3021 把它收回給點對點鏈路使用,兩端都可用),/32 也不成立(單一主機路由)。IPv6 沒有廣播位址——多點傳送與任意傳送取代了它——因此「最後位址」只是前綴範圍的上界。JavaScript 原生的位元運算子是 32 位元有號數,IPv4 的 0xFFFFFFFF 會溢位(變成 −1),IPv6 更是無法表示;本計算器全程使用 BigInt,確保兩種版本的計算結果完全一致。 IPv4 的私有位址空間由 RFC 1918 定義:10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。IPv6 則是用 fc00::/7 範圍內的 ULA(RFC 4193),加上用於 SLAAC 與本地通訊的鏈路本地 fe80::/10。計算器會標示這些範圍,避免你不小心把私有區段公布到公網 BGP。本工具能避免的常見錯誤包括:(1) 不確定 192.168.1.100/255.255.255.0 與 /24 是否相同——計算器接受前綴形式並顯示點分遮罩;(2) 算錯 /30 與 /29 的主機容量(2 個 vs 6 個主機);(3) 把 /24 切成八個 /27 時,誤判第四個子網的起點(應該是 192.168.1.96,不是 192.168.1.97);(4) 在 Cisco ACL 語法中混淆萬用字元 0.0.0.255 與遮罩 255.255.255.0。把網路位元突顯出來的二進位視覺化,是內化邊界概念、讓這些錯誤自然消失的最快途徑。
- RFC 4632(2006 年 8 月)定義了 CIDR——無類別域間路由——取代 RFC 791 的 A/B/C 分類方案。/n 標記法宣告網路前綴長度,其餘位元為主機部分。CIDR 催生了 VLSM(最早由 1985 年的 RFC 950 定義)與路由聚合,兩者皆是 IPv4 節省與現代 BGP 路由表的關鍵。
- 網路位址 = IP AND 遮罩;廣播位址 = 網路 OR 萬用字元(其中萬用字元 = NOT 遮罩)。/24 對應遮罩 0xFFFFFF00、萬用字元 0x000000FF。可用主機數 = 2^(32−n) − 2,例外:/31(RFC 3021,點對點鏈路兩個位址皆可用)與 /32(單一主機路由)。
- IPv6(128 位元)沒有廣播——由多點傳送(ff00::/8)與任意傳送取代。慣例最小前綴是 /64(用於 SLAAC,每個子網 18 京個位址);每個站點 /56 或 /48;每個 ISP /32。IPv6 位址空間優先考量路由聚合,而非位址節省。
- RFC 1918 之外的保留範圍:127.0.0.0/8 是迴路、169.254.0.0/16 是 IPv4 鏈路本地(auto-IP / APIPA)、224.0.0.0/4 是多點傳送、240.0.0.0/4 保留作實驗用途。IPv6 同樣保留 fe80::/10 給 SLAAC 鏈路本地、ff00::/8 給多點傳送、::1/128 作迴路。計算器會區分私有與公開範圍,讓你一眼就能判斷輸入的位址是否可在公網上路由。
- JavaScript 位元運算子是 32 位元有號數:(0xFFFFFFFF & 0xFFFFFF00) 會回傳 −256,而非 0xFFFFFF00。本計算器全程使用 BigInt,可處理完整的 IPv4 範圍與 128 位元 IPv6 而不損失精度。同一份程式碼能同時處理兩種版本,差別僅在遮罩寬度。
- Cisco/Juniper 常見陷阱:ACL 語法接受的是萬用字元遮罩(0.0.0.255),不是子網遮罩(255.255.255.0)。EIGRP 與 OSPF 的 network 語句同樣使用萬用字元。寫反的遮罩會比對到目標網段的補集——在路由協議中悄悄失敗(無法建立鄰接),在 ACL 中則會放行錯誤流量造成可被利用的漏洞。
- VLSM 範例:把 /24 平均切成 4 個子網,得到 4 × /26(每個 64 個位址),可用主機 62 個。相鄰 /26 的起點偏移為 0、64、128、192——而非 0、63、127、191。計算器的切分工具會自動產生這些邊界,免去你心算換算。
範例
標準 /24(最常見的區網)
輸入: 192.168.1.100/24
網路: 192.168.1.0
廣播: 192.168.1.255
遮罩: 255.255.255.0
萬用字元: 0.0.0.255
主機: 192.168.1.1 - 192.168.1.254 (254 個可用)
類別: C 類,私有 (RFC 1918)
二進位: 11000000.10101000.00000001.01100100
(網路位 = 左 24;主機位 = 右 8)點對點 /31 (RFC 3021)
輸入: 10.0.0.1/31
網路: 10.0.0.0
廣播: 10.0.0.1
遮罩: 255.255.255.254
主機: 10.0.0.0 - 10.0.0.1 (2 個可用,鏈路兩端皆可)
在 RFC 3021 之前,/31 因 2 - 2 = 0 而被視為「不可用」。
現代路由器允許在點對點鏈路上使用兩個位址,可在轉接段
節省一半的位址空間。VLSM 切分:/24 切成四個 /26
輸入: 192.168.1.0/24,切分至 /26
子網 1: 192.168.1.0/26 主機 .1 - .62
子網 2: 192.168.1.64/26 主機 .65 - .126
子網 3: 192.168.1.128/26 主機 .129 - .190
子網 4: 192.168.1.192/26 主機 .193 - .254
注意邊界:0、64、128、192——每個 /26 各有 64 個位址
(62 個可用)。常見錯誤是把子網 2 從 .63(子網 1 的廣播
位址 +1)開始——但 .63 本身就是廣播位址;下一個子網從
.64 開始。IPv6 /64(標準葉節點網路)
輸入: 2001:db8:1234:5678::1/64
網路: 2001:db8:1234:5678::
結束: 2001:db8:1234:5678:ffff:ffff:ffff:ffff
遮罩: ffff:ffff:ffff:ffff::
主機: 18,446,744,073,709,551,616 (2^64)
單一個 /64 的位址數比 IPv4 平方還多。SLAAC 必須使用 /64,
因為低 64 位元用來編碼介面識別碼(EUI-64 或 RFC 7217
所定義的隨機值)。常見問題
為什麼 /24 是 254 個可用主機,而不是 256?
/24 子網有 2^8 = 256 個位址,但其中兩個被保留:網路位址(192.168.1.0)在路由表中代表整個子網,廣播位址(192.168.1.255)用於發送給子網內所有主機的訊息。兩者都不能作為主機 IP,因此剩下 254 個可分配的位址。這個 −2 規則適用於 /1 到 /30 的所有 IPv4 前綴。例外:/31 有 2 個可用位址(RFC 3021,點對點),/32 有 1 個(單一主機路由)。
子網遮罩和萬用字元遮罩有什麼差別?
子網遮罩在網路部分是 1,主機部分是 0——/24 對應 255.255.255.0。萬用字元遮罩是它的位元 NOT——/24 對應 0.0.0.255。Cisco IOS 的 access-list、EIGRP、OSPF 都使用萬用字元,因為原始 ACL 實作採「don't care」模型(萬用字元中為 1 的位元代表「這位元不必比對」)。其他廠商以及多數較新的 Cisco 語法也支援子網遮罩形式,但你接手的舊有設定通常都是萬用字元寫法。
IPv6 有廣播位址嗎?
沒有。IPv6 刻意移除了廣播,改用多點傳送(ff00::/8)與任意傳送。「all-nodes」範圍是 ff02::1,行為類似 IPv4 的鏈路本地廣播,但只會送達已加入該多點傳送群組的節點。因此在 IPv6 模式下,計算器把這個值標示為「最後位址」而非「廣播位址」;你也無法像 IPv4 的 255.255.255.255 那樣對它送出封包——協議層面就不存在能把封包送到每台主機的機制。
依舊公式 /31「沒有可用主機」,那它為何有用?
2000 年以前的教科書說 /31 有 2^1 − 2 = 0 個可用主機,因此無效。RFC 3021(2000 年 12 月)為點對點鏈路重新定義 /31:鏈路上剛好兩個端點,不需要獨立的廣播位址——鏈路本身就界定了廣播範圍。現代路由器(IOS 12.2+、Junos、FRR、Linux)都支援 /31。轉接鏈路改用 /31 而非 /30,可以省下一半的位址消耗,在大型網路上萬條鏈路累積起來相當可觀。
為什麼我看到的 IPv6 子網好像都是 /64?
依慣例,IPv6 分配給葉節點網路的最小單位就是 /64。低 64 位元保留給介面識別碼——SLAAC(RFC 4862)會用 MAC 位址(EUI-64)、基於網路字首與每主機密鑰的穩定雜湊 (RFC 7217),或短期隨機值 (RFC 4941 隱私延伸) 產生這部分。在點對點鏈路上靜態配置 /126 或 /127 技術上可行,但會讓 SLAAC 與許多自動化功能失效。建議所有承載終端設備的子網都用 /64;/127 僅用於可完全掌控的路由器對路由器鏈路。
這個工具會把我的 IP 位址送到伺服器嗎?
不會。所有計算都在你的瀏覽器中以 JavaScript BigInt 運算完成,不會把任何位址、前綴或計算結果傳送到後端。你可以打開瀏覽器 DevTools 的網路頁籤驗證——計算過程中不會有對外請求。這符合 ToolAct 所有瀏覽器端工具的隱私原則。
/24 和 255.255.255.0 有什麼差別?
功能上沒有差別——兩者只是同一個遮罩的不同寫法。/24(CIDR 標記法,RFC 4632)計算前面 1 位元的數量;255.255.255.0(點分十進位遮罩)把那些位元寫成四個八位元組的數字。多數現代作業系統與路由器設定兩種寫法都接受。計算器會同時顯示兩種形式,方便你依目標系統的需求複製貼上。
為什麼計算器會拒絕 010.0.0.1 這類輸入?
前導零(010、04、0001)會被拒絕,是因為同一個字串在不同的 IP 解析器中代表不同的意思——glibc 的 inet_aton 在歷史上會把帶前導零的八位元組解讀為八進位(010 = 8),而現代 Python(3.9.5+)與 JavaScript 執行環境則把它們當作十進位(010 = 10)。這種跨堆疊的解讀分歧曾造成實際的 SSRF 繞過漏洞(CVE-2021-29921 及其同族問題):某個服務在白名單檢查時把 010.0.0.1 視為 8.0.0.1,而下游函式庫實際連線到的卻是 10.0.0.1。為避免暗示某種特定解讀,本計算器會拒絕任何帶前導零的八位元組——請先去掉前導零(010 → 10)再貼上。