OSPF ルート計算

OSPFでルート情報の求め方について説明します。概要ではルート計算の基本的な考え方を、その後はルータの役割ごとの具体的なルート計算の手順について説明します。

■概要

OSPFのコストと、ルート計算の概要について説明します。

OSPFのメトリック

OSPFのメトリックはインターフェイスに割り当てたコスト値です。コストは1から65535の間の数値で任意で設定しますが、基本的には回線の速度に応じて設定します。設定したコスト値が小さいほどそのインターフェースが使用される可能性が高くなります。

OSPFのルート計算と求め方

OSPFではLSAの集合であるLSDBを使用してルート計算が行われますが、ここでは下図を用いて簡単にR1からN2に対してのルートを求めてみます。

下図のようにR1からN1には3つのルートが存在します。それぞれ経由するルータの出力側インターフェイスのコスト(図内の丸で囲った数字)を加算することで求めています。ルート1はトータルコストが10、ルート2はトータルコストが45、ルート3はトータルコストが60となっています。そのためN1からN2に対する最短ルートはトータルコストが最小のルート1であると求めることができます。

この計算はすべての宛先に対して行います。下図はR1から各回線のIPサブネットへのルートを求めたものです。それぞれの宛先にはコスト(トータルコスト)とネクストホップが求められて下表のようなルーティングテーブルとして使用されます。

R1のルーティングテーブル

宛先 コスト ネクストホップ
10.1.1.0/24 5 C(直接)
10.1.2.0/24 10 10.1.2.2
10.1.3.0/24 25 10.1.2.2
10.1.4.0/24 10 10.1.2.2
10.1.5.0/24 25 10.1.2.5

■内部ルータの計算

ここからはLSAを使用した具体的なルート計算の手順について説明します。前提として内部ルータのルート計算を理解している必要があります。

計算ネットワーク

OSPFでルート計算は計算を行うルータから各ルータまでを最短で繋いだグラフ(Shortest-path tree)を求めることで行います。ここでは下図のネットワークを使用してどのようにグラフを作成しルート情報が求められるのかを見ていきます。

必要なもの

LSA

ルータが作成する各要素に対する接続情報。すべてのルータが作成し同期によって他のルータに共有している。LSAを元にしてShortest-path treeやルート情報が求められる。

Shortest-path tree

LSAを元に計算によって求められた最短の接続情報(グラフ)。この情報を元にルート情報を求める。

Candidate list

Shortest-path treeを作成する際に使用する候補リスト。各LSAから情報を登録する。

ルーティングテーブル

Shortest-path treeやLSAから作成されたルート情報を格納するデータベース。OSPFでは独自の様式を持つ。

TransitCapability

このエリアがバーチャルリンクで使用されるかどうかを示す情報。エリアデータ構造の1つ。

ルート計算の概要

OSPFのルート計算の中で最もコアとなるエリア内のルート情報を求める手順は2つの段階に分かれています。第一段階がダイクストラのアルゴリズム(Dijkstra’s algorithm)を使用したルータ間のツリー作成。第二段階が各ネットワーク(スタブリンク)を追加したルートの作成です。

第一段階

第一段階ではダイクストラのアルゴリズムを使用してグラフを作成します。この動作は”最短経路”をひたすら集めていく動作です。Shortest-path treeに自分自身(計算を行うルータ)をルートとして追加するところから始めて、Shortest-path treeに隣接するノードの中から自分から一番近いリンクを辿ってノードを追加してツリーを成長させていきます。辿るノードがなくなると終了です。使用するLSAはRouter-LSAのノードに対するリンク(スタブリンク以外のリンク)と、Network-LSAです。

大まかな手順

1.自分をShortest-path treeにルートノードとして追加

2.Shortest-path treeに隣接するノードを検索(Shortest-path tree内のLSAを検索)。隣接ノードがなければ終了

3.自分(origin)から各隣接ノードまでのパスコストが一番小さいノードをShortest-path treeに追加

4.2に戻る

第二段階

第一段階で作成したツリーを元に各ネットワーク(IPサブネット)までの距離、ネクストホップ、出力IFを求めます。使用するLSAはTyep1のエッジに対するリンク(スタブリンク)です。

説明中のルータIDとIPアドレスの表現

図中ではルータIDの代わりに”R1”などの名称を使用します。また各ルータのIPアドレスは下図の右下に示したように各IPサブネットの第4オクテットをルータの番号にしています。例えばR2の持つIPアドレスは10.1.1.2、10.1.2.2、10.1.0.2となり、すべて最後が2になります。

計算ルータと使用するLSA

計算ルータはR1で、R1がもつLSAは下図に示したものを使用していきます。下図の青矢印はR1の計算結果のルートです。このネットワークではエリア0とエリア2の境界でルート集約していることに注意が必要です。ルート集約によってネットワーク図のエリア2にあるサブネットとR1が受け取るLSAのサブネットは異なります。

エリア内ルート(Router-LSA、Network-LSA)第一段階

