image-20220108222242167

IPv6地址格式

开头的64比特用来代表网络,后面的64比特用作接口标识:

img

接口标识可以有多种方式产生:

为了便于书写,IPv6 推荐末端加上网络前缀长度的压缩格式标记,据此上面的地址可以缩短表示为: 2001:db8:130f::7000:0:140b/64

IPv6地址分类

地址类型 英文名称 二进制 16进制 应用
链路本地地址(单播) Link-local address 1111 1110 10 fe80::/10 单链路通信
唯一本地地址(单播) Unique local address 1111 1101 fd00::/8 本地网络通信
全局单播地址 Global unicast address 001 2000::/3 互联网通信
组播地址 Multicast address 1111 1111 ff00::/8 群组通信,流媒体视频

image-20210417161712823

IPv6地址可以分为三种类型:单播地址、多播地址、任播地址。

单播:

单播地址可以分为6种:

  1. Global Unicast
  2. Link-Local Unicast
  3. Loopback
  4. Unspecified
  5. Unique Local
  6. Embedded IPv4

组播:

因为 IPv6 组播地址只能用作目的地址,所以其比特位定义与单播不同。参见 RFC 4291,组播地址包含4比特特征标志位、4比特应用范围标志及最后112比特群组标识: img

另外同一协议还规定了一些预留的 IPv6 组播地址,其中最重要的有:

  • 本地网段所有节点 — ff02::1
  • 本地网段所有路由器 — ff02::2
  • 本地请求节点地址: ff02::1:ffxx:xxxx

组播侦听发现协议(MLD)

组播侦听发现协议原理是当源主机发送一份数据到一个组播地址,所有加入了这个组播地址的成员都可以收到一份数据的拷贝。并且只有组播成员才可以接收到数据。路由器通过MLD协议,可以了解自己的直连网段上是否有IPv6组播组的侦听者,并在数据库里做相应记录。同时,路由器还维护与这些IPv6组播地址相关的定时器信息。

MLD是ICMPV6的一个子协议。现在有二种版本,MLDV1和MLDV2。MLDV1有三类消息类型查询消息报告消息DONE消息MLDv2有二类消息类型查询消息报告消息。不过它是支持MLDv1的DONE消息的。

1. 普遍组查询报文(General Query)

用于发现在直连的链路上哪些组播地址有组播征听者。

2. 特定组播地址查询消息(Multicast AddresSpecific Query)

用于判断一个特定的组播地址在本地链路上是否有组播听者。在MLDv2中还有一征类消息即特定源组播查询消息(Multicast Addresand Source Specific Query),用于判断一个特定源的组播地址在本地链路上是否有组播征听者。

3. 成员报告报文(Multicast Listener Report)(Type=131)

1
2
3
4
5
6
7
8
9
源地址:

1、link-local address which the query is being sent
2、If the MLDv2 Multicast Listener Report message is for a solicitednode
multicast address corresponding to a unicast address for which duplicate address
detection is not yet complete,the source address is set to the unspecified address(::)

目的地址:
FF02::16

未进行DAD检测的暂时无本地链路地址的,MLD源地址为::

DAD检测完获取到本地链路地址的,MLD源地址为LINK-LOCAL地址;

image-20220108225202724

4. 成员离开报文(Multicast Listener Done)(Type=132)

主机离开组播组时主动向查询器发送的报文,用于宣告自己离开了某个组播组。

The Source Address:
link-local address which the query is being sent

The Destination Address:
FF02::2

NDP 协议

IPv6 动态地址分配依赖于邻居发现协议 (Neighbor Discovery Protocol,简称NDP)。NDP作用于数据链路层,负责在链路上发现其他节点和相应的 IPv6 地址,并确定可用路由和维护其他活动节点的信息可达性。它为 IPv6 网络提供了等效于 IPv4 网络中地址解析协议 (ARP) 与 ICMP 路由器发现和重定向协议的功能。然而,NDP加入了许多改进以及新的功能。 NDP 定义了五种 ICMPv6 消息类型:

