ダイナミックルーティングプロトコルとして、OpenShortest Path First (OSPF) は本番環境で一番使われているのではと思います。 この記事ではOSPFの概要をまとめます。
OSPFの概要
OSPFは、RFC 2328 “OSPF Version 2”で定義されているリンクステート型プロトコルです。最短パス・ファースト(SPF)としても知られるダイクストラアルゴリズムを使用し、帯域幅より求められるコストに基づいて最短経路が計算されます。
エリアという概念があり、同じエリアのルータ間では、ネットワーク全体のトポロジ情報を共有し、ダイクストラアルゴリズムにより、ルーティングループが発生することなく、最短パスが計算されます。エリア 0(または 0.0.0.0)は OSPF ネットワークのコアまたはバックボーンエリアを表し、単一エリア構成では全てのルータはエリア0を所属します。
エリア0に属しているルータをバックボーンルータと呼びます。
その他のエリア(エリア1、エリア2など)は、バックボーンのエリア0に接続する必要があります。
エリア0とエリア1のように、複数のエリアに属しているルータをエリア ボーダー ルーター(ABR)と呼びます。 ABRでは、各エリアのトポロジ情報を他エリアへサマリーして広告します。
OSPFの動作の流れ
ルータ間でOSPFによりトポロジ情報を交換し、ルーティングテーブルが構築されるまでの大きな流れは以下のようになります。
OSPFの隣接(ネイバー)の発見とトポロジ情報交換
OSPFが有効なインタフェースからマルチキャスト224.0.0.5宛にOSPFのHelloパケットが送信されます。このマルチキャストを使用することで、動的に隣接ルータを発見します。
Helloパケットには複数パラメータ(エリア、ルータID等)が含まれ、ルータ間で整合性が確認されます。
- ルータID :ルーターを識別するID。アクティブな物理インターフェイスの最も高いIPアドレスがルータIDとなります。ただし、ループバックインターフェイスがある場合は、IPアドレスの高低に関わらず、ループバックのアドレスがルータIDとして選定されます。
- エリア番号:自身のエリア番号。この値は、ネイバーとなるルータ間で一致する必要があります。
- サブネット:インタフェースに設定されているサブネット。この値は、ネイバーとなるルータ間で一致する必要があります。
- Helloインターバル:helloパケットの送信間隔。デフォルトは10秒です。この値は、ネイバーとなるルータ間で一致する必要があります。
- Deadインターバル:このインターバルの間、隣接ルータからHelloパケットを受信しないと、隣接関係を解消します。Helloパケットの送信間隔の4倍の40秒がデフォルトです。この値は、ネイバーとなるルータ間で一致する必要があります。
整合性が確認されると、ルータ間はトポロジ情報を交換しあい、隣接関係を結びます。
- Down – 初期状態。まだ、Helloパケットを受信もしていません。Helloパケットの送信はできます。
- Init – Helloパケットを受信したが、パケット内のActive Neighborに自身のルータIDが含まれていない状態です。
- 2-Way – ルータ間双方向でHelloパケットを受信できた状態です。お互いのルータが、受信したHelloパケットのActive Neighborに自分のルータIDが含まれていることを示します。
- Exstart – DRとBDRが選出後、ルータがDR/BDR間でリンク状態情報を交換開始する状態です。
- Exchange – ルータ間で、データベース記述子 (DBD) パケットを交換します。データベース記述子 (DBD)は、リンク状態情報の要約です。
- Loading – データベース記述子 (DBD)の情報を元に、LSR(リンク状態要求)およびLSU(リンク状態更新)パケットの交換しています。
- Full – ルータ間でLSAのデータベースが完全に同期され、隣接関係が結ばれます。
以下は、上記の状態のデバッグ結果です。(タイムラインは省略しています)
R2#debug ip ospf adj OSPF adjacency debugging is on OSPF-1 ADJ Fa0/0.23: Nbr 3.3.3.3: Clean-up dbase exchange OSPF-1 ADJ Fa0/0.23: Neighbor change event OSPF-1 ADJ Fa0/0.23: DR/BDR election OSPF-1 ADJ Fa0/0.23: Elect BDR 2.2.2.2 OSPF-1 ADJ Fa0/0.23: Elect DR 2.2.2.2 OSPF-1 ADJ Fa0/0.23: Elect BDR 0.0.0.0 OSPF-1 ADJ Fa0/0.23: Elect DR 2.2.2.2 OSPF-1 ADJ Fa0/0.23: DR: 2.2.2.2 (Id) BDR: none OSPF-1 ADJ Fa0/0.23: Remember old DR 3.3.3.3 (id) OSPF-1 ADJ Fa0/0.23: 2.2.2.2 address 192.168.23.2 is dead, state DOWN OSPF-1 ADJ Fa0/0.23: Neighbor change event OSPF-1 ADJ Fa0/0.23: DR/BDR election OSPF-1 ADJ Fa0/0.23: Elect BDR 0.0.0.0 OSPF-1 ADJ Fa0/0.23: Elect DR 0.0.0.0 OSPF-1 ADJ Fa0/0.23: Elect BDR 0.0.0.0 OSPF-1 ADJ Fa0/0.23: Elect DR 0.0.0.0 OSPF-1 ADJ Fa0/0.23: DR: none BDR: none OSPF-1 ADJ Fa0/0.23: Flush network LSA immediately OSPF-1 ADJ Fa0/0.23: Remember old DR 2.2.2.2 (id) OSPF-1 ADJ Lo0: Interface going Up OSPF-1 ADJ Fa0/0.23: Interface going Up OSPF-1 ADJ Fa0/0.23: 2 Way Communication to 3.3.3.3, state 2WAY OSPF-1 ADJ Fa0/0.23: Backup seen event before WAIT timer OSPF-1 ADJ Fa0/0.23: DR/BDR election OSPF-1 ADJ Fa0/0.23: Elect BDR 2.2.2.2 OSPF-1 ADJ Fa0/0.23: Elect DR 3.3.3.3 OSPF-1 ADJ Fa0/0.23: Elect BDR 2.2.2.2 OSPF-1 ADJ Fa0/0.23: Elect DR 3.3.3.3 OSPF-1 ADJ Fa0/0.23: DR: 3.3.3.3 (Id) BDR: 2.2.2.2 (Id) OSPF-1 ADJ Fa0/0.23: Nbr 3.3.3.3: Prepare dbase exchange OSPF-1 ADJ Fa0/0.23: Send DBD to 3.3.3.3 seq 0x61 opt 0x52 flag 0x7 len 32 OSPF-1 ADJ Fa0/0.23: Rcv DBD from 3.3.3.3 seq 0xDC3 opt 0x52 flag 0x7 len 32 mtu 1500 state EXSTART OSPF-1 ADJ Fa0/0.23: NBR Negotiation Done. We are the SLAVE OSPF-1 ADJ Fa0/0.23: Nbr 3.3.3.3: Summary list built, size 0 OSPF-1 ADJ Fa0/0.23: Send DBD to 3.3.3.3 seq 0xDC3 opt 0x52 flag 0x0 len 32 OSPF-1 ADJ Fa0/0.23: Rcv DBD from 3.3.3.3 seq 0xDC4 opt 0x52 flag 0x1 len 72 mtu 1500 state EXCHANGE OSPF-1 ADJ Fa0/0.23: Exchange Done with 3.3.3.3 OSPF-1 ADJ Fa0/0.23: Send LS REQ to 3.3.3.3 length 48 LSA count 2 OSPF-1 ADJ Fa0/0.23: Send DBD to 3.3.3.3 seq 0xDC4 opt 0x52 flag 0x0 len 32 OSPF-1 ADJ Fa0/0.23: Rcv LS UPD from 3.3.3.3 length 144 LSA count 2 OSPF-1 ADJ Fa0/0.23: Synchronized with 3.3.3.3, state FULL %OSPF-5-ADJCHG: Process 1, Nbr 3.3.3.3 on FastEthernet0/0.23 from LOADING to FULL, Loading Done OSPF-1 ADJ Fa0/0.23: Neighbor change event OSPF-1 ADJ Fa0/0.23: DR/BDR election OSPF-1 ADJ Fa0/0.23: Elect BDR 2.2.2.2 OSPF-1 ADJ Fa0/0.23: Elect DR 3.3.3.3 OSPF-1 ADJ Fa0/0.23: DR: 3.3.3.3 (Id) BDR: 2.2.2.2 (Id)
SPFアルゴリズムによる最短パスの計算
ルータ間で共有されたトポロジ情報を元にSPFアルゴリズムを使用して、最短パスを計算し、ルーティングテーブルに登録します。
R2#sh ip route ospf
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
+ - replicated route, % - next hop override
Gateway of last resort is not set
3.0.0.0/32 is subnetted, 1 subnets
O 3.3.3.3 [110/2] via 192.168.23.3, 00:03:07, FastEthernet0/0.23
隣接関係の維持
ルータ間で、隣接関係が維持されるよう、ルータ間で定期的にHelloパケットが送信されます。 以下、デバッグではデフォルトの10秒間隔で送信されていることがわかります。
R2#debug ip ospf hello OSPF hello debugging is on *Jun 13 12:21:22.007: OSPF-1 HELLO Fa0/0.23: Send hello to 224.0.0.5 area 0 from 192.168.23.2 *Jun 13 12:21:27.491: OSPF-1 HELLO Fa0/0.23: Rcv hello from 3.3.3.3 area 0 192.168.23.3 *Jun 13 12:21:31.615: OSPF-1 HELLO Fa0/0.23: Send hello to 224.0.0.5 area 0 from 192.168.23.2 *Jun 13 12:21:36.799: OSPF-1 HELLO Fa0/0.23: Rcv hello from 3.3.3.3 area 0 192.168.23.3 *Jun 13 12:21:40.791: OSPF-1 HELLO Fa0/0.23: Send hello to 224.0.0.5 area 0 from 192.168.23.2 *Jun 13 12:21:45.815: OSPF-1 HELLO Fa0/0.23: Rcv hello from 3.3.3.3 area 0 192.168.23.3
コメント