DISと疑似ノード(Pseudonode)
ブロードキャストのセグメントに複数のルータがつながっているとき、IS-ISはその中から代表を1台選びます。これがDIS(Designated Intermediate System)です。OSPFのDRに相当する役割ですが、似ているのは名前と「代表を選ぶ」という発想だけで、中身はかなり違います。
DISが担う仕事の中心は、疑似ノード(Pseudonode)というLSDB上の架空のノードを代表して作ることです。本記事では、疑似ノードが何を解決しているのか、DISがどう選ばれるのか、そしてOSPFのDRとどこが違うのかを、実機で確かめながら見ていきます。
LAN IIHに載るPriorityとLAN IDというフィールドの位置づけはIS-ISパケットの種類とヘッダーフォーマットで解説しています。本記事では、それらを使ってDISがどう決まり、疑似ノードがどう作られるのかを扱います。
疑似ノードは何のためにあるのか
ブロードキャストのセグメントは、そこにいる全員が互いに直接届く場所です。これを素直にリンクステートで表現すると、n台のルータがフルメッシュでつながっていることになり、リンクの数は n(n−1)/2 本になります。4台なら6本、10台なら45本です。台数が増えると急激に膨らみます。
ISO/IEC 10589:2002の3.6.7は、これを避けるためにセグメントそのものを1つのノードとみなすと定めています。
ブロードキャストサブネットワークにn台の中間システムが接続されているとき、そのブロードキャストサブネットワーク自体が疑似ノードとみなされる。疑似ノードはn台のそれぞれにリンクを持ち、各ISは(他のIS全部への n−1 本ではなく)疑似ノードへの1本のリンクだけを持つ。
リンクの数が n(n−1)/2 から n本 に減ります。そして同規格7.2.3が、各ルータは疑似ノードへのリンクだけを報告し、疑似ノード自身のLSPはDISが代表して作ると定めています。
DISの本質的な仕事はこれです。「代表して喋る」のではなく、「LANという架空のノードのLSPを代筆する」役割だと捉えると、後の動作が理解しやすくなります。
疑似ノードLSPのメトリックは0
疑似ノードを導入すると、経路のコストを二重に数えてしまう危険が生まれます。R2からR3へ行くのに「R2→疑似ノード」と「疑似ノード→R3」の2本を通ることになるからです。
ISO/IEC 10589:2002はこれを、疑似ノードのLSPに載せるメトリックをすべて0にすることで解決しています。同規格7.2.3の脚注が理由を明記しています。
疑似ノードへのリンクによって既にメトリックが割り当てられているため、これらは0の値に設定される。疑似ノードLSPに0以外のメトリックを割り当てると、実際の値を倍にする効果を持つ。
つまりコストを払うのは「ルータ→疑似ノード」の向きだけで、「疑似ノード→ルータ」は無料です。この非対称な作りによって、ブロードキャストのセグメントを1ホップとして正しく数えられます。
DISの選出
選出規則はISO/IEC 10589:2002の8.4.5にあり、非常に短いものです。
LAN Designated Intermediate SystemはLAN上の特定の集合の中で優先度がもっとも高い中間システムであり、同点の場合は数値としてもっとも大きいMAC送信元SNPAアドレスによって決着する。
| 順序 | 条件 |
|---|---|
| 1 | 優先度がもっとも高いIS。IOS XRの既定値は64で、0〜127の範囲で設定できる |
| 2 | 同点ならSNPA(MACアドレス)が数値としてもっとも大きいIS |
加えて同規格は、Upの隣接が1つ以上あるまでは自分をDISと宣言してはならないとも定めています。受信できない故障を抱えた機器が、誰の声も聞こえないまま自分をDISだと思い込むのを防ぐための規定です。
レベル1とレベル2でDISは別々に選ばれます。同じLANの上で、レベル1のDISとレベル2のDISが別のルータになることがあり、その場合は疑似ノードも2つ立ちます。
OSPFのDRとの違い
名前は似ていますが、実際の設計はかなり違います。この3点を押さえておくと混乱しません。
| 観点 | OSPFのDR | IS-ISのDIS |
|---|---|---|
| バックアップ | BDRがいる。DR障害時に即座に昇格する | 存在しない。ISO/IEC 10589にバックアップDISという概念は無く、落ちたらその場で選び直す |
| 優先度を上げたとき | 奪わない(非プリエンプティブ)。既存のDRが残る | 奪う(プリエンプティブ)。8.4.5が「より優先度の高い中間システムがその機能を引き継いだため」辞任すると明記している |
| 隣接の張り方 | DR / BDRとだけ完全な隣接になる | 全員と隣接を張る。畳んでいるのはLSDBの表現だけで、隣接そのものは減らさない |
3つ目は誤解されやすいところです。疑似ノードはあくまでLSDB上の表現であって、IIHのやり取りや隣接の数を減らすものではありません。実機でも、4台のLANでは各ルータが3つの隣接を持ちます。
再選出が速いのは、IIHを送受信するたびに選出をやり直す(8.4.5)ためです。バックアップを事前に決めておく必要がないので、BDRのような仕組みが要りません。
実機での検証
検証環境
4台のルータを1つのブロードキャストセグメント(10.1.0.0/24)に接続しました。全台が同じエリア49.0001でlevel-1-2、LAN側インタフェースにpoint-to-pointは書いていません。
| ルータ | NET | SNPA(MACアドレス) |
|---|---|---|
| R1 | 49.0001.0010.0100.1001.00 | 5254.00a3.a6fa |
| R2 | 49.0001.0020.0200.2002.00 | 5254.0075.d9dc |
| R3 | 49.0001.0030.0300.3003.00 | 5254.003a.d413 |
| R4 | 49.0001.0040.0400.4004.00 | 5254.0089.cc01 |
優先度は全台が既定の64なので、SNPAがもっとも大きいR1がDISになるはずです。
検証のSTEP
| STEP | 操作 | 狙い |
|---|---|---|
| 0 | 初期状態 | DISの選出結果と疑似ノードLSPの中身 |
| 1 | R3の優先度を100にする | プリエンプション。MACが最小のR3がDISを奪えるか |
| 2 | R2の優先度をレベル2だけ110にする | レベル別のDIS。同じLANに疑似ノードが2つ立つか |
| 3 | R3のLANインタフェースをshutdown | 再選出。バックアップが無いことの確認 |
| 4 | 優先度とshutdownを元に戻す(最終状態) | 初期状態と同じ |
検証にはIOS XRの2つのコマンドが役立ちました。
| コマンド | 見えるもの |
|---|---|
show isis trace all | include ELECT | DIS_RUN_ELECTION / DIS_TRIGGER_ELECTION / DIS_ELECTION_RESULT_*。選出そのもの |
show isis trace all | include PSEUDO | LOCAL_PSEUDO_BUILD_START → LOCAL_PSEUDO_NARROW_LINK_ADD → LOCAL_PSEUDO_BUILD_END。疑似ノードLSPを組み立てる過程 |
show isis traceは重大度(all / detailed / only / severe / standard)で選ぶ形式で、allは4000行近くになるため装置側で| includeを付けて絞ります。なお| include DISは配布処理のDIST_に当たってしまうので使えません。
初期状態のDIS(STEP 0)
Level-1
Adjacency Count: 3
Adjacency Flaps: 0
LAN ID: R1.01
Priority (Local/DIS): 64/64
Next LAN IIH in: 1 s
LSP Pacing Interval: 33 ms
PSNP Entry Queue Size: 0
Hello Interval: 10 s
Hello Multiplier: 3
Level-2
Adjacency Count: 3
Adjacency Flaps: 0
LAN ID: R1.01
Priority (Local/DIS): 64/64LAN ID: R1.01がレベル1・レベル2とも同じで、R1が両レベルのDISになりました。優先度は全台64なので、SNPAがもっとも大きいR1が勝ったことになります。Priority (Local/DIS): 64/64は「自分の優先度/DISの優先度」で、どちらも64です。
Adjacency Count: 3にも注目してください。疑似ノードを使っていても隣接の数は減りません。4台のLANなので、各ルータは残り3台すべてと隣接を張っています。
疑似ノードLSPの中身
R1.01-00 0x00000008 0xb492 636 /* 0/0/0
Metric: 0 IS R4.00
Metric: 0 IS R3.00
Metric: 0 IS R2.00
Metric: 0 IS R1.00
R2.00-00 0x00000006 0x8090 619 /1200 0/0/0
Area Address: 49.0001
LSP MTU: 1492
NLPID: 0xcc
IP Address: 2.2.2.2
Hostname: R2
Metric: 0 IP 2.2.2.2/32
Metric: 10 IP 10.1.0.0/24
Metric: 10 IS R1.01前半が疑似ノードLSPR1.01-00です。LAN上の4台すべてを列挙していますが、メトリックはすべて0です。
後半はR2自身のLSPで、IS(中間システム)への参照はMetric: 10 IS R1.01の1行しかありません。R3やR4への直接のリンクは書かれていません。各ルータは疑似ノードへの1本だけを報告するという7.2.3の規定がそのまま出ています。
この2つを合わせると、R2からR3へのコストは 10(R2→疑似ノード)+ 0(疑似ノード→R3)= 10 になります。もし疑似ノードLSPのメトリックが10だったら20になり、実際の2倍を数えてしまう — 規格の脚注が言っているとおりです。
優先度でDISを奪う(STEP 1)
R3の優先度を100に上げます。R3は4台の中でもっともSNPAが小さいルータなので、優先度だけでDISを奪えるかどうかがはっきり分かります。
router isis 1
interface GigabitEthernet0/0/0/0
priority 100IS-IS 1 (Level-1) Link State Database
LSPID LSP Seq Num LSP Checksum LSP Holdtime/Rcvd ATT/P/OL
R1.00-00 * 0x00000007 0x24d2 1100 /* 0/0/0
R1.01-00 0x00000009 0x9aef 0 (1099)/* 0/0/0
R2.00-00 0x00000008 0xa228 1100 /1200 0/0/0
R3.00-00 0x00000007 0x257b 1099 /1200 0/0/0
R3.01-00 0x00000001 0x60a9 1099 /1200 0/0/0
R4.00-00 0x00000008 0xa3d0 1100 /1200 0/0/0旧DISの疑似ノードLSPR1.01-00はHoldtimeが0、つまりパージされています。代わりにR3.01-00がシーケンス番号0x00000001、すなわち生まれたばかりの状態で現れました。
これはISO/IEC 10589:2002の7.2.3が定める動作です。
中間システムがDIS を辞任するとき、その疑似ノードLSPのRemaining Lifetimeをゼロに設定してネットワーク全体のパージを開始しなければならない。
優先度が最小のMACを覆したこと、そしてDISの交代が疑似ノードLSPの作り直しを伴うことの両方が、この1画面で確認できます。
キャプチャで見る交代
No type LSP-ID life seq
23 L1 LSP 0010.0100.1001.01-00 0 0x00000008
24 L2 LSP 0010.0100.1001.01-00 0 0x00000008
...
41 L1 LSP 0030.0300.3003.01-00 1200 0x00000001
43 L2 LSP 0030.0300.3003.01-00 1199 0x000000010010.0100.1001.01-00がR1.01、0030.0300.3003.01-00がR3.01です。旧DISの疑似ノードがlife=0でパージされ、新DISの疑似ノードがseq=1で生まれるという流れがそのまま流れています。
ルータ自身が選出をやり直している
Sep 9 06:51:42.059 isis/1/det ... isis_dis_run_election:778 DIS_ELECTION_RESULT_DIS_EXISTS L1 Gi0/0/0/0
Sep 9 06:51:42.059 isis/1/det ... isis_dis_run_election:778 DIS_ELECTION_RESULT_DIS_EXISTS L2 Gi0/0/0/0
Sep 9 06:51:43.049 isis/1/det ... isis_dis_trigger_election:964 DIS_TRIGGER_ELECTION L1 Gi0/0/0/0 0030.0300.3003
Sep 9 06:51:43.049 isis/1/det ... isis_dis_trigger_election:964 DIS_TRIGGER_ELECTION L2 Gi0/0/0/0 0030.0300.3003DIS_TRIGGER_ELECTIONの末尾に0030.0300.3003(R3)が入っています。R3のIIHを受け取ったことが引き金になって、R1が選出をやり直したという記録です。R3でcommitしたのが06:51:41なので、わずか2秒後に反応しています。
新DISとなったR3側には、疑似ノードLSPを組み立てる過程が残っていました。
Sep 9 06:51:42.103 isis/1/lsp ... LOCAL_PSEUDO_BUILD_START L1 Gi0/0/0/0 Node Num: 1
Sep 9 06:51:42.103 isis/1/std ... LOCAL_PSEUDO_NARROW_LINK_ADD L1 Gi0/0/0/0 Node Num: 1 0030.0300.3003.00
Sep 9 06:51:42.103 isis/1/std ... LOCAL_PSEUDO_NARROW_LINK_ADD L1 Gi0/0/0/0 Node Num: 1 0010.0100.1001.00
Sep 9 06:51:42.103 isis/1/std ... LOCAL_PSEUDO_NARROW_LINK_ADD L1 Gi0/0/0/0 Node Num: 1 0020.0200.2002.00
Sep 9 06:51:42.103 isis/1/std ... LOCAL_PSEUDO_NARROW_LINK_ADD L1 Gi0/0/0/0 Node Num: 1 0040.0400.4004.00
Sep 9 06:51:42.103 isis/1/lsp ... LOCAL_PSEUDO_BUILD_END L1 Gi0/0/0/0 Node Num: 1 1BUILD_STARTのあとにNARROW_LINK_ADDが4回(自分を含むLAN上の4台)並び、BUILD_ENDで締めています。疑似ノードLSPが「LAN上の全員へのリンク」として組み立てられていく様子が、そのまま記録されています。
レベルごとに別のDIS(STEP 2)
IOS XRでは優先度をレベル別に設定できます。R2のレベル2だけを110に上げます。
router isis 1
interface GigabitEthernet0/0/0/0
priority 110 level 2 Level-1
Adjacency Count: 3
Adjacency Flaps: 0
LAN ID: R3.01
Priority (Local/DIS): 64/100
Level-2
Adjacency Count: 3
Adjacency Flaps: 0
LAN ID: R2.01
Priority (Local/DIS): 64/110レベル1のDISはR3(優先度100)、レベル2のDISはR2(優先度110)に分かれました。Priority (Local/DIS)の右側が、それぞれのレベルのDISの優先度を示しています。
LSDBを見ると、同じLANに疑似ノードが2つ立っていることが分かります。
IS-IS 1 (Level-1) Link State Database
LSPID LSP Seq Num LSP Checksum LSP Holdtime/Rcvd ATT/P/OL
R1.00-00 * 0x00000007 0x24d2 839 /* 0/0/0
R1.01-00 0x00000009 0x9aef 0 (838)/* 0/0/0
R2.00-00 0x00000008 0xa228 839 /1200 0/0/0
R3.00-00 0x00000007 0x257b 838 /1200 0/0/0
R3.01-00 0x00000001 0x60a9 838 /1200 0/0/0
R4.00-00 0x00000008 0xa3d0 839 /1200 0/0/0
Total Level-1 LSP count: 6 Local Level-1 LSP count: 1
IS-IS 1 (Level-2) Link State Database
LSPID LSP Seq Num LSP Checksum LSP Holdtime/Rcvd ATT/P/OL
R1.00-00 * 0x0000000f 0xfa2b 1097 /* 0/0/0
R1.01-00 0x00000009 0x9aef 0 (838)/* 0/0/0
R2.00-00 0x0000000f 0x807e 1096 /1200 0/0/0
R2.01-00 0x00000001 0xd556 1096 /1200 0/0/0
R3.00-00 0x0000000d 0x0acf 1097 /1200 0/0/0
R4.00-00 0x0000000e 0x8d24 1097 /1200 0/0/0レベル1のLSDBにはR3.01-00、レベル2のLSDBにはR2.01-00があります。物理的には1本のLANなのに、レベルごとに違う疑似ノードで表現されているわけです。レベル1とレベル2でLSDBが完全に分かれていることの、分かりやすい現れ方でもあります(レベルの仕組みはレベル1とレベル2で解説しています)。
なお、レベル2のLSDBからR3.01-00は消えています。R3はレベル2のDISでなくなったので、レベル2の疑似ノードLSPだけをパージしました。辞任は「レベルごと」に起こります。
DISが落ちたとき(STEP 3)
レベル1のDISであるR3のLANインタフェースを落とします。
interface GigabitEthernet0/0/0/0
shutdown Level-1
Adjacency Count: 2
LAN ID: R1.01
Priority (Local/DIS): 64/64
Level-2
Adjacency Count: 2
LAN ID: R2.01
Priority (Local/DIS): 64/110レベル1のDISはR1に移りました。残ったR1・R2・R4はいずれも優先度64(R2の110はレベル2だけの設定)なので、SNPAがもっとも大きいR1が選ばれています。レベル2のDISはR2のままで、影響を受けていません。
IS-IS 1 (Level-1) Link State Database
LSPID LSP Seq Num LSP Checksum LSP Holdtime/Rcvd ATT/P/OL
R1.00-00 * 0x00000008 0xfb3e 1092 /* 0/0/0
R1.01-00 0x0000000a 0xe651 1092 /* 0/0/0
R2.00-00 0x0000000a 0x7894 1093 /1200 0/0/0
R3.00-00 0x00000007 0x257b 594 /1200 0/0/0
R3.01-00 0x00000001 0xe16c 0 (1092)/* 0/0/0
R4.00-00 0x0000000a 0x793d 1093 /1200 0/0/0R3.01-00がパージされ、R1.01-00が復活しています。
ここで確認したかったのは、バックアップが用意されていなかったことです。OSPFならBDRが事前に決まっていて即座に昇格しますが、IS-ISにはその仕組みがありません。R3がいなくなったあと、残った3台がその場で選出をやり直してR1に決まりました。IIHを送受信するたびに選出を走らせる設計なので、事前に予備を決めておく必要がないわけです。
隣接が落ちたことはログにも残ります。
07:00:00.552 R3 Gi0/0/0/0 u -> d Holdtime expired
IPv4 Unicast DownSTEP 4で優先度とshutdownを元に戻し、DISはR1(両レベル)に戻って初期状態と同じになりました。
検証Configおよびshow結果
各STEPで4台すべてから、次の3種類をルータごとに分けて取得しています。検証Configはこの..._run.txtです(最終状態はSTEP 4のもの)。
| ファイル | 内容 |
|---|---|
..._show.txt | show version / show interface description / show route / show route isis / show isis / show isis hostname / show isis interface / show isis interface brief / show isis neighbors / show isis neighbors detail / show isis database / show isis database detail / show isis topology / show isis adjacency / show isis adjacency detail / show isis adjacency-log / show isis trace all | include ELECT / show isis trace all | include PSEUDO / show isis spf-log / show isis lsp-log / show isis statistics / show cef |
..._log.txt | そのSTEPの範囲だけに絞ったshow logging(STEP 0のみ起動時からの全履歴) |
..._run.txt | そのSTEP時点のshow running-config(=そのSTEPの検証Config) |
最終状態のConfigは、4台とも優先度を設定していない(既定の64)状態です。STEP 1・2で入れたpriorityとSTEP 3のshutdownは、STEP 4ですべて外してあります。
STEP 0:初期状態
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
STEP 1:R3の優先度を100にする
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
STEP 2:R2の優先度をレベル2だけ110にする
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
STEP 3:R3のLANインタフェースをshutdown
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
STEP 4:優先度とshutdownを元に戻す(最終状態)
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
| キャプチャーファイルは次の3本です。 |
プリエンプション時(STEP 1)のキャプチャー(isis-dis-preempt.pcap) をダウンロード
レベル別DISへの分割時(STEP 2)のキャプチャー(isis-dis-level.pcap) をダウンロード
再選出時(STEP 3)のキャプチャー(isis-dis-reelect.pcap) をダウンロード
参考
| 標準 | タイトル | 概要 |
|---|---|---|
| ISO/IEC 10589:2002(第2版) | Intermediate System to Intermediate System intra-domain routeing information exchange protocol | IS-IS本体の仕様。本記事が参照したのは、DISと疑似ノードを定義する3.6.6 / 3.6.7、疑似ノードの扱いとメトリック0を定める7.2.3、疑似ノードLSPの生成を定める7.3.8、LSPのパージを定める7.3.16.4、DISの選出を定める8.4.5、LAN IIHのPriorityとLAN IDを定義する9.5 / 9.6、管理パラメータの既定値を定める11.3。 |
| RFC 1142 | OSI IS-IS Intra-domain Routing Protocol | ISO 10589のDraft Proposal(1990年)を再公開したもの。現在はHistoric。ISO/IEC 10589の代わりに参照してはいけません(RFC 7142)。 |
| RFC 7142 | Reclassification of RFC 1142 to Historic | 参照すべきはISO/IEC 10589:2002 第2版であることを述べている。 |
| RFC 1195 | Use of OSI IS-IS for Routing in TCP/IP and Dual Environments | IPの経路を運ぶための拡張。 |