IS-ISのATTビットとレベル1のデフォルトルート
IS-ISのレベル1エリアは、自分のエリアの中の経路しか持ちません。エリアの外の宛先を知らないルータが、どうやって外向きのパケットを送り出すのか。その答えがLSPヘッダーにあるATTビット(Attached)です。
エリアの出口になれるルータが「私は外につながっている」とATTビットで宣言し、レベル1のルータはそれを見て最も近い出口へパケットを渡します。この記事では、ATTビットがヘッダーのどこにあり、誰がどんな条件で立て、受け取った側が何をするかを、ISO/IEC 10589:2002の規定とIOS XRの実機で確認します。
レベル1とレベル2の役割分担はIS-ISのレベル1とレベル2(階層構造)で解説しています。
ATTビットはどこにあるか
ATTビットはLSPヘッダーの末尾にある1バイトに、P・LSPDBOL・IS Typeと同居しています。9.8はこの1バイトをこう定義しています。
| ビット | 名前 | 意味 |
|---|---|---|
| 8 | P | 分割修復(Partition Repair)に対応しているか |
| 7〜4 | ATT | メトリック種別ごとに1ビット。ビット4がDefault、5がDelay、6がExpense、7がError |
| 3 | LSPDBOL | LSPデータベースのオーバーロード |
| 1〜2 | IS Type | レベル1かレベル2か(1がレベル1、3がレベル2。0と2は未使用) |
ATTが4ビットあるのは、規格が4種類のメトリックを定めているからです。「Defaultメトリックでは外に出られるが、Delayメトリックでは出られない」という状態を表せます。ただし実際に使われるのはDefaultメトリックだけで、IOS XRのshow isis databaseがATT/P/OLの欄に1桁で表示するのは ビット4(Default)です。
誰がATTビットを立てるか
7.2.9.2が条件を定めています。レベル2の決定プロセスを走らせたレベル2 ISは、そのメトリックで自分のエリアの外へ届くかどうかを判定します。
そのISは、次のいずれかであれば自分をattachedと見なす。 a) 対応するルーティングメトリックを使って少なくとも1つの他のエリアに到達できる、または b) 対応するメトリックが定義された有効なreachable address prefixを少なくとも1つ持つ。 そうでなければ、そのISは自分をattachedでないと見なす。
判定が変わったときの動作も定められています。attachedでなくなったときは、フラグを偽にし、レベル1のLSP(LSP番号0)を作り直し、さらに自分自身もレベル1ルータと同じ手順(7.2.9.1)で「最も近いレベル2 IS」を求め直します。逆にattachedになったときは、フラグを真にしてレベル1のLSPを作り直し、自分の「最も近いレベル2 IS」を「自分自身」に設定します。
ここが分かりにくい点です。ATTビットが載るのはレベル2のLSPではなく、レベル1のLSPです。レベル1のルータはレベル2のLSPを持たないので、レベル1のデータベースに置かなければ伝わりません。LSP番号0と限定されているのも、レベル1のルータが分割されたLSPを組み立てる前にこのビットを読める必要があるからです。
つまりATTビットは「レベル2の世界で得た情報を、レベル1の世界へ1ビットだけ持ち込む仕掛け」です。条件が「他エリアに到達できる」であって「レベル2の隣接がある」ではない点にも注意が要ります。レベル2の隣接を持っていても、その先に別のエリアが1つも無ければattachedにはなりません。
受け取ったレベル1ルータは何をするか
7.2.9.1はレベル1 ISの動作をこう定めます。
レベル1のIntermediate systemは、メトリックごとにもう1つ情報を必要とする。そのメトリックによる最も近いレベル2 Intermediate systemへの次ホップである。レベル1のISは、メトリックkでの合計コストが最小になるような「attached」なレベル2 ISの集合Rを確定しなければならない。
集合がmaximumPathSplitsより多ければ、等コストパスと同じ規則で間引きます。等コストパスの扱いはIS-ISのSPF計算と経路選択で解説しています。
ここで比べているのは自分からそのレベル2 ISまでの距離だけです。出口の先がどうなっているかは計算に入りません。レベル1のルータが持っているのはエリア内のトポロジとATTビットだけなので、それ以上は判断のしようがありません。
またレベル1ルータは、ATTが立っていないレベル2 ISを候補にしません。レベル2をやっているルータであっても、外に出られないなら出口としては役に立たないからです。後述のラボでは、より近いルータのATTが落ちた瞬間に遠いほうへ切り替わることを確認します。
規格は「デフォルトルート」とは言っていない
ここは注意が必要です。ISO/IEC 10589もRFC 1195も、レベル1ルータが0.0.0.0/0という経路を作るとは書いていません。規格が定めるのは転送データベースに「最も近いレベル2 IS」というエントリを持つことで、RFC 1195も次のように書くだけです。
指定された宛先アドレスが、エリア内で到達可能として挙げられている
\[IPアドレス, サブネットマスク, メトリック\]の組み合わせのどれにも一致しない場合、そのパケットは最も近いレベル2ルータへ向けてルーティングされる。
0.0.0.0/0として経路表に入れるのは実装の選択です。IOS XRはこの方式を採り、レベル1のみのルータに0.0.0.0/0が現れます。後述のラボで確認します。
メトリックの無いデフォルトルート
この仕組みには弱点があります。RFC 5302がこう指摘しています。
最も近いL1L2ルータを使うということは、そのL1L2がメトリック情報を持たないデフォルトルートをL1エリアへ注入しているのと実質的に同じである。L1ルータが行う経路計算も同様に最適でない。
レベル1ルータが知っているのは「どの出口が近いか」だけで、その出口から先の距離は分かりません。近い出口の先が遠回りでも、遠い出口の先が近くても、判断できないわけです。これを改善する仕組みが、レベル2の経路をレベル1へ落とすルートリークです。
実機での検証
検証環境
エリア49.0001にR1・R2・R3を置き、R1だけをlevel-1にします。R2とR3はlevel-1-2で、別エリア49.0002のlevel-2-onlyなR4へつながります。R1から見ると出口が2つあり、どちらが選ばれるかを観察できます。
| ルータ | エリア | IS Type | Lo0 | リンク |
|---|---|---|---|---|
| R1 | 49.0001 | level-1 | 1.1.1.1/32 | Gi0/0/0/0 10.1.2.1(R2へ、metric 10)/ Gi0/0/0/1 10.1.3.1(R3へ、metric 20) |
| R2 | 49.0001 | level-1-2 | 2.2.2.2/32 | Gi0/0/0/0 10.1.2.2 / Gi0/0/0/1 10.2.4.2(R4へ) |
| R3 | 49.0001 | level-1-2 | 3.3.3.3/32 | Gi0/0/0/0 10.1.3.3 / Gi0/0/0/1 10.3.4.3(R4へ) |
| R4 | 49.0002 | level-2-only | 4.4.4.4/32 | Gi0/0/0/0 10.2.4.4 / Gi0/0/0/1 10.3.4.4 |
R1 — R2をmetric 10、R1 — R3をmetric 20にして、既定ではR2が近い出口になるようにしました。
検証のSTEP
| STEP | 操作 | 確かめること |
|---|---|---|
| 0 | 既定・安定状態 | R2とR3のレベル1 LSPでATT=1。R1に0.0.0.0/0がR2経由で入り、外エリアの経路は持たないこと |
| 1 | R1 — R2のメトリックを30に | デフォルトルートがR3経由へ移る(「最も近い」の意味) |
| 2 | 戻して、R2をis-type level-1に | R2のATTが0に落ち、出口がR3だけになること |
| 3 | R3もlevel-1に | エリアにattachedなレベル2が無くなり、R1の0.0.0.0/0が消えること |
| 4 | すべて元に戻す(最終状態) | STEP 0と一致 |
STEP 0:ATTビットとデフォルトルート
まず既定の状態です。R1はlevel-1なので、持っているのはレベル1のデータベースだけです。
RP/0/RP0/CPU0:R1#show isis database
Fri Sep 11 07:10:17.360 UTC
IS-IS 1 (Level-1) Link State Database
LSPID LSP Seq Num LSP Checksum LSP Holdtime/Rcvd ATT/P/OL
R1.00-00 * 0x00000006 0x2364 593 /* 0/0/0
R2.00-00 0x00000006 0x9e63 623 /1200 1/0/0
R3.00-00 0x00000005 0x7849 623 /1200 1/0/0
Total Level-1 LSP count: 3 Local Level-1 LSP count: 1載っているのはエリア内の3台だけで、別エリアのR4はどこにもありません。レベル1のルータがエリアの外を知らない、というのはこういうことです。
そしてATT/P/OLの欄を見ると、R2とR3が 1/0/0、R1自身は 0/0/0 です。この先頭の1桁がATTビットで、R2とR3が「私は外につながっている」と申告しています。エリアの外を知らないR1は、この1ビットだけを手がかりにします。
R1の経路表です。
RP/0/RP0/CPU0:R1#show route isis
Fri Sep 11 07:10:16.227 UTC
i*L1 0.0.0.0/0 [115/10] via 10.1.2.2, 00:09:35, GigabitEthernet0/0/0/0
i L1 2.2.2.2/32 [115/10] via 10.1.2.2, 00:11:07, GigabitEthernet0/0/0/0
i L1 3.3.3.3/32 [115/20] via 10.1.3.3, 00:10:05, GigabitEthernet0/0/0/1
i L1 10.2.4.0/24 [115/20] via 10.1.2.2, 00:11:07, GigabitEthernet0/0/0/0
i L1 10.3.4.0/24 [115/30] via 10.1.3.3, 00:10:05, GigabitEthernet0/0/0/1先頭にi*L1 0.0.0.0/0があります。*が候補デフォルトの印で、エリア内の経路と並んでデフォルトルートが1本だけ入っています。詳細を見ます。
RP/0/RP0/CPU0:R1#show route 0.0.0.0/0
Fri Sep 11 07:10:16.521 UTC
Routing entry for 0.0.0.0/0
Known via "isis 1", distance 115, metric 10, candidate default path, type level-1
Installed Sep 11 07:00:41.144 for 00:09:35
Routing Descriptor Blocks
10.1.2.2, from 2.2.2.2, via GigabitEthernet0/0/0/0
Route metric is 10
No advertising protos. candidate default pathと明示され、次ホップは10.1.2.2(R2)、メトリックは10です。ATTを立てたルータが2台あるなかで、メトリックの小さいR2が選ばれています。
STEP 1:「最も近い」はメトリックで決まる
R1のGi0/0/0/0(R2向け)をmetric 30にしました。これでR2までが30、R3までが20になります。
RP/0/RP0/CPU0:R1#show route 0.0.0.0/0
Fri Sep 11 07:13:10.825 UTC
Routing entry for 0.0.0.0/0
Known via "isis 1", distance 115, metric 20, candidate default path, type level-1
Installed Sep 11 07:11:34.020 for 00:01:36
Routing Descriptor Blocks
10.1.3.3, from 3.3.3.3, via GigabitEthernet0/0/0/1
Route metric is 20
No advertising protos. 次ホップが10.1.3.3(R3)に変わり、メトリックは20です。ATTはR2もR3も1のままで、変えたのは距離だけです。7.2.9.1が言う「合計コストが最小になるattachedなレベル2 ISの集合」が、そのまま次ホップの選択になっています。
STEP 2:ATTが落ちると出口から外れる
メトリックを10に戻し、今度はR2をis-type level-1にしました。R2はレベル2をやめるので、別エリアのR4とのレベル2隣接が切れます。
RP/0/RP0/CPU0:R1#show isis database
Fri Sep 11 07:17:14.684 UTC
IS-IS 1 (Level-1) Link State Database
LSPID LSP Seq Num LSP Checksum LSP Holdtime/Rcvd ATT/P/OL
R1.00-00 * 0x00000008 0x1f66 1031 /* 0/0/0
R2.00-00 0x00000007 0x9278 1043 /1200 0/0/0
R3.00-00 0x00000006 0x764a 890 /1200 1/0/0
Total Level-1 LSP count: 3 Local Level-1 LSP count: 1R2のATTが1/0/0から0/0/0に落ちました。R2は他エリアに到達できなくなったので、7.2.9.2の条件を満たさなくなったわけです。R3は1/0/0のままです。
このときR1のデフォルトルートはR3経由になります。メトリックはR2のほうが小さいままですが、ATTが立っていないルータは出口の候補にならないからです。
STEP 3:出口が無くなるとデフォルトルートも消える
R3もis-type level-1にしました。これでエリア内にレベル2をやるルータがいなくなります。
RP/0/RP0/CPU0:R1#show isis database
Fri Sep 11 07:20:56.481 UTC
IS-IS 1 (Level-1) Link State Database
LSPID LSP Seq Num LSP Checksum LSP Holdtime/Rcvd ATT/P/OL
R1.00-00 * 0x00000008 0x1f66 810 /* 0/0/0
R2.00-00 0x00000007 0x9278 821 /1200 0/0/0
R3.00-00 0x00000007 0x6a5f 1047 /1200 0/0/0
Total Level-1 LSP count: 3 Local Level-1 LSP count: 13台ともATTが 0/0/0 になりました。R1の経路表はこうなります。
RP/0/RP0/CPU0:R1#show route isis
Fri Sep 11 07:20:55.635 UTC
i L1 2.2.2.2/32 [115/10] via 10.1.2.2, 00:06:29, GigabitEthernet0/0/0/0
i L1 3.3.3.3/32 [115/20] via 10.1.3.3, 00:20:45, GigabitEthernet0/0/0/1
i L1 10.2.4.0/24 [115/20] via 10.1.2.2, 00:06:29, GigabitEthernet0/0/0/0
i L1 10.3.4.0/24 [115/30] via 10.1.3.3, 00:20:45, GigabitEthernet0/0/0/10.0.0.0/0の行が消えています。エリア内の経路(2.2.2.2/32・3.3.3.3/32・10.2.4.0/24・10.3.4.0/24)はそのまま残っているので、IS-ISが止まったわけではありません。attachedなレベル2 ISが1台も無いので、向ける先が無いだけです。
エリアは外と通信できなくなりますが、それが規格どおりの動作です。レベル1のルータは自力で外の経路を知る手段を持たないので、ATTビットを立てる者がいなければ出口も無くなります。
パケットで見るATTビット
show isis databaseのATT/P/OL欄は、4ビットあるATTを1桁に丸めた表示です。実際のヘッダーを見るために、R1 — R2のリンクで試験の全体をキャプチャーしました。同じR2のレベル1 LSPが、STEP 2の前後でどう変わるかを比べます。
まずSTEP 2より前、R2がまだlevel-1-2だったときのLSPです。
ISO 10589 ISIS Link State Protocol Data Unit
PDU length: 102
Remaining lifetime: 1200
LSP-ID: 0020.0200.2002.00-00
Sequence number: 0x00000006
Checksum: 0x9e63 [correct]
[Checksum Status: Good]
Type block(0x0b): Partition Repair:0, Attached bits:1, Overload bit:0, IS type:3
0... .... = Partition Repair: Not supported
.000 1... = Attachment: 1
.0.. .... = Error metric: Not set
..0. .... = Expense metric: Not set
...0 .... = Delay metric: Not set
0... .... = Default metric: Not set
.... .0.. = Overload bit: Not set
.... ..11 = Type of Intermediate System: Level 2 (3).000 1... = Attachment: 1が、9.8が定めるビット7〜4です。4ビットがメトリック種別ごとに展開されていることも分かります。Defaultだけが立ち、Delay・Expense・Errorは0です。記事の前半で「実際に使われるのはDefaultメトリックだけ」と述べたのは、この形を指しています。
続いて、R2をis-type level-1にした直後のLSPです。
ISO 10589 ISIS Link State Protocol Data Unit
PDU length: 102
Remaining lifetime: 1200
LSP-ID: 0020.0200.2002.00-00
Sequence number: 0x00000007
Checksum: 0x9278 [correct]
[Checksum Status: Good]
Type block(0x01): Partition Repair:0, Attached bits:0, Overload bit:0, IS type:1
0... .... = Partition Repair: Not supported
.000 0... = Attachment: 0
.0.. .... = Error metric: Not set
..0. .... = Expense metric: Not set
...0 .... = Delay metric: Not set
0... .... = Default metric: Not set
.... .0.. = Overload bit: Not set
.... ..01 = Type of Intermediate System: Level 1 (1)Attachmentが0になり、同時にType of Intermediate SystemがLevel 2 (3)からLevel 1 (1)へ変わっています。同じ1バイトの中で、ATTとIS Typeが並んで書き換わっているわけです。シーケンス番号も0x06から0x07に上がっており、R2がレベル1のLSPを作り直したことが読めます。
このLSPが流れているのはR1 — R2のリンク、つまりレベル1の世界です。R2が持っているレベル2の情報のうち、レベル1へ渡るのはこの1ビットだけです。
STEP 4:元に戻す
R2とR3をis-type level-1-2に戻しました。4台ともrunning-configはSTEP 0と一致しています。
検証Configおよびshow結果
R1 — R2のリンクで試験の全体をキャプチャーしています。上で引用したLSPはこの中のNo.66とNo.74です。
試験全体のキャプチャー(R1 — R2、約16分)をダウンロード各STEPで4台すべてから、次の3種類をルータごとに分けて取得しています。検証Configはこの..._run.txtです(最終状態は最後のSTEPのもの)。
| ファイル | 内容 |
|---|---|
..._show.txt | show version / show interface description / show route と、show isis 系一式(interface / neighbors detail / database detail / topology / adjacency-log / spf-log / lsp-log / statistics) |
..._log.txt | そのSTEPの範囲だけに絞ったshow logging。各STEPの開始時にlogmsgでマーカーを入れ、その時刻をshow logging startに指定して取得したもの |
..._run.txt | そのSTEP時点のshow running-config(=そのSTEPの検証Config) |
STEP 0:初期状態
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
STEP 1:R1 — R2のメトリックを30に
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
STEP 2:メトリックを戻し、R2をis-type level-1に
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
STEP 3:R3もis-type level-1に
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
STEP 4:すべて元に戻す(最終状態)
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
参考
| 標準 | タイトル | 概要 |
|---|---|---|
| ISO/IEC 10589:2002(第2版) | Intermediate System to Intermediate System intra-domain routeing information exchange protocol | IS-IS本体の仕様。本記事が参照したのは、レベル1 LSPヘッダーのATTビットの位置を定める9.8、レベル1 ISが最も近いレベル2 ISを求める7.2.9.1、レベル2 ISがattachedを判定してレベル1 LSPを作り直す7.2.9.2、等コストパスの間引きの7.2.7。 |
| RFC 1195 | Use of OSI IS-IS for Routing in TCP/IP and Dual Environments | IPの経路を運ぶための拡張。エリア内で一致しない宛先は最も近いレベル2ルータへ向ける、と述べている。 |
| RFC 5302 | Domain-Wide Prefix Distribution with Two-Level IS-IS | ATTビットによる出口選択が「メトリック情報を持たないデフォルトルートの注入」と同じであり、経路計算が最適にならないことを指摘している。 |
| RFC 7142 | Reclassification of RFC 1142 to Historic | 参照すべきはISO/IEC 10589:2002 第2版であることを述べている。 |
関連記事
- IS-ISとは
- IS-ISのNSAPアドレスとNET(System ID)
- IS-ISのレベル1とレベル2(階層構造)
- IS-ISパケットの種類とヘッダーフォーマット
- IS-ISの隣接関係の確立と状態遷移
- IS-ISのDISと疑似ノード(Pseudonode)
- IS-ISのネットワークタイプ(broadcast / point-to-point)
- IS-ISのメトリック(narrow / wide)
- IS-ISの認証(hello-password / lsp-password)
- IS-ISのLSPとリンクステートデータベース
- IS-ISの主要TLV
- IS-ISのフラッディングとLSDB同期
- IS-ISのSPF計算と経路選択
- IS-ISのATTビットとレベル1のデフォルトルート