跳到主要内容

附录 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 到期不变从列表中移除