跳到主要内容

3. 协议概述

本协议解决与连接到同一链路的节点之间交互相关的一组问题. 它定义了用于解决以下每个问题的机制:

Router Discovery (路由器发现): 主机如何定位位于所连接链路上的路由器.

Prefix Discovery (前缀发现): 主机如何发现一组地址前缀, 这些前缀定义了所连接链路上哪些目的地位于链路上. (节点使用前缀来区分位于链路上的目的地和只能通过路由器到达的目的地.)

Parameter Discovery (参数发现): 节点如何获知要放入外发分组中的链路参数 (例如 link MTU) 或 Internet 参数 (例如 hop limit 值).

Address Autoconfiguration (地址自动配置): 引入使节点能够以无状态方式为接口配置地址所需的机制. Stateless address autoconfiguration (无状态地址自动配置) 在 [ADDRCONF] 中规定.

Address resolution (地址解析): 在仅已知目的地 IP 地址的情况下, 节点如何确定链路上目的地 (例如邻居) 的链路层地址.

Next-hop determination (下一跳确定): 将 IP 目的地址映射为应向其发送该目的地流量的邻居 IP 地址的算法. 下一跳可以是路由器, 也可以是目的地本身.

Neighbor Unreachability Detection (邻居不可达检测): 节点如何确定某个邻居不再可达. 对用作路由器的邻居, 可以尝试替代的默认路由器. 对路由器和主机, 都可以重新执行地址解析.

Duplicate Address Detection (重复地址检测): 节点如何确定它希望使用的地址是否已经被另一个节点使用.

Redirect (重定向): 路由器如何通知主机, 对某个特定目的地存在更好的第一跳节点.

Neighbor Discovery 定义了五种不同的 ICMP 分组类型: 一对 Router Solicitation 和 Router Advertisement messages, 一对 Neighbor Solicitation 和 Neighbor Advertisement messages, 以及一个 Redirect message. 这些消息的用途如下:

Router Solicitation (路由器请求): 当接口启用时, 主机可以发送 Router Solicitations, 请求路由器立即生成 Router Advertisements, 而不是等到下一次计划时间.

Router Advertisement (路由器通告): 路由器周期性地或响应 Router Solicitation message 来通告自身存在以及各种链路和 Internet 参数. Router Advertisements 包含用于判断另一个地址是否共享同一链路 (on-link determination, 链路上判断) 和/或用于地址配置的前缀, 建议的 hop limit 值等.

Neighbor Solicitation (邻居请求): 由节点发送, 用于确定邻居的链路层地址, 或验证通过缓存的链路层地址仍能到达某个邻居. Neighbor Solicitations 也用于 Duplicate Address Detection.

Neighbor Advertisement (邻居通告): 对 Neighbor Solicitation message 的响应. 节点也可以发送 unsolicited Neighbor Advertisements (非请求邻居通告) 来宣布链路层地址变化.

Redirect (重定向): 路由器用它通知主机, 到某个目的地存在更好的第一跳.

在支持组播的链路上, 每台路由器都会周期性地组播一个 Router Advertisement packet 来宣布其可用性. 主机接收来自所有路由器的 Router Advertisements, 并构建默认路由器列表. 路由器生成 Router Advertisements 的频率足以让主机在几分钟内获知其存在, 但又不会频繁到可以依靠通告缺失来检测路由器故障; 独立的 Neighbor Unreachability Detection 算法提供故障检测.

Router Advertisements 包含一组用于 on-link determination 和/或 autonomous address configuration (自主地址配置) 的前缀; 与前缀关联的 flags 指定某个特定前缀的预期用途. 主机使用通告的 on-link prefixes (链路上前缀) 构建和维护一个列表, 用于判断分组目的地是在链路上还是在路由器之后. 注意, 某个目的地即使不被任何通告的链路上前缀覆盖, 仍可能位于链路上. 在这种情况下, 路由器可以发送 Redirect, 通知发送方该目的地是一个邻居.

Router Advertisements (以及 per-prefix flags) 允许路由器告知主机如何执行 Address Autoconfiguration. 例如, 路由器可以指定主机是否应使用 DHCPv6 和/或 autonomous (stateless) address configuration.

Router Advertisement messages 还包含 Internet 参数, 例如主机应在外发分组中使用的 hop limit, 以及可选的链路参数, 例如 link MTU. 这有助于集中管理关键参数: 这些参数可以在路由器上设置, 并自动传播给所有连接的主机.

节点通过组播 Neighbor Solicitation 完成地址解析, 请求目标节点返回其链路层地址. Neighbor Solicitation messages 被组播到目标地址的 solicited-node multicast address. 目标节点在单播 Neighbor Advertisement message 中返回其链路层地址. 单个请求-响应分组对足以让发起方和目标方解析彼此的链路层地址; 发起方会在 Neighbor Solicitation 中包含自己的链路层地址.

