エリア内のOSPFルータはLSDBの同期を確保する

同一エリア内のすべてのOSPFルータは、同一のLSDBを持っています。つまり、LSDBの同期を確保します。LSDBの同期処理は、アジャセンシーを形成している2台のOSPFルータ間で行うことが基本です。

イーサネット上で、アジャセンシーとなる2台のOSPFルータ間でのLSDB同期処理について解説します。

LSDBの同期処理

以下のネットワーク構成のR1とR2でLSDBの同期を確保する様子を見ていきましょう。

図 OSPF LSDBの同期 ネットワーク構成
図 OSPF LSDBの同期 ネットワーク構成

OSPFのLSDBの同期を確保する処理の流れは次の通りです。

  1. Helloパケットでネイバー/アジャセンシーの確立
  2. DDパケットの交換
  3. LSR/LSU/LSAckパケットでLSAのアドバタイズ

Helloパケットでネイバー/アジャセンシーの確立

Helloパケットによって、同じネットワーク上のOSPFルータであるネイバーを発見します。

R1から先にHelloパケットを送信したと仮定します。はじめは、R1のHelloパケットのネイバーリストには何も含まれていません。R2がHelloパケットを受信することで、同じネットワーク上のOSPFルータであるR1の存在を認識して、ネイバーテーブルにR1を登録します。このとき、R2のネイバーテーブル上でR1は「INIT」の状態となります。

R2からHelloパケットを送信するときに、ネイバーリストにはR1のルータID 1.1.1.1が含まれます。R1は、R2からのHelloパケットを受信することでR2の存在を認識して、ネイバーテーブルにR2を登録します。また、R1から送信するHelloパケットのネイバーリストにはR2のルータIDが記されます。こうしてR1とR2がお互いを認識した状態が「2WAY」です。

そして、イーサネットのようなマルチアクセスネットワークでは、DR/BDRを選出します。PriorityからR1がDRとなり、R2がBDRです。DR/BDRを選出すると、HelloパケットにそれぞれのIPアドレスが含まれます。

図 OSPF LSDBの同期 その1
図 OSPF LSDBの同期 その1

DDパケットの交換

R1とR2でLSDBの同期をとるためには、それぞれのLSDB内に含まれているLSAがわからなければいけません。DD(Database Description)パケットによって、R1とR2は自身のLSDBに含まれるLSAの要約情報を教え合います。LSAの要約情報とは、LSAのヘッダ部分のみの情報です。

図 OSPF DDパケットの概要
図 OSPF DDパケットの概要

DDパケットを交換する際に、どちらから開始するかを決定します。それがマスタ/スレーブです。ルータIDが大きいルータがマスタになり、先にDDパケットを送信します。この例では、R2がマスタで、R1がスレーブです。マスタ/スレーブを決定している状態が「ExStart」です。

マスタのR2がDDパケットを送信して、自身のLSDB内に含まれるLSAのヘッダを通知します。そして、スレーブのR1がDDパケットを送信して、自身のLSDB内に含まれるLSAヘッダを通知します。DDパケットを交換している状態が「ExChange」です。

図 OSPF LSDBの同期 その2
図 OSPF LSDBの同期 その2

図では省略していますが、マスタ/スレーブを決定する際に中身のないDDパケットを交換しています。

LSR/LSU/LSAckパケットでLSAのアドバタイズ

DDパケットを交換することで、自身のLSDBに足りないLSAがわかります。LSR(Link State Request)パケットによって足りないLSAをリクエストします。LSU(Link State Update)で、LSRによりリクエストされたLSAをアドバタイズします。そして、LSUを受信すると、LSAckで受信確認します。LSAckは受信したLSAのヘッダ部分のみを含んでいます。

R1はLSRで、足りないLSAを要求して、R2からLSUでLSAを送ります。R1はLSUを受信したらLSAckを返して、受信できたことを通知します。同様にR2はLSRで、R2に足りないLSAを要求します。そして、R1からLSUでLSAを送ります。R2はLSAckで受信確認します。そうすると、最終的にR1とR2のLSDBが同じ内容になり、LSDBの同期が完了します。

