3. 协议概述
本协议解决了与连接到同一链路的节点之间交互相关的一系列问题。它定义了解决以下每个问题的机制:
路由器发现 (Router Discovery): 主机如何定位驻留在附加链路上的路由器。
前缀发现 (Prefix Discovery): 主机如何发现定义哪些目的地在附加链路上是链路内的地址前缀集。(节点使用前缀来区分驻留在链路内的目的地和仅通过路由器可达的目的地。)
参数发现 (Parameter Discovery): 节点如何学习要放入出站数据包的链路参数 (如链路MTU) 或互联网参数 (如跳数限制值)。
地址自动配置 (Address Autoconfiguration): 引入允许节点以无状态方式为接口配置地址所需的机制。无状态地址自动配置在 [ADDRCONF] 中指定。
地址解析 (Address resolution): 节点如何仅根据目的地的IP地址确定链路内目的地 (例如, 邻居) 的链路层地址。
下一跳确定 (Next-hop determination): 将IP目的地址映射到应将目的地流量发送到的邻居的IP地址的算法。下一跳可以是路由器或目的地本身。
邻居不可达检测 (Neighbor Unreachability Detection): 节点如何确定邻居不再可达。对于用作路由器的邻居, 可以尝试备用默认路由器。对于路由器和主机, 可以再次执行地址解析。
重复地址检测 (Duplicate Address Detection): 节点如何确定它希望使用的地址是否已被另一个节点使用。
重定向 (Redirect): 路由器如何通知主机到达特定目的地的更好的第一跳节点。
邻居发现定义了五种不同的ICMP数据包类型: 一对路由器请求和路由器通告消息, 一对邻居请求和邻居通告消息, 以及重定向消息。这些消息的目的如下:
路由器请求 (Router Solicitation): 当接口启用时, 主机可以发送路由器请求, 请求路由器立即生成路由器通告, 而不是在下一个计划时间。
路由器通告 (Router Advertisement): 路由器定期或响应路由器请求消息通告其存在以及各种链路和互联网参数。路由器通告包含用于确定另一个地址是否共享同一链路 (链路内确定) 和/或地址配置的前缀、建议的跳数限制值等。
邻居请求 (Neighbor Solicitation): 由节点发送以确定邻居的链路层地址, 或验证邻居是否仍可通过缓存的链路层地址访问。邻居请求也用于重复地址检测。
邻居通告 (Neighbor Advertisement): 对邻居请求消息的响应。节点也可以发送未经请求的邻居通告来宣布链路层地址更改。
重定向 (Redirect): 路由器用于通知主机目的地的更好的第一跳。
在支持组播的链路上, 每个路由器定期组播路由器通告数据包, 宣布其可用性。主机从所有路由器接收路由器通告, 构建默认路由器列表。路由器生成路由器通告的频率足够高, 使得主机将在几分钟内了解它们的存在, 但频率不足以依赖通告的缺失来检测路由器故障; 单独的邻居不可达检测算法提供故障检测。
路由器通告包含用于链路内确定和/或自主地址配置的前缀列表; 与前缀关联的标志指定特定前缀的预期用途。主机使用通告的链路内前缀来构建和维护用于决定数据包目的地是链路内还是路由器之外的列表。注意, 即使目的地未被任何通告的链路内前缀覆盖, 目的地也可以是链路内的。在这种情况下, 路由器可以发送重定向, 通知发送者目的地是邻居。
路由器通告 (和每个前缀的标志) 允许路由器通知主机如何执行地址自动配置。例如, 路由器可以指定主机是否应使用DHCPv6和/或自主 (无状态) 地址配置。
路由器通告消息还包含互联网参数, 例如主机应在出站数据包中使用的跳数限制, 以及可选的链路参数, 例如链路MTU。这有助于集中管理可以在路由器上设置并自动传播到所有附加主机的关键参数。
节点通过组播邻居请求来完成地址解析, 该请求要求目标节点返回其链路层地址。邻居请求消息被组播到目标地址的请求节点组播地址。目标在单播邻居通告消息中返回其链路层地址。单个请求-响应数据包对足以使发起者和目标解析彼此的链路层地址; 发起者在邻居请求中包含其链路层地址。
邻居请求消息也可用于确定是否有多个节点被分配了相同的单播地址。邻居请求消息用于重复地址检测在 [ADDRCONF] 中指定。
邻居不可达检测检测邻居的故障或到邻居的前向路径的故障。这样做需要积极确认发送到邻居的数据包实际到达该邻居并由其IP层正确处理。邻居不可达检测使用来自两个来源的确认。在可能的情况下, 上层协议提供连接正在"向前进展"的积极确认, 即已知先前发送的数据已正确传递 (例如, 最近收到了新的确认)。当无法通过此类"提示"获得积极确认时, 节点发送单播邻居请求消息, 请求来自下一跳的邻居通告作为可达性确认。为了减少不必要的网络流量, 探测消息仅发送到节点正在主动向其发送数据包的邻居。
除了解决上述一般问题外, 邻居发现还处理以下情况:
链路层地址更改 - 知道其链路层地址已更改的节点可以向所有节点组播一些 (未经请求的) 邻居通告数据包, 以快速更新已变为无效的缓存链路层地址。注意, 发送未经请求的通告仅是性能增强 (例如, 不可靠)。邻居不可达检测算法确保所有节点将可靠地发现新地址, 尽管延迟可能会稍长一些。
入站负载均衡 - 具有复制接口的节点可能希望在同一链路上的多个网络接口之间负载均衡传入数据包的接收。此类节点为同一接口分配了多个链路层地址。例如, 单个网络驱动程序可以将多个网络接口卡表示为具有多个链路层地址的单个逻辑接口。邻居发现允许路由器通过允许路由器从路由器通告数据包中省略源链路层地址来执行寻址给自己的流量的负载均衡, 从而强制邻居使用邻居请求消息来学习路由器的链路层地址。返回的邻居通告消息可以包含根据例如谁发出请求而不同的链路层地址。本规范未定义允许主机负载均衡传入数据包的机制。参见 [LD-SHRE]。
任播地址 - 任播地址标识提供等效服务的一组节点之一, 并且同一链路上的多个节点可能被配置为识别相同的任播地址。邻居发现通过让节点期望为同一目标接收多个邻居通告来处理任播。所有任播地址的通告都被标记为非覆盖通告。非覆盖通告是不更新或替换另一个通告发送的信息的通告。这些通告稍后将在邻居通告消息的上下文中讨论。这调用特定规则来确定应使用潜在的多个通告中的哪一个。
代理通告 - 愿意代表无法响应邻居请求的目标地址接受数据包的节点可以发出非覆盖邻居通告。代理通告由Mobile IPv6家乡代理使用, 以在移动节点离开链路时防御移动节点的地址。但是, 它不打算作为处理例如未实现此协议的节点的通用机制。
3.1. Comparison with IPv4 (与IPv4的比较)
IPv6邻居发现协议对应于IPv4协议地址解析协议 [ARP]、ICMP路由器发现 [RDISC] 和ICMP重定向 [ICMPv4] 的组合。在IPv4中, 虽然主机要求文档 [HR-CL] 确实指定了一些可能的死网关检测算法 (邻居不可达检测解决的问题的子集), 但没有普遍认同的邻居不可达检测的协议或机制。
邻居发现协议在IPv4协议集上提供了许多改进:
-
路由器发现是基本协议集的一部分; 主机不需要"窥探"路由协议。
-
路由器通告携带链路层地址; 不需要额外的数据包交换来解析路由器的链路层地址。
-
路由器通告携带链路的前缀; 不需要有单独的机制来配置"网络掩码"。
-
路由器通告启用地址自动配置。
-
路由器可以通告主机在链路上使用的MTU, 确保所有节点在缺少明确定义的MTU的链路上使用相同的MTU值。
-
地址解析组播"分散"在1600万 (2^24) 个组播地址上, 大大减少了目标以外节点上与地址解析相关的中断。此外, 非IPv6机器根本不应该被中断。
-
重定向包含新的第一跳的链路层地址; 在接收重定向时不需要单独的地址解析。
-
多个前缀可以与同一链路关联。默认情况下, 主机从路由器通告中学习所有链路内前缀。但是, 路由器可能被配置为从路由器通告中省略部分或所有前缀。在这种情况下, 主机假设目的地是链路外的, 并将流量发送到路由器。然后路由器可以根据需要发出重定向。
-
与IPv4不同, IPv6重定向的接收者假设新的下一跳是链路内的。在IPv4中, 主机忽略指定根据链路的网络掩码不是链路内的下一跳的重定向。IPv6重定向机制类似于 [SH-MEDIA] 中指定的XRedirect设施。预计它将在不希望或不可能让节点知道链路内目的地的所有前缀的非广播和共享媒体链路上有用。
-
邻居不可达检测是基础的一部分, 这显著提高了在存在故障路由器、部分故障或分区链路或更改其链路层地址的节点的情况下数据包传递的鲁棒性。例如, 移动节点可以离开链路而不会因过时的ARP缓存而失去任何连接。
-
与ARP不同, 邻居发现检测半链路故障 (使用邻居不可达检测) 并避免向缺少双向连接的邻居发送流量。
-
与IPv4路由器发现不同, 路由器通告消息不包含偏好字段。不需要偏好字段来处理不同"稳定性"的路由器; 邻居不可达检测将检测死路由器并切换到工作的路由器。
-
使用链路本地地址唯一标识路由器 (用于路由器通告和重定向消息) 使得主机可以在站点重新编号以使用新的全局前缀时维护路由器关联。
-
通过将跳数限制设置为255, 邻居发现对意外或故意发送ND消息的链路外发送者免疫。在IPv4中, 链路外发送者可以发送ICMP重定向和路由器通告消息。
-
将地址解析放在ICMP层使得协议比ARP更独立于媒体, 并使得可以根据需要使用通用的IP层身份验证和安全机制。
3.2. Supported Link Types (支持的链路类型)
邻居发现支持具有不同属性的链路。在存在某些属性的情况下, 本文档仅完全指定了ND协议机制的子集:
点对点 (point-to-point) - 邻居发现处理此类链路就像组播链路一样。(组播可以在点对点链路上平凡地提供, 并且可以为接口分配链路本地地址。)
组播 (multicast) - 邻居发现在本文档中描述的支持组播的链路上运行。
非广播多路访问 (NBMA, non-broadcast multiple access) - 重定向、邻居不可达检测和下一跳确定应按照本文档中的描述实现。地址解析以及在NBMA链路上传递路由器请求和通告的机制未在本文档中指定。注意, 如果主机支持手动配置默认路由器列表, 主机可以从重定向消息动态获取其邻居的链路层地址。
共享媒体 (shared media) - 重定向消息以 [SH-MEDIA] 中的XRedirect消息为模型, 以简化在共享媒体链路上使用协议。
本规范不解决仅与路由器相关的共享媒体问题, 例如:
- 路由器如何在共享媒体链路上交换可达性信息。
- 路由器如何确定主机的链路层地址, 它需要向主机发送重定向消息。
- 路由器如何确定它是接收数据包的第一跳路由器。
该协议是可扩展的 (通过定义新选项), 因此将来可能有其他解决方案。
可变MTU (variable MTU) - 邻居发现允许路由器指定链路的MTU, 然后所有节点都使用它。链路上的所有节点必须使用相同的MTU (或最大接收单元) 才能使组播正常工作。否则, 在组播时, 无法知道哪些节点将接收数据包的发送者无法确定所有接收者可以处理 (或最大接收单元) 的最小数据包大小。
非对称可达性 (asymmetric reachability) - 邻居发现检测对称可达性的缺失; 节点避免使用与之没有对称连接的邻居的路径。
邻居不可达检测通常会识别此类半链路, 节点将避免使用它们。
该协议大概可以在将来扩展, 以在缺乏自反和传递连接的环境中找到可行的路径。
3.3. Securing Neighbor Discovery Messages (保护邻居发现消息)
邻居发现消息对于各种功能是必需的。几个功能旨在允许主机确定地址的所有权或链路层和IP层地址之间的映射。与邻居发现相关的漏洞在第11.1节中讨论。保护邻居发现的通用解决方案超出了本规范的范围, 并在 [SEND] 中讨论。但是, 第11.2节解释了如何以及在什么约束下可以使用IPsec身份验证头部 (AH) 或封装安全有效负载 (ESP) 来保护邻居发现。