注:本文为 “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