%% # 纲要 > 主干纲要、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 地址配置 > > ![image-20231223153143831|403](_attachment/02-开发笔记/07-计算机网络/网络层/IPv4%20编址.assets/IMG-IPv4%20编址-5071F83A7BC3D5B2703C76CF1754CA85.png) > > <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 地址进行了如下划分: ![image-20230909173153973|509](_attachment/02-开发笔记/07-计算机网络/网络层/IPv4%20编址.assets/IMG-IPv4%20编址-66F99B5E87B2EFA396E235DB7B82CA83.png) 总结说明: | 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` 三个子网**。 > > ![img|482](_attachment/02-开发笔记/07-计算机网络/网络层/IPv4%20编址.assets/IMG-IPv4%20编址-B2E92F55D157E1F04EBE16356C85E5A3.jpg) > > <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 台主机,去掉网络地址和广播地址) > > ![img](_attachment/02-开发笔记/07-计算机网络/网络层/IPv4%20编址.assets/IMG-IPv4%20编址-496F0A00E65F4D390279091F6C5D2518.png) > > 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]: 《网络是怎样连接的》