IPv6 的 NS 和 NA 功能、地址分类、邻居发现协议(NDP)、路由器发现以及无状态自动配置(SLAAC),这些机制共同确保了 IPv6 网络的高效通信和地址管理。
IPv6 邻居发现协议:NS 和 NA
文不值 已于 2023-04-05 15:43:37 修改
邻居发现协议:Neighbor Discovery Protocol(NDP)
在 ICMPv6 中定义了新的消息类型,用于实现地址解析、重复地址检测、跟踪邻居状态、路由器发现及重定向等功能。
消息类型 133 和 134 主要用于实现路由器发现功能,包括发现网关和前缀。任何 IPv6 路由器及交换机均可提供此功能。
消息类型 135 和 136 主要用于实现地址解析和重复地址检测(DAD)功能,实际上代替了 IPv4 中 ARP(广播)的功能。
IPv6 地址发现技术
通过 NS 和 NA 报文实现 ARP 和 DAD 功能。
- NS(Neighbor Solicitation,邻居请求):类似于 IPv4 中的 ARP 请求报文。
- NA(Neighbor Advertisement,邻居通告):类似于 IPv4 中的 ARP 应答报文。
上图的命令可用于查看邻居表。使用 ping
命令对某个地址进行测试后,该地址会被添加到邻居表中。
查看邻居表时,可以看到状态为 STALE
和 REACH
的条目。
STALE 状态:设备处于 REACHABLE
状态后 30 秒内,如果没有收到其他报文,则邻居状态进入 STALE
状态,表示“陈旧”。如果设备不需要向该邻居发送数据,则此状态会一直持续下去。需要注意的是,STALE
状态是这些状态中唯一可以稳定持续存在的状态。
REACHABLE 状态:设备已收到 NA 响应报文(30 秒内)。
以下命令可用于列出当前网卡信息:
从图中可以看出,2018::2
和 2018::a
均存在。
若要清空邻居表,可执行以下命令:
reset ipv6 neighbors all
执行后,邻居表将被清空。
此时,对 2018::1
进行 ping
操作,仍可收到回复,类似于 ARP 请求与应答的过程,如下图所示:
从图中可以看出,2018::1
和 2018::a
分别向对方发送了请求,从而获取了彼此的 MAC 地址。
下图显示了它们已经获取了对方的 MAC 地址:
无论谁向谁发送请求,路由器都能观察到这一过程。下图中的路由器接口配置了 2018::A
。
此时,路由器会自动加入以下特殊组播组地址:
-
所有节点组播组地址:
FF02::1
-
所有路由器组播组地址:
FF02::2
-
请求节点组播组地址:
FF02::1:FF00:A
-
Solicited Node(请求节点):请求节点组播地址的开头为
FF02::1:FF00/104
,加上单播地址的最后 24 位。
例如,单播地址为 2018::A
,则请求节点组播组地址的最后 16 位为 A
。若配置一个单播地址,其最后 24 位为 1234
,则会加入一个以 1234
结尾的请求节点组播组地址。
分析:当设备 A 想要获取设备 1 的 MAC 地址时,若设备 1 在线,则会加入请求节点组。设备 A 可以向设备 1 对应的组播组地址发送请求。此时,若设备 1 在线,则必然会收到请求并进行回应。
再次分析抓包内容:2018::a
请求 2018::1
的 MAC 地址,2018::1
会加入 FF02::1:FF00:1
这个请求节点组。此时,2018::1
必然会收到 2018::a
的请求,并进行回应。回应时,2018::1
已知 2018::a
的 MAC 地址,因此会进行单播回应(类似于 IPv4 的单播)。
IPv6 通过这种方式巧妙地实现了类似广播的功能。通信流程如下图所示:
类似于 ARP 的免费 ARP 功能,IPv6 也支持向自身发送请求以实现地址冲突检测功能。
下图中,设备 A 配置的地址为 FC00::1
,设备 B 也配置了相同的地址。可以看到,设备 A 的地址前有一个“Tentative Address”,表示试验性地址。设备 A 会发送一个请求,目标组播组地址为其自身的组播组地址。如果收到回应,则说明地址重复。这种方式称为 DAD(Duplicate Address Detection,重复地址检测)。
以下是一个实验场景:路由器和 PC 配置了相同的地址。
将路由器的地址修改为 ::2
,先删除之前的地址 2018::A
,再配置为 2018::2
(否则无法配置成功)。
回车后,抓包查看:
可以看到,设备以空地址发送了一个请求到 2
的组播组地址,询问 2
是否有 MAC 地址。如果没有收到回应,则说明没有地址冲突。
然而,可以看到有回应:
重新演示一遍:
右键单击 AR1 进行抓包,然后配置 AR1 的接口 0/0/0 为 2018::A
。
查看抓包结果,蓝色行表示正在询问 A
的地址是否重复。可以看到,目前没有收到回应,这是正常的,说明没有重复。
此时,查看该地址,可以看到已经生效。
在未确认之前,配置的每个地址都会发送一个 NS 请求以确认是否重复。如果没有重复,则地址后面会有 Tentative
标识。
将 PC 的地址修改为 A
。
此时,查看抓包工具,没有提示。这是因为配置 PC 时,PC 不会发送 NS 请求。如果是配置路由器,则会有 NS 请求,并且会提示地址冲突。
以下是一个不冲突地址的演示:
将左右两边的路由器配置为不同的地址。
此时,可以正常 ping
通,因为它们是直连的。
然而,一旦将两个路由器的地址配置为相同的冲突地址,则会出现提示。此时,打开 AR2 的抓包工具,修改 AR2 的地址与 AR1 的地址相同(需要先删除之前的地址)。
删除之前的地址,然后配置为与右边相同的地址。
回车后抓包,可以看到设备先发送了一个 NS 请求,紧接着收到一个回应,表明地址冲突,该地址无法使用。
可以看到,地址后面有一个 DUPLICATE
标识。这是 DAD 检测的结果,会有一个间断性的重复检测时间,类似于 ARP 的功能,且默认开启。NS 和 NA 也是默认开启的,但无法关闭。
将地址修改回原地址后,标识会变为 TENTATIVE
。
总的来说,NS 和 NA 的功能是代替 IPv4 中的 ARP 功能。配置时,设备会向特定的组播地址发送报文,组播地址类型中有一个请求节点地址。在单播地址配置完成后,设备会自动加入对应的组播组。单播地址只使用到后 24 位,虽然存在冲突的可能性,但 24 位冲突的概率几乎可以忽略不计。
【网络协议】----IPv6 协议报文、地址分类
跳跳没虎 于 2024-05-08 23:53:01 发布
IPv6 协议简介
IPv6 特点
IPv6 诞生背景
- IPv4 公网地址耗尽。
- Internet 用户快速增长。
- NAT 虽然可以解决私有地址空间与公网互访的问题,但破坏了端到端通信的完整性。
- IPv4 对移动性的支持不够理想。
IETF 在 20 世纪 90 年代提出下一代互联网协议——IPv6,目前 IPv6 已成为公认的 IPv4 未来的升级版本。
IPv6 技术特点
- 地址空间巨大。
- 精简报文结构。
- 实现自动配置和重新编址。
- 支持层次化网络编址。
- 支持端到端安全。
- 更好地支持 QoS 和移动特性。
IPv4 和 IPv6 报文结构
IPv4 报文结构
- Version(版本号):长度为 4bit。对于 IPv6,该值为 6。
- Traffic Class(流类别):长度为 8bit。等同于 IPv4 中的 Type Of Service 字段,表示 IPv6 数据报的类或优先级,主要用于 QoS。
- Flow Label(流标签):长度为 20bit。IPv6 新增字段,用于区分实时流量。不同流标签加源地址可以唯一确定一条数据流,中间网络设备可以根据这些信息更高效地区分数据流。
- Payload Length(有效载荷长度):长度为 16bit。有效载荷是指紧跟 IPv6 报头的数据报的其他部分(即扩展报头和上层协议数据单元)。
- Next Header(下一个报头):长度为 8bit。指明下一个扩展报头(如果存在)或上层协议的类型。
- Hop Limit(跳数限制):长度为 8bit。该字段类似于 IPv4 中的 Time to Live 字段,定义了 IP 数据报所能经过的最大跳数。每经过一个路由器,该数值减去 1,当该字段的值为 0 时,数据报将被丢弃。
- Source Address(源地址):长度为 128bit。表示发送方的地址。
- Destination Address(目的地址):长度为 128bit。表示接收方的地址。
IPv6 报文格式 - 扩展报头
扩展报头是可选的,只有在需要该扩展报头对应的功能时,数据的发送者才会添加相应扩展报头。
在 IPv4 中,IPv4 报头包含可选字段 Options,内容涉及 security、Timestamp、Record route 等,这些 Options 可以将 IPv4 报头长度从 20 字节扩充到 60 字节。在转发过程中,处理携带这些 Options 的 IPv4 报文会占用路由器很大的资源,因此实际中也很少使用。
在 IPv6 中,这些 Options 从基本报文格式中剥离,放到基本报头和上层协议数据单元之间。一个 IPv6 报文可以包含 0 个、1 个或多个扩展报头,仅当需要路由器或目的节点做某些特殊处理时,才由发送方添加一个或多个扩展头。与 IPv4 不同,IPv6 扩展头长度任意,不受 40 字节限制,这样便于日后扩充新增选项。这一特征加上选项的处理方式使得 IPv6 选项能得以真正的利用。但是为了提高处理选项头和传输层协议的性能,扩展报头总是 8 字节长度的整数倍。
当使用多个扩展报头时,前面报头的 Next Header 字段指明下一个扩展报头的类型,这样就形成了链状的列表。
路由设备转发时根据基本报头中的 Next Header 值来决定是否要处理扩展头,并不是所有扩展报头都需要被路由转发设备查看和处理。
除了目的选项扩展报头可能在一个 IPv6 报文中出现一次或两次(一次在路由扩展报头之前,另一次在上层协议数据报文之前),其余扩展报头只能出现一次。
IPv6 地址分类
- IPv4 地址分为单播地址、组播地址和广播地址。而 IPv6 中没有广播地址,增加了任播地址。IPv6 地址被分为:单播地址、组播地址、任播地址。
- 单播地址用于标识一个接口,发往该目的地址的报文会被送到被标识的接口。一个接口拥有多个 IPv6 地址是非常常见的现象。
- 组播地址用于标识多个接口,发往该目的地址的报文会被送到被标识的所有接口。
- 任播地址用于标识多个(一组)网络接口(通常属于不同节点),发往该目的地址的报文会被送到被标识的所有接口中最近的一个接口上。实际上任播地址与单播地址使用同一个地址空间,即由路由器决定数据包是做任播转发还是单播转发(任播地址只能作为目标地址)。
IPv6 地址表示
- IPv6 地址总长 128 比特,通常为 8 组,每组为 4 个十六进制数的形式,每组十六进制数间用冒号分隔。例如:
FC00:0000:130F:0000:0000:09C0:876A:130B
。这是 IPv6 地址的首选格式。 - 压缩规则:每组中的前导“0”都可以省略。所以上述地址可写为:
FC00:0:130F::90C:876A:130B
。 - 地址中包含两个连续或多个连续均为“0”的组,可用冒号“::”来代替。注意:在一个 IPv6 地址中只能出现一次双冒号“::”。
IPv6 单播地址
可聚合全球单播地址
- 全球单播地址定义用于 IPv6 Internet,是全局唯一和全局可达路由,类似于 IPv4 公网地址。
- 由前缀、子网 ID 和接口标识组成。
- 2 进制表示:
0010 0000 0000 0000::
- 16 进制表示:
2000::
- 2 进制表示:
0011 1111 1111 1111::
- 16 进制表示:
3EEE::
- 全局路由前缀:由提供商指定给一个组织机构,一般至少为 48bit。目前已分配的全局路由前缀前 3bit 均为 001,前缀为
2000::/3
。 - 子网:组织机构用子网 ID 来构建本地网络,与 IPv4 中的子网号作用类似。
- 主机位:与 IPv4 中的主机 ID 作用相同。
链路本地地址
- 在一个节点启动 IPv6 协议栈时,节点每个接口会自动分配一个链路本地地址,专门用来和相同链路上的其他主机通信。
- 只能在连接到同一本地链路的节点之间使用,用于邻居发现、无状态地址、路由协议等。
- 链路本地地址前缀为
FE80::/10
,将接口 ID 添在后面作为地址的低 64 位。 - 每个 IPv6 接口都必须具备一个链路本地地址。
唯一本地地址
- 因为 IPv6 要实现端到端的特性,导致此地址没有实施的可能性。
- 类似于 IPv4 中的私网地址,仅能在本地网络中使用,在公网 Internet 上不可被路由。
- 唯一本地地址固定前缀为
FC00::/7
。它被分为两块,其中FC00::/8
暂未定义,另一块是FD00::/8
,其格式如下:
特殊地址
- 未指定地址:
0:0:0:0:0:0:0:0/128
或::/128
。该地址作为某些报文的源地址,例如作为重复地址检测时发送的邻居请求报文(NS)的源地址,或者 DHCPv6 初始化过程中客户端所发送的请求报文的源地址。 - 环回地址:
0:0:0:0:0:0:0:1/128
或::1/128
。与 IPv4 中的127.0.0.1
作用相同,用于本地回环,发往::1
的数据包实际上就是发给本地,可用于本地协议栈回环测试。 - IPv4 兼容地址:在过渡技术中,为了让 IPv4 地址显得更加突出一些,定义了内嵌 IPv4 地址的 IPv6 地址格式。在这种表示方法中,IPv6 地址的部分使用十六进制表示,IPv4 地址部分可用十进制格式。例如:
64:FF9B::11.11.11.11
,用于过渡技术 NAT64 翻译。该地址已经几乎不再使用。
补充:接口标识(主机位)生成方法
- 关于接口 ID:接口 ID 为 64bit,用于标识链路上的接口,在每条链路上接口 ID 必须唯一。
- 接口 ID 可通过以下 3 种方法生成:手工配置、系统自动生成和 IEEE EUI - 64 规范生成。
通过 EUI - 64 规范根据 MAC 地址生成接口 ID
- 假设一个接口的 MAC 地址如上图所示,那么采用 EUI - 64 规范,接口可根据该 MAC 地址计算得到接口 ID。由于 MAC 地址全局唯一,因此该接口 ID 也相应的具备全局唯一性。计算过程如下:
- 将 48bit 的 MAC 地址对半劈开,然后插入“FFFE”,再对从左数起的第 7 位(即 U/L 位)取反,即可得到对应的接口 ID。
- 而在 EUI - 64 接口 ID 中,第 7bit 的含义与 MAC 地址正好相反,0 表示本地管理,1 表示全球管理。所以使用 EUI - 64 格式的接口 ID,U/L 位为 1,则地址是全球唯一的;如果为 0,则为本地唯一。这就是为什么要反转该位。
IPv6 组播地址
- 用来表示一组接口。发往组播地址的数据将被转发给侦听该地址的多个设备。
- 地址范围:
FF00::/8
预定义组播地址
- Node - local:
FF01::1
:所有节点的组播地址。FF01::2
:所有路由器的组播地址。
- Link - local:
FF02::1
:所有节点的组播地址。FF02::2
:所有路由器的组播地址。FF02::1:FFXX:XXXX
:Solicited - Node 组播地址。FF02::5
:所有 OSPF 路由器组播地址。FF02::6
:所有 OSPF 的 DR 路由器组播地址。FF02::14
:所有 PIM 路由器组播地址。
被请求节点组播地址
- 被请求节点组播地址通过节点的单播或任播地址生成。当一个节点具有单播或任播地址时,就会对应生成一个被请求节点组播地址,并且加入这个组播组。
- 一个单播或任播地址对应一个被请求节点组播地址,用于地址解析和地址重复检测等功能。
- 被请求节点组播地址由固定前缀
FF02::1:FF00:0/104
和对应 IPv6 地址的最后 24 比特组成。被请求节点组播地址的有效范围为本地链路范围。
IPv6 组播的 MAC 地址映射
- 在以太网环境中,一个组播 IPv6 报文必须执行以太网封装。
- 组播 IPv6 报文的目的地址是组播 IPv6 地址,而目的 MAC 地址必须是组播 MAC 地址,并且必须与对应组播 IPv6 地址对应。
- 3333 是专门为 IPv6 组播预留的 MAC 地址前缀,组播 MAC 地址的后 32bit 从对应的组播 IPv6 地址的后 32bit 拷贝而来。
例如:
- 一个接口 MAC 地址为
00E0 - FC10 - 2E1B
(48bit)。 - 根据 EUI - 64 生成接口 ID。第 7bit 取反,插入 FFFE,得到
02E0:FCFF:FE10:2E1B
。 - 链路本地地址前缀为
FE80::/10
,接口 ID 作为后 64bit,得到FE80::2E0:FCFF:FE10:2E1B
。 - 对应链路本地地址的组播地址,固定前缀为
FF02::1:FF00:0/104
,加上对应 IPv6 地址的最后 24bit,得到FF02::1:FF10:2E1B
。 - 对应组播地址的 MAC 地址,固定前缀为 3333,后 32bit 从对应组播 IPv6 地址的后 32bit 拷取,得到
3333 - FF10 - 2E1B
。
接口 MAC 为 00E0 - FC10 - 2E1B
,组播 MAC 为 3333 - FF10 - 2E1B
。
IPv6 邻居发现协议 - NDP 概述
跳跳没虎 于 2024-05-09 23:20:51 发布
IPv6 邻居发现协议 - NDP 概述
NDP(Neighbor Discovery Protocol,邻居发现协议)在 RFC2462 及 RFC4861 中定义。NDP 实现了 IPv6 中诸多重要机制。
NDP 使用 ICMPv6 的相关报文
- RS(Router Solicitation):路由器请求报文。
- RA(Router Advertisement):路由器通告报文。
- NS(Neighbor Solicitation):邻居请求报文。
- NA(Neighbor Advertisement):邻居通告报文。
地址解析
在 IPv4 中,可以通过 ARP 由 IP 地址解析到链路层地址,ARP 协议工作在 OSI 模型第二层。在 IPv6 邻居发现协议中,使用 ICMPv6 报文在 OSI 第三层完成地址解析。
- IPv6 地址解析不再使用 ARP,也不再使用广播方式。
- 地址解析在 OSI 第三层完成,针对不同的链路层协议可采用相同的地址解析协议。
- 通过 ICMPv6(类型 135 的 NS 以及类型 136 的 NA 报文)实现地址解析。
- NS 报文发送使用组播方式发送,报文的目标 IPv6 地址为被请求 IPv6 地址对应的“被请求节点组播地址”,报文的目的 MAC 为组播 MAC。
- 采用组播方式发送 NS 消息相比于广播的方式更加高效,也减少对其他节点的影响和对二层网络的性能压力。
地址解析报文
地址解析过程中使用了两种 ICMPv6 报文:邻居请求(Neighbor Solicitation)和邻居通告(Neighbor Advertisement)。
- 邻居请求(Neighbor Solicitation,NS)
- Type=135,Code=0。
- Target Address 是需要解析的 IPv6 地址,因此该处不准出现组播地址。
- 邻居通告(Neighbor Advertisement,NA)
- Type=136,Code=0。
- R 标志(Router flag)表示发送者是否为路由器,如果为 1,则表示是。
- S 标志(Solicited flag)表示发送邻居通告是否是响应某个邻居请求,如果为 1,则表示是(0 例如路由器或 PC 重启后主动发送 RA 邻居通告,类似免费 ARP)。
- O 标志(Overide flag)表示邻居通告中的消息是否覆盖已有的条目信息,如果为 1,则表示是。
- Target Address 表示所携带的链路层地址对应的 IPv6 地址。
地址解析过程
(1)发送 NS 报文
在上图所示的场景中,PC1 要请求 PC2 的 2001::2222:2222
地址对应的 MAC 地址。PC1 会发送一个 NS 报文。这个报文的源地址是 2001::1111:1111
,目的地址是 2001::2222:2222
对应的被请求节点组播地址 FF02::1:FF22:2222
。
然后 IPv6 数据包被封装上数据帧头部,其中源 MAC 地址是 PC1 的 MAC 地址,目的 MAC 地址是 2001::2222:2222
对应的被请求节点组播地址映射得到的 MAC。
(2)接收 NS 报文并响应
除 PC2 外的其他节点也会收到这个数据帧。在读取数据帧头时,发现目的 MAC 地址是一个组播 MAC 地址,而该组播 MAC 地址在本地并不侦听,因此在网卡层面就将数据帧丢弃,不再往报文里查看。
PC2 收到这个数据帧后,由于本地网卡接收目的 MAC 地址为 3333 - FF22 - 2222
的数据帧,因此在对数据帧做校验之后,从帧头的类型字段得知里头是一个 IPv6 报文,于是将帧头拆掉,把 IPv6 报文上送 IPv6 协议栈处理。IPv6 协议栈从报文的 IPv6 头部中的目的 IPv6 地址得知这个数据包是发往一个被请求节点组播地址 FF02::1:FF22:2222
,而本地网卡加入了这个组播组。接着,从 IPv6 包头的 NextHeader 字段得知 IPv6 包头后面封装着一个 ICMPv6 的报文,因此将 IPv6 包头拆除,将 ICMPv6 报文交给 ICMPv6 协议去处理。最后 ICMPv6 发现这是一个 NS 报文,要请求自己 2001::2222:2222
对应的 MAC 地址,于是回送一个 NA 报文给 PC1,在该报文中包含 PC2 的 MAC 地址。
IPv6 不像 IPv4 那样使用 ARP 表来缓存 IP 与 MAC 地址映射,而是维护一个 IPv6 邻居表。
- 华为数通设备上,使用
display ipv6 neighbors
命令来查看 IPv6 邻居表。 - Windows 系统,使用
netsh interface ipv6 show neighbors
命令查看缓存的 IPv6 邻居。
邻居状态跟踪
邻居状态种类
实际通信过程中,IPv6 不仅进行地址解析,还会维护一张邻居表,每个邻居都有相应的状态,状态之间可以迁移。邻居状态有以下五种:
- Incomplete(未完成):邻居请求已经发送到目标节点的请求组播地址,但没有收到邻居的通告。
- Reachable(可达):收到确认,不需要再发送确认报文。
- Stale(陈旧):收到上一次可达性确认后超过了 30 秒。
- Delay(延迟):在 Stale 状态后发送过一个报文,并且在 5 秒内没有收到可达性确认。
- Probe(探查):每隔 1 秒重传邻居请求,主动请求可达性确认。
邻居状态变化
以下是一个例子:节点 A 要访问节点 B,A 的缓存中无 B 的条目,下图是邻居状态机的变化。
- A 先发送 NS,并生成邻居缓存条目,状态变为 Incomplete。
- 若 B 回复 NA,则 Incomplete -> Reachable;否则 10 秒后 Incomplete -> Empty(即删除条目)。
- 经过 Reachable Time(30 秒),条目状态 Reachable -> Stale。
- 或者在 Reachable 状态,收到 B 的 非请求 NA,且链路层地址不同,则马上 -> Stale。
- 在 Stale 状态,若 A 要向 B 发送数据,则 Stale -> Delay,同时发送 NS 请求。
- 在 Delay_First_Probe_Time(默认 5 秒) 后,Delay -> Probe。若期间有 NA 应答,则刷新表项 Delay -> Reachable。
- 在 Probe 状态,每隔 RetransTimes(默认 1 秒) 发送单播 NS,发送 MAX_UNICAST_SOLICIT(默认 3 次) 后再等 RetransTimes。若有应答,则 -> Reachable;没有应答则进入 Empty(即删除表项)。
IPv6 的邻居维护关系确保在发起通信之前,邻居是可达的,而 IPv4 的 ARP 无法做到这一点,ARP 表项仅通过老化机制实现。
重复地址检测(DAD)
DAD 机制
- 重复地址检测 确保网络中没有两个相同的单播地址。
- 所有单播地址都需要进行 DAD。
- 使用 特殊 NS 和 特殊 NA 完成 DAD 交互过程。
- 一个地址在通过 DAD 检测之前称为 Tentative 地址(试验性地址),接口还暂时不能使用这个试验性地址进行正常的 IPv6 单播通信,但会加入和该地址所对应的 Solicited - Node 组播组。
- DAD 重复地址检测:节点向该 Tentative 地址所在的 Solicited - Node(被请求节点组播地址) 组播发送一个 NS(特殊 NS),源地址为
::
。如果收到某个其他站点回应的 NA,则证明该地址已被网络使用,节点不能使用该 Tentative 地址通信。 - 接口在启用任何一个单播 IPv6 地址前都需要进行 DAD,包括 link - local 地址。
DAD 过程
在上图中,R2 是已经在线的设备,使用图中的地址。现在为 R1 新配置 IPv6 地址 2001::FFFF/64
,该地址立即进入 Tentative 状态,此时地址不可用,除非该地址通过 DAD 检测。
- R1 向链路上以 组播方式发送一个 NS 报文,该 IPv6 的源地址为
::
,目的地址为要进行 DAD 检测的2001::FFFF
对应的被请求节点组播地址FF02::1:FF00:FFFF
。这个 NS 里包含着要做 DAD 检测的目标地址2001::FFFF
。 - 链路上的节点都会收到这个组播 NS 报文。没有配置
2001::FFFF
的节点由于没有加入该地址对应的被请求节点组播组,因此在收到这个 NS 报文后会默默丢弃。R2 接口配置了2001::FFFF
地址,接口会加入到组播组FF02::1:FF00:FFFF
,而此刻收到的报文是该地址为目的地址,因此它会解析该报文。它发现对方进行 DAD 的目标地址与自己本地接口地址相同,于是立即 回送一个 NA 报文。该报文的目的地址是FF02::1
(组播地址),同时在报文内部写入源地址2001::FFFF
,以及自己接口的 MAC 地址。 - 当 R1 收到这个 NA 后,它就知道
2001::FFFF
在链路上已经被其他设备使用了,会将该地址标记为 Duplicate(重复的),该地址不能用于通信。
路由器发现
路由器发现功能
路由器发现功能是 IPv6 地址自动配置功能的基础,主要通过以下两种报文实现:
- RA(Router Advertisement,路由器通告)报文:路由器定期以组播方式发送 RA 报文,携带网络前缀信息及其他配置参数,供主机获取网络配置信息。RA 报文的 Type 字段值为 134,可以一次携带多个前缀。
- RS(Router Solicitation,路由器请求)报文:主机接入网络后,若希望尽快获取网络前缀进行通信,可以发送 RS 报文,请求路由器立即发送 RA 报文。RS 报文的 Type 字段值为 133。
路由器发现功能用于发现与本地链路相连的设备,并获取与地址自动配置相关的前缀及其他配置参数。IPv6 地址支持无状态自动配置,即主机通过路由器发送的 RA 报文获取网络前缀信息,然后自行生成地址的接口标识部分,并自动配置 IPv6 地址。
路由器周期发送 RA
链路上的路由器会定期(约 200 - 600 秒)发送 RA(Router Advertisement)消息。收到 RA 的主机将加入默认路由器列表,而收到 RA 的路由器将检测 RA 内容的一致性。
主机接口初始化时发送 RS 消息,路由器回应 RA。
路由器发现 - 主机发送 RS 请求
主机接入网络后,若希望尽快获取网络配置信息,可以发送 RS 报文,请求路由器立即发送 RA 报文。RS 报文的源地址为主机的链路本地地址,目的地址为所有路由器的组播地址 FF02::2
。
路由器收到 RS 报文后,会立即向请求主机发送一个单播的 RA 报文,或者向所有节点组播地址 FF02::1
发送一个 RA 报文。
IPv6 地址无状态自动配置(SLAAC)
SLAAC 概述
- IPv6 地址无状态自动配置(Stateless Address Autoconfiguration,SLAAC) 是 IPv6 的标准功能,定义在 RFC 2462 中。
- SLAAC 无需部署应用服务器,相比 DHCPv6 更加轻量,设备的 IPv6 地址无需手工配置,即插即用,减轻了网络管理的负担。
SLAAC 工作过程
- 生成链路本地地址:主机根据本地接口 ID 自动产生网卡的链路本地地址。
- 链路本地地址 DAD 检测:主机对链路本地地址进行 DAD 检测,若地址无冲突,则启用该地址。
- 发送 RS 报文:主机发送 RS 报文尝试在链路上发现 IPv6 路由器,报文的源地址为主机的链路本地地址。
- 路由器回复 RA 报文:路由器收到 RS 报文后,回复 RA 报文(携带 IPv6 前缀信息)。即使未收到 RS 报文,路由器也会定期发送 RA 报文。
- 生成全球单播地址:主机根据路由器回复的 RA 报文,获得 IPv6 地址前缀信息,使用该地址前缀加上本地生成的接口 ID,形成单播 IPv6 地址。
- 全球单播地址 DAD 检测:主机对生成的 IPv6 地址进行 DAD 检测,若无冲突,则启用该地址。
配置示例
以下是一个简单的配置示例,展示如何通过 SLAAC 配置 IPv6 地址:
AR1 配置
system - view
ipv6
interface GigabitEthernet0/0/0
ipv6 enable
ipv6 address 2002::1:1/64
undo ipv6 nd ra halt # 开启接收 RA 报文,默认是关闭的
AR2 配置
system - view
sysname Router2
ipv6
interface GigabitEthernet0/0/0
ipv6 enable
ipv6 address auto global # AR2 只需接收 AR1 推送的前缀即可
RS 报文
RS 报文由主机发送,请求路由器立即发送 RA 报文。RS 报文的源地址为主机的链路本地地址,目的地址为所有路由器的组播地址 FF02::2
。
RA 报文
RA 报文由路由器发送,携带网络前缀信息及其他配置参数。RA 报文可以单播给请求的主机,也可以多播到所有节点组播地址 FF02::1
。
其他参数
RA 报文中的前缀处理规则
- 当存在以下情况时,忽略 RA 报文中的前缀:
- RA 报文选项中的“auto”未置位(前缀里面的 Auto 位未设置)。
- 前缀与已有地址前缀重复(包括链路本地地址)。
- RA 报文选项中的“preferred lifetime”时间大于“valid lifetime”(优先时间大于可用时间)。
- 前缀长度与接口 ID 长度之和不等于 128 位(一般要求接口 ID 为 64 位,前缀为 64 位)。
- 除以上情况外,主机获得前缀的同时,还会获得以下相关时间参数:
- “preferred lifetime”:主动通信的有效时间。
- “valid lifetime”:原有通信的有效时间。
- 主机会周期性(约 250 秒)收到 RA 报文,并据此报文更新自己的时间参数。
重定向报文
- 当网关路由器知道更好的转发路径时,会以重定向报文的方式告知主机。
- 重定向报文的结构如下:
- 重定向报文的 Type 字段值为 137,Code 字段值为 0。
- Target Address 是更好的路径下一跳地址。
- Destination Address 是需要重定向转发的报文的目的地址。
重定向过程
以下是一个具体的例子:
假设主机 A 想与主机 B 通信,主机 A 的默认网关路由器是 RTA。当 A 发送报文给 B 时,报文会被送到 RTA。
RTA 接收到 A 发送的报文后,发现实际上主机 A 直接发送给路由器 RTB 更好。于是,RTA 会发送一个 ICMPv6 重定向报文给主机 A,其中 Target Address 为 RTB 的地址,Destination Address 为主机 B 的地址。
主机 A 收到重定向报文后,会在默认路由表中添加一个主机路由,以后发往主机 B 的报文就直接发送给 RTB。
RTA 如何知道去往主机 B 的路径通过 RTB 更好呢?其实很简单,因为 RTA 会发现报文进入的接口就是报文路由得出的接口,也就是说发往主机 B 的路由实际上只是在 RTA 上转了一圈又出来了,然后转发到 RTB。据此,RTA 能判断出直接发送给 RTB 是更好的路径。
via:
- ipv6-冲突检测(NS和NA)_ipv6 ns na-优快云博客
https://blog.youkuaiyun.com/qq_53614206/article/details/129941546 - IPv6邻居发现协议 - NDP概述_ipv6 ndp-优快云博客
https://blog.youkuaiyun.com/weixin_45059947/article/details/138599413 - 【网络协议】----IPv6协议报文、地址分类_ipv6报文-优快云博客
https://blog.youkuaiyun.com/weixin_45059947/article/details/138585746