Neighbor Solicitation messages 还可用于确定是否有多个节点被分配了同一个单播地址. Neighbor Solicitation messages 用于 Duplicate Address Detection 的方式在 [ADDRCONF] 中规定.

Neighbor Unreachability Detection 检测邻居故障或到邻居的前向路径故障. 这要求有明确确认: 发送给邻居的分组确实到达该邻居, 并由其 IP 层正确处理. Neighbor Unreachability Detection 使用来自两个来源的确认. 在可能时, 上层协议提供正向确认, 表明连接正在取得 "forward progress" (前向进展), 即先前发送的数据已知被正确递送 (例如最近收到了新的确认). 当无法通过这类 "hints" (提示) 获得正向确认时, 节点会发送单播 Neighbor Solicitation messages, 请求 Neighbor Advertisements 作为来自下一跳的可达性确认. 为减少不必要的网络流量, 探测消息只发送给节点正在主动向其发送分组的邻居.

除了解决上述一般问题外, Neighbor Discovery 还处理以下情况:

Link-layer address change (链路层地址变化) - 已知自身链路层地址发生变化的节点可以向所有节点组播少量 (非请求) Neighbor Advertisement packets, 以快速更新已经失效的缓存链路层地址. 注意, 发送非请求通告只是一种性能增强 (例如并不可靠). Neighbor Unreachability Detection 算法保证所有节点都会可靠地发现新地址, 但延迟可能稍长.

Inbound load balancing (入站负载均衡) - 具有复制接口的节点可能希望在同一链路上的多个网络接口之间对入站分组接收进行负载均衡. 这类节点会为同一个接口分配多个链路层地址. 例如, 单个网络驱动程序可以将多块网络接口卡表示为一个具有多个链路层地址的逻辑接口. Neighbor Discovery 允许路由器对发往自身的流量执行负载均衡: 路由器可以从 Router Advertisement packets 中省略源链路层地址, 从而强制邻居使用 Neighbor Solicitation messages 学习路由器的链路层地址. 随后返回的 Neighbor Advertisement messages 可以包含不同的链路层地址, 具体取决于例如是谁发出了请求. 本规范没有定义允许主机对入站分组进行负载均衡的机制. 见 [LD-SHRE].

Anycast addresses (任播地址) - 任播地址标识一组提供等价服务的节点中的一个, 同一链路上的多个节点可能被配置为识别同一个任播地址. Neighbor Discovery 通过让节点预期会收到针对同一目标的多个 Neighbor Advertisements 来处理任播. 针对任播地址的所有通告都标记为 non-Override advertisements (非 Override 通告). 非 Override 通告不会更新或替换另一个通告发送的信息. 这些通告稍后会在 Neighbor Advertisement messages 的上下文中讨论. 这会触发特定规则, 用于确定可能存在的多个通告中应使用哪一个.

Proxy advertisements (代理通告) - 愿意代表无法响应 Neighbor Solicitations 的目标地址接收分组的节点可以发送 non-Override Neighbor Advertisements. Proxy advertisements 被 Mobile IPv6 Home Agents 用来在移动节点移出链路时保护其地址. 但是, 它并不打算作为处理诸如未实现本协议的节点之类情况的通用机制.

3.1. 与 IPv4 的比较

IPv6 Neighbor Discovery 协议对应于 IPv4 协议 Address Resolution Protocol [ARP], ICMP Router Discovery [RDISC] 和 ICMP Redirect [ICMPv4] 的组合. 在 IPv4 中, 并没有一个普遍认可的协议或机制用于 Neighbor Unreachability Detection, 尽管 Hosts Requirements 文档 [HR-CL] 确实规定了一些可用于 Dead Gateway Detection (死亡网关检测) 的算法 (这是 Neighbor Unreachability Detection 所处理问题的一个子集).

