Skip to main content

6. Router and Prefix Discovery (路由器和前缀发现)

本节描述路由器和前缀发现。路由器发现 (Router Discovery) 是主机定位驻留在附加链路上的路由器的过程。前缀发现 (Prefix Discovery) 是主机发现定义哪些目的地对于附加链路是链路内的地址前缀集的过程。

主机使用通告的链路内前缀来构建和维护一个列表,该列表用于决定数据包的目的地是链路内还是在路由器之外。默认情况下,主机从路由器通告中学习所有链路内前缀。但是,路由器可能被配置为从路由器通告中省略某些或所有前缀。在这种情况下,主机假设目的地是链路外的,并将流量发送到路由器。然后路由器可以根据需要发出重定向。

6.1. Message Validation (消息验证)

6.1.1. Validation of Router Solicitation Messages (路由器请求消息的验证)

主机必须 (MUST) 静默丢弃任何接收到的路由器请求消息。

路由器必须 (MUST) 静默丢弃任何不满足以下所有有效性检查的接收到的路由器请求消息:

  • IP源地址是链路本地地址。如果请求的源地址是未指定地址,路由器绝对不能 (MUST NOT) 向组播地址(全节点组播地址除外)发送路由器通告。此限制是为了防止来自恶意节点的拒绝服务攻击。

  • IP跳数限制字段的值为255,即数据包不可能被路由器转发。

  • ICMP校验和有效。

  • ICMP代码为0。

  • ICMP长度(从IP长度派生)为8个或更多八位字节。

  • 所有包含的选项长度都大于零。

如果在接口上接收到根据上述检查有效的路由器请求,并且该接口是通告接口,则路由器可以响应组播路由器通告或响应目的地为请求节点地址的单播路由器通告,如下所述。如果路由器请求是从单播地址发送的,路由器应该响应单播路由器通告;如果路由器请求是从未指定地址发送的,则响应组播路由器通告。

6.1.2. Validation of Router Advertisement Messages (路由器通告消息的验证)

节点必须 (MUST) 静默丢弃任何不满足以下所有有效性检查的接收到的路由器通告消息:

  • IP源地址是链路本地地址。路由器必须使用其链路本地地址作为路由器通告和重定向消息的源,以便主机可以唯一标识路由器。

  • IP跳数限制字段的值为255,即数据包不可能被路由器转发。

  • ICMP校验和有效。

  • ICMP代码为0。

  • ICMP长度(从IP长度派生)为16个或更多八位字节。

  • 所有包含的选项长度都大于零。

保留字段和任何无法识别的选项的内容必须 (MUST) 被忽略。未来的向后兼容协议更改可能指定保留字段的内容或添加新选项;向后不兼容的更改可能使用不同的代码值。

未指定用于路由器通告消息的任何已定义选项的内容必须 (MUST) 被忽略,数据包按正常方式处理。唯一可能出现的已定义选项是源链路层地址、MTU和前缀信息选项。

通过有效性检查的路由器通告称为"有效路由器通告 (valid Router Advertisement)"。

6.2. Router Specification (路由器规范)

6.2.1. Router Configuration Variables (路由器配置变量)

路由器必须 (MUST) 允许系统管理为每个通告接口配置以下概念变量:

MaxRtrAdvInterval - 从接口发送未请求的组播路由器通告之间允许的最大时间,以秒为单位。必须 (MUST) 不少于4秒且不大于1800秒。

默认值: 600秒

MinRtrAdvInterval - 从接口发送未请求的组播路由器通告之间允许的最小时间,以秒为单位。必须 (MUST) 不少于3秒且不大于.75 * MaxRtrAdvInterval。

默认值: 0.33 * MaxRtrAdvInterval

AdvManagedFlag - 要放置在路由器通告中的"托管地址配置 (Managed address configuration)"标志的值。参见[ADDRCONF]。

默认值: FALSE

