%%
# 纲要
> 主干纲要、Hint/线索/路标
- IPv4 编址
- IPv4 数据报格式
- IPv4 分片与重组
# Q&A
#### 已明确
#### 待明确
> 当下仍存有的疑惑
**❓<font color="#c0504d"> 有什么问题?</font>**
%%
# IPv4 编址
每个 IPv4 地址为 **4 字节 32 位**,采用 "**点分十进制表示**",例如 `192.168.0.1`。
一个 IPv4 地址由 **==网络号==** 和 **==主机号==** 两部分组成:
- **网络号**:标识 **IP 地址所在的具体网段/子网**,用于不同网络寻址。
- **主机号**:标识**该网段中的某台具体主机**,用于**局域网内通信**。
在 IPv4 编址方案上有两种[^1] [^2]:
- **==分类编址==**(Classful Addressing)——最早期互联网采用的方案
- 特点:**对 IP 地址划分了 ABCDE 五类**,其中 **ABC 类可用于给网络中主机编址**,对应的**网络号部分固定长度**分别为 **8、16、24 比特**。
- 缺点:由于**网络号长度固定**,**故每个网络可容纳的主机数固定**,故要么过大要么过小,例如 B 类地址可容纳 65534 台主机,而 C 类地址只能容纳 254 台主机,长此以往**导致了 IP 地址枯竭**。
- **==无类别间域路由选择==**(Classless Inter-Domain Routing,**==CIDR==**)——**现代互联网采用的编制方案**,自 20 世纪 90 年代以来
- 特点:IPv4 地址表示为 `a.b.c.d/x` 形式,必须指明 "**网络前缀**" 长度。
- **网络号部分** 需要通过 **用 "IPv4 地址" 与 "==子网掩码==" 做 "按位与"** 得到。
> [!example] Windows 下 IPv4 地址配置
>
> 
>
>
<br><br>
## CIDR 编址方案
> **==CIDR==** (Classless Inter-Domain Routing,**无类别间域路由选择**),即 "**无分类编址方案**"
CIDR 编址方案**取消了 "分类编址" 中 ABC 三类地址的固定划分**,消除了这三类地址中**的固定网络号长度**,
而引入了 "**可变长的网络前缀**",将 IPv4 地址划分为两个部分——IP 地址 = **网络前缀** + **主机号**,
其中 "**==网络前缀==" 的长度==可任意指定**==,从而**允许按需进行更灵活、精细的 ==IP 地址块分配(即网络划分)==**。
下图参见[^3]
![[_attachment/02-开发笔记/07-计算机网络/网络层/IPv4 编址.assets/IMG-IPv4 编址-BC96CA563DFB4DF6FFE864EF16F755A3.png|626]]
> [!example] CIDR vs 分类编址
>
> - 在分类编址中,**地址 `172.16.0.0` 为 B 类地址,网络号固定为 16 位,主机号固定为 16 位,该网段可分配 65534 台主机。**
> - 在 CIDR 方案中,**地址 `127.16.0.0` 的==网络前缀长度可任意指定==**,**从而可以灵活划分出多个不同的网段**。
> - 例如,`127.16.0.0/24` 网段可分配 254 台主机,而 `127.16.0.0/23` 可分配 510 台主机,
>
> [!NOTE] CIDR 相较于 "分类编址" 的主要变化
>
> CIDR 方案**不再划分 ABC 类地址**,但对于 DE 类地址,以及特殊地址(私有地址、环回地址等)均进行了延用,**保留这些地址的特殊用途**。
> [!caution] CIDR 是 **"==划分 IP 地址块==" 的方案**,应用时**需保证 "==IP 地址==" 的唯一性**——**每个 IP 地址==不会被重复用于不同网段==**
>
> - 对于公网 IP 地址,由**互联网注册机构向 ISP 分配地址块**,其保证公网 IP 地址在整个互联网上的唯一性。
> >
> - 对于私网 IP 地址,由网络管理员分配,其同样需要保证**私网 IP 地址在局域网内的唯一性**。
> - 例如,一个路由器连接两个局域网 `192.168.0.0/24`、`192.168.0.0/27`,则不允许两个网段中**同时使用 IP 地址** `192.168.0.1`。假设两台主机分别设置为 `192.168.0.1/24` 和 `192.168.0.1/27`,则发往 IP 地址 `192.168.0.1` 的网络包将由路由器根据**最长前缀匹配**原则均转发给主机 `192.168.0.1/27`。
>
在 CIDR 方案下,支持:
- **==子网划分==**:子网划分在分类编址时就存在,在 CIDR 下同样支持。
- **==路由聚合==**(超网):支持将一个小网络聚合为大望路(**聚合多个网络前缀**得到**缩短的网络前缀**),可将多条路由合并为一条,从而减少路由表规模。
<br>
### CIDR 表示法
CIDR 编址方案[^4]下,采用 **`a.b.c.d/x` 形式**的 "**CIDR斜线记法**" 表示**一个 IPv4 地址及其网络前缀长度**,
其中斜线后的 `x` 表示 "**==网络前缀==**" 所占的 **==位数==**,也即 **"==子网掩码==" 的全 1 前缀位数**。
> [!important] 在 CIDR 方案下,对**一个 IPv4 地址必须同时给出 ==网络前缀长度(or 子网掩码)==**,才能**确定所属网段及主机号**,从而进行网络寻址。
CIDR 表示法如下图所示:[^5](P27)
![[_attachment/02-开发笔记/07-计算机网络/网络层/IPv4 编址.assets/IMG-IPv4 编址-8BF962F569805D7B786A915EA626AB56.png|613]]
> [!NOTE] 利用子网掩码求 IPv4 地址的网络地址
>
> ![[_attachment/02-开发笔记/07-计算机网络/网络层/IPv4 编址.assets/IMG-IPv4 编址-450D4BCC8E3E1317745BEEF5B62DCD0B.png|640]]
>
>
> [!example] CIDR 编址示例
>
>
> - IP 地址:`192.168.0.100`,二进制表示为:`11000000 10101000 00000000 01100100`
> - 子网掩码:`255.255.255.192`,二进制表示为:`11111111 11111111 11111111 11000000`
>
> 子网掩码前 26 位为 1, **故 IP 地址前 26 位为网络地址,后六位为主机地址**,因此:
>
> - 该 IP 地址所在的**网络地址**为:**11000000 10101000 00000000 01**000000 —> `192.168.0.64`;
> - 该 IP 地址所属网段下的**广播地址**:11000000 10101000 00000000 01**111111** —> `192.168.0.127`(主机位全置 1 得到)
>
> 由此可知,该 IP 地址所处子网为局域网 **`192.168.0.64` 网段**,该网段的**广播地址为 `192.168.0.127`**,
> 该网段共可分配 62 台主机,对应 IP 地址为 `192.168.0.65 ~ 192.168.0.126`。
>
<br><br>
## 分类编址方案
> 现代互联网**采用 CIDR 方案**,已不再使用分类编址方案。
分类编址的优缺点:
- 优点:**解析分类快**:-> 从首位起依次判断各个位是否为 0,即可确认分类
- 缺点:**网络位**与**主机位**固定,无法灵活划分。
### IPv4 地址划分
**分类编址方案** 对 IPv4 地址进行了如下划分:

