この記事は、以下の記事の回答編です
この記事を読む方は必ず上の記事を読んだ後に見に来てください。学習効率が著しく下がります。
問題のおさらい
- RouterAとRouterBでネイバーを張る事。ただし、HelloインターバルはRouterAとRouterBで違う必要がある。
回答
- hello intervalを1秒以下に設定する
予想通りでしたか?これだけだと分かりづらいかもしれないので、具体例を出します。
いつも通り、INEのWorkbookです。R8とR10がPoint to Pointで繋がっています。
この2台でネイバーを張りたいと思います。
R8:
R8(config-subif)#do sh run | s ospf router ospf 1 network 155.1.108.0 0.0.0.255 area 0
R10:
R10(config-subif)#do sh run | s ospf router ospf 1 network 155.1.108.0 0.0.0.255 area 0 %OSPF-5-ADJCHG: Process 1, Nbr 150.1.8.8 on GigabitEthernet1/0.108 from LOADING to FULL, Loading Done
特にhello/deadを設定していないので、想定通りネイバーが成立しました。
ここで、R8のHelloを変えてみます。
R8(config-subif)#ip ospf hello-interval 200 R8(config-subif)#do sh ip ospf int g1/0.108 GigabitEthernet1/0.108 is up, line protocol is up Internet Address 155.1.108.8/24, Area 0, Attached via Network Statement Process ID 1, Router ID 150.1.8.8, Network Type BROADCAST, Cost: 1 Topology-MTID Cost Disabled Shutdown Topology Name 0 1 no no Base Transmit Delay is 1 sec, State BDR, Priority 1 Designated Router (ID) 150.1.10.10, Interface address 155.1.108.10 Backup Designated router (ID) 150.1.8.8, Interface address 155.1.108.8 Timer intervals configured, Hello 200, Dead 800, Wait 800, Retransmit 5 oob-resync timeout 800 Hello due in 00:02:58 Supports Link-local Signaling (LLS) Cisco NSF helper support enabled IETF NSF helper support enabled Index 1/1, flood queue length 0 Next 0x0(0)/0x0(0) Last flood scan length is 1, maximum is 1 Last flood scan time is 0 msec, maximum is 0 msec Neighbor Count is 1, Adjacent neighbor count is 1 Adjacent with neighbor 150.1.10.10 (Designated Router) Suppress hello for 0 neighbor(s) R8(config-subif)# %OSPF-5-ADJCHG: Process 1, Nbr 150.1.10.10 on GigabitEthernet1/0.108 from FULL to DOWN, Neighbor Down: Dead timer expired
想定通り、インターバルに差異があるからネイバーがダウンしました。
では、次にR8のhelloインターバルを1秒以下に変更してみます。これは、deadインターバルを変更する事で実現可能です。
R8(config-subif)#no ip ospf hello-interval 200 R8(config-subif)#ip ospf dead-interval minimal hello-multiplier 3 R8(config-subif)#do sh ip ospf int g1/0.108 GigabitEthernet1/0.108 is up, line protocol is up Internet Address 155.1.108.8/24, Area 0, Attached via Network Statement Process ID 1, Router ID 150.1.8.8, Network Type BROADCAST, Cost: 1 Topology-MTID Cost Disabled Shutdown Topology Name 0 1 no no Base Transmit Delay is 1 sec, State BDR, Priority 1 Designated Router (ID) 150.1.10.10, Interface address 155.1.108.10 Backup Designated router (ID) 150.1.8.8, Interface address 155.1.108.8 Flush timer for old DR LSA due in 00:02:44 Timer intervals configured, Hello 333 msec, Dead 1, Wait 1, Retransmit 5 oob-resync timeout 40 Hello due in 0 msec Supports Link-local Signaling (LLS) Cisco NSF helper support enabled IETF NSF helper support enabled Index 1/1, flood queue length 0 Next 0x0(0)/0x0(0) Last flood scan length is 1, maximum is 1 Last flood scan time is 0 msec, maximum is 0 msec Neighbor Count is 1, Adjacent neighbor count is 1 Adjacent with neighbor 150.1.10.10 (Designated Router) Suppress hello for 0 neighbor(s)
これで、helloが333 msecになりましたね(deadの1/3)。
次に、R10のhelloを250msecにしてみましょう。
R10(config-subif)#ip ospf dead-interval minimal hello-multiplier 4 %OSPF-5-ADJCHG: Process 1, Nbr 150.1.8.8 on GigabitEthernet1/0.108 from LOADING to FULL, Loading Done R10(config-subif)#do sh ip ospf int g1/0.108 GigabitEthernet1/0.108 is up, line protocol is up Internet Address 155.1.108.10/24, Area 0, Attached via Network Statement Process ID 1, Router ID 150.1.10.10, Network Type BROADCAST, Cost: 1 Topology-MTID Cost Disabled Shutdown Topology Name 0 1 no no Base Transmit Delay is 1 sec, State DR, Priority 1 Designated Router (ID) 150.1.10.10, Interface address 155.1.108.10 Backup Designated router (ID) 150.1.8.8, Interface address 155.1.108.8 Timer intervals configured, Hello 250 msec, Dead 1, Wait 1, Retransmit 5 oob-resync timeout 40 Hello due in 0 msec Supports Link-local Signaling (LLS) Cisco NSF helper support enabled IETF NSF helper support enabled Index 1/1, flood queue length 0 Next 0x0(0)/0x0(0) Last flood scan length is 1, maximum is 1 Last flood scan time is 4 msec, maximum is 4 msec Neighbor Count is 1, Adjacent neighbor count is 1 Adjacent with neighbor 150.1.8.8 (Backup Designated Router) Suppress hello for 0 neighbor(s)
deadを変更した瞬間にネイバーが成立します。インターフェースの設定を確認すると、確かにhelloは250msに変わってますね。
つまり、R8(333msec)とR10(250msec)の設定にも関わらず、ネイバーが張られています。
何故、ネイバーが張れるのか?
実は、私がRFCを確認した限り「Dead Intervalがノード間でマッチする必要がある」という記載はありますが、「Hello Intervalがノード間でマッチする必要がある」という記載は見当たりませんでした。
通常はHelloはDeadの3倍なので、結果的にHello/Deadの両方がマッチするかマッチしないかになる為、Hello/Dead両方がマッチしないとネイバーが張られないと思ってしまいます。
然しながら、上記の設定で例外的に「Deadはマッチするが、Helloはマッチしない」状況を作り出せてしまいます。
その結果、RFC的にも成立し、ネイバーが張られているのでは?と考えられます。
(2015/9/12追記)以下のコメントを頂きました。ゆうさん、ありがとうございます!
横槍失礼します。
OSPFのネイバーの確立にはHelloインターバルの一致は必須です。“ip ospf dead-interval minimal hello-multiplier”コマンドを使用すると、Helloインターバルの値に関係無く、OSPFのHello PacketのHelloIntervalフィールドには0が格納されます。
なので、実際のHelloインターバルの値に関わらず、自身がHello PacketのHelloIntervalフィールドに格納した値と、対向から受信したHello PacketのHello Intervalフィールドに格納されている値が一致するので、ネイバーが確立できるのでは。
実際にINEのWorkbookでのR10で検証してみました。
以下が、hello-multiplier設定前です。R10とR8間のインターフェースです。
次に、R10のR8向けのインターフェースのdeadをminimalに、hello-multiplierを3にしてみたパケットキャプチャです。
確かに、msecではなく0secでやり取りをしています。なので、双方のmsecが違っていても0secで一致するのでネイバーが成立するのですね。失礼しました。
この話題は以上で終了です
いかがでしたか?殆どのドキュメント、サイトでは以下がネイバーを張る為の必須条件だと記載されているはずです。
- ネットワークマスク
- 認証
- エリアID
- スタブフラグ
- Hello インターバル
- Dead インターバル
でも、実際には例外的にHelloインターバルが違っていてもネイバーを張れる訳です。
このトピックで伝えたかったメッセージは、「OSPFのDR/BDRはPreemptしない?」と同様です。
CCNPまでで学んだ内容が必ずしも正しい訳ではない。関連するRFCは要点を絞って目を通すこと。(RFCは全部熟読すると時間がいくらあっても足りません)
仮に「いやいやRFCでもHello Intervalが一致しなければいけないと明記されているよ」とか「Hello Intervalが一致しなくてもいいのはCisco Proprietaryだと正式な回答が出てるよ」とかご存知の方がいましたら、是非一報ください。
コメント
横槍失礼します。
OSPFのネイバーの確立にはHelloインターバルの一致は必須です。
“ip ospf dead-interval minimal hello-multiplier”コマンドを使用すると、Helloインターバルの値に関係無く、OSPFのHello PacketのHelloIntervalフィールドには0が格納されます。
なので、実際のHelloインターバルの値に関わらず、自身がHello PacketのHelloIntervalフィールドに格納した値と、対向から受信したHello PacketのHello Intervalフィールドに格納されている値が一致するので、ネイバーが確立できるのでは。
コメント・ご指摘ありがとうございます。
パケットキャプチャで確認した結果、その通りでした。
記事内容を修正しました。