1
2
3
4
5
1. 路由器请求 (Router Solicitation,简称 RS)
2. 路由器通告 (Router Advertisement,简称 RA)
3. 邻居请求 (Neighbor Solicitation)
4. 邻居通告 (Neighbor Advertisement)
5. 重定向 (Redirect)

这里的头二个消息类型 RS 和 RA,就是实现 IPv6 动态地址分配的关键。主机会发送 RS 消息到本地网段所有路由器组播地址 ff02::2,请求路由信息。当路由器收到网络节点发出的 RS 时,会即时发送 RA 回应。

RA关键标志位

  • Autonomous flag(简称A标记):表示是否配置无状态IP (stateless)。在一个RA报文中,可存在多个prefix,比如2020::/64、2021::/64、2023::/64,每个prefix都可以独立配置A 标记

    为1时:表示客户端应当在该prefix范围内自动生成IPv6地址(客户端通过DAD自行保证地址可用),并配置子网路由条目、网关

    为0时:表示客户端不应当在该prefix范围内自动生成IPv6地址,但是可以配置子网路由条目、网关

  • Other flag(简称O 标记):表示是否通过DHCPv6获得除IP以外的其他参数(如DNS列表)。O 标记也是RA报文中的全局参数,一个RA报文只有一个O 标记。注意:仅当M 标记为off时,该参数才会被读取。

    为1时:当M 标记为1,或者M flag为0且至少有一个A 标记为1时,将通过DHCPv6获得其他参数

    为0时:当M 标记为1时,依然将通过DHCPv6获得其他参数;当M 标记也为0时,将不通过DHCPv6获得其他参数

    image-20220108232841424

  • Managed flag(简称M标记):表示是否配置有状态IP。M flag是RA报文的全局参数,一个RA报文只有一个M 标记

    为1时:表示在stateless流程结束后开始stateful流程,也就是告诉客户端可以通过DHCPv6来获得IPv6地址和其他参数(如DNS列表等)

    为0时:表示不通过DHCPv6来获得IPv6地址。

    image-20220108232924453

  • L — “在链路” (on-link) 标志,设为1时指示前缀可用于“在链路”判定

    类似于 IPv4 的子网掩码功能,“在链路”判定的意义在于让主机确定某个接口可以接入哪些网络。缺省情况下,主机只将链路本地地址所在的网络视为“在链路”。如果无法判定一个目的地址的“在链路”状态,主机默认将 IPv6 数据报转发给默认网关(或缺省路由器)。当主机收到 RA 消息时,如果一个前缀信息选项的“在链路”标志设为1,并且有效使用期限 (Valid Lifetime) 也是非0值,那么主机就会在前缀列表中为之创建一个新的前缀网络条目。所有未过期的前缀网络条目都是“在链路”的。

消息时序

了解了 NDP 协议及 RA 消息所传递的信息之后,来看看它们是如何引导网络节点实现动态地址分配的。

网络中的路由器会周期性的发送 RA 消息到本地网段所有节点组播地址 (ff02::1)。但是,为了避免时延,主机启动完成后会马上发送一个或多个 RS 消息到本地网段所有路由器。协议规定路由器要在0.5秒内回应 RA 消息。之后,根据所收到的 RA 消息中的 M/O/A 比特位的取值,主机会决定如何动态配置接口的唯一本地地址和全局单播地址,以及如何获取其他配置信息。在某些比特位取值组合下,主机需要运行 DHCPv6 客户端软件,连接到服务器以获取地址分配和/或其他配置信息。整个过程如以下消息时序图所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
sequenceDiagram

participant R as 路由器
participant H as 主机
participant S as DHCPv6 服务器
Note over R,H: 路由器请求
rect rgb(239, 252, 202)
H->>R: Router Solitication
R-->>H: Router Advertisement
end
Note over H,S: 地址请求
rect rgb(230, 250, 255)
H->>S: DHCPv6 Solicit
S-->>H: DHCPv6 Advertise
H->>S: DHCPv6 Request
S-->>H: DHCPv6 Reply
end
Note over H,S: 其他信息请求
rect rgb(230, 250, 255)
H->>S: DHCPv6 Information-request
S-->>H: DHCPv6 Reply
end