1-1)R1が属しているエリア1について計算していきます。初めにR1自身をShortest-path treeに追加します。自分に対するコストはなしと考えるのでコストは0、ネクストホップは自分自身(ここではWを使用)に設定します。

1-2)Candidate listが空でShortest-path treeに追加できる候補がないため、Shortest-path treeに追加したR1のRouter-LSAを呼び出します。第1段階ではポイントツーポイントリンクとトランジットリンクのみを扱うため、Router-LSAの中からトランジットリンクである10.1.1.2をCandidate listに追加します。この時、10.1.1.2のNetwork-LSAを調査しR1へのリンクが返されていることを確認します。Network-LSA自体が存在しなかったりR1へのリンクが返されていない場合はこのリンクはスキップされます(その場合はR1には他にリンク情報がないためR1の最終結果として10.1.1.0/24のみがエントリーされたルーティングテーブルになります)。Candidate listに登録するときのコストはルート(Shortest-path treeの持つ最大のコストで現在はR1だけのため0)のコストにノードの持つコスト(5)を加算します。下図のCandidate listのコストでカッコなし数値がトータルコスト、カッコつきがオリジナルのコストです。また同時にネクストホップも求めて設定しますが、このノードはNetwork-LSAであり実体のないノードであるためネクストホップはありません。

もし呼び出したRouter-LSAにビットVが設定されている場合はTransitCapabilityをTRUEに設定します。この動作は以後各ノードのRouter-LSAを呼び出すたびに確認されます。TransitCapabilityがTRUEになるとそのエリアはトランジットエリアになり、後で個別の計算が行われます。詳細はこのページの「バーチャルリンクを持つABRの計算」を参照してください。

Candidate listからルートから最短のリンクをShortest-path treeに追加します。Candidate listには1つだけしか存在しないため10.1.1.2をShortest-path treeに移動します。

上でShortest-path treeに追加されたリンク情報をルート情報としてルーティングテーブルに登録します。この登録動作はShortest-path treeにリンクが追加された後に都度行われます。ただし第一段階でルーティングテーブルに追加される情報はABRとASBRとトランジットネットワークだけです。それ以外の情報(役を持たないルータ)はルーティングテーブルに登録されません。上でShortest-path treeに追加されたリンク情報はトランジットネットワークであるため下図のようにタイプがネットワーク(N)のエリア内(intra-area)のルート情報が登録されます。宛先はLS IDをネットワークマスクでマスキングしてネットワークアドレスを取得します。

1-3)前でShortest-path treeに追加したノードのLSAを呼び出します。Shortest-path treeに追加したのはトランジットリンクであるため、10.1.1.2のNetwork-LSAを呼び出します。Network-LSAには3つのノード(R1、R2、R5)が含まれていますが、R1は自分自身でありすでにShortest-path treeに存在しているためR2とR5をCandidate listに追加します。Network-LSAは実体のないノードであるため、コストを持ちません。代わりに親のノード(R1)のコストが継承(もしくは0に加算)されます。ネクストホップは各宛先(R2、R5)のLSAを参照して親(トランジットリンク:10.1.1.2)に対して返されているLSAのLink Dataを設定します。

Candidate listからルートから最短のリンクをShortest-path treeに追加します。Candidate listにはR2とR5が登録されています。2つは条件が同じであるためどちらかをShortest-path treeに追加します。ここではR2を追加します。この後にルーティングテーブルへの登録動作に移りますが、Shortest-path treeに追加されたリンクがABRでもASBRでもトランジットネットワークでもないためルーティングテーブルへの登録は行われません。

1-4)前にShortest-path treeに追加したノードのLSAを呼び出します。Shortest-path treeに追加したR2はルータであるのでR2のルータLSAを呼び出します。すでに説明した通り第1段階ではポイントツーポイントリンクとトランジットリンクのみを扱うため、R3と10.1.1.2が対象となります。ただし10.1.1.2はShortest-path treeに既に登録されているため除外し、R3だけをCandidate listに追加します。この時、R3のNetwork-LSAを調査しR2へのリンクが返されていることを確認します。Network-LSA自体が存在しなかったりR2へのリンクが返されていない場合はこのリンクはスキップされます。Candidate listに登録するときのコストはルート(Shortest-path tree全体=5)のコストにノードの持つコスト(10)を加算します。ネクストホップは計算ルータ(R1)と宛先(R3)の間に他のルータ(R2)が挟まっているため単純に親の情報を継承します。R3の親はR2となるためR2のネクストホップ(10.1.1.2)が設定されます。

Candidate listよりルートから最短のリンクをShortest-path treeに追加します。Candidate listにはR5とR3が登録されています。トータルコストが小さいR5をShortest-path treeに追加します。この後にルーティングテーブルへの登録動作に移りますが、Shortest-path treeに追加されたのが通常のルータであるためルーティングテーブルへの登録は行われません。

