
https://www.cnblogs.com/FengXingZhe008/p/17335120.html
https://zhuanlan.zhihu.com/p/702468904
一、 ipv6拿地址过程 (RS/RA 无状态拿ipv6地址,NS/NA获取邻居的mac地址)
1.核心角色介绍
RS :路由器请求报文
由主机在启动时发送,主动询问链路上是否有路由器。
RA :路由器通告报文
由路由器周期性发送或响应RS而发送,是IPv6自动配置的"总指挥"。它携带的关键信息包括:
-
前缀信息(Prefix)
-
前缀的有效/优选生命周期
-
M标志位 :管理地址配置标志。
M=1表示主机应使用有状态DHCPv6 获取地址。M=0,表示无状态获取地址。 -
O标志位 :其他配置标志。
O=1表示主机应使用DHCPv6获取其他信息(如DNS服务器)。 -
默认路由(路由器自身的链路本地地址)。
NS :邻居请求报文
用于邻居发现,相当于IPv4的ARP。
功能包括:
-
地址解析:已知目标IP,询问其MAC地址。("谁是FE80::1?请告诉你的MAC。")
-
重复地址检测(DAD):主机在给自己配置一个地址前,先询问这个地址是否已被占用。("有人用2001:db8::1吗?我要用。")


NA :邻居通告报文
响应NS,或主动宣告。用于回答"我就是那个地址,我的MAC是..."。



1)无状态获取ipv6地址
RS:

RA:

2)获取邻居的mac地址
NS:

NA:

2.下挂设备获取IPv6地址的完整过程
假设你的电脑刚连接到家庭路由器的局域网。
2.1 阶段一:获取链路本地地址(Link-Local Address)
电脑开机,启用IPv6网络接口。根据 EUI-64 或 随机生成 的方式,自动生成一个链路本地地址 (格式为 FE80::/10)。
2.关键步骤:重复地址检测
-
电脑发送一个 NS 报文,目标地址就是这个新生成的链路本地地址,询问是否有人使用。
-
如果收到 NA 回应,说明地址冲突,则重新生成并再次检测。
-
如果一段时间内没有收到NA,则认为地址唯一,正式配置给网卡。此时,主机已具备在本地链路通信的能力。
2.2 阶段二:发现网络路由器,获取全局/唯一本地地址
-
主动询问(或等待通告)
-
主动方式 :电脑立即向
ff02::2(所有路由器组播地址 )发送一个 RS 报文,请求路由器现身。 -
被动方式 :电脑也可以等待路由器周期性(如每200秒)发往
ff02::1(所有节点组播地址 )的 RA 报文。
-
-
路由器响应
-
网络中的路由器(家庭网关)收到RS后,会立即向
ff02::1回复一个 RA 报文。 -
RA报文中包含了网络前缀(例如
2001:db8:abcd::/64),以及关键的 M 和 O 标志位。
-
2.3 阶段三:根据RA标志位决定如何配置地址
这是最核心的决策点,由RA报文中的M和O位控制。
场景A:无状态地址自动配置(SLAAC) - M=0 (最常见)
-
M=0表示"无需有状态DHCPv6"。 -
主机直接使用RA报文中的前缀,结合自己的接口标识符(EUI-64或随机生成),合成一个或多个全局IPv6地址(例如
2001:db8:abcd::[接口标识符])。 -
对这个新生成的全局地址,再次执行 重复地址检测 :发送 NS ,若无 NA 回应,则正式启用。
-
如果
O=1,主机会额外发起 有状态DHCPv6 过程(见下文),但仅用于获取DNS等额外信息,不获取地址。
场景B:有状态DHCPv6 - M=1
-
M=1表示"必须使用有状态DHCPv6获取地址"。 -
主机忽略RA中的前缀来合成地址,但会记录RA中的默认路由。
-
主机启动 DHCPv6客户端 ,向
ff02::1:2(所有DHCPv6中继代理和服务器)发送 Solicit 报文,开始标准的 DHCPv6四步交换(Solicit, Advertise, Request, Reply)或两步交换(Solicit, Reply),从DHCPv6服务器获取一个或多个IPv6地址、DNS服务器等完整信息。
场景C:有/无状态结合 - M=0, O=1
-
这是目前推荐且广泛部署的模式。
-
主机通过 SLAAC (
M=0)自动生成一个或多个地址(来自RA前缀)。 -
同时,因为
O=1,主机发起 DHCPv6 过程,仅用于获取 DNS 服务器、 NTP 服务器等其他网络配置信息。
2.4 阶段四:解析默认网关的MAC地址
-
无论通过哪种方式获得地址,主机都需要知道如何将数据包发给默认网关(路由器)。
-
主机查看RA报文,知道默认网关的IP地址(路由器的链路本地地址)。
-
主机发送 NS 报文,目标地址是路由器的链路本地地址,进行地址解析。
-
路由器回复 NA 报文,告知自己的MAC地址。
-
主机将
(路由器IP, 路由器MAC)存入邻居缓存表。
3. 总结与流程图
四种报文在此过程中的作用总结:
-
RS / RA :网络层 配置 。是整个过程的开端和总指挥。负责发现路由器、下发前缀、告知主机采用何种地址配置方式(
M/O位)。 -
NS /NA :链路层 发现 。是地址配置和通信的基础保障。在主机为自己配置任何地址(链路本地、全局)前,进行重复地址检测(DAD) ,防止冲突;在需要向网关或邻居发送数据时,进行地址解析,获取对方的MAC地址。
通过RS/RA和NS/NA完美配合,IPv6实现高效、可靠且功能丰富的即插即用网络接入。

