注:本文为 “IPv6 邻居发现协议 NDP” 相关文章合辑。
IPv6 邻居发现协议 --NDP 详解
造夢先森 已于 2022-11-08 20:56:49 修改
一、ICMPv6 -Internet 控制报文协议
ICMPv6 是 IPV6 的基础协议之一,用于向源节点传递报文转发的信息或错误
协议类型号(即:IPv6Next Header)为 58

icmpv6 可以提供 icmpv4 的的对应功能之外,还有其他一些功能的基础如邻居发现、无状态地址配置、重复地址检测、PMTU 发现等。
消息类型:
| 消息类型 | TYPE | 名称 | CODE |
|---|---|---|---|
| 差错消息 | 1 | 目的不可达 | 0 无路由 |
| 1 因管理原因禁止访问 | |||
| 2 未指定 | |||
| 3 地址不可达 | |||
| 4 端口不可达 | |||
| 2 | 数据包过长 | 0 | |
| 3 | 超时 | 0 跳数到0 | |
| 1 分片重组超时 | |||
| 4 | 参数错误 | 0 错误的包头字段 | |
| 1 无法识别的下一包头类型 | |||
| 2 无法识别的 IPv6 选项 | |||
| 信息消息 | 128 | Echo request | 0 |
| 129 | Echo reply | 0 |
斐夷所非增注在 ICMPv6 中的 Type 字段定义中,0-127 为错误消息 (Error messages),而 128-255 为信息消息 (Informational messages),其中每种 Type 定义一种类型及其含义分类,而部分 Type 中由根据 Code 值指定该类别下更详细的错误或信息分类。
ICMPv6 协议属于 IPv6 协议的一部分,该部分对 IPv6 的 ND 邻居发现协议进行了很详细的分类,ND 邻居发现协议由 ICMPv6 来实现,ND 消息的各种 Type 以及各种选项 options 也在此部分定义。
报文解释:
Type:表明消息的类型,0 至 127 表示差错报文类型,128 至 255 表示消息报文类型。
Code:表示此消息类型细分的类型。
Checksum:表示 ICMPv6 报文的校验和。
错误类消息(error messages),也称为差错报文,8bits 类型字段中的最高 bit 为 0,也就是 ICMPv6 Type=[0,127]
信息类消息(information messages) ,也称为信息报文, 8bits 类型字段中的最高 bit 为 1,也就是 ICMPv6 Type=[128,255]
详细分配类型查询
Internet Control Message Protocol version 6 (ICMPv6) Parameters
http://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml
IPv6 和 IPv4 相比有哪些优势?
- v4 是用 arp 广播试下地址解析和重复地址检测
- v6 是用组播形式,减轻设备性能压力
- v6 在三层完成地址解析,适用更多的链路层(介质独立性)
- v6 在三层完成解析,可以使自身 ipsec 安全认证机制提高安全性,避免类似 v4 中的 arp 欺骗
二、IPv6 邻居发现协议–NDP 详解
NDP(Neighbor Discovery Protocol,邻居发现协议) 是 IPv6 的一个关键协议,它组合了 IPv4 中的 ARP、ICMP 路由器发现和 ICMP 重定向等协议,并对它们作了改进。该协议使用 icmpv6 协议实现,作为 IPv6 的基础性协议,NDP 还提供了前缀发现、邻居不可达检测、重复地址监测、地址自动配置等功能。
| NDP 使用的 ICMPv6 的相关报文 | Type 字段 | 说明 |
|---|---|---|
| RS(router solicitation)路由器请求 | 133 | 当主机刚刚接入网络并被配置为自动获取地址,主机需要自动获得前缀、前缀长度、默认网关等信息时,就会发送 RS 消息。 |
| RA(router Advertisment)路由器通告报文 | 134 | RA 消息由路由器周期性地发送,或者在收到主机发送的 RS 消息后立刻发送,主要为主机提供编址信息以及其他配置信息。 |
| NS(Neighbor solicition)邻居请求报文 | 135 | 当节点不知道目标地址的链路层地址时,将发送 NS 消息。 |
| NA(Neighbor Advertisement):邻居通告报文) | 136 | 当节点接收到 NS 消息后,会快速响应 NA 消息,或者当节点需要快速传播新的信息(非请求)时,也会发送 NA 消息。 |
| 重定向报文 | 137 | 通过重定向消息,路由器可以通告更优的下一跳路由,也可以用于通知目标地址就是邻居。 |
NDP 功能点:
- 路由发现 ----- 发现链路上的路由器,获得路由器通告的信息 ( RS RA 报文)
- 无状态自动配置–通知路由器通告的地址前缀,终端自动生成 IPv6 地址 (NS NA 报文)
- DAD------- 获得地址后,进行地址重复检测,确保地址不存在冲突 (NS NA 报文)
- 地址解析 ----- 请求目的网络地址对应的数据链路层地址,类似 IPv4 的 ARP (NS NA 报文)
- 邻居状态跟踪 — 通过 NDP 发现链路上的邻居并跟踪邻居状态 (NS NA 报文)
- 前缀重编址 ---- 路由器对所通告的地址前缀进行灵活设置实现网络重编址
- 路由重定向 ---- 告知其他设备,到达目标网络的更优下一跳
地址解析:
IPv6 的地址解析实现了从 IP 地址解析到链路层地址的功能。
与 IPv4 协议不同,IPv6 的地址解析有了以下变化:
① 不再使用 ARP 协议而是使用 NDP 协议;
② 不再使用广播方式而是使用组播方式;
③ 地址解析在三层(icmpv6)完成而不是 2.5 层(arp)。
由此,IPv6 的地址解析具有如下优点:
① 由于地址解析在三层完成,不同的二层介质可以使用相同的地址解析协议;
② 采用组播方式发送 NS 消息,更加高效,减少了二层网络的压力;
③ 可以使用三层的安全机制(如 IPSec)以避免地址解析攻击。
ipv6 地址解析过程中使用了两种报文:邻居请求报文 NS(Neighbor Solicitation)和邻居通告报文 NA(Neighbor Advertisement)。
NS 报文:Type 字段值为 135,Code 字段值为 0,在地址解析中的作用类似于 IPv4 中的 ARP 请求报文。
NA 报文:Type 字段值为 136,Code 字段值为 0,在地址解析中的作用类似于 IPv4 中的 ARP 应答报文。
流程解析:
① R1 要去 R2 ping 包,但是不知道对方地址(即 R1 想要知道 R2 的 MAC 地址),所以 R1 会发送 NS 邻居请求报文(源为 R1 的 IPv6 地址),目的地址是(R2 的被请求节点组播地址,以 FF02::1:FF 开头),同时需要指出的是在 NS 报文的 Options 字段中还携带了一个 R1 的 MAC 地址.
NS:

