↓ メインコンテンツへスキップ
  1. ネットワーク 記事一覧/
  2. OSPF記事一覧/

OSPFの状態遷移

目次

OSPFの状態遷移とは

OSPFのルータは、同じリンク上のルータをHelloパケットで発見してから、LSDBを同期して隣接関係(アジャセンシー)を確立するまでの間に、いくつかの状態を順に通過します。この状態はネイバーごとに管理され、show ospf neighborのState欄に表示されます。

障害切り分けの場面では、「どの状態で止まっているか」が原因の切り分けにそのまま使えます。たとえばInitのままならHelloは届いているが相手に自分が見えていない、ExStartのままならMTUが一致していない、といった具合です。本記事では、各状態の意味と遷移のきっかけを整理し、実機(Cisco IOS XR)のログとパケットキャプチャで実際の遷移を確認します。パケットの中身についてはOSPFパケットの種類とヘッダーフォーマットを参照してください。

ネイバーの状態一覧

状態説明
DownネイバーからHelloを受信していない初期状態。Deadインターバルが満了してネイバーが消えたときもこの状態になる。
AttemptNBMAネットワークでのみ使われる状態。手動設定したネイバーに対してユニキャストでHelloを送り、応答を待っている。
InitネイバーからHelloを受信したが、そのHelloのネイバー一覧に自分のルータIDが含まれていない状態。通信が片方向でしか確認できていない。
2-WayネイバーのHelloに自分のルータIDが載り、双方向の通信が確認できた状態。マルチアクセスネットワークでは、この時点でDR/BDRの選出が行われる。
ExStartLSDBを同期する準備として、DBDを交換してマスター/スレーブと初期シーケンス番号を決めている状態。ルータIDが大きい方がマスターになる。
ExchangeDBDでLSDBの目次(LSAヘッダーの一覧)を交換している状態。
LoadingDBDで判明した不足分のLSAをLSRで要求し、LSUで受け取っている状態。
FullLSDBの同期が完了し、隣接関係が確立した状態。

パケットと状態の対応

各状態は、やり取りされるパケットと1対1で対応しています。

  • Init: 相手からHelloを受信した時点。まだ相手のHelloのネイバー一覧に自分のルータIDは載っていません。
  • 2-Way: 相手のHelloのネイバー一覧に自分のルータIDを見つけた時点。ここで双方向の通信が確認できます。
  • ExStart: 最初のDBD(I・M・MSビットがすべて1)を交換し、ルータIDの大きい方をマスターとして決めます。
  • Exchange: LSAヘッダーを載せたDBDを交換します。
  • Loading: 不足しているLSAをLSRで要求し、LSUで受け取ります。
  • Full: 要求したLSAをすべて受け取り、LSDBの同期が完了した時点。

状態はネイバーごとに独立して管理されるため、R1から見たR2の状態とR2から見たR1の状態は、遷移の途中では一致しないことがあります。

show ospf neighborに表示されるのは「自分から見た相手の状態」です。片側だけがExStartで止まっている、といった非対称な状態も起こりうるため、切り分けでは両側の出力を確認します。

2-Wayで止まるケース

マルチアクセスネットワークでは、DR・BDRのいずれでもないルータ(DROther)同士は隣接関係を結ばず、2-Wayのまま維持されます。これは異常ではなく、LSAの交換をDR経由に集約するためのOSPFの設計です。DROther同士がLSDBの同期を行わなくても、DRを介して同じLSAが配られるため、エリア内のLSDBは一致します。DR/BDRの選出については、DRとBDRを参照してください。

なお、ルータ2台だけが接続されたイーサネットリンクでは、片方がDR、もう片方がBDRになるため、両者はFullになります。

状態が進まないときに疑うポイント

止まる状態よくある原因
Down のままHelloが届いていない。インタフェースのダウン、OSPFの有効化漏れ、パッシブインタフェース設定、ACLによるブロックなど。
Init のまま片方向でしかHelloが届いていない。認証設定の不一致、片側のみのACL、マルチキャストが通らない構成など。
2-Way のまま(DROther以外)Helloパラメータの不一致。エリアID、Hello/Deadインターバル、サブネットマスク、スタブエリアのフラグなどが一致していないと、ネイバー関係が成立しない。
ExStart / Exchange を繰り返すインタフェースMTUの不一致が代表的な原因。DBDに載っているInterface MTUが自身のMTUより大きいと、受信側はそのDBDを破棄する。状態は固定されず、Init・2-Way・ExStart・Downを繰り返す(後述の検証)。
Loading のまま要求したLSAが返ってこない。LSAの破損やパケットロスなど。

