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

IS-ISのリンク障害と経路切り替え

目次

IS-ISのリンク障害と経路切り替え

リンクステート型のルーティングプロトコルは、経路が1本使えなくなっても、別の経路があれば通信を続けられます。 IS-ISでは次の順に進みます。

  1. 障害に気づく
  2. 気づいたルータが自分のLSPを作り直して配る
  3. LSPを受け取った各ルータがSPFを計算し直す
  4. 新しい結果が転送テーブル(FIB)に入る

このうち1の「気づく」が最も時間を使います。IS-ISには気づき方が3通りあり、どれで気づくかによって 通信の止まる時間が0.14秒から28秒まで変わります。この記事では、同じ構成で障害の起こし方だけを変えて、 その差をIOS XRの実機で測ります。

気づき方きっかけ速さ
インタフェースのダウン自分のポートのリンクが落ちる最も速い
LSPの到着障害に気づいた相手のLSPが、別の経路を回って届く速い
Holding Timeの満了相手のIIHが届かなくなってから、規定の時間が過ぎる最も遅い(既定30秒)

Holding Timeそのものの決まり方はIS-ISのHelloとHolding Time、 SPFやLSP生成の待ち時間はIS-ISの収束タイマーで解説しています。

実機での検証

検証環境

検証構成: R1 と R6 の間に、上段と下段の独立した2経路

Cisco IOS XR(XRd 26.1.1)6台です。R1とR6の間に独立した2本の経路を用意しました。 上段(R1-R2-R3-R6)が合計30、下段(R1-R4-R5-R6)が合計60なので、通常は上段を通ります。

上段が使えなくなると中間のホップがR2・R3からR4・R5へまるごと入れ替わるので、 切り替わりがtracerouteで一目で分かります。全台が同じエリア49.0001のレベル2のみ、全リンクはpoint-to-pointです。

測定は障害を起こす前からpingを流し続けて行います。ping 6.6.6.6 source 1.1.1.1 count 600 interval 100 timeout 1 をR1とR6の両方から流し、落ちた発数で通信の止まっていた時間を求めます。応答が返らない発はtimeout 1の 1秒を待ってから次へ進むため、落ちた発数がほぼそのまま秒数になります。

検証のSTEP

STEP操作確かめること
0初期状態上段を通ること
1CMLのリンクを停止リンクが「切れた」ときの挙動
2リンクを復旧戻るときの挙動
3両端でshutdown両方のルータが自分でリンクの異常を知る場合
4shutdownを解除復旧
5片側だけshutdown落とされた側だけが知っている場合
6shutdownを解除復旧
7R2をノードごと停止装置が丸ごと落ちる場合
8R2を起動(最終状態)復旧

通常の経路(STEP 0)

R1からR6へは上段を通り、メトリックは30です。

STEP 0:R1のtracerouteと経路
RP/0/RP0/CPU0:R1#traceroute 6.6.6.6 source 1.1.1.1 timeout 1 probe 2 maxttl 6

Type escape sequence to abort.
Tracing the route to 6.6.6.6

 1  10.0.12.2 10 msec  5 msec 
 2  10.0.23.3 11 msec  8 msec 
 3  10.0.36.6 23 msec  * 
RP/0/RP0/CPU0:R1#show route isis
i L2 6.6.6.6/32 [115/30] via 10.0.12.2, 00:01:50, GigabitEthernet0/0/0/0

気づき方①:インタフェースのダウン(STEP 3)

R1とR2の両方でshutdownすると、両方のルータが自分のポートの異常として即座に知ります。 syslogの理由はInterface state downです。

STEP 3:R1のsyslog
RP/0/RP0/CPU0:Sep 23 22:28:13.138 UTC: isis[1003]: %ROUTING-ISIS-5-ADJCHANGE : ISIS (1): Adjacency to R2 (GigabitEthernet0/0/0/0) (L2) Down, Interface state down 

600発のpingのうち落ちたのは1発だけでした。キャプチャーの時刻で測ると、上段に最後のパケットが流れてから 下段に最初のパケットが流れるまで0.14秒です。

STEP 3:R1からR6へのping(600発)
Type escape sequence to abort.
Sending 600, 100-byte ICMP Echos to 6.6.6.6 timeout is 1 seconds:
Success rate is 99 percent (599/600), round-trip min/avg/max = 8/14/174 ms

経路は下段(メトリック60)に移ります。