1-5)前でShortest-path treeに追加したノードのLSAを呼び出します。Shortest-path treeに追加したR5はルータであるのでR5のルータLSAを呼び出します。前の例に倣って、スタブリンク以外でShortest-path treeに登録済みの物を除外するとR6だけとなるため、R6をCandidate listに追加します。Candidate listに登録するときのコストはルート(Shortest-path tree全体=5)のコストにノードの持つコスト(20)を加算します。ネクストホップは計算ルータ(R1)と宛先(R6)の間に他のルータ(R5)が挟まっているため親の情報を継承します。R6の親はR5となるためR5のネクストホップ(10.1.1.5)が設定されます。

Candidate listよりルートから最短のリンクをShortest-path treeに追加します。Candidate listにはR3とR6が登録されています。トータルコストが小さいR3をShortest-path treeに追加します。この後にルーティングテーブルへの登録動作に移りますが、ルーティングテーブルへの登録は行われません。

1-6)前でShortest-path treeに追加したノードのLSAを呼び出します。Shortest-path treeに追加したR3はルータであるのでR3のルータLSAを呼び出します。前の例に倣って、スタブリンク以外でShortest-path treeに登録済みの物を除外するとR4とR6になりますが、R6はすでにCandidate listに登録されているためトータルコストの小さくなるほうを選択します。R3の持つR6へのリンクから計算したトータルコスト(15+5=20)はCandidate listに登録されているトータルコスト(25)よりも小さくなるため、R6を置き換える形でR6とR4をCandidate listに追加します。Candidate listに登録するときのコストはR6が20、R4が25となります。ネクストホップは計算ルータ(R1)と宛先(R6、R4)の間に他のルータ(R3)が挟まっているため親の情報を継承します。R6とR4の親はR3となるためR3のネクストホップ(10.1.2.2)が設定されます。

Candidate listよりルートから最短のリンクをShortest-path treeに追加します。Candidate listにはR6とR4が登録されています。トータルコストが小さいR6をShortest-path treeに追加します。ルーティングテーブルへの登録は行われません。

1-7)前でShortest-path treeに追加したノードのLSAを呼び出します。Shortest-path treeに追加したR6はルータであるのでR6のルータLSAを呼び出します。スタブリンク以外でShortest-path treeに登録済みの物を除外するとR4だけとなりますが、R4はすでにCandidate listに登録されているためトータルコストの小さくなるほうを選択します。R6の持つR4へのリンクから計算したトータルコスト(20+10=30)はCandidate listに登録されているトータルコスト(25)よりも大きくなるため、Candidate listに登録されているほうを選択します。そのためR6のルータLSAからはCandidate listへの追加は発生しません。

Candidate listからルートから最短のリンクをShortest-path treeに追加します。Candidate listにはR4だけが登録されているのでR4をShortest-path treeに追加します。

続いて上でShortest-path treeに追加されたリンク情報をルート情報としてルーティングテーブルに登録します。Shortest-path treeに追加されたR4のリンク情報はABRであるため下図のようにタイプがルータ(R)のエリア内(intra-area)のルート情報が登録されます。

1-8)前でShortest-path treeに追加したノードのLSAを呼び出します。Shortest-path treeに追加したR4はルータであるのでR4のルータLSAを呼び出します。スタブリンク以外でShortest-path treeに登録済みの物を除外すると登録できるものはありません。そのためR6のルータLSAからはCandidate listへの追加は発生しません。そしてCandidate listにも候補となるノードが存在しないため第一段階は終了となります。

第一段階終了時のルーティングテーブルは上図で完成になります。トランジットネットワーク(10.1.1.0/24)とABR(R4)のルート情報のみが登録された状態です。

エリア内ルート(Router-LSA、Network-LSA)第二段階

第二段階ではスタブリンクに対してトータルコストとネクストホップが求められていきます。ここでは各ルータLSAからスタブリンクをルーティングテーブルに登録していきます。この手順で呼び出す各Router-LSAの順番は決まっていません。すでにShortest-path treeが決まっているため、どの順番で呼び出しても結果は同じです。

2-1)計算ルータであるR1は自分のRouter-LSAを呼び出しますが、スタブリンクを持たないためスキップします。次にR2のLSAを呼び出します。R2のLSAには2つのスタブリンクが含まれているためルート情報を作成します。下図はCandidate listにルート情報を置いた状態です(説明のためにCandidate listに配置していますが、仕様ではありません)。コストはそれぞれの親であるR2のコスト(5)をShortest-path treeから求めて、スタブリンクのコストを加算します。ネクストホップは親であるR2のネクストホップをそのまま使用します。

上で求めた情報をルーティングテーブルに登録します。

2-2)続いてR5のRouter-LSAを呼び出します。R5のLSAには2つのスタブリンクが含まれているためルート情報を作成します。コストはそれぞれの親であるR5のコスト(5)をShortest-path treeから求めて、スタブリンクのコストを加算します。ネクストホップは親であるR5のネクストホップをそのまま使用します。

上で求めた情報をルーティングテーブルに登録します。

