付録 C. 到達可能性状態のステートマシン (State Machine for the Reachability State)
この付録では、本仕様で定義されている近隣キャッシュの到達可能性状態の状態マシン図と詳細な説明を提供します。
C.1. 概要 (Overview)
近隣の近隣キャッシュエントリは、ノードが近隣の到達可能性について学習し検証する際に、いくつかの状態を遷移します。これらの状態は:
- INCOMPLETE(不完全): アドレス解決が進行中
- REACHABLE(到達可能): 順方向および逆方向のパスが機能している
- STALE(古い): 情報は古いが使用可能
- DELAY(遅延): 到達可能性の検証を待機中
- PROBE(プローブ): 到達可能性を積極的にプローブ中
C.2. 状態遷移図 (State Transition Diagram)
INCOMPLETE
|
| アドレス解決完了
v
REACHABLE
|
| 到達可能性タイムアウト
v
STALE
|
| トラフィック送信
v
DELAY
|
| プローブタイマー満了
v
PROBE
|
+------------+------------+
| |
到達可能性確認済み 最大再試行到達
| |
v v
REACHABLE (削除)
C.3. 状態の説明 (State Descriptions)
C.3.1. INCOMPLETE 状態
エントリ条件 (Entry Conditions):
- アドレス解決が必要な場合に近隣キャッシュエントリが作成される
- リンク層アドレスがまだ不明
アクション (Actions):
- マルチキャスト近隣要請を送信
- 再送信タイマーを開始
- アドレス解決待ちのパケットをキューに入れる
終了条件 (Exit Conditions):
- REACHABLE へ: リンク層アドレスを含む近隣通知を受信
- (削除へ): 応答なしで最大再送信数に到達
タイマー (Timers):
- 再送信タイマー: RETRANS_TIMER(通常1000ms)
- 最大再試行: MAX_MULTICAST_SOLICIT(通常3)
C.3.2. REACHABLE 状態
エントリ条件 (Entry Conditions):
- アドレス解決が正常に完了、または
- 到達可能性確認を受信(要請された近隣通知、上位層の確認)
アクション (Actions):
- 通常のパケット転送
- プローブ不要
- トラフィックが正常に流れる
終了条件 (Exit Conditions):
- STALE へ: 到達可能性確認なしで ReachableTime が満了
タイマー (Timers):
- ReachableTime: BaseReachableTime に基づくランダム化された値(通常15-45秒)
C.3.3. STALE 状態
エントリ条件 (Entry Conditions):
- REACHABLE 状態で ReachableTime が満了、または
- リンク層アドレスを更新する未要請の近隣通知を受信、または
- 受信した近隣探索メッセージによってエントリが作成された(要請された NA ではない)
アクション (Actions):
- キャッシュされたリンク層アドレスを使用
- プローブを送信しない
- 情報が古い可能性があると見なす
終了条件 (Exit Conditions):
- DELAY へ: 上位層プロトコルがこの近隣にトラフィックを送信
- REACHABLE へ: 到達可能性を確認する要請された近隣通知を受信
タイマー (Timers):
- なし(STALE 状態に無期限に留まることができる)
C.3.4. DELAY 状態
エントリ条件 (Entry Conditions):
- STALE 状態の近隣にトラフィックを送信
アクション (Actions):
- 上位層の到達可能性確認を待つ
- まだプローブを送信しない(上位層が確認する時間を与える)
- キャッシュされたリンク層アドレスを引き続き使用
終了条件 (Exit Conditions):
- REACHABLE へ: 上位層プロトコルによって到達可能性が確認される
- PROBE へ: 到達可能性確認なしで遅延タイマーが満了
タイマー (Timers):
- 遅延タイマー: DELAY_FIRST_PROBE_TIME(通常5秒)
C.3.5. PROBE 状態
エントリ条件 (Entry Conditions):
- DELAY 状態で到達可能性確認なしで遅延タイマーが満了
アクション (Actions):
- ユニキャスト近隣要請プローブを送信
- キャッシュされたリンク層アドレスを引き続き使用
- 応答がない場合はプローブを再送信
終了条件 (Exit Conditions):
- REACHABLE へ: 要請された近隣通知を受信
- (削除へ): 応答なしで最大ユニキャスト要請を送信
タイマー (Timers):
- 再送信タイマー: RETRANS_TIMER(通常1000ms)
- 最大再試行: MAX_UNICAST_SOLICIT(通常3)
C.4. イベントとトリガー (Events and Triggers)
C.4.1. 到達可能性の確認 (Reachability Confirmations)
到達可能性は以下によって確認されます:
- 要請された近隣通知の受信
- 上位層プロトコルの指示(例:TCP ACK)
- Solicited フラグが設定された近隣探索メッセージの受信
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
- 将来のトラフィックが検証をトリガー
注記: この状態マシンは、安定した到達可能な近隣に対する最小限のオーバーヘッドで、到達不能な近隣の迅速な検出のバランスを取るように設計されています。