AdvOtherConfigFlag - 要放置在路由器通告中的"其他配置 (Other configuration)"标志的值。参见[ADDRCONF]。

默认值: FALSE

AdvLinkMTU - 要放置在路由器发送的MTU选项中的值。值为零表示不发送MTU选项。

默认值: 0

AdvReachableTime - 要放置在路由器发送的路由器通告消息的可达时间字段中的值。值为零表示未指定(由此路由器)。必须 (MUST) 不大于3,600,000毫秒(1小时)。

默认值: 0

AdvRetransTimer - 要放置在路由器发送的路由器通告消息的重传计时器字段中的值。值为零表示未指定(由此路由器)。

默认值: 0

AdvCurHopLimit - 要放置在路由器发送的路由器通告消息的当前跳数限制字段中的值。该值应设置为Internet的当前直径。值为零表示未指定(由此路由器)。

默认值: 在实现时生效的"分配号码 (Assigned Numbers)" [ASSIGNED]中指定的值。

AdvDefaultLifetime - 要放置在从接口发送的路由器通告的路由器生命周期字段中的值,以秒为单位。必须 (MUST) 为零或在MaxRtrAdvInterval和9000秒之间。值为零表示路由器不用作默认路由器。这些限制可能被描述IPv6如何在不同链路层上运行的特定文档覆盖。例如,在点对点链路中,对等方可能有足够关于另一端设备数量和状态的信息,因此不需要通告。

默认值: 3 * MaxRtrAdvInterval

AdvPrefixList - 要放置在从接口发送的路由器通告消息的前缀信息选项中的前缀列表。

默认值: 路由器通过路由协议通告为从发送通告的接口链路内的所有前缀。

对于在前缀信息选项中通告的每个前缀,路由器必须 (MUST) 还允许配置以下配置变量:

AdvValidLifetime - 要放置在前缀信息选项的有效生命周期中的值,以秒为单位。所有位都为1的指定值 (0xffffffff) 表示无限。

默认值: 2592000秒(30天),固定(即在连续通告中保持不变)。

AdvOnLinkFlag - 要放置在前缀信息选项的链路内标志 ("L-bit") 字段中的值。

默认值: TRUE

AdvPreferredLifetime - 要放置在前缀信息选项的首选生命周期中的值,以秒为单位。所有位都为1的指定值 (0xffffffff) 表示无限。

默认值: 604800秒(7天),固定(即在连续通告中保持不变)。

AdvAutonomousFlag - 要放置在前缀信息选项的自治标志字段中的值。

默认值: TRUE

6.2.2. Becoming An Advertising Interface (成为通告接口)

术语"通告接口 (advertising interface)"指路由器发送周期性路由器通告的任何接口。路由器必须 (MUST) 允许系统管理员使接口成为通告接口。

接口可以随时成为通告接口。当它成为通告接口时,路由器:

  • 按[ADDRCONF]中所述初始化接口。

  • 安排从接口发送其第一个路由器通告。选择传输时间,使得通告在0和MAX_INITIAL_RTR_ADVERT_INTERVAL之间均匀分布的时间发送。

6.2.3. Router Advertisement Message Content (路由器通告消息内容)

路由器从其通告接口发送周期性以及请求的路由器通告。出站路由器通告填充以下值,与第4.2节中给出的消息格式一致:

  • 在路由器生命周期字段中: 接口配置的AdvDefaultLifetime。

  • 在M和O标志中: 分别为接口配置的AdvManagedFlag和AdvOtherConfigFlag。

  • 在当前跳数限制字段中: 接口配置的CurHopLimit。

  • 在可达时间字段中: 接口配置的AdvReachableTime。

  • 在重传计时器字段中: 接口配置的AdvRetransTimer。

  • 在选项中:

    • 源链路层地址选项: 接口的链路层地址。应该 (SHOULD) 包含此选项,但在没有地址的链路上可以 (MAY) 省略。

    • MTU选项: 如果值非零,则为接口配置的AdvLinkMTU值。如果AdvLinkMTU为零,则不发送MTU选项。

    • 前缀信息选项: AdvPrefixList中列出的每个前缀一个前缀信息选项。每个前缀信息选项包括以下字段:

      • 在"链路内 (on-link)"标志中: AdvOnLinkFlag
      • 在有效生命周期字段中: AdvValidLifetime
      • 在"自治地址配置 (autonomous address-configuration)"标志中: AdvAutonomousFlag
      • 在首选生命周期字段中: AdvPreferredLifetime
      • 在前缀中: 正在通告的前缀