4. 补充细节与现代网络实践
4.1 隐私扩展(Privacy Extensions, RFC 4941)
阶段一提到"随机生成" 接口 ID,在现代操作系统(Windows 10/11, macOS, Linux)中是默认行为。
-
原因 :如果使用 EUI-64(基于 MAC 地址),由于 MAC 地址全球唯一,用户在网络中的行踪(设备指纹)可能被跨网络追踪。
-
现代行为:主机通常会生成两个全局 IPv6 地址:
-
公共地址(Public Address):用于对外提供服务(如作为服务器),可能基于 EUI-64 或稳定的随机数。
-
临时地址(Temporary Address) :用于主动发起连接(如浏览网页),接口 ID 是随机生成的,并且会定期(如每 24 小时)自动更换。一般数据通信(如浏览网页、看视频、下载文件)默认使用的是 "临时地址"。 --- 防止跨网跟踪
-
4.2 重复地址检测(DAD)的重要性
阶段一和阶段三都提到 DAD。
-
注意 :在 IPv6 中,DAD 是强制性的。即使地址是由 DHCPv6 服务器分配的(场景 B),主机在正式使用该地址之前,也必须执行 DAD。
-
结果 :如果 DAD 失败(收到NA),主机绝不能使用该地址。
4.3 关于 DNS 获取的补充(RDNSS 和 DNSSL)
阶段三的场景 C 中,你提到通过 DHCPv6 获取 DNS。但在现代网络中,还有一种更轻量级的方式:
-
RDNSS (Recursive DNS Server) 和 DNSSL (DNS Search List) 选项可以直接包含在 RA (路由器通告) 报文中。
-
如果路由器支持并配置 RDNSS,主机甚至不需要发起 DHCPv6 请求,就能直接从 RA 报文中拿到 DNS 服务器地址。这使得纯 SLAAC 网络的配置更加零接触。
4.4 无状态 DHCPv6 (Stateless DHCPv6)
场景 C 通常被称为 "无状态 DHCPv6"。
区别 :这里的 "无状态" 是指服务器不记录地址分配状态。服务器只提供配置参数(DNS、NTP、域名),不负责分配 IP 地址,也不关心哪个 IP 分给了谁。
5.数据包视角的全过程总结(Wireshark 视角)
假设我们处于场景 C(SLAAC + 无状态 DHCPv6 ),即家庭宽带最常见的模式,数据包交互顺序如下:
5.1 RS (Router Solicitation)
-
源:[我的链路本地地址] (或::未指定地址)
-
目的:ff02::2 (所有路由器)
-
内容:"我刚上线,谁是网关?"
5.2 RA (Router Advertisement)
-
源:[路由器链路本地地址]
-
目的:ff02::1 (所有节点)
-
内容:"我是网关。前缀是 240e:xxx::/64。M=0, O=1。"
5.3 NS (Neighbor Solicitation) - DAD 检测
-
源::: (未指定地址)
-
目的:ff02::1:ffxx:xxxx (被请求节点组播地址)
-
内容:"有人在用 240e:xxx::1234 吗?"
5.4 Solicit ( DHCPv6 )
-
源:[我的链路本地地址]
-
目的:ff02::1:2 (所有 DHCPv6 服务器)
-
内容:"我需要 DNS 服务器地址和其他配置。"
5.5 Advertise ( DHCPv6 )
-
源:[路由器的 DHCPv6 服务地址]
-
目的:[我的链路本地地址]
-
内容:"我有配置信息给你。"
5.6 Request ( DHCPv6 )
-
源:[我的链路本地地址]
-
目的:ff02::1:2
-
内容:"请把刚才的配置发给我。"
5.7 Reply ( DHCPv6 )
-
源:[路由器的 DHCPv6 服务地址]
-
目的:[我的链路本地地址]
-
内容:"DNS 是 240e:xxx::1。"
5.8 NS (Neighbor Solicitation) - 网关 MAC 解析
-
源:[我的全局 IPv6 地址]
-
目的:[路由器链路本地地址的组播映射]
-
内容:"网关,你的 MAC 是多少?"
5.9 NA (Neighbor Advertisement)
-
源:[路由器链路本地地址]
-
目的:[我的全局 IPv6 地址]
-
内容:"我的 MAC 是 xx:xx:xx:xx:xx:xx。"
至此,电脑已具备完整的 IPv6 上网能力。
二、ipv6 prefix delegation 是通过ra报文,还是通过dhcpv6报文获取的?
IPv6 前缀委派(PD,Prefix Delegation)是通过 DHCPv6 报文获取的,而不是通过 RA 报文。
1. RA报文的局限性
-
RA 报文 只能通告单个/64前缀给本地链路使用
-
RA中的Prefix Information Option (PIO) 字段大小有限,通常用于主机自动配置地址
-
RA主要用于本地链路的地址配置,不适合管理整个子网的前缀分配
2. DHCPv6-PD的工作方式
IPv6前缀委派使用DHCPv6 的扩展协议,具体过程如下:

具体报文交互:
-
Solicit :客户端(如家庭网关/CPE)向
ff02::1:2发送,请求前缀 -
Advertise:服务器(ISP设备)回复可用前缀信息
-
Request:客户端选择并请求特定前缀
-
Reply:服务器正式分配前缀(通常是/56或/48前缀)
3. 关键DHCPv6选项
-
Option 25:身份关联(IA_PD) - 客户端用来请求前缀
-
Option 26 :IA_PD前缀选项 - 服务器分配的具体前缀信息
-
Option 3:服务器标识符
4. 实际部署中的典型场景

5. 为什么需要DHCPv6-PD?
分层管理:ISP可以集中管理前缀分配
灵活性:可以分配不同长度的前缀(/48, /56, /60等)
可扩展性:支持多级委派(ISP→运营商→企业→部门)
策略控制:可以基于客户端ID、位置等策略分配前缀
状态跟踪:DHCP服务器可以跟踪前缀分配状态和租期
6. 与RA的协同工作
虽然前缀委派通过DHCPv6完成,但RA仍然发挥作用:
客户端( CPE )通过 DHCPv6-PD获取前缀( 如:2001:db8:1234::/48)
客户端在自己的LAN接口上配置子网 (如:2001:db8:1234:1::/64)
客户端向LAN内设备发送 RA ,通告这些子网前缀,LAN内设备通过SLAAC(基于RA) 配置自己的IPv6地址。
7. 报文格式示例
DHCPv6-PD请求(Solicit)包含:

总结:RA 用于主机地址自动配置,DHCPv6-PD用于路由器之间的前缀委派管理。两者配合,构建了层次化的 IPv6 地址分配体系。