RIPやIGRPのようなディスタンスベクタ型ルーティングプロトコルはコンバージェンスが遅いことや,ルーティングループのような「弱点」があるため,ある程度以上の規模のネットワークでは使われなくなっています。そのためRIPの後継として作られたルーティングプロトコルがOSPFです。中規模以上のネットワークにも対応できるのが利点です。現在の主流である技術を盛り込んだ,高性能ルーティングプロトコルであるOSFPのしくみを覚えましょう。

リンクステート型ルーティングプロトコル

 第2回で説明したルーティングプロトコルの種別のうち,OSPFはリンクステート型に当てはまります。リンクステート型はディスタンスベクタ型のように「自分のルーティングテーブルに,隣のルータのルーティングテーブルを追加していく」方式と違い,「すべてのルータから情報を集め,現在のネットワークの構成を知る」方式です。

 リンクステート型は,「現在のネットワーク構成」を知るために,「すべてのルータから情報を集め」ます。その情報はルータにデータベースとして保管され,そこからSPF(Shortest Path First)アルゴリズムを使ってSPFツリーと呼ばれる構成図を作成します。この構成図からルーティングテーブルを作成します(図1)。

 図1 リンクステート型ルーティングプロトコル

 このように,構成図を作成してからルーティングテーブルを作るため,リンクステート型ではルーティングループが発生しにくくなっています。

 OSPFではリンクステート型ルーティングを実行するため,複数のテーブルやツリーを構成します。作成されるテーブルは以下の呼び方をします。

  • トポロジテーブル ・・・ トポロジデータベース,リンクステートデータベースとも呼ぶ。ルータから集めた情報が記載されている
  • ネイバーテーブル ・・・ 隣接関係を結んだOSPFルータの一覧表。この表にあるルータと情報を交換する
  • SPFツリー ・・・ トポロジテーブルの情報から生成されるツリー。このツリーを基にルーティングテーブルが作成される
  • ルーティングテーブル ・・・ SPFツリーから生成される

 OSPFの特徴は次の通りです。

  • SPFツリーによりルーティングループが起こりにくい
  • イベントトリガアップデートによる高速なコンバージェンス
  • メトリックとして帯域幅を基本としたコストを使う
  • Helloを使ったネイバーの生存確認による障害の高速な検出
  • 認証機能を持つ
  • エリアを使った階層ルーティングによる効率化

ネイバー

 OSPFではRIPやIGRPのディスタンスベクタ型と違い,情報を交換するルータを特定してから情報を交換します。また,定期的にパケットをやりとりし,相手ルータの生存を確認してネットワーク構成の変化を監視します。この相手ルータのことをネイバーと呼びます。ネイバーとはそのルータが持つインタフェースの情報(リンクステート)を交換します。この情報をやりとりすることをアドバタイズと呼び,交換する情報をリンクステートアドバタイズメント(LSA)と呼びます。

 OSPFを動作させたルータは,マルチキャスト(224.0.0.5:全OSPFルータあて)でOSPFパケットを送信します。これをHello(ハロー)パケットと呼びます。受け取ったOSPFルータはHelloを送り返した後,双方の持つリンク情報を交換します。双方が同一の情報を持った状態のことを隣接関係(アジェイセンシ:adjacency)と呼びます(図2)。

 図2 ネイバーとのやりとり

 図2でも出てきましたが,OSPFで使われるパケットにはそれぞれ呼び名と役割があります。

  • Hello ・・・ ネイバーと隣接関係を結ぶために使う。また生存確認にも使う
  • DBD(Database Description) ・・・ データベースのやり取りに使う
  • LSR(LinkState Request) ・・・ アドバタイズの送信要求に使う
  • LSU(LinkState Update) ・・・ LSAをまとめたもの。リンクステート情報を渡す
  • LSAck(LinkState Acknowledgement) ・・・ LSUやDBDを受け取ったことを示す

 OSPFではルータを識別するために,ルータIDと呼ばれる番号を使用します。ルータIDは32ビットでIPアドレスと同様の表記をします。ルータIDは次の方法で決定されます。

  1. router-idコマンドで入力された値
  2. ループバックインタフェースの中で最も大きなIPアドレス
  3. 起動しているインタフェースの中で最も大きなIPアドレス

 例えば,FastEthernet0/0が192.168.1.1,Serial0が200.100.10.1のIPアドレスをもつルータで,router-idコマンドを使わず,ループバックインタフェースがない場合,200.100.10.1がルータIDになります。

 ループバックインタフェースは論理インタフェースの1つで,自分あてのインタフェースになります。ループバックインタフェースは1つでもインタフェースが稼働していれば,決してダウンしないインタフェースです。router-idコマンドがなく,ループバックインタフェースがない場合,ルータIDは「起動している」インタフェースの中から選ばれてしまいます。したがって障害時などでインタフェースがダウンすると,ルータIDが変更されてしまいます。ルータIDはOSPFで重要な値なので,変更が起こらないようにループバックインタフェースを使うことが多いです(図3図4)。

 図3 ループバックインタフェースの作成
ループバックインタフェースの作成

 図4 show interface loopback0
show interface loopback0