image-20220108234402513

注意: 与 IPv4 DHCP 协议不同,DHCPv6 客户端使用 UDP 端口546,服务器使用 UDP 端口547。

以下详细解释由 M/O/A 比特位的取值组合所确定的三种动态分配方案:

  • SLAAC
  • SLAAC + 无状态 DHCPv6
  • 有状态 DHCPv6

1. SLAAC

SLAAC是最简单的 IPv6 地址自动分配方案,不需要任何服务器。其工作原理是主机启动后发送 RS 消息请求,路由器回送 RA 消息至本地网段所有节点。如果 RA 消息包含如下设置:

  • 首部的 M 比特和 O 比特都清零
  • 前缀信息选项的 L 比特和 A 比特置为1

那么主机收到这个 RA 消息后,执行如下操作实现 SLAAC:

  1. 组合网络前缀与本地接口标识,生成唯一本地地址或全局单播地址
  2. 安装默认网关(或缺省路由)指向路由器地址 (RA消息的源地址)
  3. 将此接口设为对应网络前缀的“在链路”,也是以上默认网关的下一跳接口
  4. 如果包含 RDNSS 和/或 DNSSL 选项,安装域名服务器和域名后缀

这样,主机就获得了一个或多个 IPv6 唯一本地地址或全局单播地址,以及默认网关和域名服务信息,可以完成各种互联网连接。

下面是思科 Catalyst 9300 多层接入交换机上的 SLAAC 配置示例:

1
2
3
4
5
6
7

ipv6 unicast-routing
interface Vlan10
ipv6 enable
ipv6 address 2001:ABCD:1000::1/64
ipv6 nd ra dns server 2001:4860:4860::8888 infinite
ipv6 nd ra dns search-list example.com

思科多层交换机的第三层接口提供路由功能。可以看到,当在 VLAN 10 的第三层接口激活 IPv6 之后,其默认的地址自动分配方案就是 SLAAC。从该接口发出的 RA 消息的控制比特位全部按照 SLAAC 方案设置,其配置的每个 IPv6 地址的网络前缀都会被自动加入到 RA 前缀信息选项列表中。当然,网络管理员也可以用单独的接口配置命令排除某些网络前缀。示例的最后两行配置命令指定了 RDNSS 和 DNSSL,它们也被加入到 RA 消息选项中。

这时如果主机接入 VLAN 10 的端口,就会马上获得一个网络前缀为 2001:ABCD:1000::/64 全局单播地址,同时其默认网关的地址被设定为 2001:ABCD:1000::1。打开浏览器输入一个网址,它就会向指定的域名服务器 2001:4860:4860::8888(谷歌的公共域名服务器地址)发出域名解析请求,以获取目的网址的 IPv6 地址建立连接。

2. SLAAC + 无状态 DHCPv6

SLAAC 自动地址分配快捷方便,为中小型网络部署提供了即插即用的 IPv6 部署方案。但是如果网络节点需要获得其他一些配置信息,比如 NTP/SNTP 服务器、TFTP 服务器和 SIP 服务器地址,或者其功能依赖某些厂商特定的信息选项 (Vendor-specific Information Option) 时,就必须选择 SLAAC + 无状态 DHCPv6 的方案。

这一方案依然使用 SLAAC 自动地址分配,但是路由器会指示主机去连接 DHCPv6 服务器以获取其他配置信息。这时路由器回送的 RA 消息设置变为:

  • 首部的 M 比特清零,O 比特置为1
  • 前缀信息选项的 L 比特和 A 比特置为1

主机收到这个 RA 消息后,执行如下操作:

  1. 组合网络前缀与本地接口标识,生成唯一本地地址或全局单播地址
  2. 安装默认网关(或缺省路由)指向路由器地址 (RA消息的源地址)
  3. 将此接口设为对应网络前缀的“在链路”,也是以上默认网关的下一跳接口
  4. 如果包含 RDNSS 和/或 DNSSL 选项,安装域名服务器和域名后缀
  5. 启动 DHCPv6 客户端,连接 DHCPv6 服务器请求其他配置信息
  6. 保存 DHCPv6 服务器回复的其他配置信息

