跳到主要内容

附录 D. IsRouter 规则摘要

本附录总结了在 Neighbor Cache 条目中维护和使用 IsRouter 标志的规则.

D.1. 概述​

Neighbor Cache 条目中的 IsRouter 标志表示某个邻居是否已知为路由器. 此信息对于正确转发分组非常关键, 并会影响 Neighbor Discovery 行为的多个方面.

D.2. 设置 IsRouter 标志​

在以下情况下, IsRouter 标志会被设置为 TRUE:

  1. Router Advertisement Received: 当从某个邻居收到 Router Advertisement 时, 该邻居的 IsRouter 标志必须被设置为 TRUE.

  2. Neighbor Advertisement with Router Flag: 当收到设置了 Router (R) 标志的 Neighbor Advertisement 时, IsRouter 标志必须被设置为 TRUE.

  3. Router Solicitation Sent: 发送 Router Solicitation 时, 如果为目的地创建了 Neighbor Cache 条目或该条目已经存在, 实现可以将 IsRouter 设置为 TRUE (虽然 Router Solicitation 通常会发送到 all-routers 多播地址).

D.3. 清除 IsRouter 标志​

在以下情况下, IsRouter 标志会被设置为 FALSE:

  1. Neighbor Advertisement without Router Flag: 当收到 Router (R) 标志被清除 (设置为 0) 的 Neighbor Advertisement 时, IsRouter 标志必须被设置为 FALSE.

  2. Router Lifetime Expiry: 当 Default Router List 中某个路由器的 Router Lifetime 到期时, IsRouter 标志保持 TRUE, 但该路由器会从 Default Router List 中移除.

D.4. 使用 IsRouter 标志​

IsRouter 标志会以多种方式影响行为:

D.4.1. Default Router List 管理​

  • 只有 IsRouter = TRUE 的邻居才能加入 Default Router List
  • 当 IsRouter 从 TRUE 变为 FALSE 时, 该邻居必须从 Default Router List 中移除

D.4.2. Redirect 消息处理​

处理 Redirect 消息时:

  • 如果重定向目标不同于目的地, 则该目标被指示为更好的第一跳路由器
  • 重定向目标的 IsRouter 标志应该被设置为 TRUE

D.4.3. Neighbor Advertisement 处理​

当从 IsRouter=TRUE 的邻居收到 R=0 的 Neighbor Advertisement 时:

  • 将 IsRouter 设置为 FALSE
  • 从 Default Router List 中移除该邻居
  • 这通常表示该邻居已经停止作为路由器工作

D.5. 竞争条件和特殊情况​

D.5.1. 路由器转换为主机​

当路由器转换为主机时:

  1. 路由器停止发送 Router Advertisement
  2. 路由器发送 R=0 的 Neighbor Advertisement
  3. 主机收到 NA, 设置 IsRouter=FALSE, 并从 Default Router List 中移除该路由器
  4. 主机上的 Router Lifetime 最终到期 (如果尚未移除)

D.5.2. 主机转换为路由器​

当主机变为路由器时:

  1. 新路由器开始发送 Router Advertisement
  2. 主机收到 RA, 设置 IsRouter=TRUE
  3. 新路由器被加入 Default Router List
  4. 路由器可以发送 R=1 的 Neighbor Advertisement 以加快这一过程

D.5.3. 同时出现的消息​

如果 Router Advertisement 和 Neighbor Advertisement (R=0) 几乎同时收到:

  • 按接收顺序处理消息
  • 最后处理的消息决定最终 IsRouter 状态
  • Router Advertisement 始终设置 IsRouter=TRUE
  • R=0 的 Neighbor Advertisement 始终设置 IsRouter=FALSE

D.6. 实现指南​

D.6.1. 初始化​

创建新的 Neighbor Cache 条目时:

  • IsRouter 的默认值应该为 FALSE
  • 只有在收到的消息确认后才设置为 TRUE

D.6.2. 一致性检查​

实现应该确保一致性:

  • 如果 IsRouter=TRUE 且不存在 Default Router List 条目, 这是可接受的 (邻居是路由器, 但不是默认路由器)
  • 如果存在 Default Router List 条目但 IsRouter=FALSE, 这是错误条件,必须通过从列表中移除该路由器来纠正

D.6.3. 日志记录和调试​

实现应该记录 IsRouter 标志转换以便调试:

  • 当 IsRouter 从 FALSE 变为 TRUE 时
  • 当 IsRouter 从 TRUE 变为 FALSE 时
  • 当路由器因 IsRouter 变为 FALSE 而从 Default Router List 中移除时

D.7. 安全考虑​

攻击者可以操纵 IsRouter 标志:

Attack: 带 R=0 的恶意 Neighbor Advertisement

  • 攻击者针对合法路由器发送 R=0 的 NA
  • 主机从其 Default Router List 中移除该路由器
  • 流量被中断

Mitigation:

  • 使用 SEND (RFC 3971) 对 Neighbor Discovery 消息进行认证
  • 对 IsRouter 标志变化实施合理的速率限制
  • 监控可疑模式 (频繁的 IsRouter 转换)

D.8. 状态转换示例​

示例 1: 正常路由器发现​

初始状态: 没有 Neighbor Cache 条目
操作: 从 fe80::1 收到 Router Advertisement
结果: 创建条目, IsRouter=TRUE, 加入 Default Router List

示例 2: 路由器变为不可用​

初始状态: IsRouter=TRUE, 路由器在 Default Router List 中
操作: 收到 R=0 的 Neighbor Advertisement
结果: IsRouter=FALSE, 从 Default Router List 中移除

示例 3: 重定向到路由器​

初始状态: 没有 fe80::2 的 Neighbor Cache 条目
操作: 收到 Redirect 消息, 指示 fe80::2 是更好的路由器
结果: 创建条目, IsRouter=TRUE (由重定向目标隐含)

D.9. 汇总表​

事件对 IsRouter 的操作对 Default Router List 的影响
收到 RA设置 TRUE加入列表 (如果尚未存在)
收到 R=1 的 NA设置 TRUE无直接影响
收到 R=0 的 NA设置 FALSE从列表中移除
收到 Redirect设置 TRUE (针对目标)目标成为首选路由器
Router Lifetime 到期不变从列表中移除