2-3)続いてR3のRouter-LSAを呼び出します。R3のLSAには2つのスタブリンクが含まれているためルート情報を作成します。コストはそれぞれの親であるR3のコスト(15)をShortest-path treeから求めて、スタブリンクのコストを加算します。ネクストホップは親であるR3のネクストホップをそのまま使用します。

上で求めた情報をルーティングテーブルに登録します。

2-4)続いてR6のRouter-LSAを呼び出します。R6のLSAには2つのスタブリンクが含まれているためルート情報を作成します。コストはそれぞれの親であるR6のコスト(20)をShortest-path treeから求めて、スタブリンクのコストを加算します。ネクストホップは親であるR6のネクストホップをそのまま使用します。

上で求めた情報をルーティングテーブルに登録します。

2-5)最後にR4のRouter-LSAを呼び出します。R4のLSAには2つのスタブリンクが含まれているためルート情報を作成します。コストはそれぞれの親であるR4のコスト(25)をShortest-path treeから求めて、スタブリンクのコストを加算します。ネクストホップは親であるR4のネクストホップをそのまま使用します。

上で求めた情報をルーティングテーブルに登録しますが、R4のスタブリンクから求めたルート情報はすでに同じものがR3とR6によって登録されています。そしてすでに登録済みのルート情報の方がコストが小さいためルーティングテーブルへの登録は行われません。

ここまでで第二段階が終了です。ルーティングテーブルは上図となり、エリア内のルート情報が求められたことになります。

エリア間ルート(Summary-LSA)

エリア内のルート計算に続いてエリア間のルート計算を行います。ここで使用するのはSummary-LSAです。

3-1)いずれかのSummary-LSAを呼び出します。下図ではR4の作成した10.0.1.0/24を呼び出していますが順番は関係ありません。10.0.1.0/24をルート情報としてCandidate listに追加します(説明のためにCandidate listに配置していますが、仕様ではありません)。この時コストはABR(R4)までのコスト(25)をルーティングテーブルで求めてサマリーLSAで指定されているコスト(5)を加算します。ネクストホップはABR(R4)に対するものと同じものを使用します。

サマリーLSAをルーティングテーブルに登録します。その中でルーティングテーブルに登録する際に既存のルートの確認が行われ、既存のルートが存在しない場合は登録します。もし既存ルートが存在する場合は、新しいルートのコストが既存ルートよりも小さければ上書き、コストが同じであればネクストホップの追加、コストが大きければ登録は行わずスキップします。

3-2)次のSummary-LSAを呼び出します。下図ではR4の作成した10.2.1.0/16を呼び出しています。10.2.1.0/16をルート情報としてCandidate listに追加します。この時コストはABR(R4)までのコスト(25)をルーティングテーブルで求めてサマリーLSAで指定されているコスト(20)を加算します。ネクストホップはABR(R4)に対するものと同じものを使用します。

サマリーLSAをルーティングテーブルに登録します。上のルート情報と下図のサブネットが異なっているのはエリア0とエリア2の境界でルート集約が行われているためです。

3-3)次のSummary-LSAを呼び出します。下図ではR4の作成した172.16.1.0/24を呼び出しています。172.16.1.0/24をルート情報としてCandidate listに追加します。この時コストはABR(R4)までのコスト(25)をルーティングテーブルで求めてサマリーLSAで指定されているコスト(25)を加算します。ネクストホップはABR(R4)に対するものと同じものを使用します。

サマリーLSAをルーティングテーブルに登録します。

以上でエリア間ルートが計算で来たことになります。ただし、エリア間ルートはSummary-LSAだけでなくASBR-Summary-LSAも同じ扱いになるため、次のASBRサマリールートの計算もつづけて行います。

エリア間ルート(ASBR-Summary-LSA)

ASBRのサマリーLSAは宛先が異なるだけでエリア間のサマリーLSAと同じ扱いです。そのためSummary-LSAと同時に計算を行います。

4-1)ASBRサマリーLSAを呼び出します。下図ではR4の作成したR9に対するASBR-Summary-LSAを呼び出しています。R9をルート情報としてCandidate listに追加します。この時コストはABR(R4)までのコスト(25)をルーティングテーブルで求めてASBR-Summary-LSAで指定されているコスト(20)を加算します。ネクストホップはABR(R4)に対するものと同じものを使用します。

ASBRサマリーLSAをルーティングテーブルに登録します。

ここまででAS内のすべてのルートに対する計算が終わったことになります。

AS外ルート(AS-external-LSA)

AS外のルートに対する計算を行っていきます。AS外ルートの計算にはAS-external-LSAを使用しますが、LSA内の指定によって下記のように計算方法が異なります。

メトリックタイプがタイプ1の場合:ASBR(もしくはフォワーディングアドレス)までのコストにAS外部LSAのコストを加算

メトリックタイプがタイプ2の場合: AS-external-LSAで指定されたコストを加算

フォワーディングアドレスがない場合:ASBRのルータIDをルーティングテーブルから検索してネクストホップを求めます

フォワーディングアドレスがある場合:指定されたアドレスをShortest-path treeもしくはルーティングテーブルから検索してネクストホップを求めます