実機での検証

検証環境

OSPFとはと同じ、Cisco IOS XR(XRd 26.1.1)のルータ3台を直線に接続したシングルエリア構成で検証します。

検証は4段階(STEP 0〜3)で進めます。各STEPで3台すべてから取得したshow出力・syslog・running-config、およびdebug ospf 1 adjの出力は、記事末尾の検証Configおよびshow結果にSTEPごとにまとめました。以降の節で引用しているのは、そのうちの一部です。

STEP操作確かめること
0初期状態(R1でclear ospf 1 processを実行して状態遷移を採取)全リンクがエリア0。R1–R2–R3 が Full
1R1 の Gi0/0/0/0 の MTU を 1400 に変更MTU不一致。R1–R2 が Full にならない
2R1 にmtu-ignoreを設定Full に復帰
3mtu-ignoreと MTU 1400 を削除初期状態へ復旧(最終状態)

状態遷移のログ(STEP 0)

IOS XRではdebug ospf <プロセスID> adjで、隣接関係の確立過程を詳細に記録できます。デバッグの出力はログバッファにも入るため、あとからshow loggingで読み出せます。

STEP 0 デバッグの有効化
RP/0/RP0/CPU0:R1#debug ospf 1 adj
Sat Sep  5 15:56:47.404 UTC
RP/0/RP0/CPU0:R1#show debug
Sat Sep  5 15:56:47.550 UTC

####  debug flags set from tty 'vty0'  ####
ospf 1 adj flag is ON with value 0

この状態でR1にclear ospf 1 processを実行し、隣接関係を張り直しました。2-WayからFullに至るまでの流れがそのまま出ています。