ps:
-
IPv6 组播 MAC 地址以 0x3333 开头,低 32 位为 IPv6 组播地址的低 32 位,最终形成 48 比特的组播 MAC 地址
-
RFC4291 定义组播地址格式如下;
| 8 | 4 | 4 | 112 | +-----+--+--+---------------+ |11111111|flgs|scop| group ID | +------+---+---+----------------+ 1234
(1)组播地址高 8bit 为固定值 FF,此高 8 个 bit 中 4bit 为 flgs 位,4bit 为组播组的泛洪范围。
(2)flags 位为 4bit: |0|R|P|T|
flags 位的高 1bit 为保留,必须设置为 0
T 位如果为置 0 表示永久分配或者是 well-known 组播地址,如果置 1 表示临时分配动态的地址,不固定。
P 位如果置 1 的话表示此组播地址是一个基于单播前缀的 ipv6 组播地址。默认为 0,如果 P 位设置为 1,那么 T 位必须为 1。
R 位如果置 1 的话表示此组播地址是一个内嵌 RP 地址的 ipv6 组播地址。默认为 0。
(3)4bit scope 位来限制组播组的传播范围。
0 reserved
1 Interface-Local scope
2 Link-Local scope-- 链路本地范围
3 reserved
4 Admin-Local scope - 管理本地范围
5 Site-Local scope-- 站点本地范围
6 (unassigned)
7 (unassigned)
8 Organization-Local scope - 组织本地范围
9 (unassigned)
A (unassigned)
B (unassigned)
C (unassigned)
D (unassigned)
E Global scope-- 全局范围的
F reserved
(4)低 112 bit 为组播地址的可用组 ID。举例:
所有节点的组播地址: FF02:0:0:0:0:0:0:1
所有路由器的组播地址:FF02:0:0:0:0:0:0:2
Solicited-Node 组播地址: FF02:0:0:0:0:1:FFXX:XXXX
所有 OSPF 路由器组播地址: FF02:0:0:0:0:0:0:5
所有 OSPF 的 DR 路由器组播地址: FF02:0:0:0:0:0:0:6
所有 RIP 路由器组播地址: FF02:0:0:0:0:0:0:9
所有 PIM 路由器组播地址: FF02:0:0:0:0:0:0:D
② 当 R2 收到了 NS 报文后,就会回应 NA 报文,其中源地址为 R2 的 IPv6 地址,目的地址是 R1 的 IPv6 地址(使用 NS 报文中的 R1 的 MAC 地址进行单播),R2 的 MAC 地址被放在 Options 字段中,这样就完成了一个地址解析的过程
NA:

路由发现:
全球单播地址的配置步骤如下:
1)客户端在配置好链路本地地址后,发送 RS 报文,请求路由器的前缀信息。
2)路由器收到 RS 报文后,发送 RA 报文,其中携带 M、O flag 用于指示进行何种类型配置,A flag 用于无状态地址自动配置的前缀信息。同时路由器也会周期性地发送组播 RA 报文。
3)客户端根据 RA 报文携带 A flag,获取网关信息。如果是自动配置或者是无状态,则根据 M、O flag,选择 IPv6 地址及 DNS 的获取方式。
-
路由器请求 RS(Router Solicitation)报文:很多情况下主机接入网络后希望尽快获取网络前缀进行通信,此时主机可以立刻发送 RS 报文,网络上的设备将回应 RA 报文。RS 报文的 Tpye 字段值为 133。

-
路由器通告 RA(Router Advertisement)报文:每台设备为了让二层网络上的主机和设备知道自己的存在,定时都会组播发送 RA 报文,RA 报文中会带有网络前缀信息,及其他一些标志位信息。RA 报文的 Type 字段值为 134。
-

M flag:为 1 通过 DHCPv6 获取 IP 地址,为 0 则是通过 RA 报文获取地址。
O flag:为 1 通过 DHCPv6 获取 DNS 等其他配置,为 0 通过 RA 报文获取其他配置。
A flag:表示是否可以使用 RA 报文前缀信息配置无状态地址
虚拟机中查看 ra 生成的路由:
# ip -6 route
default via fe80::216:3eff:fe22:314 dev eth0 proto ra metric 1024 expires 295sec hoplimit 64
12
下图可以理解其流程:

三、DHCPv6 协议
和 IPv4 的 bootp (DHCPv4) 作用类似,DHCPv6 基于 UDP,通过与服务器协商获取 IP 地址及 DNS 等信息。
DHCPv6 和 DHCPv4 报文对比
| ~~~~~~~~~~~~~~ 报文类型 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DHCPv6 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DHCPv4 | 说明 |
|---|---|---|---|
| 1 | SOLICIT | DHCP DISCOVER | DHCPv6客户端使用Solicit报文来确定DHCPv6服务器的位置。 |
| 2 | ADVERTISE | DHCP OFFER | DHCPv6服务器发送Advertise报文来对Solicit报文进行回应,宣告自己能够提供DHCPv6服务。 |
| 3 | REQUEST | DHCP REQUEST | DHCPv6客户端发送Request报文来向DHCPv6服务器请求IPv6地址和其它配置信息。 |
| 4 | CONFIRM | - | DHCPv6客户端向任意可达的DHCPv6服务器发送Confirm报文检查自己目前获得的IPv6地址是否适用与它所连接的链路。 |
| 5 | RENEW | DHCP REQUEST | DHCPv6客户端向给其提供地址和配置信息的DHCPv6服务器发送Renew报文来延长地址的生存期并更新配置信息。 |
| 6 | REBIND | DHCP REQUEST | 如果Renew报文没有得到应答,DHCPv6客户端向任意可达的DHCPv6服务器发送Rebind报文来延长地址的生存期并更新配置信息。 |
| 7 | REPLY | DHCP ACK/NAK | DHCPv6服务器在以下场合发送Reply报文:DHCPv6服务器发送携带了地址和配置信息的Reply消息来回应从DHCPv6客户端收到的Solicit、Request、Renew、Rebind报文。DHCPv6服务器发送携带配置信息的Reply消息来回应收到的Information-Request报文。用来回应DHCPv6客户端发来的Confirm、Release、Decline报文。 |
| 8 | RELEASE | DHCP RELEASE | DHCPv6客户端向为其分配地址的DHCPv6服务器发送Release报文,表明自己不再使用一个或多个获取的地址。 |
| 9 | DECLINE | DHCP DECLINE | DHCPv6客户端向DHCPv6服务器发送Decline报文,声明DHCPv6服务器分配的一个或多个地址在DHCPv6客户端所在链路上已经被使用了。 |
| 10 | RECONFIGURE | - | DHCPv6服务器向DHCPv6客户端发送Reconfigure报文,用于提示DHCPv6客户端,在DHCPv6服务器上存在新的网络配置信息。 |
| 11 | INFORMATION-REQUEST | DHCP INFORM | DHCPv6客户端向DHCPv6服务器发送Information-Request报文来请求除IPv6地址以外的网络配置信息。 |
| 12 | RELAY-FORW | - | 中继代理通过Relay-Forward报文来向DHCPv6服务器转发DHCPv6客户端请求报文。 |
| 13 | RELAY-REPL | - | DHCPv6服务器向中继代理发送Relay-Reply报文,其中携带了转发给DHCPv6客户端的报文。 |
dhcpv6 请求过程如下:

其中的 NS 报文展开如下,即 DAD 重复地址检测。

IPv6 重复地址检测和 IPv4 中的免费 ARP 类似:节点向试验地址所对应的 Solicited-Node 组播组发送 NS 邻居请求报文。
NS 报文中目标地址即为试验地址(一个 IPv6 单播地址在分配给一个接口之后且通过重复地址检测之前称为试验地址 Tentative Address)。
如果收到某个其他站点回应的 NA 报文,就证明该地址已被网络上使用,节点将不能使用该试验地址通讯。
参考
- 初识IPv6 有状态、无状态地址相关协议_ip地址状态无状态-优快云博客 it潮人 于 2021-08-05 21:17:50 发布
https://blog.youkuaiyun.com/u011029104/article/details/119427279
IPV6 邻居发现协议 (NDP)
AnyAnyAnny 已于 2022-04-02 18:58:21 修改
概述
NDP(Neighbor Discovery Protocol,邻居发现协议)是 IPv6 的一个关键协议,它组合了 IPv4 中的 ARP、ICMP 路由器发现和 ICMP 重定向等协议,并对它们作了改进。作为 IPv6 的基础性协议,NDP 还提供了前缀发现、邻居不可达检测、重复地址监测、地址自动配置等功能。
地址解析
地址解析是一种确定目的节点的链路层地址的方法。NDP 中的地址解析功能不仅替代了原 IPv4 中的 ARP 协议,同时还用邻居不可达检测(NUD)方法来维护邻居节点之间的可达性状态信息。
无状态地址自动配置
NDP 中特有的地址自动配置机制,包括一系列相关功能,如路由器发现,接口 ID 自动生成,重复地址检测等。通过无状态自动配置机制,链路上的节点可以自动获得 IPv6 全球单播地址。
路由器发现
路由器在 与其相连的链路上发布网络参数等信息,主机捕获次信息后,可以获得全球单播 IPv6 地址前缀、默认路由、链路参数(链路 MTU)等信息。
接口 ID 自动生成
主机根据 EUI-64 规范或其他方式为接口自动生成接口标识符,转换过程如下:
1、对于一个 MAC 地址,由两部分组成,24 位的公司的 ID (由 IEEE 唯一分配),24 位公司的扩展 ID(公司自己编制),联合产生全球唯一的 48 位 MAC 地址(也称 IEEE 802 地址),如下:
| cccccccUG cccccccc cccccccc | xxxxxxxx xxxxxxxx xxxxxxxx |
|---|---|
| 24 位 IEEE 分配 | 24 位厂商自己编制 |
注:第一字节的第 7 位称为 U/L 位,表示此地址是全球管理还是本地管理。如果为 0 就为全球管理,为 1 就为本地管理。
第一字节第 8 位称为 I/G 为,表示此地址是单播地址还是组播地址。如果为 0 就为单播地址,为 1 就为组播地址。
2、先将此 48 位 MAC 地址公司 ID 和公司扩展 ID 之间插入特定 16 位值 0xFFFE,形成 64 位的 EUI-64 地址,如下:
| cccccccUG cccccccc cccccccc | 11111111 11111110 | xxxxxxxx xxxxxxxx xxxxxxxx |
|---|---|---|
| 24 位 IEEE 分配 | FFFE | 24 位厂商自己编制 |
3、再将 EUI-64 地址的第一字节第 7 为反转,形成 IPV6 地址的接口 ID,加之 IPV6 前缀形成完整的 IPV6 地址。
4、实例:
a. MAC 地址为 00-AA-00-3F-2A-1C
b. 转换 EUI-64 为 00-AA-00-FF-FE-3F-2A-1C
c. 第一个字节为 0000 0000,第 7 为反转为 0000 0010 转换 16 进制为 0x02。
d. 得到结果为 02-AA-00-FF-FE-3F-2A-1C,转换为 ip6 表示格式为 2AA:FF:FE3F:2A1C
5、link-local 地址也是通过此方法获取。
注:地址范围性质不变。
在 MAC 地址中,第 7 比特为 1 表示本地管理,为 0 表示全球管理在 EUI-64 的 ipv6 地址格式中,第 7 位为 0 表示本地管理,为 1 表示全球管理为每个网卡生成一个 Link-Local 的 IP 地址,简单点说就是一个固定的前缀加上 mac 地址,由于 mac 地址全球唯一,所以这样构成的 IP 地址是唯一的,有了这个地址后,就可以局域网进行通信了,但是这种地址路由器是不会转发的。
重复地址检测
根据前缀信息生成 IPv6 地址或手动配置 IPv6 地址后,为保证地址的唯一性,在这个地址可以使用之前,主机需要检验此 IPv6 地址是否已经被链路上的其他节点所使用。
前缀重新编址
当网络前缀变化时,路由器再与其相连的链路上发布新的网络参数信息,主机捕获这些信息,重新配置前缀,链路 MTU 等地址相关信息。
路由器重定向
当在本地链路上存在一个到达目的网络的更好地路由器时,路由器需要通过节点来进行相应配置改变。
详细介绍
IPv6 地址解析
地址解析在报文转发过程中具有至关重要的作用。当一个节点需要得到同一条链路上另外一个节点的链路层地址时,需要进行地址解析。IPv6 使用 NDP 实现了这个功能,且有所增强。IPv6 的地址解析过程包括两部分:一部分解析目的 IP 地址所对应的链路层地址;另一部分是邻居可达性状态的维护过程,即邻居不可达检测。
IPv6 地址解析的优点
IPv6 地址解析相对于 IPv4 的 ARP 解析,有以下优点:
-
加强了地址解析协议与底层链路的独立性
对每一种链路层协议都使用相同的地址解析协议,无须再为每一种链路层协议定义一个新的地址解析协议。
-
增强了安全性
ARP 攻击,ARP 欺骗是 IPv4 中严重的安全问题。在第三层实现地址解析,可以利用三层标准的安全认证机制来防止这种 ARP 攻击和 ARP 欺骗。
-
减小了报文传播范围
在 IPv4 中,ARP 广播必须泛滥到二层网络中每台主机。IPv6 地址解析利用三层组播寻址限制了报文的传播范围,通过将地址解析请求仅发送到待解析地址所属的被请求节点组播组,减小了报文传播范围,节省了网络带宽。
IPv6 地址解析过程
在 IPv6 中,ND 协议通过在节点间交互 NS 和 NA 报文完成 IPv6 地址到链路层地址的解析,解析后用得到的链路层地址和 IPv6 地址等信息来建立相应的邻居缓存表项。其解析过程如下图所示:

1)NodeA 发送一个 NS 报文到链路上,目的 IPv6 地址为 NodeB 对应的被请求节点组播地址(FF02::1:FF02:B),选项字段中携带了 NodeA 的链路层地址 00E0-FC00-0001。
2)NodeB 接收到该 NS 报文后,由于报文的目的地址 FF02::1:FF01:B 时 NodeB 的被请求节点组播地址,所以 NodeB 会处理该报文;同时,根据 NS 报文中的源地址和源链路层地址选项更新自己的邻居缓存表项。
3)NodeB 发送一个 NA 报文来应答 NS,同时在消息的目标链路层地址选项中携带自己的链路层地址 00E0-FC00-0002。
4)NodeA 接收到 NA 报文后,根据报文中携带的 NodeB 链路层地址,创建一个到目标节点 NodeB 的邻居缓存表项。
通过交互,NodeA 和 NodeB 就获得了对方的链路层地址,建立其到达对方的邻居缓存表项,从而可以互相通信。
当一个节点的链路层地址发生改变时,以所有节点组播地址 FF02::1 为目的地址发送 NA 报文,通知链路上的其他节点更新邻居缓存表项。
邻居不可达检测(NUD)
NUD(Neighbor Unreachability Detection,邻居不可达检测)是节点确定邻居可达性的过程,其检测过程如下图所示:

在 IPv6 中,NDP 通过在节点间交互 NS 和 NA 报文完成 IPv6 地址到链路层地址的解析,然后通过解析后得到的链路层地址和 IPv6 等地址信息来建立相应的邻居缓存表项。如图所示,NodeA 的链路层地址为 00E0-FC00-0001,全局地址为 1::1:A;NodeB 的链路层地址为 00E0-FC00-0002,全局地址为 1::2:B。当 NodeA 要发送数据报文到 NodeB 时,需要 NDP 完成地址解析过程。
邻居可达性是单向的,如果需要达到 “双向” 可达,还需 NodeB 发送 NS 探测报文,NodeA 给 NodeB 回应 S 标志置为的 NA 报文。
邻居缓存表状态
邻居可达性状态机保存在邻居缓存表中,共有如下 6 种状态:
(1)INCOMPLETE(未完成状态):表示正在解析地址,但邻居链路层地址尚未确定。
(2)REACHABLE(可达状态):表示地址解析成功,该邻居可达。
(3)STALE(失效状态):表示可达时间耗尽,未确定邻居是否可达。
(4)DELAY(延迟状态):表示未确定邻居是否可达。DELAY 状态不是一个稳定的状态,而是一个延时等待状态。
(5)PROBE(探测状态):节点会向处于 PROBE 状态的邻居持续发送 NS 报文。
(6)EMPTY(空闲状态):表示节点上没有相关邻接点的邻居缓存表项