ここではAS外ルートの計算を2つのケースで説明します。

ケース1)メトリックタイプ1でフォワーディングアドレスがない場合

AS外部LSAを呼び出します。LSA内の各ネットワークアドレス(LS IDをネットワークマスクでマスキングして算出)をCandidate listに追加します。この時コストはASBR(R9)までのコスト(45)をルーティングテーブルで求めてAS-external-LSAで指定されているコスト(10)を加算します。ネクストホップはASBR(R9)に対するものと同じものを使用します。

ケース2)メトリックタイプ2でフォワーディングアドレスがある場合

AS外部LSAを呼び出します。ここでは下図のようにLSAにフォワーディングアドレス(FA:172.16.1.10)を追加しています。LSA内の各ネットワークアドレス(LS IDをネットワークマスクでマスキングして算出)をCandidate listに追加します。この時コストはAS-external-LSAで指定されているコスト(10)をそのまま使用します。ネクストホップはフォワーディングアドレス(172.16.1.10)をルーティングテーブルで求めて同じものを使用します。このネットワークでは結果的にケース1と同じになります。フォワーディングアドレスの効果的な使い方は「OSPFのLSA」のページのAS-external-LSAで説明しています。

Candidate listからShortest-path treeに移動します。Candidate listに登録された時点で重複はないはずなのですべてのAS外部LSAをShortest-path treeに移動します。ルーティングテーブルは2つのタイプのコストを表すように拡張して両方のコストを表示しています。

これでAS外ルートならびに内部ルートの計算は終了ですが、RFC2328ではこれ以外にも新しい選択基準を考えなければならない場合があります。詳しくは補足のRFC1583Compatibilityを参照してください

■ABRの計算

ここからはABRが行うルート計算について説明します。

計算ネットワーク

計算で使用するネットワークは内部ルータの計算で使用したもと同じネットワークを使用します。

計算ルータと使用するLSA

計算ルータはR4で、R4がもつLSAは下図に示したものを使用していきます。下図の青矢印はR4の計算結果のルートです。R4はABRとして2つのエリアに属しているため、それぞれエリア内のルート計算が必要となります。エリア内の計算は上で説明した通りのため、ここではABRがどのようにエリア間情報を作成するかについて説明していきます。またルート集約についても説明します。

ABRのルール

Summary-LSAの作成とルート計算には以下のルールが存在します。

Summary-LSA作成

・ルーティングテーブル内のエリア内ルートのSummary-LSAをバックボーンエリアに作成

・ルーティングテーブル内のエリア内ルートとエリア間ルートに対するSummary-LSAを非バックボーンエリアに作成

ルート集約

ルート集約はエリアデータ構造の「List of area address ranges」で指定された範囲を集約します。例えばエリア1の「List of area address ranges」に10.1.0.0/16でAdvertiseの情報が入っている場合、ABRはエリア0に対して10.1.0.0/16のSummary-LSAのみを送信することになります。この時のコストは範囲に含まれるネットワークのLSAの最大のコストです。もし集約と同じ範囲のルート情報を持つSummary-LSAを他のルータから受け取ったとしてもそのLSAは計算対象には含みません。

ルート計算

ルート計算で使用するSummary-LSAはバックボーンエリアのSummary-LSAのみを対象とする

ルーティングテーブルに登録するルート情報の優先順位

1)エリア内ルート

2)エリア間ルート

3)AS外ルート(タイプ1)

4)AS外ルート(タイプ2)

5)エリア内ASBR経由のAS外ルートを優先、その他は同位(RFC1583Compatibility無効の場合。デフォルトは有効)

6)最小コスト

エリア内ルート

1)ABRであるR4は各エリアの内部ルータでもあるため、内部ルータの計算で説明したのと同じ手順でエリア1とエリア0のルートを計算します。使用するLSAはそれぞれのエリアのルータLSAとNetwork-LSAです。計算した結果が下図のようになります。この状態からエリア間ルートを計算していきます。

エリア間ルートの作成

2)R4はABRであるためルーティングテーブルからSummary-LSAを作成し各エリアに対して配布します。下図ではそれぞれのエリア内ルートが他方のエリアに対してSummary-LSAが作成されて配布されている様子を表しています。エリア1にはエリア0の10.0.1.0/24のルートのSummary-LSAが作成されます。エリア1には「List of area address ranges」で指定された10.1.0.0/16のSummary-LSAが作成されます。集約したルート情報のコストは一番大きなコスト値を使用します。そして作成したSummary-LSAを同期によってエリア内に配布します。この時、配布元のABRもルート計算を行います。配布したSummary-LSAはABR自身が作成したものですが、各エリアからすると新しいLSAを受信したのと同じです。そのためABR上でも自分の作成したSummary-LSAを使用したエリア内のルート計算を行います。しかし作成元が自分自身であるため計算対象に含まれることなく終了します。

エリア間ルートの受信と作成(Summary-LSA)

