# IPv4地址与子网

IPv4地址用于网络层寻址。地址的前缀及子网掩码帮助确定目标所在网络；数据包字段和转发过程分别见[IPv4数据包](/knowledge/cs/networks/ipv4-packet/)与[IP路由](/knowledge/cs/networks/ip-routing/)。

## 地址结构

IPv4地址长度为32位，即4字节。书写时采用点分十进制，把4个字节分别写成十进制数，再用点隔开，例如`192.168.1.1`。

一个IPv4地址分为两部分：

* **网络号**：标识主机所在的网络。
* **主机号**：标识该网络内的特定设备。

子网掩码用于区分这两部分：掩码中为1的位对应网络号，为0的位对应主机号。例如掩码`255.255.255.0`表示前24位是网络号、后8位是主机号。

## 地址分类与特殊地址

### 分类编址

分类编址是历史上的方案；现代路由通常使用无类别的前缀长度，不能只靠地址类别推断当前掩码。

| 类别 | 地址范围                            | 网络号位数      | 主机号位数 | 用途    |
| :- | :------------------------------ | :--------- | :---- | :---- |
| A类 | `0.0.0.0` – `127.255.255.255`   | 8（首位为0）    | 24    | 超大型网络 |
| B类 | `128.0.0.0` – `191.255.255.255` | 16（前两位10）  | 16    | 中型网络  |
| C类 | `192.0.0.0` – `223.255.255.255` | 24（前三位110） | 8     | 小型网络  |
| D类 | `224.0.0.0` – `239.255.255.255` | —          | —     | 多播    |
| E类 | `240.0.0.0` – `255.255.255.255` | —          | —     | 保留实验  |

### 特殊地址

| 地址                                            | 含义                        |
| :-------------------------------------------- | :------------------------ |
| `10.0.0.0/8`、`172.16.0.0/12`、`192.168.0.0/16` | 私有地址，不在公共互联网中作为可路由的源或目标地址 |
| `127.0.0.1`                                   | 回环地址，通常指localhost，用于本机测试  |
| 主机号全为1，例如`192.168.1.255`                      | 广播地址，用于向本网络内所有主机发送数据      |
| 主机号全为0，例如`192.168.1.0`                        | 网络地址，用于标识整个网络             |

> [!NOTE]
> 私有地址可在独立的内部网络中复用；网络互连时若地址范围重叠，仍需处理寻址与路由冲突。

> [!NOTE]
> 下面将主机位全零和全一作为网络地址与广播地址的说明适用于常见子网；特殊前缀和点对点链路可能采用不同规则，不能机械套用可用主机数公式。

## 例子

**由地址和掩码求网络地址与广播地址**

地址`192.168.1.37`，掩码`255.255.255.0`（即 /24）。前24位是网络号，所以网络地址是把主机号全部置0，得到`192.168.1.0`；广播地址是把主机号全部置1，得到`192.168.1.255`。可分配给主机的地址是`192.168.1.1`到`192.168.1.254`，共254个。

**私有地址的重复使用**

两个不同的局域网可以都使用`192.168.1.0/24`，各自的主机在局域网内用`192.168.1.x`通信。因为这些地址不会出现在互联网的路由表中，两个局域网之间不会因为地址相同而互相干扰。

## 交互探索

调整前缀长度，比较IPv4地址、掩码与按位与得到的网络地址。

交互演示：前缀长度怎样决定网络地址？。调整IPv4前缀长度，计算掩码和网络地址。 请在站点操作演示。

## 练习

1. IPv4地址的长度是多少位？

   * A.  16位
   * B.  32位
   * C.  64位
   * D.  128位

   答案：B

   IPv4地址为32位，即4字节，用点分十进制书写。

2. `192.168.1.1`属于哪一类地址？

   * A.  公有地址
   * B.  私有地址
   * C.  回环地址
   * D.  广播地址

   答案：B

   `192.168.0.0/16`是C类私有地址段，只在局域网内部使用，不能在互联网上路由。

3. `127.0.0.1`的用途是什么？

   * A.  向本网络内所有主机发送数据
   * B.  标识整个网络
   * C.  本机回环测试
   * D.  多播

   答案：C

   `127.0.0.1`是回环地址，通常指localhost，数据不离开本机，用于本机测试。

4. 主机号全为1的地址是什么地址？

   * A.  网络地址
   * B.  广播地址
   * C.  回环地址
   * D.  私有地址

   答案：B

   主机号全为1表示广播地址，用于向本网络内所有主机发送数据；主机号全为0才是网络地址。

5. 下列哪些属于私有地址段？

   * A.  `10.0.0.0/8`
   * B.  `172.16.0.0/12`
   * C.  `192.168.0.0/16`
   * D.  `224.0.0.0/4`

   答案：A、B、C

   `224.0.0.0/4`属于D类地址，用于多播，不是私有地址。

6. `192.168.1.0/24`网络中，可分配给主机的地址有多少个？

   \_\_\_\_\_\_（hosts）

   答案：254

   主机号占8位，共256个地址；去掉主机号全0的网络地址和全1的广播地址，剩254个可分配地址。