可以看到,SLAAC + 无状态 DHCPv6 在地址分配上与 SLAAC 并没有什么不同。DHCPv6 只是提供附加配置信息,不会分配 IPv6 地址。所以 DHCPv6 服务器不会追踪网络节点的地址分配状况,这就是“无状态”的含义。

相应的 Catalyst 9300 交换机上的配置命令如下:

1
2
3
4
5
6
7
8
9
10
11
12

ipv6 unicast-routing
ipv6 dhcp pool vlan-10-clients
dns-server 2001:4860:4860::8888
domain-name example.com
sntp address 2001:DB8:2000:2000::33
interface Vlan10
ipv6 enable
ipv6 address 2001:ABCD:1000::1/64
ipv6 nd other-config-flag
ipv6 dhcp server vlan-10-clients
# ipv6 dhcp relay destination 2001:9:6:40::1

与 SLAAC 的例子不同点在于,VLAN 10 接口配置命令ipv6 nd other-config-flag明确指定置位 RA 消息的 O 比特。其下一条命令ipv6 dhcp server vlan-10-clients激活接口的 DHCPv6 服务器响应功能,对应服务器的共用资源名称为vlan-10-clients。DHCPv6 服务器的配置在接口配置的上方,从ipv6 dhcp pool vlan-10-clients处开始,包含了 DNS 服务器地址、DNS 域名和 SNTP 服务器地址。

如果使用交换机之外的位于其他网段的 DHCPv6 服务器,可以删除ipv6 dhcp server命令,启用示例中下一行的ipv6 dhcp relay destination命令指定转发 DHCPv6 请求至外部服务器的地址。

3. 有状态 DHCPv6

许多大型企业应用 DHCP 管理设备的 IPv4 地址,所以部署 DHCPv6 集中分配和管理 IPv6 地址是自然的优先选择。这就是有状态 DHCPv6的用武之地。这一方案同样需要路由器发送的 RA 消息,但是不会仅仅依靠网络前缀进行自动地址分配。RA 消息的控制比特位设置是:

  • 首部的 M 比特置为1,O 比特无所谓
  • 前缀信息选项的 L/A 比特可按需要设为1或0

收到这个 RA 消息后,主机执行操作如下:

  1. 如果有前缀信息选项 A 比特设为1,则组合生成唯一本地地址或全局单播地址
  2. 安装默认网关(或缺省路由)指向路由器地址 (RA消息的源地址)
  3. 如果有前缀信息选项 L 比特设为1,将此接口设为对应网络前缀的“在链路”
  4. 如果包含 RDNSS 和/或 DNSSL 选项,安装域名服务器和域名后缀
  5. 启动 DHCPv6 客户端,连接服务器请求地址和其他配置信息
  6. 将 DHCPv6 服务器分配的地址设置到此接口
  7. 保存 DHCPv6 服务器回复的其他配置信息

Catalyst 9300 交换机上的有状态 DHCPv6 配置命令示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
ipv6 unicast-routing
ipv6 dhcp pool vlan-10-clients
address prefix FD09:9:5:90::/64
address prefix 2001:9:5:90::/64
dns-server 2001:9:5:90::115
domain-name test.com
interface Vlan10
ipv6 enable
ipv6 address 2001:ABCD:1:1::1/64
ipv6 nd prefix 2001:ABCD:1:1::/64 no-advertise
ipv6 nd managed-config-flag
ipv6 dhcp server vlan-10-clients

与 SLAAC + 无状态 DHCPv6 相比,这里接口配置去掉了ipv6 nd other-config-flag,改用ipv6 nd managed-config-flag命令。这对应于将 RA 消息首部的 M 比特置为1。DHCPv6 服务器的配置加入了两条address prefix命令设置网络前缀。同时接口配置的ipv6 nd prefix 2001:ABCD:1:1::/64 no-advertise指定路由器不包含2001:ABCD:1:1::/64前缀信息选项到 RA 中。所以,这个例子主机接口不会生成 SLAAC 地址,只会产生来自 DHPCv6 的两个地址:一个是网络前缀为 FD09:9:5:90::/64 的唯一本地地址,另一个是网络前缀为 2001:9:5:90::/64 的全局单播地址。这两个地址的接口标识也分别由 DHPCv6 指定。