3)前の手順でSummary-LSAを送信したのと同様にR4はエリア0からSummary-LSAを受信します。受信したSummary-LSAはエリア0のエリア間ルート(エリア2の情報)であるため下図のようにLSDBに登録されて、エリア0のルート計算の結果がルーティングテーブルに登録されます。これは内部ルータの計算で説明している方法です。

そしてR4はABRであるためルーティングテーブルからSummary-LSAを作成し各エリアに対して配布します。「ABRのルール」で説明しているようにABRが作成するSummary-LSAはバックボーンエリアに対してはルーティングテーブル内のエリア内ルートを対象とし、非バックボーンエリアに対してはルーティングテーブル内のエリア内ルートとエリア間ルートを対象とします。下図ではルーティングテーブルからエリア0のルート情報を元にSummary-LSAがエリア1に作成されて配布されている様子を表しています。エリア0に作成されるSummary-LSAはありません。

Summary-LSAが作成されるのと同時にR4でもエリア1のルート計算が行われますが作成元が自分であること、またABRが計算対象として使用するSummary-LSAはエリア0のSummary-LSAだけであるため、計算対象となるSummary-LSAは存在せず変化しません。

このネットワークのエリア1はノーマルエリアですが、もし配布先がスタブエリアの場合はルート情報の一部もしくはデフォルトルートを配布することができます。

エリア間ルートの受信と作成(ASBR-Summary-LSA)

4)R4はエリア0からASBR Summary-LSAを受信します。ASBR-Summary-LSAはSummary-LSAの一部であるため考え方は前の手順と同じです。受信したASBR Summary-LSAはエリア0のエリア間ルートであるため下図のようにLSDBに登録されてエリア0のルート計算の結果がルーティングテーブルに登録されます(Summary-LSAは図から省いています)。これは内部ルータの計算で説明している方法です。

そしてR4はABRであるためルーティングテーブルからASBR-Summary-LSAを作成しエリア1に対して配布します。下図ではルーティングテーブルからエリア0のASBRのルートを元にASBR-Summary-LSAがエリア1に作成されて配布されている様子を表しています。

ASBR-Summary-LSAが作成されるのと同時にR4でもエリア1のルート計算が行われますが作成元が自分であること、またABRが計算対象として使用するSummary-LSAはエリア0のSummary-LSAだけであるため、計算対象となるASBR-Summary-LSAは存在せず変化しません。

このネットワークのエリア1はノーマルエリアですが、もし配布先がスタブエリアの場合はASBR-Summary-LSAは作成されません。またバーチャルリンクを通じた同期も行われません。

AS間ルートの受信と転送

5)R4はエリア0からAS-External-LSAを受信します。受信したAS-External-LSAはAS間の情報であるためエリアには関係なく下図のようにLSDBに登録されてルート計算の結果がルーティングテーブルに登録されます。これは内部ルータの計算で説明している方法です。

AS-External-LSAはAS内で唯一な情報として伝搬されるためABRであるR4でも何の変更も加えられずエリア1に配布されます。

このネットワークのエリア1はノーマルエリアですが、もし配布先がスタブエリアの場合は配布は行われません。またバーチャルリンクを通じた同期も行われません。

ここまででR4のルート計算は完了となります。最終的にR4が保持するルーティングテーブルは上図、LSAは下図のようになります。

■バーチャルリンクを持つABRの計算

ここからはバーチャルリンクを持つABRのルート計算について説明します。前提として内部ルータとABRのルート計算を理解している必要があります。

計算ネットワーク

計算で使用するネットワークは内部ルータの計算で使用したもと同じネットワークを使用します。

計算ルータと使用するLSA

ここでは下図の構成で説明します。計算ルータはR1です。R1にエリア3を追加し、R1とR4をバーチャルリンクで接続します。R1は複数のエリアに接続するためABRとなりますが、エリア内の計算とABRの計算はそれぞれすでに説明済みのため、ここではバーチャルリンクを追加したことによる動作を焦点にして説明します。

LSA表現の変更

説明中に登場するLSAが多いため各LSAの図を以下のように簡略化しています。説明中は細かなルート計算は省略しているためコストは省きます。

注意点

バーチャルリンクを持つABRの動作は基本的にABRと同じですが、以下の点を留意します。

・バーチャルリンクはエリア0に属する

 バーチャルリンク自体がエリア0に属する回線であるため、バーチャルリンクを持つルータはエリア0に属することになります。つまりバーチャルリンクを持つルータは必ずABRとなります。

・複数のエリアを持つルータはABRとなる

 OSPF(RFC2328)の仕様ではエリア0に接続していなくても複数のエリアに属しているルータはABRとして動作します。

・バーチャルリンク特有の仕様

 バーチャルリンクにはAS-External-LSAは配信されません。またバーチャルリンクを使用する場合にはトランジットエリアにおいてエリア間ルートのみ最後に再計算が行われます。

・トランジットエリアの制限

 バックボーンエリアの集約ルートはトランジットエリアに配布できません。トランジットエリアには集約されないSummary-LSAが配布されます。