与 IPv4 协议集合相比, Neighbor Discovery 协议提供了大量改进:

  • Router Discovery 是基础协议集的一部分; 主机无需 "snoop" 路由协议.

  • Router Advertisements 携带链路层地址; 无需额外的分组交换来解析路由器的链路层地址.

  • Router Advertisements 携带链路的前缀; 无需使用单独机制配置 "netmask".

  • Router Advertisements 启用 Address Autoconfiguration.

  • 路由器可以通告主机在链路上使用的 MTU, 从而确保在缺少明确定义 MTU 的链路上, 所有节点使用相同的 MTU 值.

  • 地址解析组播被 "spread" 到 1600 万 (2^24) 个组播地址上, 极大减少了目标以外节点上与地址解析相关的中断. 此外, 非 IPv6 机器根本不应被中断.

  • Redirects 包含新的第一跳的链路层地址; 接收 redirect 后无需单独执行地址解析.

  • 同一链路可以关联多个前缀. 默认情况下, 主机从 Router Advertisements 学习所有链路上前缀. 但是, 路由器可以被配置为从 Router Advertisements 中省略部分或全部前缀. 在这种情况下, 主机假定目的地位于链路外, 并将流量发送给路由器. 路由器随后可以按需发出 redirects.

  • 与 IPv4 不同, IPv6 redirect 的接收方会假定新的 next-hop 位于链路上. 在 IPv4 中, 如果 redirect 指定的 next-hop 根据链路的网络掩码不在链路上, 主机会忽略该 redirect. IPv6 redirect 机制类似于 [SH-MEDIA] 中规定的 XRedirect facility. 预期它可用于非广播和共享介质链路, 在这类链路中, 节点不希望或不可能知道链路上目的地的所有前缀.

  • Neighbor Unreachability Detection 是基础协议的一部分. 在存在故障路由器, 部分故障或分区链路, 或节点更改链路层地址的情况下, 它显著提高了分组递送的稳健性. 例如, 移动节点可以移出链路, 而不会因陈旧 ARP 缓存而丢失任何连接性.

  • 与 ARP 不同, Neighbor Discovery 检测 half-link failures (半链路故障, 使用 Neighbor Unreachability Detection), 并避免向缺少双向连接性的邻居发送流量.

  • 与 IPv4 Router Discovery 不同, Router Advertisement messages 不包含 preference field. 处理具有不同 "stability" 的路由器并不需要 preference field; Neighbor Unreachability Detection 会检测失效路由器并切换到可工作的路由器.

  • 使用 link-local addresses 唯一标识路由器 (用于 Router Advertisement 和 Redirect messages), 使主机能够在站点重新编号为使用新的全局前缀时仍保持路由器关联.

  • 通过将 Hop Limit 设置为 255, Neighbor Discovery 可免受链路外发送方意外或故意发送 ND messages 的影响. 在 IPv4 中, 链路外发送方可以同时发送 ICMP Redirects 和 Router Advertisement messages.

  • 将地址解析置于 ICMP 层使协议比 ARP 更独立于介质, 并使其能够在适当情况下使用通用 IP 层认证和安全机制.

3.2. 支持的链路类型

Neighbor Discovery 支持具有不同属性的链路. 当存在某些属性时, 本文档只完整规定 ND 协议机制的一个子集:

point-to-point (点到点) - Neighbor Discovery 处理这类链路的方式与处理组播链路相同. (点到点链路可以轻松提供组播, 接口也可以分配链路本地地址.)

multicast (组播) - Neighbor Discovery 按本文档所述在支持组播的链路上运行.

non-broadcast multiple access (NBMA, 非广播多路访问) - Redirect, Neighbor Unreachability Detection 和 next-hop determination 应按本文档所述实现. 本文档未规定 NBMA 链路上的地址解析以及 Router Solicitations 和 Advertisements 的递送机制. 注意, 如果主机支持手工配置默认路由器列表, 主机就可以从 Redirect messages 中动态获取其邻居的链路层地址.

shared media (共享介质) - 为简化协议在共享介质链路上的使用, Redirect message 以 [SH-MEDIA] 中的 XRedirect message 为模型.

本规范不处理仅与路由器相关的共享介质问题, 例如:

  • 路由器如何在共享介质链路上交换可达性信息.
  • 路由器如何确定主机的链路层地址, 该地址是向主机发送 redirect messages 所必需的.
  • 路由器如何确定自己是接收分组的第一跳路由器.

该协议是可扩展的 (通过定义新的 options), 因此未来可能存在其他解决方案.

variable MTU (可变 MTU) - Neighbor Discovery 允许路由器为链路指定一个 MTU, 然后所有节点都使用该 MTU. 为使组播正常工作, 同一链路上的所有节点都必须使用相同的 MTU (或 Maximum Receive Unit). 否则, 在组播时, 发送方无法知道哪些节点会接收该分组, 因而无法确定所有接收方都能处理的最小分组大小 (或 Maximum Receive Unit).

asymmetric reachability (非对称可达性) - Neighbor Discovery 检测是否缺少对称可达性; 节点会避免使用到不具备对称连接性的邻居的路径.

Neighbor Unreachability Detection 通常会识别这类半链路, 节点也会避免使用它们.

该协议未来大概可以扩展, 以便在缺乏自反和传递连接性的环境中寻找可行路径.

3.3. Neighbor Discovery 消息的安全保护

多种功能都需要 Neighbor Discovery messages. 有若干功能旨在允许主机确认某个地址的归属, 或确认链路层地址与 IP 层地址之间的映射. 与 Neighbor Discovery 相关的漏洞在 Section 11.1 中讨论. 保护 Neighbor Discovery 的通用方案超出本规范范围, 并在 [SEND] 中讨论. 但是, Section 11.2 说明了如何以及在何种约束下使用 IPsec Authentication Header (AH) 或 Encapsulating Security Payload (ESP) 来保护 Neighbor Discovery.