邻居状态机
图中实线箭头表示由 NS/NA 报文交互导致的状态变化,各状态间的相互转换如下:
① 在 EMPTY 状态时,如果有报文要发送给邻接节点,则在本地邻居缓存表建立该邻接节点的表项,并将该表项置于 INCOMPLETE 状态,同时向邻接节点以组播方式发送 NS 报文。
② 节点收到邻居回应的单播 NA 报文后,将处于 INCOMPLETE 状态的邻居缓存表项转化为 REACHABLE 状态。如果地址解析失败(发出的组播 NS 超时),则删除该表项。
③ 处于 REACHABLE 状态的表项,如果在 REACHABLE_TIME 时间内没有收到关于该邻居的 “可达性证实信息”,则进入 STALE 状态。此外,如果该节点收到邻居节点发出的非 S 置位 NA 报文,并且链路层地址有变化,相关表项会进入 STALE 状态。
④ 处于 STALE 状态的表项,当有报文发往该邻居时,这个报文会利用缓存的链路层地址进行封装,并使该表项进入 DELAY 状态,等待收到 “可达性证实信息”。
⑤ 进入 DELAY 状态后,如果 DELAY_FIRST_PROBE_TIME 时间之内还未收到关于该邻居的 “可达性证实信息”,则该表项进入 PROBE 状态。
⑥ 在 PROBE 状态时,节点会周期性地用 NS 报文来探测邻居的可达性,探测最大时间间隔为 RETRANS_TIMER,在最多尝试 MAX_ UNICAST_SOLICIT 次后,如果仍未收到邻居回应的 NA 报文,则认为该邻居已不可达,该表项将被删除
NUD 过程与地址解析过程的区别
主要不同之处在于以下两点:
(1)NUD 的 NS 报文的目的 MAC 是目的节点的 MAC 地址;目的 IPv6 地址为 NodeB 的单播地址,而不是被请求节点组播地址。
(2)NA 报文中的 S 标记须置位,表示是可达性确认报文,即这个 NA 报文是专门响应 NS 报文的。
无状态地址自动配置
IPv6 同时定义了无状态与有状态地址自动配置机制。有状态地址自动使用 DHCPv6 协议来给主机动态分配 IPv6 地址,无状态地址自动配置通过 ND 协议来实现。在无状态自动配置中,主机通过接受链路上的路由器发出的 RA 消息,结合接口的标识符而生成一个全球单播地址。
去状态地址自动配置有以下优点:
1)真正的即插即用。节点连接到没有 DHCP 服务器的网络时,无须手动配置地址等参数便可访问网络。
2)网络迁移方便。当一个站点的网络前缀发生变化,主机能够方便地进行重新编址而不影响网络连接。
3)地址配置方式选择灵活。系统管理员可根据情况决定使用何种配置方式 —— 有状态,无状态还是两者兼容。
无状态自动配置的 3 种机制
路由器发现
路由器发现是指主机定位本地链路上的路由器和确定其配置信息的过程,主要包含以下 3 方面内容:
(1)路由器发现(Router Discovery):主机发现邻居路由器及选择某一个路由器作为默认网关的过程。
(2)前缀发现(Prefix Discovery):主机发现本地链路上的一组 IPv6 前缀,生成前缀列表。该列表用于主机的地址自动配置和 on-link 判断。
(3)参数发现(Parameter Discovery):主机发现相关操作参数的过程,如 MTU、报文的默认跳数限制、地址分配方式等信息。
重复地址检测
DAD(Duplicate Address Detection,重复地址检测)是节点确定即将使用的地址是否在链路上唯一的过程。所有的 IPv6 单播地址,包括自动配置或手动配置的单播地址,在节点使用之前必须要通过重复地址检测。DAD 机制通过 NS 和 NA 报文实现。节点会发送 NS 报文,其源地址为未指定地址,目的地址为接口配置的 IPv6 地址。在 NS 报文发送到链路上后,如果在规定时间内没有收到应答的 NA 报文,则认为这个单播地址在链路上是唯一的,可以分配给接口;反之,如果收到应答的 NA 报文,则表明这个地址已经被其他节点所使用,不能配置到接口。
前缀重新编址
前缀重新编址(Prefix Renumbering)允许网络从以前的前缀平稳地过渡到新的前缀,用于提供对用户透明的网络重新编址能力。路由器通过 RA 报文中的优先时间和有效时间参数来实现前缀重新编址。
(1)优先时间(Preferred Lifetime):无状态自动配置得到的地址保持优先选择状态的时间。
(2)有效时间(Valid Lifetime):地址保持有效状态的时间。
对于一个地址或前缀,优先时间小于或等于有效时间。当地址的优先时间到期时,该地址不能被用来建立新连接,但是在有效时间内,该地址还能用来保持以前建立的连接。在重新编址时,站点内的路由器会继续通告当前前缀,但是有效时间和优先时间将被减小到接近于 0;同时,路由器开始通告新的前缀。这样,在每个链路上至少有两个前缀共存,RA 消息中包括一个旧的和一个新的 IPv6 前缀信息。
无状态地址自动配置过程
NDP 的无状态自动配置包含两个阶段:链路本地地址的配置和全球单播地址的配置。当一个接口启用时,主机会首先根据本地前缀 FE80::/64 和 EUI-64 接口标识符,为该接口生成一个链路本地地址,如果在后续的 DAD 中发生地址冲突,则必须对该接口手动配置本地链路地址,否则该接口将不可用。需要说明的是,一个链路本地地址的优先时间和有效时间是无限的,永远不超时。
对于主机上全球单播地址的配置步骤如下图所示:

地址配置完成后,路由器可以启动 NUD 检测,周期性发送 NS 报文,探测该地址是否可达。
地址的状态及生存周期
自动配置的 IPv6 地址在系统中有一个生存周期,在这个生存周期中,这个地址根据与优先时间和有效时间的关系,可以被划分为临时(Tentative),优先(Preferred),反对(Deprecated)和无效 (Invalid) 4 种状态,如下图所示:

路由器重定向
在重定向过程中,路由器通过发送重定向报文来通知链路上的报文发送节点,在同一链路上存在一个更优的转发数据报文的路由器。接收到该消息的节点据此修改其本地路由表项。路由器仅为单播数据流发送重定向报文,而重定向报文也仅以单播形式发送到始发主机,并且只会被始发节点处理。

