Skip to main content

8. 重定向功能

重定向消息由路由器用于通知主机到达目的地的更好的第一跳。路由器仅为其转发的数据包发送重定向消息。主机必须 (MUST) 静默丢弃任何不满足第8.1节中指定的所有有效性检查的接收到的重定向消息。

8.1. Validation of Redirect Messages (重定向消息的验证)

主机必须 (MUST) 静默丢弃任何不满足以下所有有效性检查的接收到的重定向消息:

  • 重定向的IP源地址与指定ICMP目的地址的当前第一跳路由器相同。

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

  • ICMP校验和有效。

  • ICMP代码为0。

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

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

  • 重定向消息中的ICMP目的地址字段不包含组播地址。

  • ICMP目标地址是链路本地地址 (重定向到路由器时) 或与ICMP目的地址相同 (重定向到链路内目的地时)。

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

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

未指定与重定向消息一起使用的任何已定义选项的内容必须 (MUST) 被忽略, 并且数据包正常处理。可能出现的唯一已定义选项是目标链路层地址和重定向头部选项。

8.2. Router Specification (路由器规范)

路由器应该 (SHOULD) 在以下情况下发送重定向消息 (受速率限制):

  • 数据包的源地址字段标识邻居, 并且

  • 路由器确定对于数据包的目的地址, 更好的第一跳节点驻留在与发送节点相同的链路上, 并且

  • 数据包的目的地址不是组播地址。

传输的重定向消息包含:

  • 在目标地址字段中: 应将目的地的后续数据包发送到的地址。如果目标是路由器, 必须 (MUST) 使用该路由器的链路本地地址。如果目标是主机, 目标地址字段必须 (MUST) 设置为与调用IP数据包的目的地址相同的值。

  • 在目的地址字段中: 调用IP数据包的目的地址。

  • 在选项中:

    • 目标链路层地址选项: 目标的链路层地址。应该 (SHOULD) 包括 (如果已知)。注意, 在NBMA链路上, 主机可能没有链路层地址, 在这种情况下无法包括该选项。

    • 重定向头部: 尽可能多的转发数据包, 而不使重定向数据包超过 [IPv6] 中指定的支持IPv6所需的最小MTU。

路由器必须 (MUST) 限制发送重定向消息的速率, 以便在源未正确响应重定向时限制重定向消息产生的带宽和处理成本。有关ICMP错误消息速率限制的更多详细信息, 请参见 [ICMPv6]。

8.3. Host Specification (主机规范)

接收重定向的主机检查数据包并执行以下有效性检查。如果这些检查中的任何一个失败, 主机必须 (MUST) 静默丢弃重定向消息。

主机验证重定向消息有效后, 按如下方式处理消息:

  • 如果目标地址与目的地址不同, 主机将其目的地缓存中目的地址的当前条目替换为指向目标地址的条目。该条目应继承旧条目关于路径MTU信息和邻居不可达检测状态的状态。当主机创建新的目的地缓存条目时, 该条目按照第5.2节中的描述进行初始化。

  • 如果目标地址与目的地址相同, 接收主机对其目的地的前缀列表条目执行以下操作:

    • 如果不存在条目, 主机将目的地作为链路内目的地添加到其前缀列表。
    • 如果前缀列表中已存在目的地的条目, 主机更新该条目以指示目的地是链路内的。

对于这两种情况, 主机更新目的地的目的地缓存条目以指向目标地址。如果目的地缓存条目不存在, 主机创建新条目。即使主机已经有一个指定不同第一跳邻居的缓存条目, 也应该 (SHOULD) 更新该条目, 因为路由器更适合确定适当的第一跳邻居。

如果重定向包含目标链路层地址选项, 主机创建或更新目标的邻居缓存条目。在这两种情况下, 都使用选项中的链路层地址。目标的邻居缓存条目设置为STALE状态。如果为目标创建了邻居缓存条目, 其可达性状态必须 (MUST) 设置为STALE, 如第7.3.3节中所述。如果缓存条目已存在并使用不同的链路层地址更新, 其可达性状态也必须 (MUST) 设置为STALE。

主机必须 (MUST) 将目标地址添加到目的地缓存。该条目的下一跳地址设置为重定向的目标地址。如果目的地的目的地缓存条目已存在, 则更新为使用目标地址作为其下一跳。注意, 主机不验证目标是否可达; 重定向消息的有效性是路由器的责任。

路由器应该 (SHOULD) 响应其转发的数据包发送重定向消息, 其中源地址字段标识邻居, 并且路由器确定目的地有更好的第一跳节点。路由器可能发送重定向的速率必须受到限制, 以防止广播风暴或对主机的拒绝服务攻击。

8.4. Example (示例)

考虑这样的情况: 主机通过默认路由器R1向目的地发送数据包, 但同一链路上的另一个路由器R2将是到达目的地的更好的第一跳。在转发数据包时, R1向主机发送重定向, 通知它R2是更好的选择。重定向包括R2的链路本地地址。

      +------+
| 主机 |
+------+
|
| (1) 到目的地的数据包
|
v
+----+ +----+
| R1 | ---------> | R2 |
+----+ 重定向 +----+
| |
| |
+------------------+
链路
  1. 主机通过R1 (其默认路由器) 向目的地发送数据包
  2. R1转发数据包并向主机发送重定向, 指示R2更好
  3. 主机更新其目的地缓存以将R2用于此目的地
  4. 到目的地的后续数据包直接发送到R2

8.5. Redirect Loop Prevention (重定向循环预防)

如果链路上的多个路由器对目的地的最佳第一跳不一致, 重定向机制容易受到重定向循环的影响。但是, 由于以下原因, 此类循环通常是短暂的:

  • 路由器仅为其转发的数据包发送重定向。如果路由器接收到它是最佳第一跳的数据包, 它将不会发送重定向。

  • 接收针对同一目的地指向不同路由器的多个重定向的主机将使用最近接收的重定向。随着时间的推移, 系统应收敛到稳定状态。

  • 邻居不可达检测算法最终将检测路由器是否不可达, 导致主机回退到另一个路由器。

尽管有这些缓解措施, 实现应注意重定向循环的可能性, 并可能实施额外的保护措施, 例如限制响应重定向更新目的地缓存条目的速率。