附录 D. IsRouter 规则摘要
本附录总结了在 Neighbor Cache 条目中维护和使用 IsRouter 标志的规则.
D.1. 概述
Neighbor Cache 条目中的 IsRouter 标志表示某个邻居是否已知为路由器. 此信息对于正确转发分组非常关键, 并会影响 Neighbor Discovery 行为的多个方面.
D.2. 设置 IsRouter 标志
在以下情况下, IsRouter 标志会被设置为 TRUE:
-
Router Advertisement Received: 当从某个邻居收到 Router Advertisement 时, 该邻居的 IsRouter 标志必须被设置为 TRUE.
-
Neighbor Advertisement with Router Flag: 当收到设置了 Router (R) 标志的 Neighbor Advertisement 时, IsRouter 标志必须被设置为 TRUE.
-
Router Solicitation Sent: 发送 Router Solicitation 时, 如果为目的地创建了 Neighbor Cache 条目或该条目已经存在, 实现可以将 IsRouter 设置为 TRUE (虽然 Router Solicitation 通常会发送到 all-routers 多播地址).
D.3. 清除 IsRouter 标志
在以下情况下, IsRouter 标志会被设置为 FALSE:
-
Neighbor Advertisement without Router Flag: 当收到 Router (R) 标志被清除 (设置为 0) 的 Neighbor Advertisement 时, IsRouter 标志必须被设置为 FALSE.
-
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. 路由器转换为主机
当路由器转换为主机时:
- 路由器停止发送 Router Advertisement
- 路由器发送 R=0 的 Neighbor Advertisement
- 主机收到 NA, 设置 IsRouter=FALSE, 并从 Default Router List 中移除该路由器
- 主机上的 Router Lifetime 最终到期 (如果尚未移除)
D.5.2. 主机转换为路由器
当主机变为路由器时:
- 新路由器开始发送 Router Advertisement
- 主机收到 RA, 设置 IsRouter=TRUE
- 新路由器被加入 Default Router List
- 路由器可以发送 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 到期 | 不变 | 从列表中移除 |