路由器重定向过程
(1)NodeA 首先传送第一个数据报文到它的默认路由器 RTA,当该报文经过 RTB 到达 NodeB 后,RTA 知道 RTB 是链路上转发报文的更好选择。
(2)RTA 向始发报文的 NodeA 发送一个 ICMPv6 重定向报文,目标地址中含有 RTB 的 IPv6 地址,报文选项字段的目标链路层地址中含有 RTB 的链路层地址。
(3)NodeA 获悉 RTB 是到 NodeB 的更好路径后,修改自己的目的缓存表,当再发送到 NodeB 的报文时优先发送到 RTB,重定向完成。
报文介绍
ICMPv6 报文类型
NDP 定义了 5 种 ICMPv6 报文类型,包括 RS、RA、NS、NA 和 Redirect 报文,如下所示
| ICMPv6 类型 | 消息名称 |
|---|---|
| Type=133 | RS(Router Solicitation,路由器请求) |
| Type=134 | RA(Router Advertisment,路由器公告) |
| Type=135 | NS(Neighbor Solicitationh,领居请求) |
| Type=136 | NA(Neighbor Advertisement,邻居公告) |
| Type=137 | Redirect(重定向报文) |
备注: NS/NA 报文主要用于地址解析,RS/RA 报文主要用于无状态地址自动配置,Redirect 报文用于路由器重定向。
地址解析交互报文
NS 报文
NS 报文是 ICMPv6 中类型为 135 的报文,其结构如下图所示:

其中各字段的含义如下:
1)Target Address:待解析的 IPv6 地址,16types。Target Address 不能是组播地址,可以是链路本地地址、站点本地地址和全球单播地址。
2)Options: 地址解析中只使用了链路层地址选项(Link-Layer Address Option),是发送 NS 报文节点的链路层地址。链路层地址选项的格式如下图所示:

其中各字段含义如下:
1)Type:选项类型,在链路层地址选项中包括如下两种:
Type=1,表明链路层地址为 Source Link-Layer Address(源链路层地址),在 NS,RS,Redirect 报文中使用。
Type=2,表明链路层地址为 Target Link-Layer Address(目标链路层地址),在 NA,Redirect 报文中使用。
2)Length:选项长度,以 8bytes 为单位。
3)Link-Layer Address:链路层地址。长度可变,对于以太网为 6bytes。
NA 报文
NA 报文是 ICMPv6 中类型为 136 的报文,其结构如下图所示:

其中各字段的含义如下:
1)R:路由器标记(Router Flag)位,表示 NA 报文发送者的角色,置为 “1” 表示发送者都是路由器,置为 “0” 表示发送者为主机。
2)S:请求标记(Solicited Flag)位,置为 “1” 表示该 NA 报文是对 NS 报文的响应。
3)O:覆盖标记(Override Flag)位,置为 “1” 表示节点可以用 NA 报文中携带的目标链路层地址选项中的链路层地址来覆盖原有的邻居缓存表项。置为 “0” 表示只有在链路层地址位置时,才能用目标链路层地址选项来更新邻居缓存表项。
4)Target Address:待地址重复检测或地址解析的 IPv6 地址。如果 NA 报文是响应 NS 报文的,则该字段直接复制 NS 报文中的 Target Address。
5)Options:只能是 Type 值为 2 的 Target Link-Layer Address,是被解析节点的链路层地址。
地址自动配置交互报文
路由器请求报文(RS)
RS 报文是 ICMPv6 中类型为 133 的报文,其结构如下图所示:

其中字段含义如下:
Options(选项)字段:只能是源链路层地址选项,表明该报文发送者的链路层地址,不过如果 IPv6 报头的源地址为未指定地址,则不能包括该选项。
路由器通告报文(RA)
RA 报文是 ICMPv6 中类型为 134 的报文,其结构如下图所示:

其中字段含义如下:
| 字段 | 描述 |
|---|---|
| Cur Hop Limit | 跳数限制。 协议规定默认 IPv6 中 Hop Limit 数值,若为 0,表示路由器不适用该字段。 设备实现中该值可配置,默认为 64。 |
| M | 管理地址配置标识(Managed Address Configuration)。 M 位为 0 表示无状态自动配置生成 IPv6 地址,如果 M=1 表示需要通过有状态(DHCPv6)方式获取 IPv6 地址。 |
| O | 其他有状态配置标识(Other Stateful Configuration)。 O 位为 0 表示除了 IPv6 地址以外的其他参数需要通过无状态自动配置获取,如果 O=1 表示除了 IPv6 地址以外的其它需要通过有状态(DHCPv6)方式进行获取。 协议规定,若 M 标记置为 1,则 O 标记也应置为 1,否则无意义。 |
| H | Home Agent,移动 IPv6 中定义的字段。 |
| Prf | 默认路由器优先级(Default Router Preference) |
| P | 代理标识(Proxy) |
| Router Lifetime | 与默认路由器关联的生存期,以秒为单位。最大值 18.2 小时。 取 0 值的 Lifetime 指出路由器不是默认路由器并且不应当出现在默认路由器列表中,但 RA 报文的其他信息仍然有效。 Router Lifetime 仅适用于作为默认路由器的路由器应用;对包括在其他消息字段或选项中的信息不适用。需要对它们的信息规定时间限制的选项有它们自己的生存期字段。 |
| Reacheable Time | 此时间以毫秒计,在收到可达性确认后节点假定该邻居是可到达的。 它由 Neighbor Unreachability Detection 算法使用。此值为 0 意味着没有 (由此路由器) 作出规定。 |
| Retrans Timer | 重发的 Neighbor Solicitation 消息间隔时间,以毫秒计。 由地址解析和 Neighbor Unreachability Detection 算法使用。 此值为 0 意味着没有 (由此路由器) 作出规定。 |
| Options | 选项字段,包含有源链路层地址选项,MTU 选项,前缀信息选项,通过间隔选项,家乡代理信息选项,路由信息选项等。 |
选项字段中个选项的含义如下:
1)源链路层地址选项:路由器发送 RA 报文的接口的链路层地址。
2)MTU 选项:包含了在链路上运行的链路层协议所能支持的 MTU 最大值。
3)前缀信息选项(Prefix Information Option):用于地址自动配置的前缀信息,可包含多个。前缀信息选项在 RFC2461 中定义,用于表示地址前缀和有关地址自动配置的信息,值用于 RA 报文中;在其他的消息中,此选项应该被忽略。其格式如下图所示:

