【OSPF】概要と隣接関係

 ダイナミックルーティングプロトコルとして、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

コメント