要約

  • IPv6 の Neighbor Unreachability Detection は、到達性を「最近得た肯定的証拠」に基づく判断とした。証拠が古くなると REACHABLE は STALE へ移るが、未使用なら削除も探索も起きない。
  • STALE を使った最初の送信は DELAY を開き、上位層の前進を待つ。それでも確認できない時に PROBE が始まり、RFC 7048 はさらに UNREACHABLE と指数バックオフを導入して、代替経路の選択と唯一の経路の放棄を切り分けた。

古い記録と壊れた経路は同義ではなかった

近隣キャッシュには、IPv6 アドレスとリンク層アドレスの対応が残っている。少し前まで通信は成功していたが、その後はパケットが流れていない。この時点で分かるのは、最後の確認が古いということだけだ。相手が停止したとも、MAC アドレスが変わったとも分からない。

1996 年の RFC 1970 は、この曖昧さを STALE という状態にした。RFC 2461 を経て RFC 4861 に受け継がれた定義では、最後の肯定的確認から ReachableTime を超えたことを表す。STALE の間は、パケットを送るまで何もしない。

使われない古いエントリーは、正しさの観点ではキャッシュに残り続けてもよい。メモリー不足による回収は別の判断である。定期的に全てを消せば、必要のないマルチキャスト解決を増やすだけで、経路の真実性は高まらない。

到着した広告は往路の証明にならない

NUD が知りたいのは、自分から隣接ノードへ向かう経路が最近機能したかどうかである。Router Advertisement が届いても、分かるのはルーターから自分への方向だ。要求していない Neighbor Advertisement も同じで、送信側から見た往路を証明しない。

そこで仕様は、肯定的確認を二つに絞った。一つは自分の Neighbor Solicitation に応答した solicited Neighbor Advertisement である。問い合わせが相手に届き、応答が戻ったので、往復の事実がそろう。もう一つは、上位層が示す通信の前進である。

TCP なら、新しい ACK は先に送ったデータが対向に届いたことを示す。新しい非重複データの到着も、それ以前の ACK が対向へ届いたことを示し得る。宛先がリンク外なら、その進展は第一ホップのルーターが最近パケットを運んだ証拠にもなる。一方、UDP や単に転送するルーターは同じ手掛かりを持たないため、明示的な探索が必要になる。

ただし、これは認証ではない。アプリケーションの健全性、将来の可用性、相手の所有権まで証明しない。キャッシュした次ホップを再利用してよいという、局所的な判断だけを支える。

通常の通信が先に答える五秒間

STALE エントリーで最初のパケットを送ると、保存済みのリンク層アドレスを使ったまま DELAY に移る。既定値は五秒である。

DELAY は障害対応を遅らせるためだけの待ち時間ではない。休止後に TCP 接続が始まれば、ハンドシェイクがすぐ前進の証拠を返すかもしれない。その場合、エントリーは REACHABLE に戻り、Neighbor Solicitation は不要になる。

五秒を過ぎても確認がなければ、単一宛先の Neighbor Solicitation を送り PROBE に入る。リンク層の対応は既に分かっているので、まずユニキャストでその経路を確かめる。誰が現在のアドレスを持つのかを改めて探すマルチキャスト解決とは、質問が違う。

時間は信頼度を下げるだけで、使用が疑問を現実の課題にする。DELAY は業務通信の証拠を待ち、PROBE はそれでも足りない場合にだけ制御トラフィックを発生させる。この順序が、静かなキャッシュ全体ではなく稼働中の集合へコストを集中させた。

到達可能時間は全端末共通の秒針ではない

RFC 4861 の標準定数は、基準到達可能時間 30 秒、再送 1 秒、最初の探索まで 5 秒、ユニキャスト探索 3 回である。しかし実際の ReachableTime は基準値の 0.5 倍から 1.5 倍の間で無作為に選ぶ。Router Advertisement が基準値と再送値を通知することもできる。

無作為化は、多数の端末が同じ瞬間に確認を失効させて探索を同期するのを防ぐ。したがって「30 秒で死亡」という読み方は最初から成り立たない。

さらに、RA がタイマーを変更できることと、RA の到着が到達性を証明することは別である。証拠の有効期間に影響する権限を持っても、その広告だけで自分を到達可能にする権限は得られない。

三回の素早い探索が早すぎる場面

RFC 4861 の当初の状態機械では、PROBE 中に RetransTimer 間隔でユニキャスト探索を繰り返し、上限まで応答がなければエントリーを削除した。既定では一秒間隔の三回である。次の通信は別のルーターを選ぶか、マルチキャストによるアドレス解決へ戻る。

代替ルーターがあるなら迅速さは利点になる。だが、唯一の次ホップしかなく、レイヤー 2 の一時障害が数秒を超える場合、削除しても代替経路は生まれない。対象を絞った探索がマルチキャストへ変わり、回復中のリンクへ追加負荷を与える。

RFC 6583 は制御面で起きる悪循環を説明した。広大な IPv6 サブネットで存在しない宛先の解決要求が増えると、NDP が既存エントリーの維持や探索への応答を処理できなくなる。使用中のエントリーが消え、マルチキャスト解決が増え、既存フローまで止まる。だから、未知の宛先を新規解決する仕事より、現に使われる宛先の NUD を優先すべきだとした。

2014 年の RFC 7048 は、NUD を「性急すぎる」と評価した。更新では概念状態 UNREACHABLE を設けた。通常のしきい値を超えたエントリーは、次ホップ選択上「到達可能と分かっている」対象ではなくなる。そのため代替ルーターを試せる。一方、リンク層アドレスは保持でき、必要ならパケットを送り続け、探索間隔を指数的に延ばせる。

相手のリンク層アドレス変更を見つけるため、やがて探索はマルチキャストへ切り替える。エントリーを使うパケットがなければ探索を止めてもよい。RFC の例は 1、4、13、40 秒に再試行し、最大間隔の例を 60 秒としたが、これは実装例であって現在の製品調査ではない。

UNREACHABLE は優先順位を変えても回復を捨てない

新しい状態が分離したのは、「別の次ホップを優先するか」と「この隣接ノードへの回復を断念するか」である。冗長なルーターがあれば前者は速くてよい。唯一の出口なら、後者はスパニングツリーの収束や無線の瞬断を待つ余地が必要だ。

指数バックオフは、回復可能性を残しながら一定間隔の負荷を抑える。肯定的証拠の定義は変えていない。上位層の進展または solicited 応答だけが REACHABLE を回復し、未要求の広告は依然として証明にならない。

DAD とはメッセージが同じでも審査対象が違う

RFC 4862 の Duplicate Address Detection も Neighbor Solicitation と Advertisement を使う。DAD はユニキャストアドレスを割り当てる前に、tentative な候補を他のノードが使用していないか調べる。NUD は既に利用中の隣接ノードについて、キャッシュした経路が今も前進するかを調べる。

DAD の限られた沈黙はアドレスの使用開始を許す。NUD の沈黙は証拠を古くするだけで、その後の使用が DELAY と PROBE を起動する。同じ ICMPv6 メッセージでも、証明範囲は交換できない。

情報源と証拠の限界

歴史と状態は RFC 197024614861 に基づく。RFC 4862 は DAD との境界、RFC 6583 は運用負荷、RFC 7048 は回復規則の更新を示す。これらは現行製品の既定値、普及率、キャッシュ容量、障害率、特定ネットワークの準拠を証明しない。