附录C. State Machine for the Reachability State (可达性状态状态机)
本附录提供了本规范中定义的邻居缓存可达性状态的状态机图和详细说明。
C.1. Overview (概述)
当节点了解并验证邻居的可达性时,邻居的邻居缓存条目会在几个状态之间转换。这些状态是:
- INCOMPLETE (不完整): 地址解析正在进行中
- REACHABLE (可达): 前向和返回路径正常工作
- STALE (陈旧): 信息已过时但可用
- DELAY (延迟): 等待验证可达性
- PROBE (探测): 主动探测可达性
C.2. State Transition Diagram (状态转换图)
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. State Descriptions (状态描述)
C.3.1. INCOMPLETE State (不完整状态)
进入条件:
- 需要地址解析时创建邻居缓存条目
- 尚不知道链路层地址
操作:
- 发送组播邻居请求
- 启动重传计时器
- 队列等待地址解析的数据包
退出条件:
- 到REACHABLE: 接收到带有链路层地址的邻居通告
- 到(删除): 达到最大重传次数但无响应
计时器:
- 重传计时器: RETRANS_TIMER(通常为1000ms)
- 最大重试: MAX_MULTICAST_SOLICIT(通常为3)
C.3.2. REACHABLE State (可达状态)
进入条件:
- 地址解析成功完成,或
- 接收到可达性确认(请求的邻居通告、上层确认)
操作:
- 正常数据包转发
- 无需探测
- 流量正常流动
退出条件:
- 到STALE: ReachableTime过期而没有可达性确认
计时器:
- ReachableTime: 基于BaseReachableTime的随机值(通常为15-45秒)
C.3.3. STALE State (陈旧状态)
进入条件:
- REACHABLE状态下ReachableTime过期,或
- 接收到更新链路层地址的未请求邻居通告,或
- 由接收到的邻居发现消息(非请求的NA)创建的条目
操作:
- 使用缓存的链路层地址
- 不发送探测
- 将信息视为可能过时
退出条件:
- 到DELAY: 上层协议向此邻居发送流量
- 到REACHABLE: 接收到确认可达性的请求邻居通告
计时器:
- 无(可以无限期保持在STALE状态)
C.3.4. DELAY State (延迟状态)
进入条件:
- 向STALE状态的邻居发送流量
操作:
- 等待上层可达性确认
- 尚未发送探测(给上层时间确认)
- 继续使用缓存的链路层地址
退出条件:
- 到REACHABLE: 上层协议确认可达性
- 到PROBE: 延迟计时器过期而没有可达性确认
计时器:
- 延迟计时器: DELAY_FIRST_PROBE_TIME(通常为5秒)
C.3.5. PROBE State (探测状态)
进入条件:
- DELAY状态下延迟计时器过期而没有可达性确认
操作:
- 发送单播邻居请求探测
- 继续使用缓存的链路层地址
- 如果没有响应则重传探测
退出条件:
- 到REACHABLE: 接收到请求的邻居通告
- 到(删除): 发送最大单播请求但无响应
计时器:
- 重传计时器: RETRANS_TIMER(通常为1000ms)
- 最大重试: MAX_UNICAST_SOLICIT(通常为3)
C.4. Events and Triggers (事件和触发器)
C.4.1. Reachability Confirmations (可达性确认)
可达性通过以下方式确认:
- 接收到请求的邻居通告
- 上层协议指示(例如,TCP ACK)
- 接收到设置了请求标志的邻居发现消息
C.4.2. Link-Layer Address Changes (链路层地址更改)
当邻居通告更新链路层地址时:
- 如果设置了Override标志: 更新地址,移至STALE
- 如果Override标志清除且地址不同: 移至STALE,不更新
- 如果Override标志清除且地址匹配: 无状态更改
C.4.3. Timeout Events (超时事件)
- REACHABLE中ReachableTime过期: 移至STALE
- DELAY中DELAY_FIRST_PROBE_TIME过期: 移至PROBE
- INCOMPLETE/PROBE中重传计时器: 重传或删除
C.5. Implementation Considerations (实现考虑)
C.5.1. State Tracking (状态跟踪)
实现应该 (SHOULD) 跟踪:
- 当前状态
- 链路层地址(如果已知)
- IsRouter标志
- 待处理数据包队列(对于INCOMPLETE)
- 重传计数
- 适用的计时器
C.5.2. Upper-Layer Hints (上层提示)
上层协议可以提供关于可达性的提示:
- 正面提示: 连接建立、数据确认
- 负面提示: 连接失败、超时
这些提示可以触发状态转换或加速探测。
C.5.3. Performance Optimizations (性能优化)
乐观DAD (Optimistic DAD - RFC 4429):
- 允许在DAD完成之前使用地址
- 在某些场景中更快地转换到REACHABLE
快速恢复 (Fast Recovery):
- 优先检查活跃使用的邻居的可达性
- 对关键邻居使用并行探测
C.5.4. Security Considerations (安全考虑)
应保护状态转换:
- 验证邻居发现消息的源地址
- 使用SEND (RFC 3971) 进行加密保护
- 速率限制状态转换以防止DoS攻击
C.6. Example Scenarios (示例场景)
C.6.1. Successful Address Resolution (成功的地址解析)
- 在INCOMPLETE状态下创建条目
- 发送邻居请求
- 接收邻居通告 → REACHABLE
- ReachableTime后 → STALE
- 发送流量 → DELAY
- 上层确认可达性 → REACHABLE
C.6.2. Neighbor Becomes Unreachable (邻居变为不可达)
- REACHABLE状态下的条目
- ReachableTime过期 → STALE
- 发送流量 → DELAY
- 无可达性确认 → PROBE
- 发送单播探测(×3)
- 无响应 → 删除条目
C.6.3. Link-Layer Address Changes (链路层地址更改)
- REACHABLE/STALE状态下的条目
- 接收到带有新地址的未请求NA,Override=1
- 更新地址 → STALE
- 未来流量触发验证
注意: 此状态机旨在在及时检测不可达邻居与稳定、可达邻居的最小开销之间取得平衡。