如何分辨主机接口动态分配的地址来源?方法很简单。要记住的一点是,DHPCv6 不会发送网络前缀长度给请求者,所以从 DHPCv6 拿到的地址的网络前缀长度都是128。而 SLAAC 生成的地址网络前缀长度不会是128的。

下面为Linux 主机上接口实例:

1
2
3
4
5
6
7
8
9
10
wlp0s20f3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet 192.168.4.240 netmask 255.255.255.0 broadcast 192.168.4.255
inet6 fe80::b2e1:5565:d56e:5d0f prefixlen 64 scopeid 0x20<link>
inet6 fd4b:e40e:f5de::e73 prefixlen 128 scopeid 0x0<global>
inet6 fd4b:e40e:f5de:0:b482:79d1:43c8:fe3f prefixlen 64 scopeid 0x0<global>
ether dc:71:96:7f:a6:3e txqueuelen 1000 (Ethernet)
RX packets 942610 bytes 1202958613 (1.1 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 416037 bytes 57598961 (54.9 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

我们马上可以判定,该接口使用的是有状态 DHCPv6 地址分配,但也用收到的RA通告报文中相同的网络前缀fd4b:e40e:f5de::/64生成了 SLAAC 地址:

image-20220108235113627

  • fd4b:e40e:f5de::e73/128 — DHCPv6 地址,接口标识为随机数
  • fd4b:e40e:f5de:0:b482:79d1:43c8:fe3f/64— SLAAC 地址,接口标识为 由隐私扩展或加密协议生成
  • fe80::b2e1:5565:d56e:5d0f/64 — 链路本地地址,接口标识为 由隐私扩展或加密协议生成

下表列出了 RA 消息的控制比特组合与地址分配和其他配置获取方式的关系:

M-比特 O-比特 A-比特 主机地址 其他配置
0 0 0 静态设置 手工配置
0 0 1 前缀由 RA 指定,自动生成 手工配置
0 1 0 静态设置 DHCPv6
0 1 1 前缀由 RA 指定,自动生成 DHCPv6
1 0 0 有状态 DHCPv6 DHCPv6
1 0 1 有状态 DHCPv6 和/或 自动生成 DHCPv6
1 1 0 有状态 DHCPv6 DHCPv6
1 1 1 有状态 DHCPv6 和/或 自动生成 DHCPv6

总结三种动态分配方案:

分配方案 特点 适用场景
SLAAC 简单实用,快速部署 中小企业、消费类产品联网、物联网 (IoT)
SLAAC + 无状态 DHCPv6 自动配置,扩展服务 中小企业需要附加网络服务
有状态 DHCPv6 集中管理和控制 大型企业、事业单位和校园网

**注意:**由于 IPv6 网络接口可以有多个地址(一个链路本地地址,加上一个或多个唯一本地地址和/或全局单播地址),在建立外部连接时,如何选择源地址变得非常重要。RFC 6724 给出了详细的 IPv6 源地址选择规则。在嵌入式系统的开发中,与同一远端设备连接的控制平面和数据平面常常由不同的功能组件实现。比如控制平面直接调用 Linux 用户空间套接字建立连接,连接使用的 IPv6 源地址由 TCP/IP 协议栈选定,而数据平面直接在内核空间实现数据封装处理和传输。这时要及时将控制平面所选择的 IPv6 源地址同步到数据平面,否则用户数据无法送达同一目的地。


https://www.packetmania.net/2020/12/01/IPv6-Addressing/

https://blog.csdn.net/linuxblack125125/article/details/7884415

https://blog.csdn.net/qq_38265137/article/details/80475510

https://blog.csdn.net/weixin_35123329/article/details/112780543