STEP 3:R1の経路
i L2 6.6.6.6/32 [115/60] via 10.0.14.4, 00:01:24, GigabitEthernet0/0/0/1

気づき方②:LSPの到着(STEP 5)

R2側だけをshutdownすると、知っているのはR2だけです。R1のインタフェースは落ちません。

それでも、落ちた発数は1発(0.14秒ではなく1.00秒)でした。R1はHolding Timeを待っていません。

理由はR2が作り直したLSPが、別の経路を回ってR1に届くからです。R2はR3へLSPを送り、それがR6・R5・R4を 経由してR1に届きます。R1はそのLSPでSPFを回し直し、上段が使えないことを知ります。

このとき、R1の隣接はまだUpのままです。隣接が落ちるのはHolding Timeが切れた後で、時刻を並べると はっきり分かります。

時刻(UTC)出来事
22:35:56.437R2がInterface state downで隣接を落とす(落とした側)
22:35:57.45下段に最初のパケットが流れる(=R1の転送が切り替わった)
22:36:23.728R1がHoldtime expiredで隣接を落とす(26.3秒後)
STEP 5:R1のsyslog(26秒後にようやく隣接が落ちる)
RP/0/RP0/CPU0:Sep 23 22:36:23.728 UTC: isis[1003]: %ROUTING-ISIS-5-ADJCHANGE : ISIS (1): Adjacency to R2 (GigabitEthernet0/0/0/0) (L2) Down, Holdtime expired 

隣接が落ちることと、経路が切り替わることは別です。転送はLSPが届いた時点で切り替わります。 ただしこれは迂回経路があるからで、2台を結ぶ線が1本しかない構成では、LSPを運ぶ道もないため Holding Timeを待つことになります。

気づき方③:Holding Timeの満了(STEP 1・7)

リンクが物理的に切れていなくても、フレームが流れなくなる障害があります。片側の光が出ていない、 途中のスイッチが黙って捨てている、といった場合です。このときルータのインタフェースはupのままなので、 IIHが届かなくなってHolding Timeが切れるまで気づけません。

CMLでリンクを停止すると、まさにこの状態になります。XRdのインタフェースはupのままで、 syslogの理由はHoldtime expiredです。

STEP 1:R1のsyslog(CMLでリンクを停止)
RP/0/RP0/CPU0:Sep 23 22:20:29.445 UTC: isis[1003]: %ROUTING-ISIS-5-ADJCHANGE : ISIS (1): Adjacency to R2 (GigabitEthernet0/0/0/0) (L2) Down, Holdtime expired 

落ちた発数は28発、つまり約28秒の断です。既定のHolding Time(30秒)から、最後に届いたIIHからの 経過分を引いた値になります。

STEP 1:R1からR6へのping(600発中28発が落ちた)
Type escape sequence to abort.
Sending 600, 100-byte ICMP Echos to 6.6.6.6 timeout is 1 seconds:
!!!!!!!!!!!!!!!!!!............................!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 95 percent (572/600), round-trip min/avg/max = 9/13/66 ms

R2を装置ごと停止したSTEP 7も同じ28発でした。装置が消えてもリンクダウンとしては伝わらないため、 両隣のR1とR3はHolding Timeで気づきます。

障害の起こし方による違い

障害の起こし方ごとの、気づき方と断の長さ
STEP障害の起こし方落ちた発数断の長さ気づいた理由
3両端でshutdown1 / 6000.14秒Interface state down
5片側だけshutdown1 / 6001.00秒相手のLSPが迂回して届いた
1CMLのリンクを停止28 / 600約28秒Holdtime expired
7R2をノードごと停止28 / 600約28秒Holdtime expired

R1 → R6 と R6 → R1 で値は同じでした。復旧の操作(STEP 2・4・6)はいずれも600発すべて成功で、 上段へ戻るときにパケットは落ちていません。

数十秒の断が許されない設計では、Holding Timeに頼らない検知が要ります。Helloの間隔を詰める方法は IS-ISのHelloとHolding Timeで、ミリ秒単位で検知するBFDは IS-ISとBFDによる障害検知で扱います。

設計上の注意

  • リンクが落ちない障害がある。インタフェースがupのままフレームだけが失われる状態では、 IS-ISはHolding Timeが切れるまで気づけません。既定では30秒近く止まります
  • 検証環境で「ケーブルを抜いた」つもりの操作が、そうなっていないことがある。 CMLでリンクを停止してもXRdのインタフェースはupのままで、実際にはHolding Time待ちの試験になります
  • 隣接がUpであることは、その経路が使われていることを意味しません。STEP 5では、隣接がUpのまま 転送だけが迂回に移りました

