要約

  • 従来の HoldTimer が測るのは、隣接者から適格な BGP メッセージを最後に受け取った時刻である。逆方向の UPDATE、撤回、KEEPALIVE がすべて詰まっていても更新され続ける場合がある。
  • RFC 9687 は局所設定の SendHoldTimer を追加する。設定時間に BGP メッセージを一つも送信できなければ、理由を記録し、BGP 資源と TCP を解放して Idle に戻る。
  • 安全な導入には、生成・送信進捗・相手の処理・実転送を分けた証拠、ネゴシエートした HoldTime より長い値、再接続の反復を抑える設計が必要である。

境界ルータは障害経路の撤回を生成し、代替経路を選んだ。ところが相手は三十秒ごとに KEEPALIVE を送り続けるため、通常の HoldTimer は切れない。相手の BGP プロセスは受信ストリームを読まず、ローカル送信キューだけが伸びる。最後に相手へ届いた古い広告が、最新の判断より長く効力を持つ。

問題は経路選択ではない。選んだ事実を共有できないのに、セッション状態だけが共有を装うことにある。

一本の TCP 接続に二つの状態がある

TCP は双方向のバイトストリームだが、両方向の進捗を同時には保証しない。RFC 9687 の代表例は、相手の受信ウィンドウがゼロになる状況である。相手はローカル側へ BGP を送信し続けられる一方、こちらからのバイトは受け入れない。過負荷、読み取りスレッドの停止、内部キュー障害も同じ非対称性を作る。

RFC 4271 の HoldTimer は受信側の証拠である。UPDATE や KEEPALIVE が届くと再始動する。それは相手が何かを送った証明だが、こちらの撤回を相手が処理した証明ではない。UPDATE の生成は送信ではなく、カーネルバッファへの書き込みは遠端の読み取りではなく、TCP Established は BGP アプリケーションの健全性ではない。

撤回が詰まれば、相手は既に無効な経路へトラフィックを送る。したがって重要なのは最後の受信時刻だけでなく、最後に BGP メッセージを送信できた時刻である。

RFC 9687 が閉鎖判断を局所化する

RFC 9687 は SendHoldTimeSendHoldTimer、イベント 29 SendHoldTimer_Expires を状態機械に加える。SendHoldTime はピアごとの局所方針で、能力としてネゴシエートしない。相手が機能を知らなくても、送信不能を観測した側が自分のセッションを守れる。

OpenConfirm から Established に入る際、値がゼロでなければタイマーを開始する。BGP メッセージを正常に送信するたびに再始動し、Established を離れると停止する。SendHoldTime またはネゴシエートされた HoldTime がゼロの場合も停止する。非ゼロの SendHoldTime は HoldTime より大きくなければならない。

RFC は既定での有効化を推奨し、八分と HoldTime の二倍の大きい方を既定値として示す。しかしこれは全ピア共通の正解ではない。ルートサーバ、リフレクタ、トランジット、資源の乏しい装置では負荷とリセット費用が異なる。

満了時には Send Hold Timer Expired を記録し、BGP 資源を解放し、TCP を切断し、再試行状態を更新して Idle に移る。NOTIFICATION は終了処理を遅らせない場合にだけ試せる。IANA のエラーコードは 8、サブコードは 0 である。まさに送信不能が原因なので、遠端の受信記録ではなくローカル記録が一次証拠になる。

異なる検出器の不一致を残す

HoldTimer は BGP 受信、SendHoldTimer は BGP 送信進捗、BFD は転送経路の連続性、TCP の再送や keepalive は輸送状態を問う。BFD と TCP が正常で、入ってくる KEEPALIVE が HoldTimer を更新していても、SendHoldTimer は満了できる。

この不一致が診断である。監視は、ローカル受信、ローカル送信、遠端の経路処理、データ面転送を別々に保存すべきだ。SendHoldTimer はすべての BGP ゾンビや古い経路を検出せず、転送障害も証明しない。持続的な送信不能に待機上限を与えるだけである。

修復リセットには副作用がある

セッションを落とせば、学習経路が無効になり、最良経路再計算、FIB 更新、代替広告が走る。再接続ではフルテーブル転送も起こり得る。多数のピアを持つリフレクタやルートサーバで同時満了が起きれば、収束波になる。

値が短すぎると、一時的なスケジューリング遅延やバックプレッシャーを不要な切断へ変える。相手の読み取り能力が戻らなければ、再接続とフルテーブルがさらに負荷を加え、リセットが周期化する。長すぎれば、古い経路の権限が延命する。

HoldTime の制約に加え、実測したキュー遅延、保守停止、UPDATE バースト、CPU、経路量、再試行費用で値を決める。ピア種別ごとに余裕を変えるべきだ。振動抑制は再試行を遅らせられるが、容量不足や停止した読み取りを直さない。

正しいカナリアは下位経路を残す

インターフェースを抜く試験では BFD や HoldTimer が先に働く。必要なのは、転送経路と入ってくる BGP を維持しながら、遠端の受信処理だけを制御して止める試験である。

BIRD 3.3.0 は試験用 disable rx を説明し、本番利用を明確に警告する。隔離ラボでこれを使うなら、事前にビルド、HoldTime、SendHoldTime、タイマーと通常キューを記録する。障害中は KEEPALIVE の継続、最後の送信時刻の停止、送信キューまたはゼロウィンドウ、制御された撤回の滞留を証明する。

満了時に原因、時刻、NOTIFICATION の試行、TCP 閉鎖、Idle 遷移を取得する。解除後は再接続ループがなく、経路、FIB、実パケットが回復したことを確認する。FRRouting の対応一覧や BIRD の設定項目は製品の主張であり、展開中のバイナリの挙動は実験で確かめる。

切断権限と証拠の所有者を一致させる

重要な相互接続を切る主体は、最後に生成したメッセージ、最後の成功送信、キューの年齢と深さ、TCP ウィンドウ、再送、受信時刻、タイマー履歴、最終理由を保持すべきだ。どの撤回が止まり、相手の古い見え方が何分続き、復旧後どう収束したかも必要である。

情報はデーモン、OS、コレクタ、相手のポータル、NOC に分散する。実務上のデータ主権とは、それらを結合し、保存し、判断に使えることだ。証拠なき権限は恣意的で、権限なき証拠は経路を直せない。