ping6.net
基础知识

IPv6 地址类型:全局、链路本地、多播详解

了解不同类型的 IPv6 地址:用于互联网的全局单播、用于局域网的链路本地、用于组的多播等。

ping6.net2024年1月20日4 min read
IPv6地址类型单播多播链路本地任播

IPv6 地址在传递数据包的方式上与 IPv4 不同。在调试网络问题或设计系统时,理解这些差异很重要。

TL;DR - 快速摘要

要点:

  • IPv6 使用单播(一对一)、多播(一对多)和任播(一对最近)——没有广播
  • 全局单播(2xxx/3xxx)用于互联网,链路本地(fe80::)用于本地网段,ULA(fd00::)用于私有网络
  • 多播(ffxx::)替代广播;被请求节点多播使邻居发现更高效
  • 链路本地地址需要区域 ID,如 fe80::1%eth0 来指定接口

跳转至: 全局单播地址 | 多播地址 | 快速参考

三种传递方法#

IPv6 使用三种基本传递模型:

  • 单播:一个发送者到一个接收者。与特定主机通信的标准方式。
  • 多播:一个发送者到多个接收者。用于组通信的高效方式。
  • 任播:一个发送者到组中最近的接收者。用于负载均衡和冗余。

IPv6 中没有广播

IPv6 完全消除了广播。IPv4 会向所有主机广播(如 ARP 请求淹没你的网络),而 IPv6 使用有针对性的多播。这减少了不必要的流量并提高了网络效率。

单播地址#

每个单播地址都唯一标识一个网络接口。将数据包发送到该地址,恰好一个主机接收它。

全局单播地址(2000::/3)#

这些是你的公共 IPv6 地址,可在整个互联网上路由。如果地址以 23 开头,它就是全局单播地址。

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::fbmDNSv6(多播 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 show

macOS:

ifconfig | grep inet6

Windows:

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 验证器检查任何地址。输入一个地址,立即查看其类型、范围以及它是否有效。