■OSPF概要
OSPF(Open Shortest Path First)はIGPと呼ばれているルーティング・プロトコルで日本で最も多く使われているダイナミックルーティングプロトコルです。このOSPFは、以下のような特徴を備えています。
- エリアの使用による階層型ネットワーク設計のサポート
- リンクステートデーターベースの使用によるルーティングループの可能性の低減
- クラスレスルーティングの動きを完全サポート
- 経路集約によるルーティングテーブルサイズの縮小
- 必要なときのみ更新情報を送信するネットワーク帯域幅の使用を削減
- マルチキャストパケット(224.0.0.5)を使用したOSPFが動いていないルータへの影響現象
- 認証のサポートによる安全なネットワークの実装
- RIPのような最大メトリック値(15)という制限がない
以下ではEthernetを前提としOSPFについて紹介できればと思いますがOSPFの全てを解説しようとすると膨大な量になってしまい、私自身エリア分けを必要とするぐらいの大規模なOSPFネットワークを構築した経験がないことからシングルエリアに限定した記事になります。端末数が数千台、セグメント数が200程度のネットワークであってもエリア0だけで十分事足ります。
■OSPF用語
OSPFで使用する用語を以下に示します。
用語 | 説明 |
近隣ルータ | OSPFプロセスが動いていて同じエリアに割り当てられた隣接インターフェイスを持つ接続ルータです。 近隣ルータを見つけるにはマルチキャスト(224.0.0.5)を使ったHelloパケットを使います。 |
隣接関係 | ルータとそれに対応する代表ルータやバックアップルータとの論理的な接続です。 |
リンク | OSPFにおけるリンクとはインターフェイスと同義です。 |
LSA | リンクステートアドバタイズメント(link-state advertisement : LSA)とは OSPFルータ同士で共有されるリンクステート情報やルーティング情報の入ったOSPFデータパケットです。 |
LSR | リンクステートリクエスト(link-state request)とはLSAの送信要求です。 |
LSU | リンクステートアップデート(link-state update)とは OSPFに変更があった場合に送信するマルチキャストです。 |
代表ルータ | 代表ルータ(designated router : DR)は形成される隣接関係の数を最小限にするため セグメントごとに選出されセグメントの残りのルータとルーティング情報の送受信が行われます。 |
バックアップルータ | 代表ルータのスタンバイルータです。 代表ルータと同じくセグメントごとに選出されます。 バックアップルータはOSPFルータから全てのルーティング更新を 受信しますがLSA更新のフラッディングは行いません。 |
OSPFエリア | エリアは階層型ネットワークを確立するために使われます。詳細は後述。 |
内部ルータ | 自分の全インターフェイスが1つのエリアに参加しているルータです。 |
エリア境界ルータ | 複数のエリアが割り当てられているルータでABR(area border router : ABR)と呼ばれます。 |
AS境界ルータ | OSPF以外の外部ネットワークなどに接続されたOSPFルータでASBR(as boundary router : ASBR)と呼ばれます。 |
ルータID | OSPFでルータを識別するための番号です。 CiscoではルータIDを任意に定義することができ未設定の場合はループバックIPが適用され、 ループバックも設定されていない場合は全インターフェイスの最上位のIPアドレスが適用されます。 |
■OSPFの動作
OSPFの動作は大きく分けて以下の3つに大別することができます。
- 近隣ルータと隣接関係の初期化
- LSAフラッティング
- SPFツリーの計算
基本的な動作は以下のようになります。
用語 | 説明 |
近隣ルータと隣接関係の初期化 | OSPFルータがHelloパケットを送信します。 他のOSPFルータがHelloパケットに設定してあるパラメータに同意した場合、 ルータ同士は近隣ルータとなります。 |
LSAフラッティング | OSPFルータがLSAを送信します。 LSAを受信したルータは受け取った情報をLSDBに記録して そのLSAをさらに近隣ルータに転送します。 |
SPFツリーの計算 | 全てのLSAを受信したら各ルータはSPFアルゴリズムを実行して宛先への最短パスを学習します。 それぞれのルータはこの情報を使って自分のSPFツリーを作ります。 そしてSPFツリーの持つ情報がルーティングテーブルにのるために使用されます。 |
■近隣ルータと近隣関係の初期化
Helloパケットは近隣ルータを発見して隣接関係を確立するために使われます。Helloパケットには送信元ルータに関する多くの情報が含まれており、デフォルトで10秒間隔でマルチキャストされます。Helloパケットに含まれるデータについてはルータID、エリアID、認証情報など多岐に渡り共通のOSPFヘッダーで運ばれます。
そしてHelloパケットに含まれるパラメータが一致した場合、隣接関係を確立するわけですがルータ同士の近隣状態には以下の7つのステータスが存在します。
状態 | 説明 |
Down | Helloパケットが受信されない。 |
Init | Helloパケットを受信したが、Helloパケットに自分がはいっていない状態で双方向通信がまだ確立していない状態。 |
2Way | Neighborフィールドに自分のルータIDの入ったHelloパケットを受信し双方向通信が確立した状態。 |
ExStart | 隣接関係形成のためDD (Database Description : データベース記述)パケットの交換を行って マスター/スレーブの関係が確立され代表ルータ(DR)が選出されます。 |
Exchange | DDパケットやLSRパケットを使ってルーティング情報が交換されます。 |
Loading | リンクステート要求(LSR)パケットを近隣ルータに送ってExchange状態の間に発見された新しいLSAを要求します。 |
Full | 隣接した近隣ルータ同士で全てのLSA情報の同期をとる。 |
上記をよりわかりやすくするために以下にフローチャート形式の図にしてみました。
近隣ルータが特定されると隣接関係を確立してルーティング(LSA)情報を交換できるようにする必要があります。近隣のルータをOSPFに参加させるには以下のステップが必要です。
- 双方向通信を確立(Helloにより実現)
- データベースの同期(ルータ間で交換される次の3パケットで実現)
- データーベース記述(DD)パケット
- リンクステート要求(LSR)パケット
- リンクステート更新(LSU)パケット
データーベースが同期されれば隣接関係にあるとみなされます。
OSPFネットワーク上にはDRとBDRとDROtherの3種類存在します。DROtherルータとはDRやBDRと同じネットワークに属しますがLSAによりネットワークを代表することのないルータで、隣接関係が形成されるのはDR/BDRとDROtherの間のみです。DROtherルータ同士は隣接関係を結びませんので注意してください。イメージ的には下記のようになります。
■DRとBDR(代表ルーター)の選出
各OSPFインターフェイスにはルータプライオリティが設定可能でデフォルトで1が設定されています。DRまたはBDRに選出させたくない場合はプライオリティ値を0に設定することでそれが可能となります。プライオリティはDR/BDRを選出する際に重要な値となります。以下がDR/BDR選出のステップとなります。
1. 適切なルータリストが作成される。適切とは以下の基準を満たしているルータ。
- プライオリティが0より大きい
- OSPFの状態が2Wayである
- DRまたはBDRのIPアドレスが参加インターフェイスのIPアドレスと同一セグメントである
2. DRになることを主張していない全てのルータのリストが1のリストを元に編集される
3. BDRが次の基準をもとに2のリストから選ばれる
- ルータプライオリティの最も高いルータがBDRになる
- 全てのプライオリティが等しい場合は最上位のルータIDを持つルータがBDRになる
4. DRは次の基準を元に残りの適格なルータから選ばれます。
- DRフィールドにルータのインターフェイスIPアドレスが設定されている
- プライオリティの最も高いルータがDRに選ばれる。プライオリティが同じ場合は最上位のルータIDを持つルータが選ばれる
- 残りのルータがDRになることを主張していない場合はBDRがDRとなり、再度BDRを選出するため3が繰り返される
ただし、上記はあくまで同一セグメントで複数のルータが同時にアクティブになろうとしたときのステップです。既にDRやBDRが存在している場合はプリエンプト的な動きをするわけではなく下克上が行われるわけではありません。さらにいうと、セグメント上に一つしかルータが存在しない場合はそれが必ずDRとなり次のルータがBDRとなります。DRやBDRがいれかわるのは現行のDR/BDRがダウンした場合に上記のフローが実行され再選出されます。
■LSAフラッディング
LSAフラッディングとはOSPFがルーティング情報を共有するための方法です。LSUパケットによりリンクステートデータを含むLSA情報が全てのOSPFルータと共有されます。ネットワークトポロジーはLSA更新から作成され、フラッディングが使われるのは全てのOSPFルータがトポロジーマップを持ちそれを使ってSPF計算が行われるようにするためです。
フラッディングの際に使われるマルチキャストアドレスが以下のものです。
マルチキャストアドレス | 説明 |
224.0.0.5 | AllSPFRouters |
224.0.0.6 | AllDR |
図で表すと以下のようになります。
OSPFルータの一台に何かしらイベントが発生した場合、上記のように各ルータに通知が行われます。LSUパケットがDR/BDRに送信され、DRから各ルータにLSAがフラッディングされるという動きとなります。
各ルータとDR間では上記のやりとりが行われます。この後にLSUを受信したルータでLSDBを生成しルーティングテーブルは作成されます。
またLSAを生成しLSUをDRに送るタイミングは次の通りです。
・LSAのageフィールドがLS Refresh Timeのデフォルト値(1800秒)に到達したとき
・ルーターのインターフェイスの状態が変化したとき
・DR(代表ルーター)が変更されたとき
・隣接ルーターがfullstateになったとき(もしくはなくなったとき)
上記のタイミングで各ルータはDRにLSUを送信し、以下の流れでルーティングテーブルは維持されます。
①LSU パケットを受信した DR は LSU を送信した OSPF ルータに LSAck を送信。その後、DR は 224.0.0.5 ( 全 OSPF ルータ ) へ
※ LSU をフラッディングする。
②LSU を受信したルータは、LSDB を アップデートして、それを元に SPF アルゴリズムにより、新しいルーティングテーブル を作成する。
隣接関係にあるTwo-way Stateでは10秒間に1回ごとにHelloパケットを流し隣接関係を維持しDead インターバルである 40 秒以内に応答がなければ、リンクがダウンしていると見なされます
■SPFツリー計算
SPF最短パス優先ツリーはネットワークを通ってある宛先までのパスです。OSPFが認識する宛先は2つのタイプがあり、それはネットワークとルータです。ルータの宛先には具体的にはエリア境界ルータ(ABR)とAS境界ルータ(ASBR)宛のものです。
全てのOSPFルータがリンクステートデーターベースを同期し終わると各ルータが既知の宛先にそれぞれに関するSPFツリーを自分で計算することになります。計算はダイクストラアルゴリズムを使って行われます。計算するには各リンクのメトリックが必要となります。
■OSPFメトリック
OSPFはコストというメトリックを使用します。コストはSPFツリーに沿った出力インターフェイスに関連します。CiscoはOSPFが有効になった各インターフェイスのコストを計算するための独自の実装しています。Ciscoは100M÷帯域幅という簡単な式を使用します。帯域幅とはインターフェイスに設定された帯域幅です。各帯域幅ごとのコストは以下のようになります。
帯域 | コスト |
10M | 100M÷10M=10 |
100M | 100M÷100M=1 |
1G | 100M÷1G=0.1=1 (※) |
10G | 100M÷10G=0.01=1 (※) |
※小数点以下は繰り上げになるため1となる。
上記のようにデフォルトの状態ですと100M以上のインターフェイスだとすべて同一コストとなってしまいます。100M/1G/10Gで優劣をつけるために分母の100Mという数字を変更するにはauto-cost reference-bandwidthコマンドを使用します。
またコスト値はip ospf costコマンドを使って上書きすることも可能です。コストを操作するには値を1~65535の範囲で指定します。コストは各リンクに割り当てられるため値は各インターフェイス上で設定する必要があります。また、宛先までのコストを計算する際、発信インターフェイスを元に計算されます。