# 網段說明
:::info
🚩 這裡提供一些簡介
:::
## 說明
:::warning
🚀 IP位址: **192.168.1.1/24** (子網路遮罩: 255.255.255.0)
:::
> 根據 /24 的前置碼 (prefix),可以得知子網路遮罩為 255.255.255.0。
假設你的主機 IP 位址為 192.168.1.1
下面列出了可以 ping 到的 IP 位址及其前置碼
1. 10.10.10.1/24:
這個 IP 位址位於另一個不同的網路,其前置碼也是 /24,也就是相同的子網路遮罩 255.255.255.0。因此,你可以 ping 到這個 IP。
2. 192.168.100.1/24:
這個 IP 位址位於相同的網路,其前置碼也是 /24,子網路遮罩同樣是 255.255.255.0。你可以 ping 到這個 IP。
## 注意事項
- 因為這些 IP 位址的**前置碼**和**子網路遮罩與你的主機相同**,所以你**可以**順利地在相同的網路上進行 ping。
- 如果其他 IP 位址的**前置碼**和**子網路遮罩不同於你的主機**,則你可能**無法**在相同的網路上 ping 到它們。
## Private IP
|Class|Range|Mask|數量|
|--|--|--|--|
|Class A | `10.0.0.0` - `10.255.255.255` | `255.0.0.0` | 16777216
|Class B | `172.16.0.0` - `172.31.255.255` | `255.255.0.0` | 65536
|Class C | `192.168.0.0` - `192.168.255.255` | `255.255.255.0` | 256
---
# 網段計算
:::info
🚩 這裡提供一些相關計算之說明。
:::
## 以 `199.1.1.100/28` 為例
### 🧰 **IPAddress** `199.1.1.100`
- IP 地址是 `199.1.1.100`
將它轉換成二進位表示為 `11000111 00000001 00000001 01100100`。
### 🧰 **IPAddress.Mask**
:::warning
🎯 **快速算法**
記下分段規則
| **CIDR Value** | **Subnet Mask** | 備註 |
| ---------| ------------------ | --------- |
| 24 | 255.255.255.`0` | |
| 25 | 255.255.255.`128` | 128 |
| 26 | 255.255.255.`192` | 128+64 |
| 27 | 255.255.255.`224` | 128+64+32 |
| 28 | 255.255.255.`240` | 128+64+32+16 |
| 29 | 255.255.255.`248` | 128+64+32+16+8 |
| 30 | 255.255.255.`252` | 128+64+32+16+8+4 |
> P.S 如果是 `24-n` 則往回推,概念相同
> 範例以`24`為例是因為我們通常使用屬`Class C`的`192.168.x.x`
> 如果今天是`23`則遮罩為 255.255.`254`.`0` (-2)
已知prefix為`28`
故子網路遮罩為 `255.255.255.240`
:::
自最高位元往後,總共有`28`個`1`
- 子網路遮罩為 `255.255.255.240`
將其轉換成二進位表示為 `11111111 11111111 11111111 11110000`。
### 🧰 **Subnetwork Number**
:::warning
🎯 **快速算法**
256 - 240 = 16
求子 **網路編號(簡稱n)** 必須遵守以下三個規則
1. n**必需小於等於**所提供的IP區段,**n ≤ 100** (199.1.1.100)
2. n**必需為`16`的倍數** (256-240=16)
3. n**必需為整數**
而`96`最接近`100`
所以本主機子網路編號為`199.1.1.96`。(n為整數)
:::
將 **IP地址** 和 **子網路遮罩** 進行 "**AND**" 運算,得到**子網路編號**。
```json
11000111 00000001 00000001 01100100 (IP 地址)
& 11111111 11111111 11111111 11110000 (子網路遮罩)
---------------------------------------------------------
= 11000111 00000001 00000001 01100000
```
子網路編號為 `199.1.1.96`。
### 🧰 **IPAddress.Broadcast**
:::warning
🎯 **快速算法**
廣播位址為下一個子網路編號再-1,通常是本網段範圍的最後一個IP
96 + 16 – 1 = 111
故廣播位址為 `199.1.1.111`
:::
將 **IP地址** 和 **反轉後的子網路遮罩** 進行 "**OR**" 運算,得到**廣播位址**。
```java
11000111 00000001 00000001 01100100 (IP 地址)
| 00000000 00000000 00000000 00001111 (反轉後的子網路遮罩)
---------------------------------------------------------
11000111 00000001 00000001 01101111
```
將二進位的廣播位址轉換為十進位表示: `199.1.1.111`
### 🧰 **IPAddress.Range**
- 網路地址加 `1` 通常是第一個可用 IP 地址。
- 廣播位址減 `1` 通常是最後一個可用 IP 地址。
- 在這個例子中,子網路編號為 `199.1.1.96`
所以可用範圍為 `199.1.1.97` ~ `199.1.1.110` 。
### 🚂 **Result**
```cpp
Address: 199.1.1.100/28
Mask: 255.255.255.240
Broadcast: 199.1.1.111
AvailableRange: 199.1.1.97 ~ 199.1.1.110
```
---
## 以 `10.10.10.10/26` 為例
### 📻 **IPAddress** `10.10.10.10`
- IP 地址是 `10.10.10.10`
將它轉換成二進位表示為 `00001010 00001010 00001010 00001010`。
### 📻 **IPAddress.Mask**
:::warning
🎯 **快速算法**
記下分段規則
* 24: 255.255.255.`0`
* 25: 255.255.255.`128` (128)
* 26: 255.255.255.`192` (128+64)
* 27: 255.255.255.`224` (128+64+32)
* 28: 255.255.255.`240` (128+64+32+16)
* 29: 255.255.255.`248` (128+64+32+16+8)
* 30: 255.255.255.`252` (128+64+32+16+8+4)
* 31: 255.255.255.`254` (128+64+32+16+8+4+2)
已知prefix為`26`
故子網路遮罩為 `255.255.255.192`
:::
自最高位元往後,總共有`26`個`1`
- 子網路遮罩為 `255.255.255.192`
將其轉換成二進位表示為 `11111111 11111111 11111111 11000000`。
### 📻 **Subnetwork Number**
:::warning
🎯 **快速算法**
256 – 192 = 64
求子 **網路編號(簡稱n)** 必須遵守以下三個規則
1. n**必需小於等於**所提供的IP區段,**n ≤ 10** (10.10.10.10)
2. n**必需為`64`的倍數** (256 – 192 = 64)
3. n**必需為整數,也可以是0**
而`0`最接近`10`
所以本主機子網路編號為`10.10.10.0`。(n為整數)
:::
將 **IP地址** 和 **子網路遮罩** 進行 "**AND**" 運算,得到**子網路編號**。
```json
00001010 00001010 00001010 00001010 (IP 地址)
& 11111111 11111111 11111111 11000000 (子網路遮罩)
---------------------------------------------------------
= 00001010 00001010 00001010 00000000
```
子網路編號為 `10.10.10.0`。
### 📻 **IPAddress.Broadcast**
:::warning
🎯 **快速算法**
廣播位址為下一個子網路編號再-1,通常是本網段範圍的最後一個IP
0 + 64 – 1 = 63
故廣播位址為 `10.10.10.63`
:::
將 **IP地址** 和 **反轉後的子網路遮罩** 進行 "**OR**" 運算,得到**廣播位址**。
```java
00001010 00001010 00001010 00001010 (IP 地址)
| 00000000 00000000 00000000 00111111 (反轉後的子網路遮罩)
---------------------------------------------------------
00001010 00001010 00001010 00111111
```
將二進位的廣播位址轉換為十進位表示: `10.10.10.63`
### 📻 **IPAddress.Range**
- 網路地址加 `1` 通常是第一個可用 IP 地址。
- 廣播位址減 `1` 通常是最後一個可用 IP 地址。
- 在這個例子中,子網路編號為 `10.10.10.0`
所以可用範圍為 `10.10.10.1` ~ `10.10.10.62` 。
### 🚝 **Result**
```cpp
Address: 10.10.10.10/26
Mask: 255.255.255.192
Broadcast: 10.10.10.63
AvailableRange: 10.10.10.1 ~ 10.10.10.62
```