1-1)下図はこれまで説明してきたOSPFネットワークです。この段階ではR1にはバーチャルリンクは設定されておらず、エリア1の内部ルータとして動作しています。ここから行う動作は「内部ルータの計算」の続きであるため、LSDBとルーティングテーブルは同じものを持っています。

2-1)下図のようにR1の左にエリア3を追加します。するとR1は複数のエリアに接続することになるためABRとして動作し始めます。この時点ではR1にバックボーンエリアは存在していませんが、OSPFの仕様ではABRになるためにバックボーンエリアの有無は関係ないため複数のエリアに接続された時点でABRとしての動作を開始します。

2-2)ABRとなったR1はRouter-LSAにBビットを付加して発信しはじめます。この時点でのR1のLSDBとルーティングテーブルは下図のとおりです。LSDBにエリア3が作成されてR1自身のRouter-LSAが登録されます。そしてRouter-LSAからルーティングテーブルにエリア3のエリア内ルート情報(10.3.1.0/24)が登録されます。

2-3)次にR1はABRとしてルーティングテーブルから各エリアに対してSummary-LSAを作成します。この動作は「ABRの計算」で説明したのと同じ方法です。「ABRの計算」と異なるのは現時点でバックボーンエリアが存在しない点です。

次に、作成したLSAを元に各エリアでルート計算を行います。ただしABRのルールによるとエリア間ルートの計算ではエリア0のSummary-LSAだけが計算対象となりますが、R1にはエリア0が存在しないため作成したSummary-LSAはルート計算には用いられません。よってルーティングテーブルに変化はありません。

なお、ここで説明したバックボーンエリアに接続しないABRによるSummary-LSAの作成はネットワークの構成によって不具合を起こす可能性があるためRFC3509で修正されています。RFC3509を適用した場合にはこの手順2-3の動作はバーチャルリンクが接続しエリア0が作成された後(手順3-1の後)に実施されます。

3-1)ここでR1とR4にバーチャルリンクを設定します。するとR1では以下の処理が行われてバーチャルリンクが確立します。これは「内部ルータの計算」で説明している方法です。

R1での処理

・第一段階のルート計算中にV-bitがセットされたRouter-LSA(R4)を呼び出すとエリアデータ構造のTransitCapabilityをTRUEに設定します

・R1はバーチャルインターフェースを作成し自身のプロトコルデータ構造のVirtual links configured(バーチャルリンクのネイバールータID=R4)からルーティングテーブルのR4を検索して、その発信インターフェースのIPアドレス(10.1.1.1)をバーチャルインターフェースに設定します。

・遠方のネイバーとなるR4のIPアドレスにはR4のRouter-LSAの中からShortest-path treeのルート(root)を指し返しているリンクのIPアドレス(10.1.3.4)を設定します

この動作によりバーチャルリンクのネイバーに対するHelloの送信先と出力インターフェースが確定するためHelloパケットをR4に送信します。R4でも同様の処理が行われた結果、バーチャルリンクがアップし下図のようにLSDBにエリア0が作成されてR1のRouter-LSAが登録されます。そしてRouter-LSAからルーティングテーブルにエリア0のエリア内ルート情報(R4)が登録されます。

3-2)R1がエリア0と接続したことでバーチャルリンクを通じてエリア0のLSAの同期が行われます。同時にR1の他のエリアからのSummary-LSAの作成が行われます。エリア0の同期が完了するとR1は下図のようなLSAを保持することになります。LSDBのエリア0内の青字はバーチャルリンクを通じて受け取ったLSA、赤字はR1自身のルーティングテーブルから作成したSummary-LSAです(エリア1はルート集約を行っています)。赤字のSummary-LSAはルーティングテーブル内のエリア内ルートだけが対象となることに注意してください。これはABRのルールによるものです。

3-3)そしてR1はABRとしてエリア0のルート計算を行います。この計算の手順は「内部ルータの計算」で説明している方法で行います。まず、エリア0のRouter-LSAとNetwork-LSAを使用してルート計算を行いルーティングテーブルに登録します。次にSummary-LSAを使用して計算を行いますが、R1はABRであるためルート計算に使用するSummary-LSAはエリア0の物だけを使用します。Summary-LSAを使用した計算結果はルーティングテーブルに登録しますが、ルートの優先順位としてはエリア内ルートが優先されるため、他のエリアのエリア内ルートは上書きされません。結果として下図のようにエリア0の持つルートだけが登録されることになります。

上図のルーティングテーブルは下図のような意味になります。この中で青矢印はバーチャルリンクを経由しないルート、紫の矢印はバーチャルリンクを経由するルートです。エリア3とエリア1はR1にとってエリア内ルートであるためそのまま到達可能ですが、それ以外のルートはバーチャルリンクを経由することが前提のルートになっています。つまりエリア0とエリア2そしてASBRへのルートが書き換わってしまっています。ASBRへのルートが変わることによってAS外ルートも変わることになります。このような結果となるのはバーチャルリンクがエリア0に属する回線であることと、ABRのルールによってABRのルート計算時に考慮するエリア間ルート(Summary-LSA、ASBR-Summary-LSA)はエリア0のものだけを使用して計算されるためです。