検証Configおよびshow結果

各STEPで6台すべてから取得しています。検証Configはこの..._run.txtです(最終状態は最後のSTEPのもの)。

ファイル内容
..._show.txtshow version / show route isis / show isis interface / show isis neighbors detail / show isis topology / show isis database detail / show isis spf-log / show isis lsp-log / show isis adjacency-log ほか
..._ping.txtR1とR6から流した600発のping(障害の前から流し続けたもの)
..._clear.txtそのSTEPでクリアしたインタフェースカウンタの記録
..._log.txtそのSTEPの範囲だけに絞ったshow logging
..._run.txtそのSTEP時点のshow running-config(=そのSTEPの検証Config)
..._commit.cfgそのSTEPで実際にcommitされた設定だけ
..._trace.txtshow isis trace。トレースバッファは起動時から累積するので、最後のSTEP 8のものが全STEPぶんを含んでいる(STEP 8の6台分だけを添付)

STEP 0:初期状態

ルータshow出力pingclear投入した設定syslogrunning-config
R1showpingclear—logrun
R2show—clear—logrun
R3show—clear—logrun
R4show—clear—logrun
R5show—clear—logrun
R6showpingclear—logrun

STEP 1:CMLのリンクを停止

ルータshow出力pingclear投入した設定syslogrunning-config
R1showpingclear—logrun
R2show—clear—logrun
R3show—clear—logrun
R4show—clear—logrun
R5show—clear—logrun
R6showpingclear—logrun

STEP 2:リンクを復旧

ルータshow出力pingclear投入した設定syslogrunning-config
R1showpingclear—logrun
R2show—clear—logrun
R3show—clear—logrun
R4show—clear—logrun
R5show—clear—logrun
R6showpingclear—logrun

STEP 3:両端でshutdown

ルータshow出力pingclear投入した設定syslogrunning-config
R1showpingclearcommitlogrun
R2show—clearcommitlogrun
R3show—clear—logrun
R4show—clear—logrun
R5show—clear—logrun
R6showpingclear—logrun

STEP 4:shutdownを解除

ルータshow出力pingclear投入した設定syslogrunning-config
R1showpingclearcommitlogrun
R2show—clearcommitlogrun
R3show—clear—logrun
R4show—clear—logrun
R5show—clear—logrun
R6showpingclear—logrun

STEP 5:片側だけshutdown

ルータshow出力pingclear投入した設定syslogrunning-config
R1showpingclear—logrun
R2show—clearcommitlogrun
R3show—clear—logrun
R4show—clear—logrun
R5show—clear—logrun
R6showpingclear—logrun

STEP 6:shutdownを解除

ルータshow出力pingclear投入した設定syslogrunning-config
R1showpingclear—logrun
R2show—clearcommitlogrun
R3show—clear—logrun
R4show—clear—logrun
R5show—clear—logrun
R6showpingclear—logrun

STEP 7:R2をノードごと停止

ルータshow出力pingclear投入した設定syslogrunning-config
R1showpingclear—logrun
R2——————
R3show—clear—logrun
R4show—clear—logrun
R5show—clear—logrun
R6showpingclear—logrun

STEP 8:R2を起動(最終状態)

ルータshow出力pingclear投入した設定syslogrunning-configtrace
R1showpingclear—logruntrace
R2show—clear—logruntrace
R3show—clear—logruntrace
R4show—clear—logruntrace
R5show—clear—logruntrace
R6showpingclear—logruntrace

パケットキャプチャーはSTEPごとに取得しています(R1-R2は停止した区間なので、STEP 1・7では回収できていません)。

STEPR1-R2間R1-R4間
0pcappcap
1—pcap
2—pcap
3pcappcap
4pcappcap
5pcappcap
6pcappcap
7—pcap
8—pcap

参考

標準タイトル概要
ISO/IEC 10589:2002(第2版)Intermediate System to Intermediate System intra-domain routeing information exchange protocol隣接の保持(holdingTimer)と、隣接が落ちたときにLSPを作り直す手順を定めている。本記事が参照したのは8.2節(隣接の維持)と7.3節(LSPの生成とフラッディング)。
RFC 5303Three-Way Handshake for IS-IS Point-to-Point Adjacenciesポイントツーポイントの3ウェイハンドシェイク。片側だけが落ちた状態を検出する仕組み。

関連記事