STEP 0 R1 隣接関係の確立過程(debug ospf 1 adj)
RP/0/RP0/CPU0:Sep  5 15:56:54.665 UTC: ospf[1035]:  2 Way Communication to 2.2.2.2 on GigabitEthernet0/0/0/0, state 2WAY
RP/0/RP0/CPU0:Sep  5 15:56:54.665 UTC: ospf[1035]:  Backup event seen before WAIT timer on GigabitEthernet0/0/0/0, vrf default vrfid 0x60000000
RP/0/RP0/CPU0:Sep  5 15:56:54.665 UTC: ospf[1035]:  DR/BDR election on GigabitEthernet0/0/0/0 
RP/0/RP0/CPU0:Sep  5 15:56:54.665 UTC: ospf[1035]:  Elect BDR Router ID 1.1.1.1(IP Addr 10.1.2.1) 
RP/0/RP0/CPU0:Sep  5 15:56:54.665 UTC: ospf[1035]:  Elect DR Router ID 2.2.2.2(IP Addr 10.1.2.2)
RP/0/RP0/CPU0:Sep  5 15:56:54.665 UTC: ospf[1035]:  Elect BDR Router ID 1.1.1.1(IP Addr 10.1.2.1) 
RP/0/RP0/CPU0:Sep  5 15:56:54.665 UTC: ospf[1035]:  Elect DR Router ID 2.2.2.2(IP Addr 10.1.2.2)
RP/0/RP0/CPU0:Sep  5 15:56:54.665 UTC: ospf[1035]:        DR: 2.2.2.2(Id) 10.1.2.2(IP Addr)
RP/0/RP0/CPU0:Sep  5 15:56:54.665 UTC: ospf[1035]:       BDR: 1.1.1.1(Id) 10.1.2.1(IP Addr)
RP/0/RP0/CPU0:Sep  5 15:56:54.665 UTC: ospf[1035]:  Send DBD  to 2.2.2.2(10.1.2.2) on GigabitEthernet0/0/0/0 seq 0x73875e02 opt 0x52 flag 0x7 len 32, vrf default vrfid 0x60000000
RP/0/RP0/CPU0:Sep  5 15:56:54.665 UTC: ospf[1035]:  Extended options bit out 0x1, GigabitEthernet0/0/0/0 (lls_len 12 bytes)
RP/0/RP0/CPU0:Sep  5 15:56:54.671 UTC: ospf[1035]:  Rcv DBD  from 2.2.2.2(10.1.2.2) on GigabitEthernet0/0/0/0 seq 0x733b91e2 opt 0x52 flag 0x7 len 32 mtu 1500 state EXSTART vrf default vrfid 0x60000000
RP/0/RP0/CPU0:Sep  5 15:56:54.671 UTC: ospf[1035]:  NBR Negotiation Done. We are the SLAVE for nbr 2.2.2.2 on GigabitEthernet0/0/0/0, area 0
RP/0/RP0/CPU0:Sep  5 15:56:54.671 UTC: ospf[1035]: build dbd: took 0 ms for nbr 2.2.2.2, count=1, vrf default vrfid 0x60000000
RP/0/RP0/CPU0:Sep  5 15:56:54.671 UTC: ospf[1035]:  Send DBD  to 2.2.2.2(10.1.2.2) on GigabitEthernet0/0/0/0 seq 0x733b91e2 opt 0x52 flag 0x2 len 52, vrf default vrfid 0x60000000
RP/0/RP0/CPU0:Sep  5 15:56:54.671 UTC: ospf[1035]:  Extended options bit out 0x1, GigabitEthernet0/0/0/0 (lls_len 12 bytes)
RP/0/RP0/CPU0:Sep  5 15:56:54.676 UTC: ospf[1035]:  Rcv DBD  from 2.2.2.2(10.1.2.2) on GigabitEthernet0/0/0/0 seq 0x733b91e3 opt 0x52 flag 0x1 len 92 mtu 1500 state EXCHANGE vrf default vrfid 0x60000000
RP/0/RP0/CPU0:Sep  5 15:56:54.677 UTC: ospf[1035]:  Exchange Done with 2.2.2.2 on GigabitEthernet0/0/0/0
RP/0/RP0/CPU0:Sep  5 15:56:54.677 UTC: ospf[1035]:  sent LS REQ packet to 10.1.2.2, length 36, vrf default vrfid 0x60000000
RP/0/RP0/CPU0:Sep  5 15:56:54.677 UTC: ospf[1035]:  Send DBD  to 2.2.2.2(10.1.2.2) on GigabitEthernet0/0/0/0 seq 0x733b91e3 opt 0x52 flag 0 len 32, vrf default vrfid 0x60000000
RP/0/RP0/CPU0:Sep  5 15:56:54.677 UTC: ospf[1035]:  Extended options bit out 0x1, GigabitEthernet0/0/0/0 (lls_len 12 bytes)
RP/0/RP0/CPU0:Sep  5 15:56:54.683 UTC: ospf[1035]:  Synchronized with 2.2.2.2 on GigabitEthernet0/0/0/0, state FULL, vrf default vrfid 0x60000000

記事の前半で説明した状態が、そのまま順番に現れています。

デバッグの行対応する状態
2 Way Communication to 2.2.2.2 ... state 2WAY2-Way。双方向の通信が確認できた
Send DBD ... flag 0x7ExStart。I・M・MSの3ビットが立った最初のDBD
NBR Negotiation Done. We are the SLAVE for nbr 2.2.2.2ExStart。ルータIDの大きいR2がマスターに決まった
Rcv DBD ... flag 0x1 ... state EXCHANGEExchange。LSAヘッダーの一覧を交換している
Exchange Done with 2.2.2.2 / sent LS REQ packetLoading。不足分をLSRで要求している
Synchronized with 2.2.2.2 ... state FULLFull。LSDBの同期が完了した

flag 0x7はI(Init)・M(More)・MS(Master)の3ビットが立った状態、flag 0x1はMSだけが残った状態です。DBDのフラグの意味はOSPFパケットの種類とヘッダーフォーマットで解説しています。

show ospf neighbor での状態表示(STEP 0)

収束後のR1です。State欄がFULL/DRになっています。

STEP 0 R1 Full到達後
RP/0/RP0/CPU0:R1#show ospf neighbor
Sat Sep  5 16:00:04.031 UTC

* Indicates MADJ interface
# Indicates Neighbor awaiting BFD session up

Neighbors for OSPF 1