路由器可以 (MAY) 包含上述指定以外的选项。

6.2.4. Sending Unsolicited Router Advertisements (发送未请求的路由器通告)

路由器发送未请求的路由器通告以宣布其存在并通告各种链路和Internet参数。对于每个通告接口,路由器向全节点组播地址发送周期性组播路由器通告。

路由器通告的发送速率由路由器的配置变量控制: MaxRtrAdvInterval和MinRtrAdvInterval。当接口成为通告接口时,路由器在接口上初始化一个计时器,该计时器在发送第一个通告后过期。计时器设置为在0和MAX_INITIAL_RTR_ADVERT_INTERVAL之间均匀分布的时间过期。

在第一个通告之后,当计时器过期时发送后续路由器通告。每当计时器过期时,计时器重置为在MinRtrAdvInterval和MaxRtrAdvInterval之间均匀分布的值。

6.2.5. Ceasing To Be An Advertising Interface (停止成为通告接口)

接口可以随时停止成为通告接口。例如,正在关闭的路由器或正在禁用的接口可能停止成为通告接口。在这种情况下,路由器应该 (SHOULD) 在接口上传输一个或多个(但不超过MAX_FINAL_RTR_ADVERTISEMENTS)最终组播路由器通告,路由器生命周期字段为零。在路由器关闭的情况下,接口应该 (SHOULD) 被声明停止成为通告接口,然后发送最终路由器通告。在路由器知道接口可能在一段时间内不可用(例如,由于即将断电)的情况下,路由器可以 (MAY) 以更快的速率(即,比每MinRtrAdvInterval一次更频繁)传输最终路由器通告。

6.2.6. Processing Router Solicitations (处理路由器请求)

主机必须 (MUST) 静默丢弃任何接收到的路由器请求消息。

除了发送周期性、未请求的通告外,路由器还响应在通告接口上接收到的有效路由器请求发送路由器通告。路由器可以 (MAY) 选择直接单播响应到请求主机的地址(如果请求的源地址不是未指定地址),但通常情况下会将响应组播到全节点组。在后一种情况下,接口的间隔计时器重置为新的随机值,就像发送了未请求的通告一样(参见第6.2.4节)。

在所有情况下,响应路由器请求发送的路由器通告必须 (MUST) 在0和MAX_RA_DELAY_TIME秒之间的随机时间延迟。(如果响应多个请求发送单个通告,延迟是相对于第一个请求的。)此外,发送到全节点组播地址的连续路由器通告必须 (MUST) 速率限制为每MIN_DELAY_BETWEEN_RAS秒不超过一个通告。

如果路由器的配置指示不应在接口上发送路由器通告,路由器可以 (MAY) 选择忽略路由器请求。

6.2.7. Router Advertisement Consistency (路由器通告一致性)

为了最小化错误配置的可能性,路由器应该 (SHOULD) 在其通告的值中保持一致。也就是说,同一链路上的路由器应该 (SHOULD) 为AdvCurHopLimit、AdvManagedFlag、AdvOtherConfigFlag、AdvLinkMTU、AdvReachableTime和AdvRetransTimer通告相同的值。但是,不需要这种一致性,如果路由器通告不同的值,系统仍然应该工作,尽管可能不如它可能的那样好。