总结说明:
| IPv4 地址分类 | 网络号长度 | 固定前缀 | 有效地址范围 | 说明 |
| --------- | --------- | ----- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **A 类** | 1 字节 8 位 | 0 | **1.0.0.0 - 126.255.255.255** | - `0.x.x.x` 与 `127.x.x.x`是两个特殊地址段 <br>- 网络号范围:`1.0.0.0 — 126.0.0.0` (共 126 个)<br>- 私有地址:`10.X.X.X` (局域网中使用的地址)<br>- 保留地址:`127.X.X.X`<br>- 单个网段最大主机数量:16777214 台( $2^{24}-2$ ) |
| | | | | |
| **B 类** | 2 字节 16 位 | 10 | **128.0.0.0** - 191.255.255.255 | - 网络号范围:128.0.0.0 — 191.255.0.0<br>- 私有地址:172.16.0.0 — 172.31.255.255<br>- 保留地址:169.254.X.X (IP 地址为自动获取,且无可用 DHCP 服务时,分配该地址)<br>- 广播地址:191.255.255.255<br>- 单个网段最大主机数量: 65534 台 ($2^{16}-2$) |
| | | | | |
| **C 类** | 3 字节 24 位 | 110 | **192.0.0.0** - 223.255.255.255 | - 网络号范围:192.0.0.0 — 223.255.255.0 <br>- 私有地址:`192.168.X.X`<br>- 单个网段最大主机数量:254 台 ($2^{8}-2$) |
| | | | | |
| **D 类** | 无 | 1110 | **224.0.0.0** - 239.0.0.0 | 用于多播/组播(multicast),即一对多通信,做广播地址 |
| | | | | |
| **E 类** | 无 | 11110 | **240.0.0.0** - 254.0.0.0 | 作为保留地址,保留为以后使用 |
其中:
- 只有 **ABC 类地址**可用于**给网络中的计算机编址**。
- **主机号 "==全 0==" 表示主机所在的网络**
- **主机号 "==全 1==" 表示主机所在网络的 "==广播地址=="**,用以该网段下进行广播。
### 特殊 IP 地址
#### 1. 网络地址
**主机号全 0 的 IP 地址**, 称为"**==网络地址==**",代表该 IP 所在的整个网络本身,即**本网段**。
#### 2. 广播地址
**主机号全 1 的 IP**,称为 "**==广播地址==**",代表**该网络中所有地址**,用于**向该网段中所有主机进行广播**。
> [!NOTE] "有限广播地址" 与 "直接广播地址"
>
> - **直接广播地址**:即主机**所在网段的广播地址**。
> - **有限广播地址**:特指 `255.255.255.255`,用于本网广播。
> - 使用场景:当**主机不知道本机所在网络**时(如主机的启动过程中),**只能采用有限广播方式**,通常由无盘工作站启动时使用,希望从网络 IP 地址服务器处获得一个 IP 地址。
> [!example] 广播示例
> ![[_attachment/02-开发笔记/07-计算机网络/网络层/IPv4 编址.assets/IMG-IPv4 编址-29C9A48C4D877B9AC33AB652BB64815F.png|410]]
#### 3. 私有地址
私有地址:**规定==专用于 "局域网" 内分配==的 IP 地址**,不会被注册为公网,不允许在互联网公网中使用。
在 "**分类编址**" 方案下,私有地址在 IPv4 中 A、B、C 类地址中占有的范围如下:
| | 范围 |
| ------- | ------------------------------- |
| A 类私有地址 | `10.0.0.0 - 10.255.255.255` |
| B 类私有地址 | `172.16.0.0 - 172.31.255.255` |
| C 类私有地址 | `192.168.0.0 - 192.168.255.255` |
> [!NOTE] 在 CIDR 中仍保留上述私有地址范围,但不再划分 ABC 类地址,而是**支持使用==不同长度的网络前缀==更灵活地划分子网**。
>
> - 在 "分类编址" 中,规定 C 类地址的网络号均为 24 位,因此每个 C 类私有地址(如 `192.168.0.0` )表示的网段中只能容纳 255 台主机,
> - 在 CIDR 方式下,则支持划分为 `192.168.0.0/29`,允许容纳 6 台主机。
#### 4. 环回地址
环回地址:用于**主机==向自身==发送数据**的地址,所有**向环回地址发送的数据报都==只会被主机自身的协议栈接收处理==**,而**不会传递给物理网卡,故不会发送到外部网络**。常用于 "**==环回测试==**(loopback test)"——测试本机网络协议栈,以及进程之间的通信。
**环回地址范围**:`127.0.0.1 - 127.255.255.254` ,各个地址效果均相同,其中 `127.0.0.1` 最常用。
> [!caution] `127.0.0.0` 为网络地址,`127.255.255.255` 是广播地址,环回地址范围内不包含二者。
>
> ping `127.0.0.0` 与 `127.255.255.255` 均会失败。
![[02-开发笔记/07-计算机网络/应用层/域名 & URL & URI#^munya2]]
#### 5. 未指定地址
**Unspecified 地址**:特指 `0.0.0.0`,通常称为 "**非特定地址或无效地址**",表示 "**任何地址**" 或 "**所有地址**"。
该地址的具体含义及用法取决于 "**上下文**",常见使用场景有:
- (1)在主机**尚未被分配有效 IP 地址**时,**==用作主机的源地址==**。例如主机刚启动后通过 DHCP 请求一个 IP 地址时,主机发给 DHCP Discover 的消息中使用的源地址即为 `0.0.0.0`。
- (2)在路由表中,路由 `0.0.0.0/0` 表示 "**==默认路由==**",即**所有未明确指定路由的流量都将发送到这个默认路由**
- (3)作为**服务器==监听地址==** 时(例如配置 nginx 监听 `0.0.0.0:80`),表示 **==监听所有网络地址==**——服务器会**接收来自任意网络接口的连接请求**。
<br><br><br>
# 子网掩码
子网掩码同样为 **4 字节 32 位**,采用 "**点分十进制表示**",用于**标识 IPv4 地址中的 "==网络前缀=="**:
- 子网掩码 **==前 N 位全为 1==**,对应标识 IPv4 地址中的 "**网络前缀/网络号**" 部分。
- 子网掩码**后 32- N 位全为 0**,对应标识 IPv4 地址中的 "**主机号**" 部分。
**用 "IPv4 地址" 与 "==子网掩码==" 做 "==按位与=="**,即可得到**该地址对应的==网络地址==**,**计算机中实际上即是这样操作的**。
> [!example] 求解 "网络地址"
> ![[_attachment/02-开发笔记/07-计算机网络/网络层/IPv4 编址.assets/IMG-IPv4 编址-8488511870848CCFAFD8BE3E0BB1B959.png|390]]
> [!NOTE] CIDR 斜线标记法中的 `/x` 直观指示了 "**网络前缀位数**",也即 **"子网掩码" ==全 1 前缀的位数==**。
>
> [!NOTE] 子网掩码的两个作用:
>
> 1. **CIDR** 编址方案下,标识 "**网络前缀**";
> 2. **子网划分**。
>
> 子网掩码最初用于 "**分类编址**" 方案下的 **==子网划分==**,后来才用于 "CIDR" 编址方案中确定 "**==网络前缀==**"。
> [!NOTE] 在 "分类编址方案" 下,由于 ABC 类地址的**网络号部分**是固定的,因此**子网掩码默认可以省略**。
>
> - A 类地址,默认子网掩码 `255.0.0.0`
> - B 类地址,默认子网掩码 `255.255.0.0`
> - C 类地址,默认子网掩码 `255.255.255.0`
<br><br><br>
# 子网划分
> 子网划分最初在 "**分类编址**" 方案中就有应用,而后在 **CIDR 方案**中同样支持。
**子网划分**:将**一个较大网络(较大 IP 地址块)** 划分成**多个较小子网**,可使得**原本同处于一个网段的主机==分属于不同的子网段==**。
> [!example] 如下图所示,将网络 `145.13.0.0/16` 进一步**划分为 `145.13.3.0/24` 、`145.13.21.0/24`、`145.13.7.0/24` 三个子网**。
>
> 
>
>
<br>
### 划分方法
划分方法:通过**修改 "==子网掩码=="** 实现(即相当于在 CIDR 中**扩展 "==网络前缀位数=="** ):
**在既有网络位的基础上从 "==主机位==" 借位作为 "==子网位=="**,将**两级 IP 地址(网络号+主机号)** 转变为**三级 IP 地址(网络号+子网号+主机号)**。
> [!note]
> ![[_attachment/02-开发笔记/07-计算机网络/网络层/IPv4 编址.assets/IMG-IPv4 编址-3B7B44035AE860CAE470B9C0C36D5EAF.png|718]]
<br>
#### 子网划分示例
> [!example] 示例:子网划分 1
>
> 一个 C 类 IP 地址,若要划分 14 个子网,则子网掩码应为多少?
>
> C 类 IP 默认子网掩码是 `/24`,要再划分 14 个子网需要借 4 个主机位,故为 `/28` 即 `255.255.255.240`(128+64+32+16)
> [!example] 示例:子网划分 2
>
> 现有一个网段地址 193.168.1.0/24 ,要求**均分出 4 个子网段**,**故需要借用两个主机位作为子网位**。
> 即**网络前缀变为 26 位**,对应的**子网掩码为 255.255.255.192**。
>
> 剩下6个主机位,因此每个子网内共 $2^6=64$ 个 ip,去除网络地址与广播地址,每个子网内**可分配 62 个主机地址**。
>
> 由此,划分出**各个子网的子网号依次为 0,64,128,192**,故:
>
> - 各个子网的网络地址为 `X.X.X.0/26`,`X.X.X.64/26`,`X.X.X.128/26`,`X.X.X.192/26`
> - 各个子网的广播地址为 `X.X.X.63/26`,`X.X.X.127/26`,`X.X.X.191/26`,`X.X.X.255/26`。
>
> [!example] 示例:一个 C 类网络 `192.168.0.0/24` 被进一步划分子网,子网掩码是 `255.255.255.224` 即 `/27`,可以如何划分?
>
> 子网掩码最后八位是 `11100000`,所以**前 3 位共可划分 8 个子网**,每个子网里 32 个 IP 地址,其中 30 个可分配。例如:
>
> | 网络地址 | 广播地址 | 广播地址如何得到 |
> | ------------------ | ------------------ | -------- |
> | `192.168.0.0/27` | `192.168.0.31/27` | 0+31 |
> | `192.168.0.32/27` | `192.168.0.63/27` | 32+31 |
> | `192.168.0.64/27` | `192.168.0.95/27` | 64+31 |
> | `192.168.0.96/27` | `192.168.0.127/27` | 96+31 |
> | `192.168.0.128/27` | `192.168.0.159/27` | 128+31 |
> | `192.168.0.160/27` | `192.168.0.191/27` | 160+31 |
> | `192.168.0.192/27` | `192.168.0.223/27` | 192+31 |
> | `192.168.0.224/27` | `192.168.0.255/27` | 224+31 |
>
> [!example] 示例:局域网地址配置
>
> 一个公司有 530 台电脑,组成一个对等**局域网**,子网掩码和 IP 设多少最合适?
>
> 530 台电脑,需要**至少用 10 位主机位来表示**:
>
> (1)在曾经的 "**分类编址**" 方案下,一个 C 类网络最多允许 254(2^8-2)台主机,因此 **==只能使用 B 类地址==**。B 类地址中主机位共 16 位,因此可以向主机位借用 6 位作为子网位,划分得到网段 `172.16.0.0/22` ,有效IP地址范围为 `172.16.0.1 - 172.16.3.254`。
>
> (2)在现代网络采用的 **CIDR** 方案下,不存在 ABC 类地址的区分,因此**可以直接使用私有地址 `192.168.0.0`** 并**设置网络前缀为 22 位**,得到网段 `192.168.0.0/22`。
>
> [!example] **示例:判断两个 IP 地址是否在同一网段**
>
> - 主机一的 IP 地址为 `222.21.160.6`,子网掩码为 `255.255.255.192`;
> - 主机二的 IP 地址为 `222.21.160.73`,子网掩码为 `255.255.255.192`。
>
> 用 IP 地址与子网掩码做按位与,得到网络地址:
>
> - 主机一:
> - IP 地址 `222.21.160.6 `即:`11011110.00010101.10100000.00000110`
> - 子网掩码 `255.255.255.19`2 即:`11111111.11111111.11111111.11000000`
> - 按位逻辑与运算结果为:`11011110.00010101.10100000.00000000`,故网络地址为:`222.21.160.0`
>
> - 主机二:
> - IP 地址 `222.21.160.73` 即:`11011110.00010101.10100000.01001001`
> - 子网掩码 `255.255.255.192` 即:`11111111.11111111.11111111.11000000`
> - 按位逻辑与运算结果为:`11011110.00010101.10100000.01000000`,故网络地址为:`222.21.160.64`
>
> 可见,**两个 IP 地址的网络前缀不相同**,**分属于两个网段**,如果要通信**需要经过路由器转发**。
>
<br>
### 子网划分的作用
- **限定广播的传播**
- 广播数据包只能在同网段内传播,由于子网划分后网段规模变小,也即广播域变小,可减少网络**广播风暴**所造成的网络拥塞。
- **实现网络隔离**
- 处于**同一个子网(网段)内的主机才能直接互通**,不同子网(网段)之间不能直接通信(需要通过路由器/网关转发)。
> [!NOTE]
>
> - **子网划分与 VLAN 都可以做到隔离广播域,但子网划分是三层隔离,而 VLAN 是二层**。
> - ARP 协议通过 ip 地址获取目标主机的 mac 地址这一过程使用的是广播的方式,这个广播地址就是通过网络地址与子网掩码计算而来的,只有这一子网内的主机才能收到这个 arp 广播包。
>
<br><br><br>
# 超网
**超网**(Supernetting):将多个较小的子网通过**减少网络前缀位数**来合并为一个较大的子网,称之为 "**==超网化==**",与子网划分的过程恰相反。
> [!example] 网段合并
>
> 现有以下 4 个网段需要合并:
> `192.168.0.0/24`,`192.168.1.0/24`,`192.168.2.0/24`,`192.168.3.0/24` (每个网段对应 254 台主机,去掉网络地址和广播地址)
>
> 
>
> 4 个网段在**网络地址部分的区别**为上图标红内容,第 23 位和第 24 位,而前 22 位完全相同。
> 由此,要合并四个网段为**同一个子网**,**将==网络前缀收缩为 22 位==**,即超网化为 `192.168.0.0/22` ,对应子网掩码 `255.255.252.0`。
>
> 合并后所得网段内的地址范围为 `192.168.0.0/22 ~ 192.168.3.255/22`。
> 即 11000000 10101000 000000**00 00000000** 到 11000000 10101000 000000**11 11111111** 之间的地址。
# 路由聚合
**路由聚合**(Route Aggregation) 是指通过**将多个网络或子网的路由条目==合并为一个更大的路由条目==**,从而减少路由表中的条目数量。
路由聚合在现代路由协议中被广泛使用,比如BGP(边界网关协议)。
路由聚合通过 "**地址聚合**(也称 **==超网==**)"的方式实现,即 "**合并多个较小的子网为一个更大网络**",称为 "**超网化**"。
> [!example] 路由聚合
>
> 如下图所示,假设**存在三个网段 `10.10.0.0/24`,`10.10.3.0/24`,`10.10.2.0/24`**,
> 对 **==路由器 B==** 而言其路由表中会**存在三条不同的路由条目**,而这三个条目**均对应路由器 B 的同一接口**,
> 由此可进行 "**==路由聚合==**",将三条记录**合并为一条指向==更大的网络 `10.10.0.0/16`== 的路由记录**。
>
> ![[_attachment/02-开发笔记/07-计算机网络/网络层/IPv4 编址.assets/IMG-IPv4 编址-ECB5FC76C599A2CAA7248375736B7993.png|559]]
>
>
<br><br>
# Buffer
## 闪念
> sudden idea
## 候选资料
> Read it later
# ♾️参考资料
# Footnotes
[^1]: 《计算机网络(第八版)》——谢希仁(P123)
[^2]: 《计算机网络—自顶向下方法》(P221)
[^3]:《计算机网络(第八版)》——谢希仁 (P129)
[^4]: [IPv4地址表示法详解](https://www.cnblogs.com/yahuian/p/ipv4-representation.html)
[^5]: 《网络是怎样连接的》