Neighbor ID     Pri   State           Dead Time   Address         Interface
2.2.2.2         1     FULL/DR         00:00:31    10.1.2.2        GigabitEthernet0/0/0/0
    Neighbor is up for 00:01:24

Total neighbor count: 1

FULL/DRの/より後ろは、そのネイバーがこのセグメントで担っている役割(DR / BDR / DROTHER)です。詳しくはDRとBDRで解説しています。

clear ospf 1 processの直後にshow ospf interfaceを叩くと、選出前の待ち状態が見えます。

STEP 0 R1 再起動直後(Waitタイマー動作中)
RP/0/RP0/CPU0:R1#clear ospf 1 process
Sat Sep  5 15:58:34.220 UTC
Reset OSPF process 1? [no]: yes
RP/0/RP0/CPU0:R1#show ospf interface GigabitEthernet0/0/0/0
Sat Sep  5 15:58:34.500 UTC

GigabitEthernet0/0/0/0 is up, line protocol is up 
  Internet Address 10.1.2.1/24, Area 0, SID 0, Strict-SPF SID 0
  Label stack Primary label 0 Backup label 0 SRTE label 0
  Process ID 1, Router ID 1.1.1.1, Network Type BROADCAST, Cost: 1
  Transmit Delay is 1 sec, State WAITING, Priority 1, MTU 1500, MaxPktSz 1500
  Forward reference No, Unnumbered no,  Bandwidth 1000000 
  RIB LC sync Yes
  No designated router on this network
  No backup designated router on this network
  Timer intervals configured, Hello 10, Dead 40, Wait 40, Retransmit 5
    Hello due in 00:00:08:592
    Wait time before Designated router selection 00:00:39
  Index 1/1, flood queue length 0
  Next 0(0)/0(0)
  Last flood scan length is 1, maximum is 1
  Last flood scan time is 0 msec, maximum is 0 msec
  LS Ack List: current length 0, high water mark 4
  Neighbor Count is 0, Adjacent neighbor count is 0
  Suppress hello for 0 neighbor(s)
  Multi-area interface Count is 0
  Segment Routing Forwarding MPLS enabled: Yes
  Adjacency hold timer expired last : Never
  Exchange timer expired last : Never

State WAITINGはインタフェースの状態で、DR/BDRがまだ決まっていません。ネイバーの状態遷移はこのあと始まります。

MTU不一致でFullにならない場合(STEP 1)

R1のGi0/0/0/0のMTUを1400バイトに変更し、R2(既定の1500バイト)との間で不一致を作ります。

STEP 1 R1に投入した設定
interface GigabitEthernet0/0/0/0
 mtu 1400
!

デバッグを見ると、R2から受け取ったDBDのMTU(1500)が自分より大きいことを検出し、DBDの再送を繰り返しています。

STEP 1 R1 MTU不一致時のデバッグ出力
RP/0/RP0/CPU0:R1#RP/0/RP0/CPU0:Sep  5 16:01:28.120 UTC: ospf[1035]:  Rcv DBD  from 2.2.2.2(10.1.2.2) on GigabitEthernet0/0/0/0 seq 0x766b8d31 opt 0x52 flag 0x7 len 32 mtu 1500 state EXSTART vrf default vrfid 0x60000000
RP/0/RP0/CPU0:Sep  5 16:01:28.120 UTC: ospf[1035]: Nbr 2.2.2.2 has larger interface MTU
RP/0/RP0/CPU0:Sep  5 16:01:28.129 UTC: ospf[1035]:  Retransmitting DBD to 2.2.2.2 on GigabitEthernet0/0/0/0
RP/0/RP0/CPU0:Sep  5 16:01:28.129 UTC: ospf[1035]:  Retransmitting DBD to 2.2.2.2 on GigabitEthernet0/0/0/0
RP/0/RP0/CPU0:Sep  5 16:01:28.129 UTC: ospf[1035]:  Send DBD  to 2.2.2.2(10.1.2.2) on GigabitEthernet0/0/0/0 seq 0x6c0848cd opt 0x52 flag 0x7 len 32, vrf default vrfid 0x60000000

再送を繰り返した末に、too many DBD retransmissionsで落ちます。

