跳到主要内容

附录 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. 可达性确认

可达性通过以下方式确认:

  1. 收到 solicited Neighbor Advertisement
  2. 上层协议指示 (例如 TCP ACK)
  3. 收到 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. 成功地址解析

  1. 创建处于 INCOMPLETE 状态的条目
  2. 发送 Neighbor Solicitation
  3. 收到 Neighbor Advertisement -> REACHABLE
  4. ReachableTime 之后 -> STALE
  5. 发送流量 -> DELAY
  6. 上层确认可达性 -> REACHABLE

C.6.2. 邻居变为不可达

  1. 条目处于 REACHABLE 状态
  2. ReachableTime 到期 -> STALE
  3. 发送流量 -> DELAY
  4. 没有可达性确认 -> PROBE
  5. 发送单播探测 (x3)
  6. 没有响应 -> 删除条目

C.6.3. 链路层地址变化

  1. 条目处于 REACHABLE/STALE 状态
  2. 收到带有新地址的 unsolicited NA, Override=1
  3. 更新地址 -> STALE
  4. 未来流量触发验证

注: 该状态机旨在平衡两个目标: 及时检测不可达邻居, 同时对稳定且可达的邻居保持最小开销.