如果链路上的路由器为AdvCurHopLimit通告不同的值,主机将使用它们最近学到的通告值。如果AdvCurHopLimit更改,一些主机可能使用一个值,而其他主机可能使用不同的值,直到所有主机都接收到通告新值的路由器通告。

如果路由器为AdvReachableTime或AdvRetransTimer通告不同的值,主机将按照第6.3.2节中所述计算自己的值。

如果路由器为AdvDefaultLifetime通告不同的值,主机将偏好通告最大值的路由器。

6.3. Host Specification (主机规范)

6.3.1. Host Configuration Variables (主机配置变量)

主机应该 (SHOULD) 允许系统管理为每个接口配置以下变量:

DupAddrDetectTransmits - 在暂定地址上执行重复地址检测时发送的连续邻居请求消息的数量。值为零表示不对暂定地址执行重复地址检测。值为1表示单次传输,没有后续重传。

默认值: 1,但可能被涵盖在特定链路类型上运行IP的文档中的特定于链路类型的值覆盖。

6.3.2. Host Variables (主机变量)

主机在每个接口基础上维护以下变量:

RouterList - 默认路由器列表,如第5节中所定义。

PrefixList - 前缀列表,如第5节中所定义。

LinkMTU - 链路的MTU值。从链路层提供的linkmtu值初始化。

CurHopLimit - 应放入出站IP数据包的IP头部跳数字段的默认值。初始化为"IPv6分配号码 (IPv6 Assigned Numbers)"文档[ASSIGNED]指定的值。

BaseReachableTime - 用于计算随机ReachableTime值的基值。初始化为REACHABLE_TIME。

ReachableTime - 在收到可达性确认后,邻居被认为可达的时间。ReachableTime由邻居不可达检测算法使用(参见第7.3节)。它从路由器通告中学习或设置为默认值。它是在MIN_RANDOM_FACTOR和MAX_RANDOM_FACTOR倍BaseReachableTime之间均匀分布的随机值。当BaseReachableTime更改(由于路由器通告)或至少每隔几个小时即使没有接收到路由器通告,也应计算新的随机值。

RetransTimer - 解析地址或探测邻居的可达性时向邻居重传邻居请求消息之间的时间。也在重复地址检测期间使用(参见[ADDRCONF])。RetransTimer从路由器通告中学习或设置为默认值。

6.3.3. Interface Initialization (接口初始化)

主机在所有支持组播的接口上加入全节点组播地址。

6.3.4. Processing Received Router Advertisements (处理接收到的路由器通告)

收到有效路由器通告后,主机提取数据包的源地址并执行以下操作:

  • 如果地址尚未出现在主机的默认路由器列表中,并且通告的路由器生命周期非零,则在列表中创建新条目,并从通告的路由器生命周期字段初始化其失效计时器值。

  • 如果由于先前接收到的通告,地址已经出现在主机的默认路由器列表中,则将其失效计时器重置为新接收到的通告中的路由器生命周期值。

  • 如果地址已经出现在主机的默认路由器列表中,并且接收到的路由器生命周期值为零,则立即超时该条目,如第6.3.5节中所指定。

路由器通告字段(例如,当前跳数限制、可达时间和重传计时器)可能包含表示未指定的值。在这种情况下,应忽略参数,主机应继续使用它已经使用的任何值。

如果接收到的当前跳数限制值非零,主机应该 (SHOULD) 将其CurHopLimit变量设置为接收到的值。

如果接收到的可达时间值非零,主机应该 (SHOULD) 将其BaseReachableTime变量设置为接收到的值。如果新值与先前值不同,主机应该 (SHOULD) 重新计算新的随机ReachableTime值。

如果接收到的重传计时器值非零,主机应该 (SHOULD) 将其RetransTimer变量设置为接收到的值。