STEP 1 R1 のログ
RP/0/RP0/CPU0:Sep  5 16:02:20.598 UTC: ospf[1035]: %ROUTING-OSPF-5-ADJCHG : Process 1, Nbr 2.2.2.2 on GigabitEthernet0/0/0/0 in area 0 from EXSTART to DOWN, Neighbor Down: too many DBD retransmissions, vrf default vrfid 0x60000000 

ExStartのまま止まるのではなく、ExStart → Down → Init → ExStart を繰り返します。 そのためshow ospf neighborを叩くタイミングによって見える状態が変わります。今回の採取時点では両側がDOWNでした。

STEP 1 R1 の状態
RP/0/RP0/CPU0:R1#show ospf neighbor
Sat Sep  5 16:03:23.203 UTC

* Indicates MADJ interface
# Indicates Neighbor awaiting BFD session up

Neighbors for OSPF 1

Neighbor ID     Pri   State           Dead Time   Address         Interface
2.2.2.2         1     DOWN/DROTHER       -        10.1.2.2        GigabitEthernet0/0/0/0

Total neighbor count: 1
STEP 1 R2 の状態
RP/0/RP0/CPU0:R2#show ospf neighbor
Sat Sep  5 16:03:47.552 UTC

* Indicates MADJ interface
# Indicates Neighbor awaiting BFD session up

Neighbors for OSPF 1

Neighbor ID     Pri   State           Dead Time   Address         Interface
1.1.1.1         1     DOWN/DROTHER       -        10.1.2.1        GigabitEthernet0/0/0/0
3.3.3.3         1     FULL/DR         00:00:30    10.2.3.3        GigabitEthernet0/0/0/1
    Neighbor is up for 00:08:04

Total neighbor count: 2

R2はR3との隣接(FULL/DR)は保っており、影響はR1との間だけに限られています。

R1のインタフェースMTUは1400バイトですが、OSPFが表示するMTUは1386バイトです。これはイーサネットヘッダー14バイトを引いたIPペイロードのMTUを表示しているためです。

STEP 1 R1 のインタフェース(show ospf interface)
RP/0/RP0/CPU0:R1#show ospf interface
Sat Sep  5 16:03:21.491 UTC

GigabitEthernet0/0/0/0 is up, line protocol is up 
  Internet Address 10.1.2.1/24, Area 0, SID 0, Strict-SPF SID 0
  Label stack Primary label 0 Backup label 0 SRTE label 0
  Process ID 1, Router ID 1.1.1.1, Network Type BROADCAST, Cost: 1
  Transmit Delay is 1 sec, State DR, Priority 1, MTU 1386, MaxPktSz 1386
  Forward reference No, Unnumbered no,  Bandwidth 1000000 
  RIB LC sync Yes
  Designated Router (ID) 1.1.1.1, Interface address 10.1.2.1
  No backup designated router on this network
  Timer intervals configured, Hello 10, Dead 40, Wait 40, Retransmit 5
    Hello due in 00:00:04:307
  Index 1/1, flood queue length 0
  Next 0(0)/0(0)
  Last flood scan length is 1, maximum is 1
  Last flood scan time is 0 msec, maximum is 0 msec
  LS Ack List: current length 0, high water mark 4
  Neighbor Count is 1, Adjacent neighbor count is 0
  Suppress hello for 0 neighbor(s)
  Multi-area interface Count is 0
  Segment Routing Forwarding MPLS enabled: Yes
  Adjacency hold timer expired last : Never
  Exchange timer expired last : Never

mtu-ignore で回避する(STEP 2)

本来はMTUを揃えるのが正しい対処ですが、揃えられない事情がある場合は、mtu-ignoreでDBDのMTUチェックを無効にできます。今回はMTUの小さいR1側に設定しました。

STEP 2 R1に投入した設定
router ospf 1
 area 0
  interface GigabitEthernet0/0/0/0
   mtu-ignore
  !
 !
!
STEP 2 R1 mtu-ignore設定後
RP/0/RP0/CPU0:R1#show ospf neighbor
Sat Sep  5 16:06:17.144 UTC

* Indicates MADJ interface
# Indicates Neighbor awaiting BFD session up

Neighbors for OSPF 1

