附录 C. reachability state 状态机
本附录提供状态机图, 并详细说明本规范定义的 Neighbor Cache 可达性状态 (reachability state).
C.1. 概述
随着节点学习并验证邻居的可达性, 对应邻居的 Neighbor Cache 条目会在若干状态之间转换. 这些状态是:
- INCOMPLETE: 地址解析正在进行
- REACHABLE: 正向路径和返回路径工作正常
- STALE: 信息已过时但仍可使用
- DELAY: 等待验证可达性
- PROBE: 正在主动探测可达性
C.2. 状态转换图
INCOMPLETE
|
| Address resolved
v
REACHABLE
|
| Reachability timeout
v
STALE
|
| Traffic sent
v
DELAY
|
| Probe timer expires
v
PROBE
|
+------------+------------+
| |
Reachability confirmed Max retries reached
| |
v v
REACHABLE (deleted)
C.3. 状态说明
C.3.1. INCOMPLETE 状态
进入条件:
- 需要地址解析时创建 Neighbor Cache 条目
- 尚不知道链路层地址
动作:
- 发送组播 Neighbor Solicitation
- 启动重传定时器
- 将等待地址解析的分组排队
退出条件:
- 到 REACHABLE: 收到带有链路层地址的 Neighbor Advertisement
- 到 (deleted): 达到最大重传次数且没有响应
定时器:
- 重传定时器: RETRANS_TIMER (通常为 1000ms)
- 最大重试次数: MAX_MULTICAST_SOLICIT (通常为 3)
C.3.2. REACHABLE 状态
进入条件:
- 地址解析成功完成, 或
- 收到可达性确认 (solicited Neighbor Advertisement, 上层确认)
动作:
- 正常转发分组
- 不需要探测
- 流量正常传输
退出条件:
- 到 STALE: ReachableTime 到期且没有可达性确认
定时器:
- ReachableTime: 基于 BaseReachableTime 的随机化值 (通常为 15-45 秒)
C.3.3. STALE 状态
进入条件:
- REACHABLE 状态中的 ReachableTime 到期, 或
- 收到 unsolicited Neighbor Advertisement 并更新链路层地址, 或
- 由收到的 Neighbor Discovery 消息创建条目 (不是 solicited NA)
动作:
- 使用缓存的链路层地址
- 不发送探测
- 将信息视为可能已过期
退出条件:
- 到 DELAY: 上层协议向该邻居发送流量
- 到 REACHABLE: 收到 solicited Neighbor Advertisement 并确认可达性
定时器:
- 无 (可以无限期保持在 STALE)
C.3.4. DELAY 状态
进入条件:
- 向处于 STALE 状态的邻居发送流量
动作:
- 等待上层可达性确认
- 暂不发送探测 (给上层时间进行确认)
- 继续使用缓存的链路层地址
退出条件:
- 到 REACHABLE: 上层协议确认可达性
- 到 PROBE: 延迟定时器到期且没有可达性确认
定时器:
- 延迟定时器: DELAY_FIRST_PROBE_TIME (通常为 5 秒)
C.3.5. PROBE 状态
进入条件:
- DELAY 状态中的延迟定时器到期, 且没有可达性确认
动作:
- 发送单播 Neighbor Solicitation 探测
- 继续使用缓存的链路层地址
- 如果没有响应, 重传探测
退出条件:
- 到 REACHABLE: 收到 solicited Neighbor Advertisement
- 到 (deleted): 已发送最大次数的单播 solicitation 且没有响应
定时器:
- 重传定时器: RETRANS_TIMER (通常为 1000ms)
- 最大重试次数: MAX_UNICAST_SOLICIT (通常为 3)
C.4. 事件与触发器
C.4.1. 可达性确认
可达性通过以下方式确认:
- 收到 solicited Neighbor Advertisement
- 上层协议指示 (例如 TCP ACK)
- 收到 Solicited 标志置位的 Neighbor Discovery 消息
C.4.2. 链路层地址变化
当 Neighbor Advertisement 更新链路层地址时:
- 如果 Override 标志已置位: 更新地址, 转入 STALE
- 如果 Override 标志未置位且地址不同: 转入 STALE, 不更新
- 如果 Override 标志未置位且地址匹配: 状态不变
C.4.3. 超时事件
- REACHABLE 中 ReachableTime 到期: 转入 STALE
- DELAY 中 DELAY_FIRST_PROBE_TIME 到期: 转入 PROBE
- INCOMPLETE/PROBE 中的重传定时器: 重传或删除
C.5. 实现考虑事项
C.5.1. 状态跟踪
实现应该跟踪:
- 当前状态
- 链路层地址 (如果已知)
- IsRouter 标志
- 待处理分组队列 (用于 INCOMPLETE)
- 重传计数
- 适用的定时器
C.5.2. 上层提示
上层协议可以提供关于可达性的提示:
- 正向提示: 连接建立, 数据确认
- 负向提示: 连接失败, 超时
这些提示可以触发状态转换或加快探测.
C.5.3. 性能优化
Optimistic DAD (RFC 4429):
- 允许在 DAD 完成前使用地址
- 在某些场景下更快转换到 REACHABLE
快速恢复:
- 优先检查活跃使用邻居的可达性
- 对关键邻居使用并行探测
C.5.4. 安全考虑事项
状态转换应受到保护:
- 验证 Neighbor Discovery 消息的源地址
- 使用 SEND (RFC 3971) 提供密码学保护
- 对状态转换进行速率限制, 以防止 DoS 攻击
C.6. 示例场景
C.6.1. 成功地址解析
- 创建处于 INCOMPLETE 状态的条目
- 发送 Neighbor Solicitation
- 收到 Neighbor Advertisement -> REACHABLE
- ReachableTime 之后 -> STALE
- 发送流量 -> DELAY
- 上层确认可达性 -> REACHABLE
C.6.2. 邻居变为不可达
- 条目处于 REACHABLE 状态
- ReachableTime 到期 -> STALE
- 发送流量 -> DELAY
- 没有可达性确认 -> PROBE
- 发送单播探测 (x3)
- 没有响应 -> 删除条目
C.6.3. 链路层地址变化
- 条目处于 REACHABLE/STALE 状态
- 收到带有新地址的 unsolicited NA, Override=1
- 更新地址 -> STALE
- 未来流量触发验证
注: 该状态机旨在平衡两个目标: 及时检测不可达邻居, 同时对稳定且可达的邻居保持最小开销.