如果存在MTU选项,主机应该 (SHOULD) 将选项的值复制到LinkMTU中,只要该值大于或等于最小链路MTU [IPv6]并且不超过链路类型特定文档(例如,[IPv6-ETHER])中指定的默认LinkMTU值。

设置了"链路内 (on-link)" (L) 标志的前缀信息选项指示标识应被视为链路内的地址范围的前缀。但是,请注意,链路内标志设置为零的前缀信息选项不传达有关链路内确定的信息,绝对不能 (MUST NOT) 被解释为表示前缀覆盖的地址是链路外的。禁用先前通告的前缀的唯一方法是通告该前缀,有效生命周期设置为零(参见第6.3.5节)。

对于设置了链路内标志的每个前缀信息选项,主机执行以下操作:

  • 如果前缀尚未出现在前缀列表中,并且前缀信息选项的有效生命周期字段非零,则为前缀创建新条目,并将其失效计时器初始化为前缀信息选项中的有效生命周期值。

  • 如果由于先前接收到的通告,前缀已经出现在主机的前缀列表中,则将其失效计时器重置为前缀信息选项中的有效生命周期值。如果新的生命周期值为零,则立即超时前缀(参见第6.3.5节)。

  • 如果前缀信息选项的有效生命周期字段为零,并且前缀不在主机的前缀列表中,则静默忽略该选项。

自治地址配置标志 (A-flag) 指示前缀是否可用于无状态地址自动配置。A标志的处理在[ADDRCONF]中指定。

6.3.5. Timing out Prefixes and Default Routers (前缀和默认路由器超时)

当前缀的有效生命周期到期时,前缀从前缀列表中删除。当其有效生命周期到期时,前缀失效。

每当默认路由器列表中条目的失效计时器到期时,该条目被丢弃。从默认路由器列表中删除路由器时,节点必须 (MUST) 更新目的地缓存,使所有使用该路由器的条目再次执行下一跳确定,而不是继续向(已删除的)路由器发送流量。

6.3.6. Default Router Selection (默认路由器选择)

选择默认路由器的算法取决于主机的策略。此算法可以是移动性解决方案的一部分。

以下规则代表在没有更好算法的情况下应该 (SHOULD) 使用的默认路由器选择算法。

  • 可达或可能可达(即,处于INCOMPLETE以外的任何状态)的路由器应该 (SHOULD) 优先于可达性未知或可疑(即,处于INCOMPLETE状态)的路由器。实现可以选择始终返回相同的路由器或以轮询方式循环浏览路由器列表,只要它在可用时始终返回可达的路由器。

  • 当列表上没有路由器已知可达或可能可达时,路由器应该 (SHOULD) 以轮询方式选择,以便对默认路由器的后续请求不会返回相同的路由器,直到所有其他路由器都被选择。

在这种情况下循环浏览路由器列表确保所有可用路由器都在主动测试可达性,而没有一个已知可达。

6.3.7. Sending Router Solicitations (发送路由器请求)

当接口启用时,主机可以发送最多MAX_RTR_SOLICITATIONS个路由器请求消息。但是,不期望未请求的路由器通告的接口(例如,仅主机链路,或配置了默认路由器的主机的链路)不需要发送路由器请求。

主机向全路由器组播地址发送路由器请求。

主机应该 (SHOULD) 传输最多MAX_RTR_SOLICITATIONS个路由器请求消息,每个消息之间至少间隔RTR_SOLICITATION_INTERVAL秒。但是,为了避免网络拥塞,第一次传输之前的延迟应该 (SHOULD) 是0和MAX_RTR_SOLICITATION_DELAY之间均匀分布的随机值。此延迟确保来自不同主机的路由器请求不同步。

在传输MAX_RTR_SOLICITATIONS个请求后,主机将接收路由器通告,或将得出链路上没有路由器的结论。一旦主机发送了MAX_RTR_SOLICITATIONS个请求,它应该 (SHOULD) 继续接收和处理可能在停止发送路由器请求后到达的路由器通告。