OSPF Optionsフィールドとは
Optionsフィールドは、OSPFのルータが「自分はどの拡張機能に対応しているか」「このエリアはどういう性質か」を相手に伝えるための8ビットのフィールドです。OSPFパケットの共通ヘッダーには含まれず、Helloパケット・DBDパケット・LSAヘッダーというそれぞれの中に置かれています。
このフィールドは単なる情報の広告にとどまりません。たとえばEビットはネイバー間で一致していないと隣接関係が成立せず、Lビットが立っていなければLLSデータブロックを付けられません。「Helloは届いているのにネイバーにならない」という場面で確認するポイントのひとつです。
Optionsフィールドのビット構成
| ビット | 名称 | 意味 | 定義 |
|---|---|---|---|
| 7 | DN | MPLS-VPNでPEルータ間のルーティングループを防ぐためのビット。PEがCEへ広告するLSAに立てられ、このビットが立ったLSAを受け取ったPEはそのLSAをVPNへ再広告しない。 | RFC 4576 |
| 6 | O | Opaque LSA(Type 9/10/11)に対応していることを示す。OSPFのTE拡張やSegment Routingで使われる。 | RFC 5250 |
| 5 | DC | デマンドサーキット(ISDNなど、必要なときだけ接続する回線)に対応していることを示す。 | RFC 1793 |
| 4 | L | LLS(Link-Local Signaling)データブロックがパケットに付加されていることを示す。 | RFC 5613 |
| 3 | N/P | Nビットは、NSSAエリアに対応していることを示す(Helloで使用)。Pビットは、Type 7 LSAをType 5に変換するかどうかをABRに伝える(Type 7 LSAのヘッダーで使用)。 | RFC 3101 |
| 2 | MC | マルチキャストOSPF(MOSPF)に対応していることを示す。現在ではほとんど使われない。 | RFC 1584 |
| 1 | E | 外部経路(Type 5 LSA、AS外部LSA)を受け取れるエリアかどうかを示す。通常のエリアでは1、スタブエリアやNSSAでは0になる。 | RFC 2328 |
| 0 | MT | マルチトポロジルーティングに対応していることを示す。RFC 2328では上位互換のTOSルーティング用(Tビット)として定義されていた。 | RFC 4915 |
Optionsフィールドが現れる場所
| 現れる場所 | 役割 |
|---|---|
| Helloパケット | 自分の対応機能とエリアの性質を、同じリンク上のルータに伝える。Eビットが一致しないとネイバー関係が成立しない。 |
| DBDパケット | LSDBの同期を始める相手に、自分の対応機能を伝える。 |
| LSAヘッダー | そのLSAを生成したルータの対応機能を、LSAとともにエリア全体へ伝える。 |
同じルータであっても、現れる場所によって立つビットは変わります。次の実機の検証で、その違いを確認します。
実機での検証
検証環境
Cisco IOS XR(XRd 26.1.1)のルータ3台を直線に接続し、全リンクをエリア0に所属させた構成で確認します。OSPFとはで使ったトポロジと同じものです。
R1–R2間のリンクでパケットキャプチャを取り、R1でclear ospf 1 processを実行して隣接関係を張り直しました。このキャプチャ1本に、Hello・DBD・LSAヘッダーの3か所のOptionsがすべて含まれています。
HelloパケットのOptions
R2でdebug ospf 1 helloを有効にして、送受信するHelloのOptionsを確認します。
RP/0/RP0/CPU0:R2#debug ospf 1 hello
Sat Sep 5 08:20:13.485 UTC
RP/0/RP0/CPU0:R2#RP/0/RP0/CPU0:Sep 5 08:20:17.716 UTC: ospf[1035]: Rcv hello from 3.3.3.3 area 0 from GigabitEthernet0/0/0/1 10.2.3.3 (nbr/if state 3/6) vrf default vrfid 0x60000000
RP/0/RP0/CPU0:Sep 5 08:20:17.716 UTC: ospf[1035]: Rcv hello pkt pri 1 options 0x12 lls options 0x1 DR 10.2.3.3 BDR 10.2.3.2 hello 10 dead 40 netmask 255.255.255.0 (nbr_dr 10.2.3.3 nbr_bdr 10.2.3.2)
RP/0/RP0/CPU0:Sep 5 08:20:17.716 UTC: ospf[1035]: End of hello processing
RP/0/RP0/CPU0:Sep 5 08:20:19.331 UTC: ospf[1035]: Send hello to 224.0.0.5 area 0 on GigabitEthernet0/0/0/0 from 10.1.2.2 (nbr/if state 3/5)
RP/0/RP0/CPU0:Sep 5 08:20:19.331 UTC: ospf[1035]: Send hello pkt pri 1 options 0x12 DR 10.1.2.2 BDR 10.1.2.1 hello 10 dead 40 netmask 255.255.255.0, vrf default vrfid 0x60000000
RP/0/RP0/CPU0:Sep 5 08:20:19.331 UTC: ospf[1035]: Extended options bit out 0x1, GigabitEthernet0/0/0/0 (lls_len 32 bytes)送信・受信ともにoptions 0x12です。キャプチャのNo.2(R1が送ったHello)を開くと、各ビットの内訳まで確認できます。
OSPF Hello Packet
Network Mask: 255.255.255.0
Hello Interval [sec]: 10
Options: 0x12, (L) LLS Data block, (E) External Routing
0... .... = DN: Not set
.0.. .... = (O) Opaque: Not set
..0. .... = (DC) Demand Circuits: Not supported
...1 .... = (L) LLS Data block: Present
.... 0... = (N) NSSA: Not supported
.... .0.. = (MC) Multicast: Not capable
.... ..1. = (E) External Routing: Capable
.... ...0 = (MT) Multi-Topology Routing: No
Router Priority: 1
Router Dead Interval [sec]: 40
Designated Router: 10.1.2.2
Backup Designated Router: 10.1.2.1
Active Neighbor: 2.2.2.2
OSPF LLS Data Block
Checksum: 0x7fc2
LLS Data Length: 32 bytes
Extended options TLV
TLV Type: 1
TLV Length: 4
Options: 0x00000001, (LR) LSDB Resynchronization0x12は0001 0010で、立っているのはLビット(0x10)とEビット(0x02)の2つです。
- L(0x10): このHelloにLLSデータブロックが付いていることを示します。下の
OSPF LLS Data Blockがそれで、実際に32バイト付いています。デバッグのExtended options bit out 0x1, ... (lls_len 32 bytes)も同じことを表しています。なお、その中のOptions: 0x00000001, (LR) LSDB ResynchronizationはLLSデータブロック自身のフィールドで、OSPFのOptionsフィールドとは別物です。デバッグのlls options 0x1もこちらを指しています。 - E(0x02): エリア0は通常のエリアなので、外部経路を受け取れるという意味でこのビットが立ちます。
Oビット・DCビットが立っていない点にも注目してください。この2つはHelloには現れません。
DBDパケットが伝えるOptions
DBDパケットのOptionsは、ネイバーの情報として保持されます。show ospf neighbor detailのOptions欄がそれです。
RP/0/RP0/CPU0:R2#show ospf neighbor detail
Sat Sep 5 08:15:52.873 UTC
* Indicates MADJ interface
# Indicates Neighbor awaiting BFD session up
Neighbors for OSPF 1
Neighbor 1.1.1.1, interface address 10.1.2.1
In the area 0 via interface GigabitEthernet0/0/0/0
Neighbor priority is 1, State is FULL, 12 state changes
DR is 10.1.2.2 BDR is 10.1.2.1
Options is 0x52
LLS Options is 0x1 (LR)
Dead timer due in 00:00:34
Neighbor is up for 00:18:42キャプチャのNo.7は、同じR1が送った最初のDBDです。
このNo.7(DBD)だけを抜き出したもの(ospf-options-no7.pcap) をダウンロード OSPF DB Description
Interface MTU: 1500
Options: 0x52, (O) Opaque, (L) LLS Data block, (E) External Routing
0... .... = DN: Not set
.1.. .... = (O) Opaque: Set
..0. .... = (DC) Demand Circuits: Not supported
...1 .... = (L) LLS Data block: Present
.... 0... = (N) NSSA: Not supported
.... .0.. = (MC) Multicast: Not capable
.... ..1. = (E) External Routing: Capable
.... ...0 = (MT) Multi-Topology Routing: No
DB Description: 0x07, (I) Init, (M) More, (MS) Master
.... 0... = (R) OOBResync: Not set
.... .1.. = (I) Init: Set
.... ..1. = (M) More: Set
.... ...1 = (MS) Master: Yes
DD Sequence: 10312775310x52は0101 0010で、O(0x40)・L(0x10)・E(0x02)の3つが立っています。同じR1が送っているのに、Helloの0x12と比べてOビットが増えています。
O(0x40) はOpaque LSA(Type 9/10/11)に対応していることを示すビットです。RFC 5250は、相手がOpaque対応かどうかはDBDのOビットだけで判断すると定めていて、「DBD以外のパケットではOビットを立てるべきではなく、受信しても無視しなければならない」としています。Helloで立っていないのはこのためです。
LSAヘッダーのOptions
LSAヘッダーのOptionsは、LSU・LSAck・DBDに載るLSAヘッダーの中にあります。No.15はR1が自分のRouter-LSAを送ったLSUです。
このNo.15(LSU)だけを抜き出したもの(ospf-options-no15.pcap) をダウンロード LS Update Packet
Number of LSAs: 1
LSA-type 1 (Router-LSA), len 48
.000 0000 0000 0101 = LS Age (seconds): 5
0... .... .... .... = Do Not Age Flag: 0
Options: 0x22, (DC) Demand Circuits, (E) External Routing
0... .... = DN: Not set
.0.. .... = (O) Opaque: Not set
..1. .... = (DC) Demand Circuits: Supported
...0 .... = (L) LLS Data block: Not Present
.... 0... = (N) NSSA: Not supported
.... .0.. = (MC) Multicast: Not capable
.... ..1. = (E) External Routing: Capable
.... ...0 = (MT) Multi-Topology Routing: No
LS Type: Router-LSA (1)
Link State ID: 1.1.1.1
Advertising Router: 1.1.1.1
Sequence Number: 0x80000001
Checksum: 0x5bac
Length: 480x22は0010 0010で、DC(0x20)とE(0x02)です。DBDでは立っていたOとLが落ち、代わりにDCが立っています。
DC(0x20) はデマンドサーキットに対応していることを示すビットで、このLSAが「エージングしない(DoNotAge)」扱いを受けられるかどうかに関わります。LSAそのものの性質なのでLSAヘッダーに現れ、IOS XRはHelloとDBDでは立てません。
3か所のOptionsの違い
同じキャプチャ(ospf-options.pcap)から取り出した3か所の値をまとめると次のようになります。
| No. | 現れる場所 | 値 | 立っているビット |
|---|---|---|---|
| 2 | Helloパケット | 0x12 | L, E |
| 7 | DBDパケット | 0x52 | O, L, E |
| 15 | LSAヘッダー(LSU内) | 0x22 | DC, E |
同じルータが送っているのに3か所で値が違うのは、それぞれのビットが「どの単位の情報か」が異なるためです。
- LはパケットにLLSデータブロックが付いているかを示すので、HelloとDBDには現れますが、LSDBに格納されるLSAのヘッダーには現れません。
- OはRFC 5250がDBD限定と定めているため、DBDにだけ現れます。
- DCはLSAの性質に関わるためLSAヘッダーに現れ、IOS XRはHelloとDBDでは立てません。
- 3か所すべてに共通して立つのはEビットだけです。
なお、IOS XRのshow ospf databaseはLSAヘッダーのOptionsを16進数ではなく文字列で表示します。DCビットとMTビットしか表示されないため、Eビットの値はこの出力からは読み取れません。
RP/0/RP0/CPU0:R2#show ospf database router 2.2.2.2
Sat Sep 5 08:00:23.219 UTC
OSPF Router with ID (2.2.2.2) (Process ID 1)
Router Link States (Area 0)
LS age: 192
Options: (No TOS-capability, DC)
LS Type: Router Links
Link State ID: 2.2.2.2
Advertising Router: 2.2.2.2
LS Seq Number: 80000006
Checksum: 0xd8da
Length: 60
Number of Links: 3スタブエリアではEビットが0になる
Eビットの意味を確認するため、R2–R3間をエリア1のスタブエリアに変更します。R2がABR(エリア境界ルータ)になります。
router ospf 1
area 0
no interface GigabitEthernet0/0/0/1
!
area 1
stub
interface GigabitEthernet0/0/0/1
!
!R3側はすべてのインタフェースをエリア1へ移し、同じくstubを設定します。この状態でR2のHelloを見ると、インタフェースごとに値が変わります。
RP/0/RP0/CPU0:R2#debug ospf 1 hello
Sat Sep 5 08:12:33.829 UTC
RP/0/RP0/CPU0:R2#RP/0/RP0/CPU0:Sep 5 08:12:37.321 UTC: ospf[1035]: Rcv hello from 1.1.1.1 area 0 from GigabitEthernet0/0/0/0 10.1.2.1 (nbr/if state 3/5) vrf default vrfid 0x60000000
RP/0/RP0/CPU0:Sep 5 08:12:37.321 UTC: ospf[1035]: Rcv hello pkt pri 1 options 0x12 lls options 0x1 DR 10.1.2.2 BDR 10.1.2.1 hello 10 dead 40 netmask 255.255.255.0 (nbr_dr 10.1.2.2 nbr_bdr 10.1.2.1)
RP/0/RP0/CPU0:Sep 5 08:12:37.321 UTC: ospf[1035]: End of hello processing
RP/0/RP0/CPU0:Sep 5 08:12:37.567 UTC: ospf[1035]: Send hello to 224.0.0.5 area 1 on GigabitEthernet0/0/0/1 from 10.2.3.2 (nbr/if state 3/6)
RP/0/RP0/CPU0:Sep 5 08:12:37.567 UTC: ospf[1035]: Send hello pkt pri 1 options 0x10 DR 10.2.3.3 BDR 10.2.3.2 hello 10 dead 40 netmask 255.255.255.0, vrf default vrfid 0x60000000
RP/0/RP0/CPU0:Sep 5 08:12:37.567 UTC: ospf[1035]: Extended options bit out 0x1, GigabitEthernet0/0/0/1 (lls_len 32 bytes)
RP/0/RP0/CPU0:Sep 5 08:12:40.064 UTC: ospf[1035]: Rcv hello from 3.3.3.3 area 1 from GigabitEthernet0/0/0/1 10.2.3.3 (nbr/if state 3/6) vrf default vrfid 0x60000000
RP/0/RP0/CPU0:Sep 5 08:12:40.064 UTC: ospf[1035]: Rcv hello pkt pri 1 options 0x10 lls options 0x1 DR 10.2.3.3 BDR 10.2.3.2 hello 10 dead 40 netmask 255.255.255.0 (nbr_dr 10.2.3.3 nbr_bdr 10.2.3.2)同じR2が、エリア0側(Gi0/0/0/0)では0x12、スタブエリア側(Gi0/0/0/1)では0x10のHelloを送っています。差はEビット(0x02)だけです。スタブエリアには外部経路(Type 5 LSA)が入らないため、Eビットが0になります。
R2–R3間のキャプチャ(ospf-options-stub.pcap)は、エリア0からエリア1のスタブエリアへ変更する前後をまたいでいます。No.22は変更後のHelloです。
OSPF Hello Packet
Network Mask: 255.255.255.0
Hello Interval [sec]: 10
Options: 0x10, (L) LLS Data block
0... .... = DN: Not set
.0.. .... = (O) Opaque: Not set
..0. .... = (DC) Demand Circuits: Not supported
...1 .... = (L) LLS Data block: Present
.... 0... = (N) NSSA: Not supported
.... .0.. = (MC) Multicast: Not capable
.... ..0. = (E) External Routing: Not capable
.... ...0 = (MT) Multi-Topology Routing: No
Router Priority: 1DBDとLSAヘッダーも同じようにEビットが落ちます。
このNo.24(DBD)だけを抜き出したもの(ospf-options-stub-no24.pcap) をダウンロード OSPF DB Description
Interface MTU: 1500
Options: 0x50, (O) Opaque, (L) LLS Data block
0... .... = DN: Not set
.1.. .... = (O) Opaque: Set
..0. .... = (DC) Demand Circuits: Not supported
...1 .... = (L) LLS Data block: Present
.... 0... = (N) NSSA: Not supported
.... .0.. = (MC) Multicast: Not capable
.... ..0. = (E) External Routing: Not capable
.... ...0 = (MT) Multi-Topology Routing: No LSA-type 1 (Router-LSA), len 36
.000 0000 0000 1000 = LS Age (seconds): 8
0... .... .... .... = Do Not Age Flag: 0
Options: 0x20, (DC) Demand Circuits
0... .... = DN: Not set
.0.. .... = (O) Opaque: Not set
..1. .... = (DC) Demand Circuits: Supported
...0 .... = (L) LLS Data block: Not Present
.... 0... = (N) NSSA: Not supported
.... .0.. = (MC) Multicast: Not capable
.... ..0. = (E) External Routing: Not capable
.... ...0 = (MT) Multi-Topology Routing: No
LS Type: Router-LSA (1)エリア0とスタブエリアで、3か所の値がどう変わったかをまとめると次のようになります。
| 現れる場所 | エリア0 | エリア1(スタブ) | 差 |
|---|---|---|---|
| Helloパケット | 0x12 | 0x10 | E |
| DBDパケット | 0x52 | 0x50 | E |
| LSAヘッダー | 0x22 | 0x20 | E |
ネイバー情報のOptionsも同じように変わります。
Neighbor 3.3.3.3, interface address 10.2.3.3
In the area 1 via interface GigabitEthernet0/0/0/1
Neighbor priority is 1, State is FULL, 6 state changes
DR is 10.2.3.3 BDR is 10.2.3.2
Options is 0x50
LLS Options is 0x1 (LR)エリアの種別はshow ospfでも確認できます。
Routing Process "ospf 1" with ID 2.2.2.2
It is an area border router
Number of areas in this router is 2. 1 normal 1 stub 0 nssaEビットが一致しないと隣接関係は確立しない
R3側のstubだけを削除して、エリア番号は同じ1のまま、Eビットだけを不一致にします。
router ospf 1
area 1
no stub
!
!R2でHelloのデバッグを見ると、R1(エリア0)からのHelloは正常に処理されるのに対し、R3からのHelloは検証で弾かれています。
RP/0/RP0/CPU0:Sep 5 08:08:58.900 UTC: ospf[1035]: Rcv hello from 1.1.1.1 area 0 from GigabitEthernet0/0/0/0 10.1.2.1 (nbr/if state 3/5) vrf default vrfid 0x60000000
RP/0/RP0/CPU0:Sep 5 08:08:58.900 UTC: ospf[1035]: Rcv hello pkt pri 1 options 0x12 lls options 0x1 DR 10.1.2.2 BDR 10.1.2.1 hello 10 dead 40 netmask 255.255.255.0 (nbr_dr 10.1.2.2 nbr_bdr 10.1.2.1)
RP/0/RP0/CPU0:Sep 5 08:08:58.900 UTC: ospf[1035]: End of hello processing
RP/0/RP0/CPU0:Sep 5 08:08:59.102 UTC: ospf[1035]: Rcv hello from 3.3.3.3 area 1 from GigabitEthernet0/0/0/1 10.2.3.3 (nbr/if state 3/5) vrf default vrfid 0x60000000
RP/0/RP0/CPU0:Sep 5 08:08:59.102 UTC: ospf[1035]: Hello from 10.2.3.3 with mismatched Stub/Transit area option bit
RP/0/RP0/CPU0:Sep 5 08:08:59.103 UTC: ospf[1035]: hello from 3.3.3.3 area 1 failed validationmismatched Stub/Transit area option bitがEビットの不一致を指しています。Helloそのものは受信できているのにfailed validationで破棄されるため、ネイバーは維持されずDeadインターバルの満了で消えます。
RP/0/RP0/CPU0:R2#show ospf neighbor
Sat Sep 5 08:07:51.795 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 FULL/BDR 00:00:30 10.1.2.1 GigabitEthernet0/0/0/0
Neighbor is up for 00:10:40
Total neighbor count: 1
RP/0/RP0/CPU0:R2#show logging | include OSPF
RP/0/RP0/CPU0:Sep 5 08:07:14.220 UTC: ospf[1035]: %ROUTING-OSPF-5-ADJCHG : Process 1, Nbr 3.3.3.3 on GigabitEthernet0/0/0/1 in area 1 from FULL to DOWN, Neighbor Down: dead timer expired, vrf default vrfid 0x60000000 dead timer expiredだけで、Optionsの不一致であることは書かれていません。show ospf statistics interfaceのエラーカウンタにも計上されません。Helloは届いているのにネイバーが消える場合は、debug ospf 1 helloまで下りて原因を確認する必要があります。検証Config
エリア0だけの構成(検証前・検証後)と、エリア1のスタブエリアを追加した構成の、それぞれのrunning-configとshow出力です。
R1 config(r1_options.cfg) をダウンロード
R2 config(r2_options.cfg) をダウンロード
R3 config(r3_options.cfg) をダウンロード
R1 show出力(r1_options_show.txt) をダウンロード
R2 show出力(r2_options_show.txt) をダウンロード
R3 show出力(r3_options_show.txt) をダウンロード
R2 Helloデバッグ出力(r2_options-hello_debug.txt) をダウンロード
R1–R2間のキャプチャ(ospf-options.pcap) をダウンロード
スタブエリアを追加した状態のConfigとshow出力、Eビット不一致時のデバッグ出力です。
R2 config(r2_options-stub.cfg) をダウンロード
R3 config(r3_options-stub.cfg) をダウンロード
R2 show出力(r2_options-stub_show.txt) をダウンロード
R3 show出力(r3_options-stub_show.txt) をダウンロード
R2 Helloデバッグ出力(r2_options-stub-hello_debug.txt) をダウンロード
R2 Eビット不一致時のデバッグ出力(r2_options-ebit-mismatch_debug.txt) をダウンロード
R2–R3間のキャプチャ(ospf-options-stub.pcap) をダウンロード
スタブエリアそのものの動作は、別記事で解説します。
参考
| RFC | タイトル | 概要 |
|---|---|---|
| RFC 2328 | OSPF Version 2 | OptionsフィールドはSection A.2で定義されている(当初はTビットとEビットのみ)。 |
| RFC 1584 | Multicast Extensions to OSPF | MCビット。 |
| RFC 1793 | Extending OSPF to Support Demand Circuits | DCビット。 |
| RFC 3101 | The OSPF Not-So-Stubby Area (NSSA) Option | N/Pビット。 |
| RFC 4576 | Using a Link State Advertisement (LSA) Options Bit to Prevent Looping in BGP/MPLS IP VPNs | DNビット。 |
| RFC 4915 | Multi-Topology (MT) Routing in OSPF | MTビット。 |
| RFC 5250 | The OSPF Opaque LSA Option | Oビット。 |
| RFC 5613 | OSPF Link-Local Signaling | Lビット。 |