IPv6 地址类型:全局、链路本地、多播详解
了解不同类型的 IPv6 地址:用于互联网的全局单播、用于局域网的链路本地、用于组的多播等。
IPv6 地址在传递数据包的方式上与 IPv4 不同。在调试网络问题或设计系统时,理解这些差异很重要。
三种传递方法#
IPv6 使用三种基本传递模型:
- 单播:一个发送者到一个接收者。与特定主机通信的标准方式。
- 多播:一个发送者到多个接收者。用于组通信的高效方式。
- 任播:一个发送者到组中最近的接收者。用于负载均衡和冗余。
IPv6 中没有广播
IPv6 完全消除了广播。IPv4 会向所有主机广播(如 ARP 请求淹没你的网络),而 IPv6 使用有针对性的多播。这减少了不必要的流量并提高了网络效率。
单播地址#
每个单播地址都唯一标识一个网络接口。将数据包发送到该地址,恰好一个主机接收它。
全局单播地址(2000::/3)#
这些是你的公共 IPv6 地址,可在整个互联网上路由。如果地址以 2 或 3 开头,它就是全局单播地址。
2001:0db8:85a3:0000:0000:8a2e:0370:7334
│ │ │ │
│ │ │ └─ 接口 ID(64 位)
│ │ └──────────────── 子网 ID(16 位)
│ └────────────────────────── 站点前缀(48 位)
└──────────────────────────────────── 全局路由前缀典型结构将 /48 分配拆分如下:
| 位 | 组件 | 用途 |
|---|---|---|
| 0-47 | 全局路由前缀 | 你从 ISP 或 RIR 获得的分配 |
| 48-63 | 子网 ID | 每个站点 65,536 个子网 |
| 64-127 | 接口 ID | 从 MAC 地址生成或随机化 |
实际提供商通常为站点分配 /48,为小型企业分配 /56,或为住宅用户分配 /64。每个 /64 子网包含 18 百京个地址,这就是为什么你在 /64 边界上进行子网划分。
文档地址
前缀 2001:db8::/32 仅用于文档和示例。不要在生产环境中使用这些地址。RFC 中的每个示例都使用 2001:db8 是有原因的,它们不会与真实网络冲突。
链路本地地址(fe80::/10)#
当你启用 IPv6 时,每个 IPv6 接口都会自动生成链路本地地址。这些地址仅在本地网段上工作,永远不会被路由。
fe80::1
fe80::a1b2:c3d4:e5f6:7890链路本地地址对于 IPv6 功能是强制性的。邻居发现、路由器请求和其他核心协议需要它们。你的接口可能没有全局地址,但它始终会有链路本地地址。
区域 ID:指定接口#
由于 fe80::1 可能存在于每个接口上,因此你需要指定你指的是哪个接口:
ping6 fe80::1%eth0 # Linux
ping6 fe80::1%en0 # macOS
ping fe80::1%12 # Windows(使用接口索引)% 符号位于区域 ID 之前。在 Linux 和 macOS 上,使用接口名称。在 Windows 上,使用来自 netsh interface ipv6 show interface 的接口索引。
唯一本地地址(fc00::/7)#
将这些视为 IPv6 版本的 RFC 1918 私有地址。它们不是全局可路由的,这使它们适合内部网络。
实际上,你会看到 fd00::/8 地址,因为 fc00::/8 范围需要从未实施的中央分配。随机生成 40 位全局 ID:
fd 3a:c7b1:29f4 :0001:0000:0000:0000:0001
│ └──────────┘ │ └──────────────────┘
│ │ │ │
│ │ │ └─ 接口 ID(64 位)
│ │ └─────────────── 子网 ID(16 位)
│ └──────────────────────── 随机全局 ID(40 位)
└──────────────────────────────── ULA 前缀(fd = 本地分配)当你随机生成该 40 位标识符时,如果两个网络稍后合并,你可以最小化冲突风险。不要在任何地方都使用 fd00::1。
特殊地址#
两个地址具有独特的用途:
环回(::1):向自己发送数据包。相当于 IPv6 的 127.0.0.1。发往 ::1 的流量永远不会离开主机。
未指定(::):表示没有地址。主机在 DHCPv6 期间或尚未配置地址时使用 :: 作为源地址。你不能将数据包发送到 ::。
多播地址(ff00::/8)#
每个以 ff 开头的地址都是多播。数据包发送到加入该多播组的每个接口。
地址结构#
ff 0 2 : 0000:0000:0000:0000:0001
│ │ │ └──────────────────────┘
│ │ │ │
│ │ │ └─ 组 ID(112 位)
│ │ └──────────────── 范围(4 位)
│ └─────────────────── 标志(4 位)
└────────────────────── 多播前缀范围字段确定多播数据包传播的距离:
| 范围 | 值 | 范围 |
|---|---|---|
| 接口本地 | 1 | 仅此接口 |
| 链路本地 | 2 | 本地网段 |
| 管理本地 | 4 | 管理边界 |
| 站点本地 | 5 | 组织站点 |
| 组织本地 | 8 | 组织中的多个站点 |
| 全局 | e | 整个互联网 |
基本多播组#
几个多播地址用于关键功能:
| 地址 | 用途 |
|---|---|
ff02::1 | 链路上的所有节点(替代 IPv4 广播) |
ff02::2 | 链路上的所有路由器 |
ff02::5 | 所有 OSPF 路由器 |
ff02::6 | 所有 OSPF 指定路由器 |
ff02::9 | 所有 RIP 路由器 |
ff02::1:2 | 所有 DHCPv6 服务器/中继 |
ff02::fb | mDNSv6(多播 DNS) |
被请求节点多播#
这种机制使邻居发现高效。IPv6 不是问每个主机「谁有这个 IP?」(像 ARP),而是询问一个小的多播组。
每个单播地址都会自动生成相应的被请求节点多播地址:
单播: 2001:db8:1234:5678::abcd:ef12:3456
└────┬─────┘
│
(最后 24 位)
│
被请求节点: ff02::1:ff12:3456 ────────┘当主机需要解析 2001:db8:1234:5678::abcd:ef12:3456 时,它向 ff02::1:ff12:3456 发送邻居请求。只有地址以 12:3456 结尾的主机处理该请求。与向每个主机广播相比,这大大减少了多播开销。
任播地址#
任播地址看起来与单播地址相同,没有特殊前缀。区别在于配置:你将相同的地址分配给多个接口,路由将数据包传递到拓扑上最近的一个。
常见用例#
DNS 根服务器:所有 13 个根服务器字母(a.root-servers.net 到 m.root-servers.net)都使用任播。相同的 IP 地址存在于全球数百个位置。你的查询到达最近的根服务器。
CDN 边缘服务器:内容分发网络使用任播将用户路由到附近的缓存服务器。相同的地址,不同的地理位置。
6to4 中继路由器:地址 192.88.99.1(IPv4)和 2002:c058:6301::(IPv6)是 6to4 中继的任播地址。
子网路由器任播#
每个子网都会自动具有一个保留的任播地址,其接口标识符设置为零:
子网: 2001:db8:1234:5678::/64
子网路由器: 2001:db8:1234:5678::该子网上的路由器应响应此地址。实际上,它很少使用。
快速参考:识别地址类型#
查看前几个字符以识别任何 IPv6 地址:
| 开头 | 类型 | 范围 |
|---|---|---|
::1 | 环回 | 主机本地 |
:: | 未指定 | 不适用 |
fe80: | 链路本地单播 | 链路本地 |
fc00: 或 fd00: | 唯一本地单播 | 私有 |
ff00: 到 ffff: | 多播 | 不同(检查第 2 位数字) |
2... 或 3... | 全局单播 | 互联网 |
其他所有内容要么是保留的,要么尚未分配。
检查你的地址#
查看你的系统配置了哪些地址:
Linux:
ip -6 addr showmacOS:
ifconfig | grep inet6Windows:
netsh interface ipv6 show addresses你通常会看到:
- 多个链路本地地址(
fe80::),每个接口一个 - 如果你有 IPv6 连接,则有一个或多个全局单播地址
- 环回接口上的环回地址
::1 - 几个多播组成员身份(通常默认不显示)
测试多播#
向本地链路上的所有节点发送 ICMPv6 回显请求:
# 将 eth0 替换为你的接口名称
ping6 ff02::1%eth0你将收到该网段上每个启用 IPv6 的设备的回复。这对于发现很有用,但在大型网络上可能会很嘈杂。
检查路由器是否存在:
ping6 ff02::2%eth0只有路由器应该响应。
实际影响#
不同的地址类型会影响你设计网络和排除问题的方式:
安全策略:在防火墙处过滤全局单播,但链路本地必须通过以进行邻居发现。阻止 fe80::/10 会完全破坏 IPv6。
应用程序绑定:绑定到 :: 的服务器在所有地址上监听(类似于 IPv4 中的 0.0.0.0)。绑定到 ::1 仅限于本地主机。
路由表:链路本地地址在路由表中显示为下一跳,这让习惯 IPv4 的人感到困惑。这是正常的,路由器使用链路本地地址以保持稳定性,因为它们永远不会改变。
DNS:只在 DNS 中发布全局单播地址。永远不要在公共 DNS 区域中发布链路本地或唯一本地地址。
理解这些地址类型不是学术性的,它对于配置防火墙、调试连接和设计实际工作的网络是必要的。
相关文章#
- IPv6 基础知识,它是什么以及为何重要 - 了解 IPv6 的基本概念,包括地址格式、压缩规则和协议设计改进。
- IPv6 子网划分:从 /48 到 /64 - 掌握 IPv6 子网划分的实用技能,学习如何有效划分地址空间。
- IPv6 安全:威胁、缓解措施和最佳实践 - 深入了解 IPv6 安全威胁并学习如何保护你的网络。
亲自尝试
使用 IPv6 验证器检查任何地址。输入一个地址,立即查看其类型、范围以及它是否有效。