LSR/LSU/LSAckでLSDBの同期をとっている状態が「LOADING」です。そして、LSDBの同期が完了した状態が「FULL」です。

図 OSPF LSDBの同期 その3
図 OSPF LSDBの同期 その3

LSDB同期のdebug出力とパケットキャプチャ

Ciscoルータでは、debug ip ospf adjコマンドでLSDB同期の様子をコンソール上で確認できます。ここまで解説したR1において、debug ip ospf adjコマンドでLSDB同期の様子を確認すると、以下のような出力です。

debug ip ospf adjの出力例

R1(config-if)#do debug ip ospf adj
OSPF adjacency events debugging is on
R1(config-if)#no shutdown
R1(config-if)#
*Mar  1 00:33:47.327: OSPF: Interface FastEthernet0/0 going Up
*Mar  1 00:33:47.831: OSPF: Build router LSA for area 0, router ID 1.1.1.1, seq 0x80000002, process 1
R1(config-if)#
*Mar  1 00:33:49.307: %LINK-3-UPDOWN: Interface FastEthernet0/0, changed state to up
*Mar  1 00:33:50.307: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/0, changed state to up
R1(config-if)#
*Mar  1 00:33:56.607: OSPF: 2 Way Communication to 2.2.2.2 on FastEthernet0/0, state 2WAY
R1(config-if)#
*Mar  1 00:33:58.147: OSPF: end of Wait on interface FastEthernet0/1
*Mar  1 00:33:58.147: OSPF: DR/BDR election on FastEthernet0/1
*Mar  1 00:33:58.147: OSPF: Elect BDR 1.1.1.1
*Mar  1 00:33:58.147: OSPF: Elect DR 1.1.1.1
*Mar  1 00:33:58.147: OSPF: Elect BDR 0.0.0.0
*Mar  1 00:33:58.151: OSPF: Elect DR 1.1.1.1
*Mar  1 00:33:58.151:        DR: 1.1.1.1 (Id)   BDR: none
*Mar  1 00:33:58.651: OSPF: No full nbrs to build Net Lsa for interface FastEthernet0/1
R1(config-if)#
*Mar  1 00:34:27.331: OSPF: end of Wait on interface FastEthernet0/0
*Mar  1 00:34:27.331: OSPF: DR/BDR election on FastEthernet0/0
*Mar  1 00:34:27.331: OSPF: Elect BDR 1.1.1.1
*Mar  1 00:34:27.331: OSPF: Elect DR 1.1.1.1
*Mar  1 00:34:27.331: OSPF: Elect BDR 2.2.2.2
*Mar  1 00:34:27.331: OSPF: Elect DR 1.1.1.1
*Mar  1 00:34:27.331:        DR: 1.1.1.1 (Id)   BDR: 2.2.2.2 (Id)
*Mar  1 00:34:27.331: OSPF: Send DBD to 2.2.2.2 on FastEthernet0/0 seq 0x173A opt 0x52 flag 0x7 len 32
*Mar  1 00:34:27.831: OSPF: No full nbrs to build Net Lsa for interface FastEthernet0/0
R1(config-if)#
*Mar  1 00:34:29.575: OSPF: Rcv DBD from 2.2.2.2 on FastEthernet0/0 seq 0xFB1 opt 0x52 flag 0x7 len 32  mtu 1500 state EXSTART
*Mar  1 00:34:29.575: OSPF: NBR Negotiation Done. We are the SLAVE
*Mar  1 00:34:29.579: OSPF: Send DBD to 2.2.2.2 on FastEthernet0/0 seq 0xFB1 opt 0x52 flag 0x2 len 52
*Mar  1 00:34:29.623: OSPF: Rcv DBD from 2.2.2.2 on FastEthernet0/0 seq 0xFB2 opt 0x52 flag 0x3 len 52  mtu 1500 state EXCHANGE
*Mar  1 00:34:29.623: OSPF: Send DBD to 2.2.2.2 on FastEthernet0/0 seq 0xFB2 opt 0x52 flag 0x0 len 32
*Mar  1 00:34:29.651: OSPF: Rcv DBD from 2.2.2.2 on FastEthernet0/0 seq 0xFB3 opt 0x52 flag 0x1 len 32  mtu 1500 state EXCHANGE
*Mar  1 00:34:29.655: OSPF: Exchange Done with 2.2.2.2 on FastEthernet0/0
*Mar  1 00:34:29.655: OSPF: Send LS REQ to 2.2.2.2 length 12 LSA count 1
*Mar  1 00:34:29.655: OSPF: Send DBD to 2.2.2.2 on FastEthernet0/0 seq 0xFB3 opt 0x52 flag 0x0 len 32
*Mar  1 00:34:29.675: OSPF: Rcv LS REQ from 2.2.2.2 on FastEthernet0/0 length 36 LSA count 1
*Mar  1 00:34:29.675: OSPF: Send UPD to 192.168.12.2 on FastEthernet0/0 length 52 LSA count 1
*Mar  1 00:34:29.687: OSPF: Rcv LS UPD from 2.2.2.2 on FastEthernet0/0 length 76 LSA count 1
*Mar  1 00:34:29.687: OSPF: Synchronized with 2.2.2.2 on FastEthernet0/0, state FULL
*Mar  1 00:34:29.687: %OSPF-5-ADJCHG: Process 1, Nbr 2.2.2.2 on FastEthernet0/0 from LOADING to FULL, Loading Done
*Mar  1 00:34:30.067: OSPF: Rcv LS UPD from 2.2.2.2 on FastEthernet0/0 length 76 LSA count 1
*Mar  1 00:34:30.191: OSPF: Build router LSA for area 0, router ID 1.1.1.1, seq 0x80000003, process 1
*Mar  1 00:34:30.191: OSPF: Build network LSA for FastEthernet0/0, router ID 1.1.1.1
*Mar  1 00:34:30.191: OSPF: Build network LSA for FastEthernet0/0, router ID 1.1.1.1
R1(config-if)#
R1(config-if)#
*Mar  1 00:34:36.263: OSPF: Neighbor change Event on interface FastEthernet0/0
*Mar  1 00:34:36.263: OSPF: DR/BDR election on FastEthernet0/0
*Mar  1 00:34:36.263: OSPF: Elect BDR 2.2.2.2
*Mar  1 00:34:36.267: OSPF: Elect DR 1.1.1.1
*Mar  1 00:34:36.267:        DR: 1.1.1.1 (Id)   BDR: 2.2.2.2 (Id)
*Mar  1 00:34:36.267: OSPF: Neighbor change Event on interface FastEthernet0/0
*Mar  1 00:34:36.267: OSPF: DR/BDR election on FastEthernet0/0
*Mar  1 00:34:36.267: OSPF: Elect BDR 2.2.2.2
*Mar  1 00:34:36.271: OSPF: Elect DR 1.1.1.1
*Mar  1 00:34:36.271:        DR: 1.1.1.1 (Id)   BDR: 2.2.2.2 (Id)
R1(config-if)#do u all
All possible debugging has been turned off
R1(config-if)#

また、R1-R2間のLSDB同期の様子をWiresharkでキャプチャしたファイルを以下よりダウンロードできるようにしています。

最終的にはエリア内のすべてのOSPFルータでLSDBの同期をとる

ここまで、アジャセンシーを形成している2台のOSPFルータ間でLSDBの同期を確保する様子を見ています。最終的には、エリア内のすべてのOSPFルータでLSDBの同期をとることをきちんと把握しておきましょう。次の図のR1~R5のすべてのOSPFルータは、同じLSDBを持つことになります。

図 エリア内のすべてのOSPFルータはLSDBの同期をとる
図 エリア内のすべてのOSPFルータはLSDBの同期をとる

OSPFの仕組み