OSPFの収束タイマー(SPF / LSAスロットル)
リンクが落ちたりコストが変わったりすると、OSPFのルータはLSAを作り直し、それを受け取ったルータがSPFで経路を計算し直します。変化が1回なら、すぐに作り直してすぐに計算するほど早く収束します。しかしリンクが断続的に切れる状況では、変化のたびに作り直しと計算を繰り返すとCPUが追いつかず、かえって全体が落ち着きません。
そこでOSPFの実装は、LSAの作り直しとSPFの実行をわざと少し遅らせ、変化が続くほど遅らせる時間を伸ばします。この記事では、その遅らせ方をRFCとCiscoの説明で整理し、IOS XRの実機でミリ秒単位の時刻から確かめます。
LSAの周期的な作り直し(1800秒)と寿命はOSPFのLSAとLSAヘッダーで解説しています。
RFC 2328が決めていること
RFC 2328は、LSAの作り直しと受け取りに固定の下限を設けています。Section 12.4はLSAの生成についてこう書いています。
同じLSAの2つのインスタンスを、MinLSIntervalの時間内に生成してはならない。そのため、次のインスタンスの生成を最大でMinLSIntervalだけ遅らせる必要があることがある。
同じ節は、新しいLSAを作るのは中身が変わるときだけとしています。待っている間に変化が行って戻り、前に送ったLSAと中身が同じになった場合、新しいLSAは作られません。
受け取る側の下限はSection 13の(5)(a)です。
すでにデータベースにコピーがあり、そのコピーがフラッディングで受け取られてからMinLSArrival秒未満しか経っていなければ、新しいLSAを(確認応答を返さずに)破棄する。
確認応答が返らないので、送った側はそのLSAを再送します。この判定はフラッディングで受け取ったLSAにだけ行い、自分が作ったLSAには行いません(Appendix G.2)。
一方、SPFをいつ走らせるかについて、RFC 2328はタイマーを定めていません。SPFの遅らせ方は実装とRFC 8405の領域です。
RFC 2328の値とIOS XRの既定値を並べると次のとおりです。IOS XRの値はshow ospfで確認できます。
| 項目 | RFC 2328 | IOS XRの既定 | 設定コマンド |
|---|---|---|---|
| 同じLSAを作り直す最小の間隔 | MinLSInterval 5秒 | 200ミリ秒 | timers throttle lsa all |
| 同じLSAを受け取る最小の間隔 | MinLSArrival 1秒 | 100ミリ秒 | timers lsa min-arrival |
| LSA生成の遅らせ方 | 規定なし | 初期50 / 最小200 / 最大5000ミリ秒 | timers throttle lsa all |
| SPFの遅らせ方 | 規定なし | 初期50 / 最小200 / 最大5000ミリ秒 | timers throttle spf |
show ospfのMinimum LSA intervalは、LSAスロットルの2番目の値(hold)と同じ値を表示します。この記事の検証でも、holdを2000ミリ秒にするとMinimum LSA interval 2000 msecsに変わります。
Ciscoの指数バックオフ
IOS XRのtimers throttle spf(SPF)とtimers throttle lsa all(LSA生成)は、3つの値で遅らせ方を決めます。
| 値 | 意味 |
|---|---|
| start | 静かな状態でイベントが起きてから、SPF / LSA生成までの待ち |
| hold | 続けてイベントが起きたときの待ち。回を追うごとに倍になる |
| max-wait | 待ちの上限 |
CiscoのOSPF Shortest Path First Throttlingの設定ガイドは、倍になる条件と上限に達した後をこう説明しています。
SPFの計算の間の待ちは、前の待ちの間に少なくとも1つのトポロジー変更のイベントを受け取ると、倍になる。
最大の待ち時間に達すると、トポロジーが安定し、その待ちの間にイベントを受け取らなくなるまで、待ちは同じまま続く。
たとえばtimers throttle spf 1000 2000 16000なら、イベントが続く限り待ちは1秒、2秒、4秒、8秒、16秒と伸びて16秒で止まります。ここで押さえておく点が3つあります。
- 待ちの起点は前回のSPF(LSA生成)であって、イベントの時刻ではありません。そのため、実際に走る時刻は「前回の計算+待ち」と「イベント+start」の遅いほうになります
- 待っている間に届いたイベントは、次の1回にまとめて反映されます。10回の変化が3回のSPFになる、といったことが普通に起きます
- 上限に達した後、その待ちの時間だけイベントが無ければ、待ちはstartに戻ります。「静かになったら元に戻る」という条件がこれです
送る側と受け取る側の両方に待ちがあるため、観測される間隔は、送る側のLSA生成の待ちと受け取る側のSPFの待ちのうち、長いほうで決まります。既定値どうしで両者が同じ値なら、先に効くのは送る側です。
既定値の50 / 200 / 5000ミリ秒と、受け取りの最小の間隔100ミリ秒は、Ciscoの既定値変更の案内がIOSの既定値をこの値に揃えたうえで「IOS XRの既定値と同じ」と述べている値です。
RFC 8405の遅らせ方
倍々に伸ばすやり方は、実装ごとに違う動きになります。これを揃えるためにRFC 8405が定義されました。倍々ではなく、最初の変化からの経過時間で待ちを切り替えるのが特徴です。
| パラメータ | 推奨の既定 | 意味 |
|---|---|---|
| INITIAL_SPF_DELAY | 50ミリ秒 | 静かな状態で最初の変化が来たときの待ち |
| SHORT_SPF_DELAY | 200ミリ秒 | 最初の変化から間もない間の待ち |
| LONG_SPF_DELAY | 5000ミリ秒 | 変化が続いている間の待ち |
| TIME_TO_LEARN | 500ミリ秒 | 同じ障害に由来する情報が出そろうまでの見込み時間 |
| HOLDDOWN | 10000ミリ秒 | 静かな状態に戻ったと判断するまでの時間 |
IOS XRのOSPFには、RFC 8405方式を選ぶ設定がありません。timers throttle spfが取るのは数値3つだけで、spf配下にも該当する選択肢はありません(設定モードの?で確認しました)。IS-ISにはspf-interval ietfがありますが、OSPFには無いということです。そのため以下の検証は、Ciscoの指数バックオフの動きを確かめるものになります。
実機での検証
検証環境
IOS XR(XRd 26.1.1)3台を一直線につなぎ、すべてエリア0に入れます。ルータ間はネットワークタイプをpoint-to-pointにし、コストは10で揃えています。
| ルータ | ルータID | 役割 |
|---|---|---|
| R1 | 1.1.1.1 | 観測点。SPFの待ちとMinLSArrivalを見る。timers throttle spfとtimers lsa min-arrivalを変えるのはR1だけ |
| R2 | 2.2.2.2 | イベント役。R3向けインタフェースのコストを変えてLSAを作り直させる。timers throttle lsa allを変えるのはR2だけ |
| R3 | 3.3.3.3 | R2の先。R1から見た3.3.3.3/32のコストがイベントのたびに変わる |
イベント1回は、R2にSSHで入ってcostを変えてcommitするまでです。設定モードに入ったままcostとcommitだけを繰り返すことで、約1.8秒おきに変化を起こしています。時刻はすべてルータ側のtraceとsyslogのミリ秒で、キャプチャーはR1 - R2間で取りました。
検証のSTEP
| STEP | 操作 | 確かめること |
|---|---|---|
| 0 | 既定値のまま(設定変更なし) | show ospfの既定値と、R1からR3への疎通 |
| 1 | 既定値のまま約1.8秒おきに12回のイベント | 既定の50 / 200 / 5000ミリ秒でも待ちが倍々に伸び、5000ミリ秒で頭打ちになる |
| 2 | R1にtimers throttle spf 1000 2000 16000。約1.8秒おき10回 → 24秒おき3回 → 40秒おき2回 |
SPFの待ちが1 → 2 → 4 → 8 → 16秒と伸びて止まり、静かになるとstartに戻る |
| 3 | R1を既定に戻し、R2にtimers throttle lsa all 1000 2000 16000。同じ間隔でイベント |
LSA生成の待ちも同じ形で伸び、静かになると戻る |
| 4 | R2はそのまま。コストを20と10で往復させて約1.8秒おきに10回 | 待ちの間に中身が元へ戻ると、新しいLSAが作られない |
| 5 | R2を既定に戻し、R1にtimers lsa min-arrival 3000。約1.8秒おき10回 |
3秒以内に届いた新しいLSAを、確認応答を返さずに捨てる |
| 6 | R1はそのまま。イベントを2回だけ起こして静かにする | 捨てられたLSAが送り側から再送され、受け入れられる |
| 7 | R1にtimers throttle spf、R2にtimers throttle lsa allを同時に入れ、約1.8秒おき30回 |
両方の待ちが足し算になる。LSA生成側も上限のまま続く |
| 8 | すべて既定に戻す(最終状態) | show ospfとrouter ospfの設定がSTEP 0と一致する |
STEP 0:既定値を確かめる
R1のshow ospfです。SPFとLSAスロットルがどちらも50 / 200 / 5000ミリ秒、Minimum LSA arrivalが100ミリ秒で、RFC 2328の5秒・1秒より桁違いに短い値が既定になっています。
Initial SPF schedule delay 50 msecs
Minimum hold time between two consecutive SPFs 200 msecs
Maximum wait time between two consecutive SPFs 5000 msecs
Initial LSA throttle delay 50 msecs
Minimum hold time for LSA throttle 200 msecs
Maximum wait time for LSA throttle 5000 msecs
Minimum LSA interval 200 msecs. Minimum LSA arrival 100 msecs
LSA refresh interval 1800 seconds
Flood pacing interval 33 msecs. Retransmission pacing interval 66 msecsSTEP 1:既定値のまま約1.8秒おきに12回
既定値のままイベントを12回起こします。R1のSPFの実行時刻です。
238 Sep 16 11:33:21.575 ospf_run_spf: Begin SPF
269 Sep 16 11:33:23.576 ospf_run_spf: Begin SPF
300 Sep 16 11:33:25.377 ospf_run_spf: Begin SPF
331 Sep 16 11:33:27.178 ospf_run_spf: Begin SPF
362 Sep 16 11:33:28.951 ospf_run_spf: Begin SPF
393 Sep 16 11:33:32.153 ospf_run_spf: Begin SPF
424 Sep 16 11:33:37.154 ospf_run_spf: Begin SPF
455 Sep 16 11:33:42.155 ospf_run_spf: Begin SPF間隔を並べると、待ちが伸びていく様子が読めます。
| R1のSPF(UTC) | 前回のSPFから |
|---|---|
| 11:33:21.575 | — |
| 11:33:23.576 | 2000ミリ秒 |
| 11:33:25.377 | 1801ミリ秒 |
| 11:33:27.178 | 1801ミリ秒 |
| 11:33:28.951 | 1773ミリ秒 |
| 11:33:32.153 | 3202ミリ秒 |
| 11:33:37.154 | 5001ミリ秒 |
| 11:33:42.155 | 5001ミリ秒 |
待ちが200 → 400 → 800 → 1600ミリ秒と伸びている間は、どれもイベントの間隔(約1.8秒)より短いので、間隔はイベントのほうで決まります。待ちが3200ミリ秒になった時点でイベントの間隔を追い越し、そこからは待ちそのものが間隔になり、上限の5000ミリ秒で頭打ちになりました。12回の変化が8回のSPFにまとまっています。
同じ時刻をR2側で見ると、LSAを作った時刻がR1のSPFとほぼ同じ間隔で並びます。
72 Sep 16 11:33:21.497 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x80000005 vrfid 0x60000000
73 Sep 16 11:33:23.476 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x80000006 vrfid 0x60000000
74 Sep 16 11:33:25.321 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x80000007 vrfid 0x60000000
75 Sep 16 11:33:27.122 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x80000008 vrfid 0x60000000
76 Sep 16 11:33:28.894 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x80000009 vrfid 0x60000000
77 Sep 16 11:33:32.095 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x8000000a vrfid 0x60000000
78 Sep 16 11:33:37.096 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x8000000b vrfid 0x60000000
79 Sep 16 11:33:42.095 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x8000000c vrfid 0x60000000R1のSPFはLSAの到着から50〜78ミリ秒後に走っており、この条件で見えている間隔は、送る側のLSA生成の待ちのほうです。受け取る側のSPFの待ちを見るには、次のSTEPのようにR1側を長くします。
STEP 2:SPFの待ちを1000 / 2000 / 16000ミリ秒にする
R1だけ設定を変えます。
RP/0/RP0/CPU0:R1#show configuration commit changes last 1
Wed Sep 16 11:39:59.786 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
router ospf 1
timers throttle spf 1000 2000 16000
!
end Initial SPF schedule delay 1000 msecs
Minimum hold time between two consecutive SPFs 2000 msecs
Maximum wait time between two consecutive SPFs 16000 msecsこの状態で、約1.8秒おきに10回 → 24秒おきに3回 → 40秒おきに2回とイベントの間隔を広げます。
486 Sep 16 11:40:47.626 ospf_run_spf: Begin SPF
517 Sep 16 11:40:49.626 ospf_run_spf: Begin SPF
548 Sep 16 11:40:53.627 ospf_run_spf: Begin SPF
579 Sep 16 11:41:01.628 ospf_run_spf: Begin SPF
610 Sep 16 11:41:17.629 ospf_run_spf: Begin SPF
641 Sep 16 11:41:33.630 ospf_run_spf: Begin SPF
672 Sep 16 11:41:58.225 ospf_run_spf: Begin SPF
703 Sep 16 11:42:22.926 ospf_run_spf: Begin SPF
734 Sep 16 11:43:10.426 ospf_run_spf: Begin SPF
765 Sep 16 11:43:51.227 ospf_run_spf: Begin SPFR1がLSAをデータベースに入れた時刻と突き合わせると、次のようになります。
| R1がLSAを入れた時刻 | R1のSPF | 前回のSPFから | 読み取り |
|---|---|---|---|
| 11:40:46.625 | 11:40:47.626 | — | start 1000(入れてから1001ミリ秒後) |
| 48.427 | 11:40:49.626 | 2000ミリ秒 | hold 2000 |
| 50.125 / 51.726 / 53.526 | 11:40:53.627 | 4001ミリ秒 | 待ちの間の3本が1回にまとまった |
| 56.725 | 11:41:01.628 | 8001ミリ秒 | — |
| 11:41:01.725 | 11:41:17.629 | 16001ミリ秒 | 上限に到達 |
| 06.725 / 32.586 | 11:41:33.630 | 16001ミリ秒 | 2本目は前回のSPFの14.96秒後に到着したので上限のまま |
| 11:41:57.224 | 11:41:58.225 | 24595ミリ秒 | 前回のSPFの23.59秒後に到着したのでstartに戻り、1001ミリ秒後に実行 |
| 11:42:21.926 | 11:42:22.926 | 24701ミリ秒 | start |
| 11:43:09.426 | 11:43:10.426 | 47500ミリ秒 | start |
| 11:43:50.226 | 11:43:51.227 | 40801ミリ秒 | start |
1 → 2 → 4 → 8 → 16秒と倍々に伸びて上限で止まること、上限に達した後も待ちの中に次が来る限り上限のままであること、上限の時間だけ何も来なければstartに戻ることが、同じ表の中に出ています。戻る境目は上限の16秒で、14.96秒後の到着では戻らず、23.59秒後では戻りました。
STEP 3:LSA生成の待ちを1000 / 2000 / 16000ミリ秒にする
R1を既定に戻し、今度はR2のLSA生成を長くします。
RP/0/RP0/CPU0:R2#show configuration commit changes last 1
Wed Sep 16 11:51:24.226 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
router ospf 1
timers throttle lsa all 1000 2000 16000
!
end Initial LSA throttle delay 1000 msecs
Minimum hold time for LSA throttle 2000 msecs
Maximum wait time for LSA throttle 16000 msecs
Minimum LSA interval 2000 msecs. Minimum LSA arrival 100 msecsMinimum LSA intervalがholdと同じ2000ミリ秒に変わっています。この状態で同じようにイベントを起こすと、LSAを作る間隔が伸びます。
93 Sep 16 11:52:12.249 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x8000001a vrfid 0x60000000
94 Sep 16 11:52:14.249 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x8000001b vrfid 0x60000000
95 Sep 16 11:52:18.250 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x8000001c vrfid 0x60000000
96 Sep 16 11:52:26.250 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x8000001d vrfid 0x60000000
97 Sep 16 11:52:42.250 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x8000001e vrfid 0x60000000
98 Sep 16 11:53:01.952 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x8000001f vrfid 0x60000000
99 Sep 16 11:53:26.738 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x80000020 vrfid 0x60000000
100 Sep 16 11:54:14.345 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x80000021 vrfid 0x60000000
101 Sep 16 11:54:55.222 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x80000022 vrfid 0x60000000| R2のイベント | R2がLSAを作った時刻 | イベントから | 前回の生成から |
|---|---|---|---|
| 11:52:11.246 | 11:52:12.249 | 1003ミリ秒 | — |
| 12.939 | 11:52:14.249 | 1310ミリ秒 | 2000ミリ秒 |
| 14.625 | 11:52:18.250 | 3625ミリ秒 | 4001ミリ秒 |
| 18.460 | 11:52:26.250 | 7790ミリ秒 | 8000ミリ秒 |
| 20.439〜29.949の6回 | 11:52:42.250 | 14114ミリ秒 | 16000ミリ秒 |
| 11:53:00.949 | 11:53:01.952 | 1003ミリ秒 | 19702ミリ秒 |
SPFと同じ形で伸び、上限に達しました。2行目はイベントから1310ミリ秒後・前回の生成から2000ミリ秒後で、待ちの起点が前回の生成であることがそのまま出ています。最後の行は、前回の生成から18.7秒イベントが無かったのでstartに戻り、イベントの1003ミリ秒後に作られました。15回の変化が9本のLSAにまとまっています。
STEP 4:待ちの間にコストが元に戻ると、LSAは作られない
R2の設定はそのままで、コストを20と10で往復させます。待っている間に中身が元へ戻るため、作り直す時点では前に送ったLSAと同じ内容になります。
102 Sep 16 12:01:25.953 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x80000023 vrfid 0x60000000
103 Sep 16 12:01:28.141 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x80000024 vrfid 0x60000000
104 Sep 16 12:01:36.142 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x80000025 vrfid 0x60000000
105 Sep 16 12:01:52.142 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x80000026 vrfid 0x6000000010回のイベントに対して、作られたLSAは4本だけです。作らなかった回はtraceにそのまま残ります。
137 Sep 16 12:01:32.141 ospf_build_rtr_lsa: no change in router LSA, area 0.0.0.0 rtrid 2.2.2.2 instance 0x60000000 db_nsf_active 012:01:28.141に作った0x80000024の後、12:01:32.141の作り直しはno change in router LSAとなり、LSAは流れませんでした。中身が変わるときだけ新しいLSAを作るというRFC 2328 Section 12.4の規定どおりです。キャプチャーにもこの時刻のLSUはありません。
STEP 5:MinLSArrivalを3000ミリ秒にする
R2を既定に戻し、R1の受け取り側の下限を3000ミリ秒にします。既定は100ミリ秒ですが、それより短い間隔でLSAを届けることは送る側の下限(既定200ミリ秒)に阻まれてできないため、実際に捨てる様子を見るには受け取り側を広げます。
RP/0/RP0/CPU0:R1#show configuration commit changes last 1
Wed Sep 16 12:08:57.065 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
router ospf 1
timers lsa min-arrival 3000
!
end Minimum LSA interval 200 msecs. Minimum LSA arrival 3000 msecsR2は約1.8秒おきに8本のLSAを作りました。
106 Sep 16 12:09:43.201 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x80000027 vrfid 0x60000000
107 Sep 16 12:09:44.976 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x80000028 vrfid 0x60000000
108 Sep 16 12:09:46.711 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x80000029 vrfid 0x60000000
109 Sep 16 12:09:48.501 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x8000002a vrfid 0x60000000
110 Sep 16 12:09:50.388 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x8000002b vrfid 0x60000000
111 Sep 16 12:09:53.589 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x8000002c vrfid 0x60000000
112 Sep 16 12:09:58.589 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x8000002d vrfid 0x60000000
113 Sep 16 12:10:03.589 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x8000002e vrfid 0x60000000R1がデータベースに入れたのは、このうち6本だけです。
258 Sep 16 12:09:46.725 db_install: FC: LSA_CHG: Changed Rtr LSA: ar 0.0.0.0 lsid 2.2.2.2 advrtr 2.2.2.2 seq 0x80000029
259 Sep 16 12:09:46.725 db_install: FC: SCHED_SPF: ar 0.0.0.0 type 1 lsid 2.2.2.2 advrtr 2.2.2.2
264 Sep 16 12:09:50.393 db_install: FC: LSA_CHG: Changed Rtr LSA: ar 0.0.0.0 lsid 2.2.2.2 advrtr 2.2.2.2 seq 0x8000002b
265 Sep 16 12:09:50.393 db_install: FC: SCHED_SPF: ar 0.0.0.0 type 1 lsid 2.2.2.2 advrtr 2.2.2.2
270 Sep 16 12:09:53.592 db_install: FC: LSA_CHG: Changed Rtr LSA: ar 0.0.0.0 lsid 2.2.2.2 advrtr 2.2.2.2 seq 0x8000002c
271 Sep 16 12:09:53.592 db_install: FC: SCHED_SPF: ar 0.0.0.0 type 1 lsid 2.2.2.2 advrtr 2.2.2.2
276 Sep 16 12:09:58.594 db_install: FC: LSA_CHG: Changed Rtr LSA: ar 0.0.0.0 lsid 2.2.2.2 advrtr 2.2.2.2 seq 0x8000002d
277 Sep 16 12:09:58.594 db_install: FC: SCHED_SPF: ar 0.0.0.0 type 1 lsid 2.2.2.2 advrtr 2.2.2.2
282 Sep 16 12:10:03.593 db_install: FC: LSA_CHG: Changed Rtr LSA: ar 0.0.0.0 lsid 2.2.2.2 advrtr 2.2.2.2 seq 0x8000002e
283 Sep 16 12:10:03.593 db_install: FC: SCHED_SPF: ar 0.0.0.0 type 1 lsid 2.2.2.2 advrtr 2.2.2.2| R2が作ったLSA | R1に届いた時刻 | R1の処理 | 前回の登録から |
|---|---|---|---|
| 0x80000027 | 21:09:43.223 | 登録 → SPF → 確認応答 | — |
| 0x28 | 45.023 | 捨てた | 1.80秒 |
| 0x29 | 46.722 | 登録 → SPF → 確認応答 | 3.499秒 |
| 0x2a | 48.522 | 捨てた | 1.80秒 |
| 0x2b | 50.390 | 登録 → SPF → 確認応答 | 3.668秒 |
| 0x2c | 53.590 | 登録 → SPF → 確認応答 | 3.199秒 |
| 0x2d | 58.591 | 登録 → SPF → 確認応答 | 5.002秒 |
| 0x2e | 21:10:03.591 | 登録 → SPF → 確認応答 | 4.999秒 |
登録から3秒以内に届いた0x28と0x2aは、データベースに入らず、SPFも走らず、確認応答も返っていません。キャプチャーで見ると、LSUが8本に対して確認応答は6本です。
13 56.147212 10.0.12.2 → 224.0.0.5 OSPF 146 LS Update
16 57.946875 10.0.12.2 → 224.0.0.5 OSPF 146 LS Update
17 58.152029 10.0.12.1 → 224.0.0.5 OSPF 78 LS Acknowledge
18 59.646385 10.0.12.2 → 224.0.0.5 OSPF 146 LS Update
19 61.446002 10.0.12.2 → 224.0.0.5 OSPF 146 LS Update
20 61.651004 10.0.12.1 → 224.0.0.5 OSPF 78 LS Acknowledge
21 63.314147 10.0.12.2 → 224.0.0.5 OSPF 146 LS Update
22 65.319472 10.0.12.1 → 224.0.0.5 OSPF 78 LS Acknowledge
25 66.514402 10.0.12.2 → 224.0.0.5 OSPF 146 LS Update
26 68.518464 10.0.12.1 → 224.0.0.5 OSPF 78 LS Acknowledge
27 71.515036 10.0.12.2 → 224.0.0.5 OSPF 146 LS Update
28 73.520027 10.0.12.1 → 224.0.0.5 OSPF 78 LS Acknowledge
31 76.514801 10.0.12.2 → 224.0.0.5 OSPF 146 LS Update
32 78.518679 10.0.12.1 → 224.0.0.5 OSPF 78 LS Acknowledge確認応答は、登録から約2005ミリ秒後にまとめて返っています(遅延確認応答)。
STEP 6:捨てられたLSAは再送される
STEP 5では捨てられたLSAの再送が起きませんでした。約1.8秒おきに次の版が作られるため、捨てられた版は再送タイマー(5秒)が切れる前に新しい版へ置き換わるからです。そこでR1の設定はそのままに、イベントを2回だけ起こして静かにします。
2 4.086032 10.0.12.2 → 224.0.0.5 OSPF 146 LS Update
4 5.984502 10.0.12.2 → 224.0.0.5 OSPF 146 LS Update
5 6.090964 10.0.12.1 → 224.0.0.5 OSPF 78 LS Acknowledge
7 10.856835 10.0.12.2 → 10.0.12.1 OSPF 146 LS Update
8 12.861767 10.0.12.1 → 224.0.0.5 OSPF 78 LS AcknowledgeNo.2とNo.4がR2の作った2本です。No.4は1.9秒後に届いたので捨てられ、確認応答が返っていません。No.7がその再送で、宛先はマルチキャスト(224.0.0.5)ではなく、R1へのユニキャスト(10.0.12.1) です。最初の送信から4.872秒後で、RxmtIntervalの5秒どおりです。
上のキャプチャーのパケット(No.7 再送のLS Update)のpcapをダウンロードR1側の記録です。0x80000031を12:21:37.227に入れた後、0x80000032が入ったのは再送が届いた12:21:43.998で、最初の登録から6.771秒後でした。
308 Sep 16 12:21:37.227 db_install: FC: LSA_CHG: Changed Rtr LSA: ar 0.0.0.0 lsid 2.2.2.2 advrtr 2.2.2.2 seq 0x80000031
309 Sep 16 12:21:37.227 db_install: FC: SCHED_SPF: ar 0.0.0.0 type 1 lsid 2.2.2.2 advrtr 2.2.2.2
314 Sep 16 12:21:43.998 db_install: FC: LSA_CHG: Changed Rtr LSA: ar 0.0.0.0 lsid 2.2.2.2 advrtr 2.2.2.2 seq 0x80000032
315 Sep 16 12:21:43.998 db_install: FC: SCHED_SPF: ar 0.0.0.0 type 1 lsid 2.2.2.2 advrtr 2.2.2.2確認応答が返らなければ送り直す、という流れが1本のキャプチャーに収まっています。
STEP 7:SPFとLSA生成の両方に待ちを入れる
実運用では両方に値を入れます。R1にSPFの待ち、R2にLSA生成の待ちを同時に設定し、約1.8秒おきに30回のイベントを起こしました。
RP/0/RP0/CPU0:R1#show configuration commit changes last 1
Wed Sep 16 12:27:23.959 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
router ospf 1
timers throttle spf 1000 2000 16000
no timers lsa min-arrival 3000
!
end118 Sep 16 12:28:17.923 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x80000033 vrfid 0x60000000
119 Sep 16 12:28:19.923 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x80000034 vrfid 0x60000000
120 Sep 16 12:28:23.923 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x80000035 vrfid 0x60000000
121 Sep 16 12:28:31.923 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x80000036 vrfid 0x60000000
122 Sep 16 12:28:47.924 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x80000037 vrfid 0x60000000
123 Sep 16 12:29:03.924 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x80000038 vrfid 0x60000000
124 Sep 16 12:29:19.925 ospf_build_rtr_lsa: area 0.0.0.0 rtrid 2.2.2.2 seq 0x80000039 vrfid 0x600000001511 Sep 16 12:28:18.927 ospf_run_spf: Begin SPF
1542 Sep 16 12:28:20.930 ospf_run_spf: Begin SPF
1573 Sep 16 12:28:24.930 ospf_run_spf: Begin SPF
1604 Sep 16 12:28:32.931 ospf_run_spf: Begin SPF
1637 Sep 16 12:28:48.932 ospf_run_spf: Begin SPF
1668 Sep 16 12:29:04.934 ospf_run_spf: Begin SPF
1699 Sep 16 12:29:20.934 ospf_run_spf: Begin SPF| R2がLSAを作った時刻 | 前回の生成から | R1のSPF | 登録からSPFまで |
|---|---|---|---|
| 12:28:17.923 | — | 12:28:18.927 | 1000ミリ秒 |
| 19.923 | 2000ミリ秒 | 20.930 | 1000ミリ秒 |
| 23.923 | 4000ミリ秒 | 24.930 | 1002ミリ秒 |
| 31.923 | 8000ミリ秒 | 32.931 | 1003ミリ秒 |
| 47.924 | 16001ミリ秒 | 48.932 | 1004ミリ秒 |
| 12:29:03.924 | 16000ミリ秒 | 12:29:04.934 | 1006ミリ秒 |
| 19.925 | 16001ミリ秒 | 20.934 | 1006ミリ秒 |
最初のイベント(12:28:16.856)からR1のSPF(12:28:18.927)までは2071ミリ秒で、内訳はR2側のstart 1000ミリ秒、伝播の数ミリ秒、R1側のstart 1000ミリ秒です。遅れは足し算になります。上限に達した後は、R2が16秒おきに作り、その約1秒後にR1が計算する形に落ち着きました。30回の変化が7本のLSAと7回のSPFにまとまっています。
STEP 8:すべて既定に戻す(最終状態)
R1とR2から設定を外します。
RP/0/RP0/CPU0:R1#show configuration commit changes last 1
Wed Sep 16 12:36:14.495 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
router ospf 1
no timers throttle spf 1000 2000 16000
!
end Initial SPF schedule delay 50 msecs
Minimum hold time between two consecutive SPFs 200 msecs
Maximum wait time between two consecutive SPFs 5000 msecs
Initial LSA throttle delay 50 msecs
Minimum hold time for LSA throttle 200 msecs
Maximum wait time for LSA throttle 5000 msecs
Minimum LSA interval 200 msecs. Minimum LSA arrival 100 msecs3台ともrouter ospf 1の設定がSTEP 0と一致し、R1からR3への疎通も全STEPで100パーセントでした。
検証Configおよびshow結果
各STEPで3台すべてから、次のファイルをルータごとに分けて取得しています。検証Configはこの..._run.txtです(最終状態は最後のSTEPのもの)。
| ファイル | 内容 |
|---|---|
..._show.txt |
show version / show interface description / show route / show route ospfと、show ospf系一式(interface / neighbor / neighbor detail / database / database router / database network / database router self-originate / database database-summary / statistics spf / statistics spf detail / statistics prot)、show route 3.3.3.3/32、show configuration commit list |
..._log.txt |
そのSTEPの範囲だけに絞ったshow logging。各STEPの開始時にlogmsgでマーカーを入れ、その時刻をshow logging startに指定して取得したもの。R2のcommitの時刻(%MGBL-CONFIG-6-DB_COMMIT)もここに残る |
..._run.txt |
そのSTEP時点のshow running-config(=そのSTEPの検証Config) |
..._trace.txt |
show ospf trace spf / adj_cycle / events / errorsと、show ospf trace allをrtr / db_install / arrivで絞ったもの |
..._ping.txt |
R1からping 3.3.3.3 / traceroute 3.3.3.3(送信元1.1.1.1、50発)。R2・R3には無い |
..._trigger.txt |
R2でイベントを起こしたSSHセッションの記録。イベントを起こしたSTEPだけにある(STEP 2と3は間隔を変えた分がb・cとして分かれている) |
..._commit.cfg |
そのSTEPでcommitされた設定(show configuration commit changes last 1)。設定を変えていないSTEPとルータには無い |
STEP 0:既定値のまま(設定変更なし)
| ルータ | show出力 | syslog | running-config | trace | ping | commit | イベント |
|---|---|---|---|---|---|---|---|
| R1 | show | log | run | trace | ping | — | — |
| R2 | show | log | run | trace | — | — | — |
| R3 | show | log | run | trace | — | — | — |
STEP 1:既定値のまま約1.8秒おきに12回のイベント
| ルータ | show出力 | syslog | running-config | trace | ping | commit | イベント |
|---|---|---|---|---|---|---|---|
| R1 | show | log | run | trace | ping | — | — |
| R2 | show | log | run | trace | — | — | trigger |
| R3 | show | log | run | trace | — | — | — |
STEP 2:R1にtimers throttle spf 1000 2000 16000
| ルータ | show出力 | syslog | running-config | trace | ping | commit | イベント |
|---|---|---|---|---|---|---|---|
| R1 | show | log | run | trace | ping | commit | — |
| R2 | show | log | run | trace | — | — | trigger / triggerb / triggerc |
| R3 | show | log | run | trace | — | — | — |
STEP 3:R1を既定に戻し、R2にtimers throttle lsa all 1000 2000 16000
| ルータ | show出力 | syslog | running-config | trace | ping | commit | イベント |
|---|---|---|---|---|---|---|---|
| R1 | show | log | run | trace | ping | commit | — |
| R2 | show | log | run | trace | — | commit | trigger / triggerb / triggerc |
| R3 | show | log | run | trace | — | — | — |
STEP 4:R2はそのまま。コストを20と10で往復
| ルータ | show出力 | syslog | running-config | trace | ping | commit | イベント |
|---|---|---|---|---|---|---|---|
| R1 | show | log | run | trace | ping | — | — |
| R2 | show | log | run | trace | — | — | trigger |
| R3 | show | log | run | trace | — | — | — |
STEP 5:R2を既定に戻し、R1にtimers lsa min-arrival 3000
| ルータ | show出力 | syslog | running-config | trace | ping | commit | イベント |
|---|---|---|---|---|---|---|---|
| R1 | show | log | run | trace | ping | commit | — |
| R2 | show | log | run | trace | — | commit | trigger |
| R3 | show | log | run | trace | — | — | — |
STEP 6:R1はそのまま。イベントを2回だけ起こして静かにする
| ルータ | show出力 | syslog | running-config | trace | ping | commit | イベント |
|---|---|---|---|---|---|---|---|
| R1 | show | log | run | trace | ping | — | — |
| R2 | show | log | run | trace | — | — | trigger |
| R3 | show | log | run | trace | — | — | — |
STEP 7:R1にSPF、R2にLSA生成の待ちを同時に入れて30回のイベント
| ルータ | show出力 | syslog | running-config | trace | ping | commit | イベント |
|---|---|---|---|---|---|---|---|
| R1 | show | log | run | trace | ping | commit | — |
| R2 | show | log | run | trace | — | commit | trigger |
| R3 | show | log | run | trace | — | — | — |
STEP 8:すべて既定に戻す(最終状態)
| ルータ | show出力 | syslog | running-config | trace | ping | commit | イベント |
|---|---|---|---|---|---|---|---|
| R1 | show | log | run | trace | ping | commit | — |
| R2 | show | log | run | trace | — | commit | — |
| R3 | show | log | run | trace | — | — | — |
パケットキャプチャーはSTEPごとにR1 - R2間で取得しています。
| STEP | R1-R2間 |
|---|---|
| 0 | pcap |
| 1 | pcap |
| 2 | pcap |
| 3 | pcap |
| 4 | pcap |
| 5 | pcap |
| 6 | pcap |
| 7 | pcap |
| 8 | pcap |
参考
| 標準・資料 | タイトル | 概要 |
|---|---|---|
| RFC 2328 | OSPF Version 2 | Section 12.4で同じLSAを作り直す最小間隔(MinLSInterval、5秒)と「中身が変わるときだけ作る」こと、Section 13の(5)(a) で受け取り側の最小間隔(MinLSArrival、1秒)と確認応答を返さずに捨てること、Appendix G.2でその判定がフラッディングで受け取ったLSAにだけ適用されることを定めている。SPFの待ちは定めていない。 |
| RFC 8405 | Shortest Path First (SPF) Back-Off Delay Algorithm for Link-State IGPs | 3節で5つのパラメータ、5節でQUIET / SHORT_WAIT / LONG_WAITの状態機械、6節で推奨の既定値を定めている。IOS XRのOSPFにはこの方式を選ぶ設定が無い。 |
| Cisco IP Routing: OSPF Configuration Guide, IOS XE Gibraltar 16.10.x | OSPF Shortest Path First Throttling | SPFの待ちが前の待ちの間にイベントを受け取ると倍になること、上限に達した後は静かになるまで同じ待ちが続くことを説明している(IOS XE向け)。 |
| Cisco: Change of Default OSPF and IS-IS SPF and Flooding Timers | Document ID 211432 | IOSのOSPFのSPFスロットル・LSAスロットル・LSA arrivalの既定値を50 / 200 / 5000ミリ秒と100ミリ秒に変え、IOS XRの既定値と揃えたことを説明している。 |
関連記事
- OSPFとは
- OSPFのルータID
- OSPFパケットの種類とヘッダーフォーマット
- OSPFの認証
- OSPFの状態遷移
- OSPF Optionsフィールド
- OSPFのDRとBDR
- OSPF ネットワークタイプ
- OSPFのコスト(メトリック)
- OSPFの外部経路(スタティックの再配布)
- OSPFのマルチエリアとABR
- OSPFのバーチャルリンク
- OSPFのスタブエリアとトータリースタブエリア
- OSPFのNSSAとトータリーNSSA
- OSPFのデフォルトルート
- OSPFの経路集約
- OSPFのLSAとLSAヘッダー
- OSPFの収束タイマー(SPF / LSAスロットル)
- OSPFのRouter-LSA(Type 1)
- OSPFのNetwork-LSA(Type 2)
- OSPFのSummary-LSA(Type 3)
- OSPFのASBR Summary-LSA(Type 4)
- OSPFのAS External-LSA(Type 5)
- OSPFのNSSA External-LSA(Type 7)