# IPv6

2019 年 11 月 25 日已分配完公网 IPv4 地址，短期内可以使用 NAT 技术进行缓解。长期来看，还是要用 128 位的 IPv6 地址替代 32 位的 IPv4 地址。

## 地址表示

* IPv4 地址长度为 32 位，使用「点分十进制表示法」，共有 4 个 8 位段，每段范围为 0 - 255。
* IPv6 地址长度为 128 位，使用冒号分隔 8 个 16 位段，每段使用十六进制表示，范围为 0000 - ffff。
* IPv6 地址有两条简化规则：
  1. 每段十六进制数中开头的 0 可以省略。例如，`2001:0db8:0042:0001:0000:0000:0000:d74c` 可以表示为 `2001:db8:42:1:0:0:0:d74c`。
  2. 由全 0 组成的连续的 16 进制数字段可以用一对冒号 `::` 表示，但只可以使用一次。例如 `2001:0db8:0042:0001:0000:0000:0000:d74c` 可以表示为 `2001:db8:42:1::d74c`。
* 网段:
  * IPv4: `192.168.0.0/16` 或 子网掩码 `255.255.0.0`
  * IPv6: `2001:db8:42:1::/112`
* Unspecified Address： IPv4 未指定地址 `0.0.0.0`， IPv6 未指定地址： `::`。从 DHCP 服务器获得 IP 地址前，使用未指定地址配置主机。如果主机监听未指定地址，则会监听主机所有的网口。
* IPv4 回环地址： `127.0.0.1/8`， IPv6 回环地址： `::1/128`

## 地址类型

IPv6 类型：

1. 单播 Unicast
   * 全球单播地址 Global Unicast Address
   * 唯一本地地址 Unique Local Address
   * 链路本地地址 LLA, Link Local Address
2. 任意播 Anycast
3. 组播 Multicast

相比 IPv4，IPv6 没有广播地址。包含全部节点的组播地址，与 IPv4 中的广播地址功能相同。

|  地址类型  |   二进制格式前缀  |  IPv6 前缀  |
| :----: | :--------: | :-------: |
|  未指定地址 |   00...0   |   ::/128  |
|  回环地址  |    00..1   |  ::1/128  |
| 全球单播地址 |     001    |  2000::/3 |
| 唯一本地地址 |  11111101  |  fd00::/8 |
| 链路本地地址 | 1111111010 | fe80::/10 |

### 全球单播地址

全球单播地址类似 IPv4 中的公网 IP 地址，由 Internet 地址授权委员会（IANA, Internet Address Numbers Authority）分配给地区 Internet 注册机构（ RIR, Regional Internet Registry），再由 RIR 分配给 Internet 服务提供商（ISP, Internet Service Provider）。

IPv6 单播格式

1. 全球单播 IPv6 地址的前 3 位固定为 001。
2. 全球路由前缀由地址分配机构分配。
3. 主机位称为接口 ID （一台主机可以有多个接口，因此 IPv6 地址表示主机的一个接口更准确）。一个接口可以有一个 IPv4 地址和多个 IPv6 地址（如全球单播地址、链路本地地址等等）。
4. 全球单播地址前缀为 `2000::/3`,开头 4 位为 0010 或 0011，即为十进制的 2 或 3。
5. 对于十分庞大的网络，地址分配机构可以分配长度小于 /48 的前缀。对于只有一个子网可以分配长度是 /64 的前缀。对于一台设备，可以分配长度是 /128 的前缀。

```
  3 bit         45 bit            16 bit          64 bit
    ↑            ↑                 ↑              ↑
 +-----+-----------------------+-----------+------------------+
 | 001 | Global Routing Prefix | Subnet ID |   Interface ID   |
 +-----+-----------------------+-----------+------------------+
```

### 本地单播地址

1. 唯一本地地址
2. 链路本地地址
3. 未指定地址
4. 回环地址

### 唯一本地地址

类似 IPv4 的私有 IP 地址，只可以在私有网络使用。

唯一本地地址的前 7 位固定是 1111110 ，即 fc00::/7。第 8 位为 0 时未定义，即 fc00::/8 地址前缀属于保留的地址空间。目前私有网络使用的以 11111101 开头，即前缀为 fd00::/8 的 IPv6 地址。

### 链路本地地址

链路本地地址是只在一个网段内或者一个广播域内有效的地址。路由器不会转发源地址或目的地址是 LLA 的数据包。

IPv4 LLA 地址段为 169.254.0.0/16 (169.254.0.0 - 169.254.255.255)。

IPv6 LLA 地址段为 fe80::/10。启动 IPv6 时，网络接口会自动配置一个 IPv6 LLA 地址。

IPv6 LLA 前缀为 1111111010，其余 global routing prefix 为 0，对网络接口 MAC 地址进行转换获得接口 ID。

MAC-to-EUI64 转换法是将 MAC 地址中 U/L 位设置为 1，并在 OUI 后面插入固定数 0xfffe

```
        MAC 00:16:3e:0a:c5:d3
         0000 0000 
             ↓
         0000 0010 
             ↓
            02:16:3e:0a:c5:d3
             ↓
            216:3eff:fe0a:c5d3
             ↓
      fe80::216:3eff:fe0a:c5d3       
```

### 未指定地址

未指定地址（::/128）不能分配给接口使用，只有当 IPv6 设备还没获取到地址时，才将未指定地址作为数据包的源 IPv6 地址。

### 回环地址

回环地址（::1/128）

## 组播

组播地址标识一个组播组 Multicast Group。

组播地址前 8 位为 1 ，后面跟着 4 位标记位，再后面是 4 位地址范围，最后 112 位为组 ID （Group ID）。组 ID 前 80 位为 0 ，使用后面 32 位。各个协议使用的组播组以 ff0 开头的 IPv6 地址，而自定义的组播组以 ff1 开头。

范围位取值：

| 范围位值 |  表示范围  |
| :--: | :----: |
|   1  |  接口本地  |
|   2  |  链路本地  |
|   3  |  子网本地  |
|   4  | 管理范围本地 |
|   5  |  站点本地  |
|   8  | 组织机构本地 |
|   E  |   全局   |

常见的 IPv6 组播地址标记位值为 0 ，范围位值为 2 ，即前缀为 ff02。

|    地址   |      组播组      |
| :-----: | :-----------: |
| ff02::1 |      所有节点     |
| ff02::2 |     所有路由器     |
| ff02::5 |   OSPFv3 路由器  |
| ff02::6 |  OSPFv3 指定路由器 |
| ff02::9 |    RIP 路由器    |
| ff02::c | DHCP 服务器/中继代理 |

### 目的节点组播地址

目的节点的组播地址的前 104 位固定为 ff02::1:ff ，后 24 位使用目的单播 IPv6 地址接口 ID 的后 24 位。

当接口获取一个单播或任意播 IPv6 地址时，会同时监听该单播地址对应的目的节点组播地址。

### IPv6 组播地址与 MAC 地址的映射关系

将 IPv6 组播地址的后 32 位取出，填充到固定前缀是 3333 的 MAC 地址中来生成数据链路层地址。
