メインコンテンツへスキップ
  1. ネットワーク 記事一覧/
  2. OSPF記事一覧/

OSPFの収束タイマー(SPF / LSAスロットル)

目次

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 ospfMinimum 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 spftimers 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 ospfrouter ospfの設定がSTEP 0と一致する

STEP 0:既定値を確かめる

R1のshow ospfです。SPFとLSAスロットルがどちらも50 / 200 / 5000ミリ秒、Minimum LSA arrivalが100ミリ秒で、RFC 2328の5秒・1秒より桁違いに短い値が既定になっています。

STEP 0 R1 の show ospf(タイマーの行)
 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 msecs

STEP 1:既定値のまま約1.8秒おきに12回

既定値のままイベントを12回起こします。R1のSPFの実行時刻です。

STEP 1 R1 の SPF 実行(show ospf trace 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とほぼ同じ間隔で並びます。

STEP 1 R2 の Router-LSA 生成(show ospf trace all の抜粋)
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 0x60000000

R1のSPFはLSAの到着から50〜78ミリ秒後に走っており、この条件で見えている間隔は、送る側のLSA生成の待ちのほうです。受け取る側のSPFの待ちを見るには、次のSTEPのようにR1側を長くします。

STEP 2:SPFの待ちを1000 / 2000 / 16000ミリ秒にする

R1だけ設定を変えます。

STEP 2 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
STEP 2 R1 の show ospf(SPF の行)
 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回とイベントの間隔を広げます。

STEP 2 R1 の SPF 実行(show ospf trace spf の抜粋)
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 SPF

R1が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生成を長くします。

STEP 3 R2 に投入した設定
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
STEP 3 R2 の show ospf(LSA スロットルの行)
 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 msecs

Minimum LSA intervalがholdと同じ2000ミリ秒に変わっています。この状態で同じようにイベントを起こすと、LSAを作る間隔が伸びます。

STEP 3 R2 の Router-LSA 生成(show ospf trace all の抜粋)
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と同じ内容になります。

STEP 4 R2 が作った Router-LSA(show ospf trace all の抜粋)
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 0x60000000

10回のイベントに対して、作られたLSAは4本だけです。作らなかった回はtraceにそのまま残ります。

STEP 4 R2 の作り直しが見送られた記録
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 0

12: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ミリ秒)に阻まれてできないため、実際に捨てる様子を見るには受け取り側を広げます

STEP 5 R1 に投入した設定
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
STEP 5 R1 の show ospf(LSA の受け取りの行)
 Minimum LSA interval 200 msecs. Minimum LSA arrival 3000 msecs

R2は約1.8秒おきに8本のLSAを作りました。

STEP 5 R2 が作った Router-LSA(show ospf trace all の抜粋)
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 0x60000000

R1がデータベースに入れたのは、このうち6本だけです。

STEP 5 R1 のデータベース登録(show ospf trace all の抜粋)
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本です。

STEP 5 R1 - R2 間の LS Update と LS Acknowledge
   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回だけ起こして静かにします。

STEP 6 R1 - R2 間の LS Update と LS Acknowledge
    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 Acknowledge

No.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秒後でした。

STEP 6 R1 のデータベース登録(show ospf trace all の抜粋)
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回のイベントを起こしました。

STEP 7 R1 に投入した設定
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
!
end
STEP 7 R2 の Router-LSA 生成
118  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 0x60000000
STEP 7 R1 の SPF 実行
1511 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から設定を外します。

STEP 8 R1 に投入した設定
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
STEP 8 R1 の show ospf(既定値に戻ったところ)
 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

3台とも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/32show 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 allrtr / 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の既定値と揃えたことを説明している。

関連記事