其各字段的含义如下所示:
| 字段 | 描述 |
|---|---|
| Type | 选项类型,值为 3 |
| Length | 选项长度,以 8bytes 为单位,值为 4 |
| Prefix Length | 前缀长度,值为 0-128 |
| L | 直连标记(on-link flag)。 当取值为 1 时,表示该前缀可以作为 on-link 判断;否则表示该前缀不用作 on-link 判断,前缀本身也不包含 on-link 或 on-off 属性,默认值为 1。 |
| A | 自动配置标记(Autonomous Address-configuration Flag)。 当取值为 1 时,表示该前缀用于无状态地址配置;否则为有状态地址配置。默认值为 1。 |
| R | 路由器地址标记(Router Address Flag)。 用于移动 IPv6(RFC3775),当取值为 1 时,表示 Prefix 字段不仅包含前缀信息,同时也包含了发送该 RA 报文的路由器地址。 |
| Valid Lifetime | 有效时间,表示该前缀产生的 on-link 地址处于有效状态的时间(单位为秒)。 |
| Preferred Lifetime | 优先时间,表示由该前缀通过无状态地址自动配置产生的地址处于优先状态的时间。 |
| Prefix | 前缀地址,长度为 16bytes。该字段和 Prefix Length 字段一起明确定义了一个 IPv6 地址前缀 |
4)路由信息选项(Route Information Option):用于主机生产默认路由。路由信息选项在 RFC4191 中定义,取代了原前缀信息选项的功能。接收 RA 报文的主机将选项中的信息添加到自己的贝蒂路由表中,以便在发送报文时做出更好地转发决定,其个数如下图所示:

其中各字段含义如下所示:
| 字段 | 描述 |
|---|---|
| Type | 选项类型,值为 24 |
| Length | 选项长度,以 8bytes 为单位,根据 Prefix Length 的长度,可取 1,2,3 这 3 个值。 |
| Prefix Length | 前缀长度,表示对路由有意义的前缀位数,值为 0-128 |
| Prf | 默认路由器优先级(Default Router Preference)。 |
| Route Lifetime | 路由生命周期,表示用于路由信息选项的前缀处于有效状态的时间,当 RA 中的 Router Lifetime = 0 时,Route Lifetime 也应该为 0。 |
| Prefix | 前缀地址,表示有效的路由前缀,其长度由 Prefix Length 决定。 |
参考链接
-
IPv6 知识概述 - ND 协议_ipv6 nd-优快云 博客
https://blog.youkuaiyun.com/Gina_wj/article/details/106708770 -
IPv6 邻居发现协议_ipv6 邻居关系 - 优快云 博客
https://blog.youkuaiyun.com/lianliange85/article/details/45511393 -
计算机网络 | IPv6 | 什么是 IPv6_网络芯片哪个信号与 ipv6 有关 - 优快云 博客
https://blog.youkuaiyun.com/ThinPikachu/article/details/105715620
【IPv6】NS,NA 报文学习
原创 313119992 2018-07-25 17:26:22
IPV6 邻居发现报文学习
IPv6 的邻节点发现协议的所有功能都由以下报文来完成:
l 路由器请求报文;
l 路由器公告报文;
l 邻节点请求报文;
l 邻节点公告报文;
l 重定向报文。
一.邻节点请求报文详细分析
请求报文分为 2 类:
- 地址冲突检测 (DAD) 类邻节点请求报文。
- 邻居可达性检测 (NUD) 类邻节点请求报文。
1. 地址冲突检测 (DAD) 类邻节点请求报文分析
| DAD NS报文 | |
|---|---|
| 以太层 | |
| 源MAC | 目的MAC |
| 发送方网卡的MAC | 与目标的请求节点地址相对应的以太网MAC地址(组播MAC) |
| IP层 | |
| 源IP | 目的IP |
| :: | 目标的请求节点地址(组播IP) |
DAD 类 NS 报文以太层,IP 层参数值的说明:
报文例子是 DAD NS 报文
源 MAC:发出该 NS 报文的网卡的 MAC,例如报文示例的 00:0C:29:ED:92:F2
目的 MAC:与目标的请求节点地址相对应的以太网 MAC 地址 (组播 MAC), 例如报文示例的 33:33:FF:BC:DE:F1,它是目标的请求节点地址 1234:5678:90AB:CDEF:2345:6789:A0BC:DEF1 对应的以太网 MAC 地址。有一个对应算法,补充介绍。
源 IP:发送 NS 报文的源 IP。例如报文示例的 ::。其中::为 DAD 报文发送 NS 报文专用。
目的 IP:发送到哪个 IP 上,这里是目标的请求节点地址。例如报文示例的 FF02::1:FFBC:DEF1。有一个对应的算法,补充介绍。
Target Address:请求的 IP 地址。例如报文示例的 1234:5678:90AB:CDEF:2345:6789:A0BC:DEF1。
2. 邻居可达性检测 (NUD) 类邻节点请求报文分析
| NUD NS报文 | |
|---|---|
| 以太层 | |
| 源MAC | 目的MAC |
| 发送方网卡的MAC | 邻节点的单播MAC地址 |
| IP层 | |
| 源IP | 目的IP |
| 发送方接口的单播IPv6地址 | 目标的单播地址 |
邻居可达性检测类请求报文中,因为邻居的信息已经是确定的,所以对应的目的 MAC, 目的 IP 都是确定的单播。内容相对简单。
邻节点请求报文通用参数:
报文类型:135
源链路层地址选项:该选项非 DAD 请求报文中打开。报文中带着自己本身的 MAC。
3. 地址解析请求报文分析
| 地址解析 NS 报文 | |
|---|---|
| 以太层 | |
| 源 MAC | 目的 MAC |
| 发送方网卡的 MAC | 与目标的请求节点地址相对应的以太网 MAC 地址 (组播 MAC) |
| IP 层 | |
| 源 IP | 目的 IP |
| 发送方接口的单播 IPv6 地址 | 目标的请求节点地址 (组播 IP) |
二.邻节点公告报文详细分析
公告报文分为 2 类:
-
回复邻节点请求的公告报文。
-
自动发送类公告报文。
1. 回复邻节点请求的公告报文分析
| 回复 NUD 请求的 NA 报文 / 回复地址解析 | |
|---|---|
| 以太层 | |
| 源 MAC | 目的 MAC |
| 发送方网卡的 MAC | NS 请求的最初发送者的单播 MAC 地址 (即 NS 报文中源 MAC) |
| IP 层 | |
| 源 IP | 目的 IP |
| 发送方接口的单播 IPv6 地址 | NS 请求的最初发送者的单播 IP 地址 (即 NS 报文中的源 IP) |
回复 DAD 请求的 NA 报文
| 回复 DAD 请求的 NA 报文 | |
|---|---|
| 以太层 | |
| 源 MAC | 目的 MAC |
| 发送方网卡的 MAC | NS 请求的最初发送者的单播 MAC 地址 (即 NS 报文中源 MAC) |
| IP 层 | |
| 源 IP | 目的 IP |
| 发送方接口的单播 IPv6 地址 | FF02::1 |
2. 自动发送类公告报文分析
节点会主动发送 NA 报文,公告自己的信息。免费 ARP?
| 自发发送 NA 报文 | |
|---|---|
| 以太层 | |
| 源 MAC | 目的 MAC |
| 发送方网卡的 MAC | 33:33:00:00:00:01 |
| IP 层 | |
| 源 IP | 目的 IP |
| 发送方接口的单播 IPv6 地址 | FF02::1 |
特殊 IP:FF02::1,这是链路本地范围所有节点多播地址。
邻节点公告报文通用参数:
报文类型:136
三.路由器请求报文详细分析
分为 2 种,一种是接口未获得 linklocal 地址,另一种是接口已经获得 linklocal 地址。
1. 接口未获得 linklocal 地址 RS 报文分析
| 未获得 linklocal 地址 | |
|---|---|
| 以太层 | |
| 源 MAC | 目的 MAC |
| 发送方网卡的 MAC | 33:33:00:00:00:02 |
| IP 层 | |
| 源 IP | 目的 IP |
| :: | 链路本地范围所有路由器多播地址 FF02::2 |
2. 接口获得 linklocal 地址 RS 报文分析
| 已经获得 linklocal 地址 | |
|---|---|
| 以太层 | |
| 源 MAC | 目的 MAC |
| 发送方网卡的 MAC | 33:33:00:00:00:02 |
| IP 层 | |
| 源 IP | 目的 IP |
| 发送方接口的链路本地 IPv6 地址 | 链路本地范围所有路由器多播地址 FF02::2 |
报文类型:133
源链路层地址选项
四.路由器通告报文详细分析
路由器通告报文分为 2 种,一种是单播 RA,另一种是组播 RA。
1. 单播 RA 报文分析
| RA 单播报文 | |
|---|---|
| 以太层 | |
| 源 MAC | 目的 MAC |
| 发送方网卡的 MAC | 发送 RS 请求报文的主机的单播 MAC 地址 |
| IP 层 | |
| 源 IP | 目的 IP |
| 发送方接口的链路本地 IPv6 地址 | 发送 RS 请求报文的主机的的单播 IPv6 地址 |
2. 组播 RA 报文
| RA 组播报文 | |
|---|---|
| 以太层 | |
| 源 MAC | 目的 MAC |
| 发送方网卡的 MAC | 33:33:00:00:00:01 |
| IP 层 | |
| 源 IP | 目的 IP |
| 发送方接口的链路本地 IPv6 地址 | FF02::1 |
路由通告报文通用参数:
报文类型:134
当前条数限制:255
管理地址配置标志:当管理地址配置标志为 1 时,表示接收这个路由器公告报文的主机除了有可能从无状态地址自动配置协议获得地址外,还必须使用有状态地址配置协议 (DHCPv6) 来获得地址。
其他状态配置标志:当其它状态配置标志为 1 时,表示收到这个路由器通告报文的主机必须使用有状态地址配置协议 (DHCPv6) 来获得非地址配置的信息。
。。。
补充
算法补充
根据节点 IP 计算对应节点地址 (组播 IP)
假设节点 IP 为 1234:5678:90AB:CDEF:2345:6789:A0BC:DEF1,那么它对应的节点地址为 FF02::1:FFBC:DEF1
| IPv6 地址对应节点 IPv6 地址(组播) | |
|---|---|
| IPv6 地址 | 1234:5678:90AB:CDEF:2345:6789:A0BC:DEF1 |
| 对应节点 IPv6 地址 (组播) | FF02::1:FFBC:DEF1 |
算法内容:
IPv6 地址对应的节点 IPv6 组播地址,有固定前缀 FF02::1:FF,剩余部分为原地址的后 24 位。
将固定前缀与原地址的后 24 位组合在一起就计算出对应的节点地址。
根据节点 IP 计算对应的以太网 MAC
假设节点地址为 1234:5678:90AB:CDEF:2345:6789:A0BC:DEF1,那么它对应的 MAC 为 33:33:FF:BC:DE:F1
| IPv6 地址对应组播 MAC 地址 | |
|---|---|
| IPv6 地址 | 1234:5678:90AB:CDEF:2345:6789:A0BC:DEF1 |
| 对应节点 IPv6 地址 (组播) | FF02::1:FFBC:DEF1 |
| 对应组播 MAC | 33:33:FF:BC:DE:F1 |
算法内容:
MAC 都是 48 位,对应的组播 MAC 有固定前缀 33:33,剩余部分为要发送的地址的后 32 位。
将固定前缀与对应节点 IPv6 地址的低 32 位组合在一起就计算出对应的以太 MAC。
via:
-
IPv6 邻居发现协议 --NDP 详解_ipv6 ndp-优快云 博客 造夢先森 已于 2022-11-08 20:56:49 修改
https://blog.youkuaiyun.com/qq_15437629/article/details/127688513 -
IPV6 邻居发现协议 (NDP)_wifi neighbor discovery-优快云 博客 AnyAnyAnny 已于 2022-04-02 18:58:21 修改
https://blog.youkuaiyun.com/wgl307293845/article/details/117446336 -
【IPv6】NS,NA 报文学习_51CTO 博客_ipv6 ns 报文 原创 313119992 2018-07-25 17:26:22
https://blog.51cto.com/qiaopeng688/2150114
IPv6协议详解
1346

被折叠的 条评论
为什么被折叠?