Neighbor ID     Pri   State           Dead Time   Address         Interface
2.2.2.2         1     FULL/DR         00:00:37    10.1.2.2        GigabitEthernet0/0/0/0
    Neighbor is up for 00:01:45

Total neighbor count: 1

MTUは1386バイトのままですが、Fullに到達しています。

STEP 2 R1 のインタフェース(show ospf interface)
RP/0/RP0/CPU0:R1#show ospf interface
Sat Sep  5 16:06:15.495 UTC

GigabitEthernet0/0/0/0 is up, line protocol is up 
  Internet Address 10.1.2.1/24, Area 0, SID 0, Strict-SPF SID 0
  Label stack Primary label 0 Backup label 0 SRTE label 0
  Process ID 1, Router ID 1.1.1.1, Network Type BROADCAST, Cost: 1
  Transmit Delay is 1 sec, State BDR, Priority 1, MTU 1386, MaxPktSz 1386
  Forward reference No, Unnumbered no,  Bandwidth 1000000 
  RIB LC sync Yes
  Designated Router (ID) 2.2.2.2, Interface address 10.1.2.2
  Backup Designated router (ID) 1.1.1.1, Interface address 10.1.2.1
  Timer intervals configured, Hello 10, Dead 40, Wait 40, Retransmit 5
    Hello due in 00:00:02:945
  Index 1/1, flood queue length 0
  Next 0(0)/0(0)
  Last flood scan length is 1, maximum is 1
  Last flood scan time is 0 msec, maximum is 0 msec
  LS Ack List: current length 0, high water mark 4
  Neighbor Count is 1, Adjacent neighbor count is 1
    Adjacent with neighbor 2.2.2.2  (Designated Router)
  Suppress hello for 0 neighbor(s)
  Multi-area interface Count is 0
  Segment Routing Forwarding MPLS enabled: Yes
  Adjacency hold timer expired last : Never
  Exchange timer expired last : Never

この確認のあと、mtu-ignoreとMTU 1400をどちらも削除して初期状態に戻しています(STEP 3)。

検証Configおよびshow結果

各STEPで3台すべてから、次の4種類をルータごとに分けて取得しています。検証Configはこの..._run.txtです(最終状態はSTEP 3のもの)。

ファイル内容
..._show.txtshow version / show interface description / show route / show route ospf / show ospf / show ospf interface / show ospf interface brief / show ospf neighbor / show ospf neighbor detail / show ospf database / show ospf database router / show ospf database network / show ospf statistics interface
..._log.txtそのSTEPの範囲だけに絞ったshow logging。各STEPの開始時にlogmsgでマーカーを入れ、その時刻をshow logging startに指定して取得したもの(STEP 0のみ起動時からの全履歴)
..._run.txtそのSTEP時点のshow running-config(=そのSTEPの検証Config)
..._debug.txt記事用に別途取得したdebug ospf 1 adjの出力(R1のみ、STEP 0とSTEP 1)

STEP 0:初期状態(R1で clear ospf 1 process を実行して状態遷移を採取) — 全リンクがエリア0。R1–R2–R3 が Full

ルータshow出力syslogrunning-configdebug
R1showlogrundebug
R2showlogrun—
R3showlogrun—

STEP 1:R1 の Gi0/0/0/0 の MTU を 1400 に変更 — MTU不一致。R1–R2 が Full にならない

ルータshow出力syslogrunning-configdebug
R1showlogrundebug
R2showlogrun—
R3showlogrun—

STEP 2:R1 に mtu-ignore を設定 — Full に復帰

ルータshow出力syslogrunning-configdebug
R1showlogrun—
R2showlogrun—
R3showlogrun—

STEP 3:mtu-ignore と MTU 1400 を削除(最終状態) — 初期状態へ復旧

ルータshow出力syslogrunning-configdebug
R1showlogrun—
R2showlogrun—
R3showlogrun—

clear ospf 1 processの直後に取得した、選出前の状態(State WAITING)は次のファイルにあります。

STEP 0 R1 再起動直後の show 出力

隣接関係の確立時にやり取りされるパケットそのものは、OSPFパケットの種類とヘッダーフォーマットでキャプチャを添えて解説しています。

参考

RFCタイトル概要
RFC 2328OSPF Version 2ネイバーの状態遷移はSection 10(The Neighbor Data Structure)で定義されている。

関連記事