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

OSPF Optionsフィールド

目次

OSPF Optionsフィールドとは

Optionsフィールドは、OSPFのルータが「自分はどの拡張機能に対応しているか」「このエリアはどういう性質か」を相手に伝えるための8ビットのフィールドです。OSPFパケットの共通ヘッダーには含まれず、Helloパケット・DBDパケット・LSAヘッダーというそれぞれの中に置かれています。

このフィールドは単なる情報の広告にとどまりません。たとえばEビットはネイバー間で一致していないと隣接関係が成立せず、Lビットが立っていなければLLSデータブロックを付けられません。「Helloは届いているのにネイバーにならない」という場面で確認するポイントのひとつです。

Optionsフィールドのビット構成

ビット名称意味定義
7DNMPLS-VPNでPEルータ間のルーティングループを防ぐためのビット。PEがCEへ広告するLSAに立てられ、このビットが立ったLSAを受け取ったPEはそのLSAをVPNへ再広告しない。RFC 4576
6OOpaque LSA(Type 9/10/11)に対応していることを示す。OSPFのTE拡張やSegment Routingで使われる。RFC 5250
5DCデマンドサーキット(ISDNなど、必要なときだけ接続する回線)に対応していることを示す。RFC 1793
4LLLS(Link-Local Signaling)データブロックがパケットに付加されていることを示す。RFC 5613
3N/PNビットは、NSSAエリアに対応していることを示す(Helloで使用)。Pビットは、Type 7 LSAをType 5に変換するかどうかをABRに伝える(Type 7 LSAのヘッダーで使用)。RFC 3101
2MCマルチキャストOSPF(MOSPF)に対応していることを示す。現在ではほとんど使われない。RFC 1584
1E外部経路(Type 5 LSA、AS外部LSA)を受け取れるエリアかどうかを示す。通常のエリアでは1、スタブエリアやNSSAでは0になる。RFC 2328
0MTマルチトポロジルーティングに対応していることを示す。RFC 2328では上位互換のTOSルーティング用(Tビット)として定義されていた。RFC 4915
Optionsフィールドの8ビットは、当初のRFC 2328では下位2ビット(TビットとEビット)しか定義されていませんでした。残りのビットは、後から出た拡張仕様がそれぞれ割り当てたものです。そのため各ビットの定義RFCがばらばらになっています。

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を確認します。

R2 HelloのOptions(debug ospf 1 hello)
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)を開くと、各ビットの内訳まで確認できます。

このNo.2(Hello)だけを抜き出したもの(ospf-options-no2.pcap) をダウンロード
No.2 Hello(R1 → 224.0.0.5)tshark -V
    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 Resynchronization

0x120001 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 detailOptions欄がそれです。

R2 ネイバーが広告したOptions(show ospf neighbor detail)
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) をダウンロード
No.7 DBD(R1 → R2)tshark -V
    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: 1031277531

0x520101 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) をダウンロード
No.15 LSU(R1 → R2)tshark -V
    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: 48

0x220010 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.現れる場所立っているビット
2Helloパケット0x12L, E
7DBDパケット0x52O, L, E
15LSAヘッダー(LSU内)0x22DC, 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ビットの値はこの出力からは読み取れません。

R2 自身のRouter LSA(show ospf database router)
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(エリア境界ルータ)になります。

R2に投入した設定
router ospf 1
 area 0
  no interface GigabitEthernet0/0/0/1
 !
 area 1
  stub
  interface GigabitEthernet0/0/0/1
 !
!

R3側はすべてのインタフェースをエリア1へ移し、同じくstubを設定します。この状態でR2のHelloを見ると、インタフェースごとに値が変わります。

R2 エリア0とエリア1の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です。

このNo.22(Hello)だけを抜き出したもの(ospf-options-stub-no22.pcap) をダウンロード
No.22 Hello(R2 → 224.0.0.5、エリア1)tshark -V
    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: 1

DBDとLSAヘッダーも同じようにEビットが落ちます。

このNo.24(DBD)だけを抜き出したもの(ospf-options-stub-no24.pcap) をダウンロード
No.24 DBD(R2 → R3、エリア1)tshark -V
    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
このNo.32(LSU)だけを抜き出したもの(ospf-options-stub-no32.pcap) をダウンロード
No.32 LSU(R2 → R3、エリア1)tshark -V
        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パケット0x120x10E
DBDパケット0x520x50E
LSAヘッダー0x220x20E

ネイバー情報のOptionsも同じように変わります。

R2 スタブエリアのネイバー(show ospf neighbor detail)
 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でも確認できます。

R2 エリアの種別(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 nssa

Eビットが一致しないと隣接関係は確立しない

R3側のstubだけを削除して、エリア番号は同じ1のまま、Eビットだけを不一致にします。

R3に投入した設定(Eビットを不一致にする)
router ospf 1
 area 1
  no stub
 !
!

R2でHelloのデバッグを見ると、R1(エリア0)からのHelloは正常に処理されるのに対し、R3からのHelloは検証で弾かれています。

R2 Eビット不一致時のデバッグ出力
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 validation

mismatched Stub/Transit area option bitがEビットの不一致を指しています。Helloそのものは受信できているのにfailed validationで破棄されるため、ネイバーは維持されずDeadインターバルの満了で消えます。

R2 ネイバーの状態とログ
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 2328OSPF Version 2OptionsフィールドはSection A.2で定義されている(当初はTビットとEビットのみ)。
RFC 1584Multicast Extensions to OSPFMCビット。
RFC 1793Extending OSPF to Support Demand CircuitsDCビット。
RFC 3101The OSPF Not-So-Stubby Area (NSSA) OptionN/Pビット。
RFC 4576Using a Link State Advertisement (LSA) Options Bit to Prevent Looping in BGP/MPLS IP VPNsDNビット。
RFC 4915Multi-Topology (MT) Routing in OSPFMTビット。
RFC 5250The OSPF Opaque LSA OptionOビット。
RFC 5613OSPF Link-Local SignalingLビット。

関連記事