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

IS-ISのATTビットとレベル1のデフォルトルート

目次

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バイトをこう定義しています。

ビット名前意味
8P分割修復(Partition Repair)に対応しているか
7〜4ATTメトリック種別ごとに1ビット。ビット4がDefault、5がDelay、6がExpense、7がError
3LSPDBOLLSPデータベースのオーバーロード
1〜2IS Typeレベル1かレベル2か(1がレベル1、3がレベル2。02は未使用)

ATTが4ビットあるのは、規格が4種類のメトリックを定めているからです。「Defaultメトリックでは外に出られるが、Delayメトリックでは出られない」という状態を表せます。ただし実際に使われるのはDefaultメトリックだけで、IOS XRのshow isis databaseATT/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.0002level-2-onlyなR4へつながります。R1から見ると出口が2つあり、どちらが選ばれるかを観察できます。

ルータエリアIS TypeLo0リンク
R149.0001level-11.1.1.1/32Gi0/0/0/0 10.1.2.1(R2へ、metric 10)/ Gi0/0/0/1 10.1.3.1(R3へ、metric 20)
R249.0001level-1-22.2.2.2/32Gi0/0/0/0 10.1.2.2 / Gi0/0/0/1 10.2.4.2(R4へ)
R349.0001level-1-23.3.3.3/32Gi0/0/0/0 10.1.3.3 / Gi0/0/0/1 10.3.4.3(R4へ)
R449.0002level-2-only4.4.4.4/32Gi0/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経由で入り、外エリアの経路は持たないこと
1R1 — R2のメトリックを30にデフォルトルートがR3経由へ移る(「最も近い」の意味)
2戻して、R2をis-type level-1R2のATTが0に落ち、出口がR3だけになること
3R3もlevel-1エリアにattachedなレベル2が無くなり、R1の0.0.0.0/0が消えること
4すべて元に戻す(最終状態)STEP 0と一致

STEP 0:ATTビットとデフォルトルート

まず既定の状態です。R1はlevel-1なので、持っているのはレベル1のデータベースだけです。

STEP 0 R1:show isis database
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の経路表です。

STEP 0 R1:show route isis
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本だけ入っています。詳細を見ます。

STEP 0 R1:show route 0.0.0.0/0
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になります。

STEP 1 R1:show route 0.0.0.0/0
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隣接が切れます。

STEP 2 R1:show isis database
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: 1

R2の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をやるルータがいなくなります。

STEP 3 R1:show isis database
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: 1

3台ともATTが 0/0/0 になりました。R1の経路表はこうなります。

STEP 3 R1:show route isis
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/1

0.0.0.0/0の行が消えています。エリア内の経路(2.2.2.2/323.3.3.3/3210.2.4.0/2410.3.4.0/24)はそのまま残っているので、IS-ISが止まったわけではありません。attachedなレベル2 ISが1台も無いので、向ける先が無いだけです。

エリアは外と通信できなくなりますが、それが規格どおりの動作です。レベル1のルータは自力で外の経路を知る手段を持たないので、ATTビットを立てる者がいなければ出口も無くなります。

パケットで見るATTビット

show isis databaseATT/P/OL欄は、4ビットあるATTを1桁に丸めた表示です。実際のヘッダーを見るために、R1 — R2のリンクで試験の全体をキャプチャーしました。同じR2のレベル1 LSPが、STEP 2の前後でどう変わるかを比べます。

まずSTEP 2より前、R2がまだlevel-1-2だったときのLSPです。

ATT=1のLSP(No.66)tshark -V
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)
上のtshark出力のパケット(No.66、ATT=1)のpcapをダウンロード

.000 1... = Attachment: 1が、9.8が定めるビット7〜4です。4ビットがメトリック種別ごとに展開されていることも分かります。Defaultだけが立ち、Delay・Expense・Errorは0です。記事の前半で「実際に使われるのはDefaultメトリックだけ」と述べたのは、この形を指しています。

続いて、R2をis-type level-1にした直後のLSPです。

ATT=0のLSP(No.74)tshark -V
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)
上のtshark出力のパケット(No.74、ATT=0)のpcapをダウンロード

Attachmentが0になり、同時にType of Intermediate SystemLevel 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.txtshow 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出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun

STEP 1:R1 — R2のメトリックを30に

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun

STEP 2:メトリックを戻し、R2をis-type level-1

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun

STEP 3:R3もis-type level-1

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun

STEP 4:すべて元に戻す(最終状態)

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun

参考

標準タイトル概要
ISO/IEC 10589:2002(第2版)Intermediate System to Intermediate System intra-domain routeing information exchange protocolIS-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 1195Use of OSI IS-IS for Routing in TCP/IP and Dual EnvironmentsIPの経路を運ぶための拡張。エリア内で一致しない宛先は最も近いレベル2ルータへ向ける、と述べている。
RFC 5302Domain-Wide Prefix Distribution with Two-Level IS-ISATTビットによる出口選択が「メトリック情報を持たないデフォルトルートの注入」と同じであり、経路計算が最適にならないことを指摘している。
RFC 7142Reclassification of RFC 1142 to Historic参照すべきはISO/IEC 10589:2002 第2版であることを述べている。

関連記事