つまりR1は上図のネットワークを下図のようにとらえています。論理的には正しいですが現実には合わない結論です。

3-4)上図の問題を直すためバーチャルリンクを持つABRでは通常のエリア内ルートの計算が終わった後に、トランジットエリア(エリア1)のエリア間ルート(Summary-LSA、ASBR-Summary-LSA)のみルート計算をやり直しその結果をルーティングテーブルに上書きします。この動作は1つ以上のトランジットエリアに接続するABR(R1、R4)で実行します。

その結果、バーチャルリンク(エリア0)に引っ張られていたルート情報が修正され、下図のようにエリア間ルートがエリア1を経由するルートを選択することになります。ただし、ここで説明してるネットワークではコストが変わらないため、実際のパケットルーティングに効果のある影響はありません。再計算が意味を持つケースはこの後説明します。

ここで説明したようにバーチャルリンクはエリア0を切り離すことのできない原則を順守するために欠くことのできない概念であることは間違いありませんが、実際のルーティングにおいて意味のあるルート情報を提供しません。バーチャルリンクはルータがエリア0に繋がっていることを証明することでエリア0のLSAを入手し通常のABRとして動作をするための免罪符的な役割となっています。

トランジットエリアの再計算が意味をもつケース

上で説明したバーチャルリンクを持つABRの再計算は以下のようなケースで効果的に働きます。

ケース1)バーチャルリンクよりも低いコストのルートがある場合

このケースはRFCで説明されている構成です。下図の場合、エリア1がトランジットエリアとなりR1とR4の間にバーチャルリンクが設定されています。この構成の場合R1から10.0.1.0/24へのルートは2つのルートA, Bが存在しますが、R1はトータルコストで劣るルートAだけを選択します。これはR1がABRであり、ABRのルールによってエリア0(バーチャルリンク)のSummary-LSAのみを計算対象とするためです。上で説明したようにトランジットエリアのエリア間ルートのみを再計算し上書きすることでルートBが選択されることになります。

ケース2)トランジットエリアに隣接するリモートエリアが複数ある場合

このケースは2つのリモートエリア同士のルーティングの構成です。下図の場合、エリア1がトランジットエリアとなりR1とR2の間、R3とR4の間にバーチャルリンクが設定されています。この構成の場合、エリア2とエリア3の間のルーティングはR1、R3共にルートAを選択することになります。理由はケース1と同じでエリア0のSummary-LSAのみを対象とするためです。そこでトランジットエリアのエリア間ルートのみを再計算し上書きすることでルートBが選択されることになります。

■補足

RFC1583Compatibility

RFC1583CompatibilityはOSPFv2の現行バージョン(RFC2328)から見た場合に後方バージョンであるRFC1583の仕様に合わせるかどうかの選択です。OSPFv2はいくつかのRFCによって改訂が行われていますが、RFC2178からはAS外ルートの計算に以下で説明するような新しい基準を導入しています。この新しい基準を使用する場合はRFC1583Compatibilityを無効に、使用しない場合はRFC1583Compatibilityを有効にします。RFC2328では有効がデフォルトです。このRFC1583Compatibilityの選択はルートの決定に影響するため、ループを防ぐためにすべてのOSPFルータで同じ設定にしておく必要があります。

計算基準の違い

RFC1583とRFC2328の計算基準の違いはAS外ルートの計算において非バックボーンエリアのルートを優先させるかどうかです。RFC1583におけるAS外ルートの計算はトータルコストの小さいルート情報を採用しますが、RFC2328ではコストによる比較の前に下表の基準を追加します。

新しい基準
・非バックボーンエリアのパスを最優先
・そのほかのパスは同じ優先度(コストに基づいて比較)

ルート情報の優先順位は次のようになります。5が追加した基準です。

1)エリア内ルート

2)エリア間ルート

3)AS外ルート(タイプ1)

4)AS外ルート(タイプ2)

5)エリア内ASBR経由のAS外ルートを優先

6)最小コスト

例えば下図の環境で2台のASBR(R2, R3)が共に192.168.1.0/24のAS-external-LSAを配布している状態で、R1がAS外ルートを計算する場合は以下のようになります。RFC1583仕様ではASBRまでのコストの一番小さいエリア0(R2)経由のルートを採用しますが、RFC2328仕様ではルート計算時に非バックボーンエリアのルートが優先されるためエリア1(R3)経由のルートが採用されます。

RFC1583の場合(RFC1583Compatibility有効)

 R2経由

RFC2328の場合(RFC1583Compatibility無効)

 R3経由

概念的には上記のとおりですが、実際のAS外ルートの計算ではフォワーディングアドレスの有無によって検索対象が異なります。つまり上記のルートの求め方はAS-external-LSAにフォワーディングアドレスが設定されていない(Forwarding Addressフィールドが0.0.0.0)場合はASBRに対するルート検索に適用され、設定されている場合はフォワーディングアドレスに対するルート検索に適用されます。