要約

  • RFC 2174 は、小規模な MAPOS スイッチ群で距離ベクトル型ユニキャスト経路と、一つの仮想送信元を根とするブロードキャスト/マルチキャスト木を組み合わせた。
  • MAPOS フレームには送信元アドレスと TTL がなく、一時的なループに入ると実際の起点を確認できず、フレーム自身も寿命を尽くせなかった。
  • そのため、経路、VSS、16 未満のメトリック、立ったビットはいずれも制御面の局所状態であり、安全な転送や配送完了の証明ではなかった。

まず木を作り、すぐには使わない

SSP では、各スイッチが既定で十秒ごとに完全な経路表を隣接スイッチへ送った。受け取ったメトリックにリンクコストを加え、より小さな値の経路を採用し、その更新が来たポートを次ホップにする。障害やメトリック悪化を知れば、次の周期を待たず triggered update を出せた。

ここまでは「速く知らせる」設計である。ところがブロードキャスト側は、速く知ったからといって速く送らなかった。新しい下流ポートを認識したとき、FORWARD_DELAY_TIMER を開始し、既定で三十秒、すなわち完全更新三回分のあいだ、そのポートへのブロードキャストとマルチキャストを禁止した。

待機が必要だった理由はフレームにある。MAPOS の HDLC フレームは宛先を持つが送信元を持たない。受信スイッチは、実際の送信者を根にした逆方向検査を行えない。さらに TTL がない。収束途中の異なる木が循環路を作っても、フレーム内に周回を終わらせるカウンタがない。

だから SSP は、経路情報が先に動き、データの複製は後から動くようにした。沈黙は遅さではなく、整合しない木へ無制限寿命のフレームを入れないための状態だった。

実在しない送信元を一つだけ置く

送信元が見えない問題に対し、RFC 2174 は Virtual Reverse Path Broadcast を導入した。すべてのブロードキャストとマルチキャストが、特定の Virtual Source Switch の配下から生まれたと仮定する。

VSS は、到達可能な経路の中でスイッチ番号が最小のものだった。各スイッチは自分のユニキャスト表から独立に VSS を見つけ、そこへの最短逆経路を計算する。根でないスイッチには一つの上流ポートと、ゼロ個以上の下流ポートがある。ネットワーク全体では、一時点につき一つの木だけを使う。

この規則は全員参加の選挙ではない。同じアルゴリズムを使っても、更新が届く時刻は同じではない。あるスイッチが新しい最小番号を見つけた時、別のスイッチは旧経路を保持しているかもしれない。VSS は局所表から得た選択であり、全スイッチが同時に同じ状態になったという受領証ではない。

新しい VSS の発見、または現 VSS の到達不能は、ブロードキャスト/マルチキャスト表全体を無効にした。単一の下流変更は他の枝を必ずしも壊さない。根の変更と枝の変更で影響範囲を分けていたのである。

ビットは命令であって、配送記録ではない

転送表はポートごとのビットマップだった。ビットが一なら、そのポートからローカルノード、上流、または下流へフレームを出す。ビットが一つも立っていなければ、フレームは黙って捨てられる。

だが、一という値は結果を語らない。光路が送信したか、隣のスイッチが受信したか、隣が同じ VSS を見ているか、終端ノードがペイロードを受け入れたかは分からない。forward delay 中は、ビットに対応する関係が分かっていても転送許可はまだない。

ビットの根拠も一種類ではない。NSP のアドレス要求はローカルノード接続の手掛かりになる。VSS への次ホップが上流を決める。あるポートから poisoned reverse が来れば、その先のスイッチが自分を根への経路として使っている、すなわち下流だと推定する。

新しい下流では forward delay が有効化を待たせる一方、別の三十秒タイマーが関係の継続を監視する。poisoned reverse が続けば PORT_EXPIRATION_TIMER は更新され、途絶えればビットが消える。以前の下流から通常更新が来れば、そのスイッチは別経路か別 VSS を選んだと考え、直ちにビットを消す。

同じ一ビットにも、候補、待機中、有効、更新済み、無効、消去済みという履歴がある。最終値だけを保存すれば、なぜ転送したかを説明できない。

16 は不達を表すが、原因までは表さない

現在の隣から三十秒間更新がなければ、経路はメトリック 16、すなわち到達不能になる。隣が 16 を広告した場合も同じである。ただし行はすぐ消えない。さらに三十秒残り、到達不能という情報を周囲へ知らせてからガベージコレクションされる。

背景にある RFC 1058 の RIP は、距離ベクトルが古い信念を引きずり、無限大へ数え上げる問題を説明していた。poisoned reverse は特定のループを速く切り、triggered update は悪い知らせを速く運ぶ。それでも更新は分散して届き、周期更新と交差し得る。送信したという事実は収束完了ではない。

経路期限、ガベージコレクション、forward delay、ポート期限は別々の主張である。古い経路を使用停止する時刻、死亡を伝えるために保持する期間、新しい枝をまだ使わない期間、下流証拠を待てる期間を一つの「タイムアウト」にまとめてはならない。

受信できる黒穴

実装上の注意には、片方向故障がある。ポートは受信できても送信できない場合がある。SSP 更新は到着し続け、表は新鮮に見えるが、自分が出すフレームは黒穴へ落ちる。

SONET/SDH のオーバーヘッドで遠端から送信路の状態を返せる場合もあったが、必要な透明性を提供しないサービスもあると文書は述べる。受信した制御情報は一方向の到着証拠であり、双方向データ経路の証明ではない。

RFC 2174 は Informational で、IETF ワーキンググループの成果でも Standards Track 文書でもない。少数スイッチを前提とし、普及状況、実測収束、相互運用率、実際のループ事故を報告していない。セキュリティ問題も議論していない。

それでも歴史的な境界は明確である。経路を知ること、木を選ぶこと、待機を終えること、フレームを届けることは別の出来事だった。RFC 2174 は、その間にある「まだ送らない」をプロトコルの一部として残した。

出典

  1. RFC 1058 — Routing Information Protocol
  2. RFC 2171 — MAPOS Version 1
  3. RFC 2173 — Node Switch Protocol
  4. RFC 2174 — Switch-Switch Protocol
  5. RFC 2176 — IPv4 over MAPOS Version 1