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

OSPFのコスト(メトリック)

目次

OSPFのコストとは

OSPFは宛先までのコストの合計がいちばん小さい経路を選びます。このコストがOSPFのメトリックです。

RFC 2328 Section 2.1は、コストを各ルータインタフェースの出方向に結び付く値と定めています。管理者が設定するもので、値が小さいほどそのインタフェースが転送に使われやすくなります。Section 9ではインタフェースの出力コストは0より大きくなければならないと規定しています。

ここから2つのことが決まります。

  • コストは片方向の値です。 R1とR2をつなぐリンクに「リンクのコスト」という1つの値があるのではなく、R1の出方向とR2の出方向にそれぞれ別の値があります。片側だけ変えれば往路と復路で経路が変わります
  • 最小値は1です。 0にはできません

設定できる上限は65535です。Router-LSAがリンクごとのコストを運ぶフィールドが16ビットだからです(RFC 2328 Appendix A.4.2)。

RFCはコストの決め方までは規定していません。 Section 1.2はコストを「単一の無次元のメトリック」と呼ぶだけで、帯域幅から計算するとは書いていません。帯域幅を基に自動計算するのは各社の実装です。

コストの決まり方

Ciscoの実装では、1つのインタフェースのコストは次の順で決まります。

インタフェース単位のcostが設定されていればその値をそのまま使い、無ければ参照帯域幅をインタフェースの帯域幅で割った値になります。どちらもMbpsで計算し、1未満になれば1に切り上げます。

設定書く場所単位
auto-cost reference-bandwidth <値>router ospf <プロセス> 配下Mbps
cost <値>area <ID>interface <IF> 配下コストそのもの(1〜65535)
bandwidth <値>インタフェース配下(OSPFの外)kbps

既定の参照帯域幅は100Mbpsです。 これは現在の回線速度に対して低すぎます。100Mbpsを1Gbpsで割ると0.1、10Gbpsで割ると0.01で、どちらも切り上げられてコスト1になります。1Gbpsも10Gbpsも100Gbpsも区別できません。区別したいなら参照帯域幅を上げます。

参照帯域幅はエリア内の全ルータで同じ値にします。 1台だけ設定を忘れると、そのルータのリンクだけ相対的に安くなり、意図しない経路が選ばれます。

検証構成

R1からR3へ、R2経由とR4経由の2つの経路があるダイヤモンド型です。全リンクが1Gbpsで、全リンクがエリア0です。観測対象は1つに固定します。R1から見た 3.3.3.3/32 です

項目内容
経路AR1 - R2 - R3
経路BR1 - R4 - R3
ルータIDR1が1.1.1.1、R2が2.2.2.2、R3が3.3.3.3、R4が4.4.4.4
観測対象R1から見た3.3.3.3/32
ソフトウェアXRd 26.1.1

7つのSTEPで進めます。

STEP操作確かめること
0既定状態1GbpsのリンクもLoopbackもコスト1。2経路が等コスト
11つのインタフェースのbandwidthを下げるコストが帯域幅から決まる。遠回りのほうが安くなることもある
2全4台の参照帯域幅を100Gbpsへコストが一斉に変わる。Loopbackは変わらない
3R4だけ既定へ戻すそのルータのリンクが安くなり、経路がR4へ寄る
4R4も揃える等コストに戻り、FIBに2本載る
51つのインタフェースにcostを設定参照帯域幅より優先される。往路だけ変わり復路は変わらない
6すべて既定へ戻すSTEP 0と同じ状態(最終状態)

STEP 0:既定の状態

show ospf interface briefCost列が、この記事でいちばん見る場所です。1Gbpsの物理インタフェースもLoopbackも1で並んでいます。

R1 すべてコスト1(STEP 0)
RP/0/RP0/CPU0:R1#show ospf interface brief
Fri Sep 11 07:28:19.669 UTC

* Indicates MADJ interface, (P) Indicates fast detect hold down state

Interfaces for OSPF 1

Interface          PID   Area            IP Address/Mask    Cost  State Nbrs F/C
Lo0                1     0               1.1.1.1/32         1     LOOP  0/0
Gi0/0/0/0          1     0               10.1.2.1/24        1     DR    1/1
Gi0/0/0/1          1     0               10.1.4.1/24        1     DR    1/1

R1から3.3.3.3/32へは2本の経路が載ります。メトリックはどちらも3です。R1の出方向が1、R2(またはR4)の出方向が1、R3のLoopbackが1の合計です。

R1 2経路が等コスト(STEP 0)
RP/0/RP0/CPU0:R1#show route ospf
Fri Sep 11 07:28:18.205 UTC

O    2.2.2.2/32 [110/2] via 10.1.2.2, 00:08:37, GigabitEthernet0/0/0/0
O    3.3.3.3/32 [110/3] via 10.1.2.2, 00:04:18, GigabitEthernet0/0/0/0
                [110/3] via 10.1.4.4, 00:04:18, GigabitEthernet0/0/0/1
O    4.4.4.4/32 [110/2] via 10.1.4.4, 00:04:18, GigabitEthernet0/0/0/1
O    10.2.3.0/24 [110/2] via 10.1.2.2, 00:08:37, GigabitEthernet0/0/0/0
O    10.3.4.0/24 [110/2] via 10.1.4.4, 00:04:18, GigabitEthernet0/0/0/1

参照帯域幅の既定値はどのshowにも表示されません。 show ospfshow ospf 1show protocols ospfshow ospf interfaceshow running-config router ospf 1のすべてを確認しましたが1行もありません。値が既定のままなら設定にも現れません。

STEP 1:帯域幅を下げてコストを動かす

コストが帯域幅から決まることを確かめます。R1のR4向けインタフェースだけ、帯域幅を10Mbps相当にします。

STEP 1で投入した設定(単位はkbps)
(R1)
interface GigabitEthernet0/0/0/1
 bandwidth 10000

そのインタフェースのコストが10になりました。既定の参照帯域幅100Mbpsを10Mbpsで割った値です。

R1 Gi0/0/0/1だけコスト10(STEP 1)
RP/0/RP0/CPU0:R1#show ospf interface brief
Fri Sep 11 07:30:57.443 UTC

* Indicates MADJ interface, (P) Indicates fast detect hold down state

Interfaces for OSPF 1

Interface          PID   Area            IP Address/Mask    Cost  State Nbrs F/C
Lo0                1     0               1.1.1.1/32         1     LOOP  0/0
Gi0/0/0/0          1     0               10.1.2.1/24        1     DR    1/1
Gi0/0/0/1          1     0               10.1.4.1/24        10    DR    1/1

経路も変わります。3.3.3.3/32はR2経由の1本だけになりました。注目したいのは4.4.4.4/32です。R4は直接つながっているのに、R1はR2とR3を経由する遠回りを選んでいます。

R1 R4へは遠回りになった(STEP 1)
RP/0/RP0/CPU0:R1#show route ospf
Fri Sep 11 07:30:54.975 UTC

O    2.2.2.2/32 [110/2] via 10.1.2.2, 00:11:14, GigabitEthernet0/0/0/0
O    3.3.3.3/32 [110/3] via 10.1.2.2, 00:00:36, GigabitEthernet0/0/0/0
O    4.4.4.4/32 [110/4] via 10.1.2.2, 00:00:36, GigabitEthernet0/0/0/0
O    10.2.3.0/24 [110/2] via 10.1.2.2, 00:11:14, GigabitEthernet0/0/0/0
O    10.3.4.0/24 [110/3] via 10.1.2.2, 00:00:36, GigabitEthernet0/0/0/0

直接R4へ行くと10+Loopbackの1で11です。R2とR3を回ると111+Loopbackの1で4になります。コストは距離でもホップ数でもないので、ホップ数の多い経路のほうが安くなることがあります。

STEP 2:参照帯域幅を上げる

1Gbpsも10Gbpsもコスト1に潰れる問題に対処します。参照帯域幅を100Gbpsにすれば、1Gbpsのリンクは100、10Gbpsのリンクは10、100Gbpsのリンクは1になり区別がつきます。

STEP 1のbandwidthを外したうえで、4台すべてに同じ値を入れます。

STEP 2で投入した設定(単位はMbps)
(R1・R2・R3・R4のすべてに投入する)
router ospf 1
 auto-cost reference-bandwidth 100000

1Gbpsの物理インタフェースが1から100に変わりました。Loopbackは1のままです。

R1 物理は100、Loopbackは1のまま(STEP 2)
RP/0/RP0/CPU0:R1#show ospf interface brief
Fri Sep 11 07:33:59.373 UTC

* Indicates MADJ interface, (P) Indicates fast detect hold down state

Interfaces for OSPF 1

Interface          PID   Area            IP Address/Mask    Cost  State Nbrs F/C
Lo0                1     0               1.1.1.1/32         1     LOOP  0/0
Gi0/0/0/0          1     0               10.1.2.1/24        100   DR    1/1
Gi0/0/0/1          1     0               10.1.4.1/24        100   DR    1/1

メトリックの内訳がはっきりします。3.3.3.3/32201は、R1の出方向100+R2の出方向100+R3のLoopback1です。ループバック宛の経路に必ず1が足されるのはこのためです。

R1 メトリックが201になった(STEP 2)
RP/0/RP0/CPU0:R1#show route ospf
Fri Sep 11 07:33:56.694 UTC

O    2.2.2.2/32 [110/101] via 10.1.2.2, 00:01:00, GigabitEthernet0/0/0/0
O    3.3.3.3/32 [110/201] via 10.1.2.2, 00:00:42, GigabitEthernet0/0/0/0
                [110/201] via 10.1.4.4, 00:00:42, GigabitEthernet0/0/0/1
O    4.4.4.4/32 [110/101] via 10.1.4.4, 00:01:00, GigabitEthernet0/0/0/1
O    10.2.3.0/24 [110/200] via 10.1.2.2, 00:00:48, GigabitEthernet0/0/0/0
O    10.3.4.0/24 [110/200] via 10.1.4.4, 00:00:42, GigabitEthernet0/0/0/1

コストはRouter-LSAに載ってエリア全体へ流れます。R1が出しているLSAを見ると、リンクごとのTOS 0 Metricsが、いまインタフェースに表示されているコストと一致しています。Loopbackのスタブが1、2本の物理リンクが100です。

R1のRouter-LSA リンクごとのコスト(STEP 2)
   Number of Links: 3

    Link connected to: a Stub Network
     (Link ID) Network/subnet number: 1.1.1.1
     (Link Data) Network Mask: 255.255.255.255
      Number of TOS metrics: 0
       TOS 0 Metrics: 1

    Link connected to: a Transit Network
     (Link ID) Designated Router address: 10.1.2.1
     (Link Data) Router Interface address: 10.1.2.1
      Number of TOS metrics: 0
       TOS 0 Metrics: 100

    Link connected to: a Transit Network
     (Link ID) Designated Router address: 10.1.4.1
     (Link Data) Router Interface address: 10.1.4.1
      Number of TOS metrics: 0
       TOS 0 Metrics: 100

STEP 3:1台だけ揃え忘れるとどうなるか

R4だけ参照帯域幅を既定に戻します。運用で起こる設定漏れを再現します。

STEP 3で投入した設定
(R4のみ)
router ospf 1
 no auto-cost reference-bandwidth 100000

no auto-cost reference-bandwidthと値を省くと設定は外れません。 commitは通り、show configuration commit changesも変更なしを返しますが、show running-configには残ったままでコストも変わりません。値まで書く必要があります。

R4のインタフェースだけコストが1に戻りました。他の3台は100のままです。

R4だけコスト1に戻った(STEP 3)
RP/0/RP0/CPU0:R4#show ospf interface brief
Fri Sep 11 07:39:11.310 UTC

* Indicates MADJ interface, (P) Indicates fast detect hold down state

Interfaces for OSPF 1

Interface          PID   Area            IP Address/Mask    Cost  State Nbrs F/C
Lo0                1     0               4.4.4.4/32         1     LOOP  0/0
Gi0/0/0/0          1     0               10.1.4.4/24        1     BDR   1/1
Gi0/0/0/1          1     0               10.3.4.4/24        1     BDR   1/1

R4の両隣のリンクが他より100倍安くなったので、R1からR3への経路がR4側へ寄ります。等コストだった2本が1本に減り、メトリックも201から102へ下がりました。

R1 R4経由の1本だけになった(STEP 3)
RP/0/RP0/CPU0:R1#show route ospf
Fri Sep 11 07:38:04.079 UTC

O    2.2.2.2/32 [110/101] via 10.1.2.2, 00:05:07, GigabitEthernet0/0/0/0
O    3.3.3.3/32 [110/102] via 10.1.4.4, 00:01:09, GigabitEthernet0/0/0/1
O    4.4.4.4/32 [110/101] via 10.1.4.4, 00:05:07, GigabitEthernet0/0/0/1
O    10.2.3.0/24 [110/200] via 10.1.2.2, 00:04:55, GigabitEthernet0/0/0/0
O    10.3.4.0/24 [110/101] via 10.1.4.4, 00:01:09, GigabitEthernet0/0/0/1

逆向きも同じです。R3からR1への経路もR4経由になっています。

R3 こちらもR4経由(STEP 3)
RP/0/RP0/CPU0:R3#show route ospf
Fri Sep 11 07:38:46.951 UTC

O    1.1.1.1/32 [110/102] via 10.3.4.4, 00:01:52, GigabitEthernet0/0/0/1
O    2.2.2.2/32 [110/101] via 10.2.3.2, 00:05:38, GigabitEthernet0/0/0/0
O    4.4.4.4/32 [110/101] via 10.3.4.4, 00:05:38, GigabitEthernet0/0/0/1
O    10.1.2.0/24 [110/200] via 10.2.3.2, 00:05:38, GigabitEthernet0/0/0/0
O    10.1.4.0/24 [110/101] via 10.3.4.4, 00:01:52, GigabitEthernet0/0/0/1

設定を忘れた1台にトラフィックが集まります。 参照帯域幅を上げる作業は、エリア内の全ルータで漏れなく行う必要があります。

STEP 4:揃え直す

R4にも同じ値を入れると、等コストの2経路に戻ります。

R1 等コスト2経路に復帰(STEP 4)
RP/0/RP0/CPU0:R1#show route ospf
Fri Sep 11 07:40:15.979 UTC

O    2.2.2.2/32 [110/101] via 10.1.2.2, 00:07:19, GigabitEthernet0/0/0/0
O    3.3.3.3/32 [110/201] via 10.1.2.2, 00:00:38, GigabitEthernet0/0/0/0
                [110/201] via 10.1.4.4, 00:00:38, GigabitEthernet0/0/0/1
O    4.4.4.4/32 [110/101] via 10.1.4.4, 00:07:19, GigabitEthernet0/0/0/1
O    10.2.3.0/24 [110/200] via 10.1.2.2, 00:07:07, GigabitEthernet0/0/0/0
O    10.3.4.0/24 [110/200] via 10.1.4.4, 00:00:38, GigabitEthernet0/0/0/1

等コストの経路はRIBだけでなくFIBにも複数載ります。show cefの末尾を見ると、2つのネクストホップと、フローを振り分けるハッシュの割り当てまで出ています。

R1 FIBにも2本のネクストホップ(STEP 4)
   via 10.1.2.2/32, GigabitEthernet0/0/0/0, 7 dependencies, weight 0, class 0 [flags 0x0]
    path-idx 0 NHID 0x2 [0x8a75b3c0 0x0]
    next hop 10.1.2.2/32
    local adjacency
   via 10.1.4.4/32, GigabitEthernet0/0/0/1, 7 dependencies, weight 0, class 0 [flags 0x0]
    path-idx 1 NHID 0x4 [0x8a75b500 0x0]
    next hop 10.1.4.4/32
    local adjacency

    Load distribution: 0 1 0 1 (refcount 2)

    Hash  OK  Interface                 Address
    0     Y   GigabitEthernet0/0/0/0    10.1.2.2       
    1     Y   GigabitEthernet0/0/0/1    10.1.4.4       
    2     Y   GigabitEthernet0/0/0/0    10.1.2.2       
    3     Y   GigabitEthernet0/0/0/1    10.1.4.4       

STEP 5:インタフェース単位のコストを設定する

参照帯域幅は「全インタフェースに一律の計算式を当てる」仕組みなので、特定のリンクだけ調整したいときには向きません。そこにはインタフェース単位のcostを使います。

R1のR2向けインタフェースだけ、コストを50にします。

STEP 5で投入した設定
(R1)
router ospf 1
 area 0
  interface GigabitEthernet0/0/0/0
   cost 50

参照帯域幅から計算された100ではなく、設定した50が表示されます。インタフェース単位のcostが優先されます。

R1 Gi0/0/0/0だけ50(STEP 5)
RP/0/RP0/CPU0:R1#show ospf interface brief
Fri Sep 11 07:42:43.518 UTC

* Indicates MADJ interface, (P) Indicates fast detect hold down state

Interfaces for OSPF 1

Interface          PID   Area            IP Address/Mask    Cost  State Nbrs F/C
Lo0                1     0               1.1.1.1/32         1     LOOP  0/0
Gi0/0/0/0          1     0               10.1.2.1/24        50    DR    1/1
Gi0/0/0/1          1     0               10.1.4.1/24        100   DR    1/1

R1からR3への経路はR2経由の1本になりました。50+100+1で151、R4経由の100+100+1で201より安いためです。

R1 往路はR2経由の1本(STEP 5)
RP/0/RP0/CPU0:R1#show route ospf
Fri Sep 11 07:42:41.932 UTC

O    2.2.2.2/32 [110/51] via 10.1.2.2, 00:00:46, GigabitEthernet0/0/0/0
O    3.3.3.3/32 [110/151] via 10.1.2.2, 00:00:46, GigabitEthernet0/0/0/0
O    4.4.4.4/32 [110/101] via 10.1.4.4, 00:09:45, GigabitEthernet0/0/0/1
O    10.2.3.0/24 [110/150] via 10.1.2.2, 00:00:46, GigabitEthernet0/0/0/0
O    10.3.4.0/24 [110/200] via 10.1.4.4, 00:03:04, GigabitEthernet0/0/0/1

ここで反対側を見ます。R3からR1への経路は等コストの2本のままで、何も変わっていません。

R3 復路は2本のまま(STEP 5)
RP/0/RP0/CPU0:R3#show route ospf
Fri Sep 11 07:43:29.020 UTC

O    1.1.1.1/32 [110/201] via 10.2.3.2, 00:03:51, GigabitEthernet0/0/0/0
                [110/201] via 10.3.4.4, 00:03:51, GigabitEthernet0/0/0/1
O    2.2.2.2/32 [110/101] via 10.2.3.2, 00:10:20, GigabitEthernet0/0/0/0
O    4.4.4.4/32 [110/101] via 10.3.4.4, 00:10:20, GigabitEthernet0/0/0/1
O    10.1.2.0/24 [110/200] via 10.2.3.2, 00:10:20, GigabitEthernet0/0/0/0
O    10.1.4.0/24 [110/200] via 10.3.4.4, 00:03:51, GigabitEthernet0/0/0/1

変更したのはR1の出方向のコストだけで、R3とR2の出方向は触っていないからです。往路と復路で経路が違う状態が、片側だけのコスト変更で簡単にできてしまいます。 経路を対称に保ちたいなら両端に同じ変更を入れます。

STEP 6:すべて既定へ戻す

costと参照帯域幅を外すと、STEP 0と同じ状態に戻ります。

R1 すべてコスト1に復帰(STEP 6)
RP/0/RP0/CPU0:R1#show ospf interface brief
Fri Sep 11 07:45:21.407 UTC

* Indicates MADJ interface, (P) Indicates fast detect hold down state

Interfaces for OSPF 1

Interface          PID   Area            IP Address/Mask    Cost  State Nbrs F/C
Lo0                1     0               1.1.1.1/32         1     LOOP  0/0
Gi0/0/0/0          1     0               10.1.2.1/24        1     DR    1/1
Gi0/0/0/1          1     0               10.1.4.1/24        1     DR    1/1

設計上の注意

  • 参照帯域幅を上げるならエリア内の全ルータで揃えます。 1台の漏れがその周辺にトラフィックを集めます(STEP 3)
  • 上げるときは十分に大きな値にします。 いま100Gbpsのリンクが無くても、あとから入ったときに区別できるよう余裕を持たせます。変更は全台に入れ直す作業になるので、何度もやり直さずに済む値を選びます
  • Loopbackのコストは参照帯域幅では変わりません。 ループバック宛の経路には常に1が足されます
  • costは出方向にだけ効きます。 片側だけ入れると往路と復路で経路が分かれます(STEP 5)
  • no auto-cost reference-bandwidthは値まで書きます。 省くとcommitは通るのに設定が残ります

検証Configおよびshow結果

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

ファイル内容
..._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 / show cef 3.3.3.3/32 / show ospf database router self-originate
..._log.txtそのSTEPの範囲だけに絞ったshow logging。各STEPの開始時にlogmsgでマーカーを入れ、その時刻をshow logging startに指定して取得したもの
..._run.txtそのSTEP時点のshow running-config(=そのSTEPの検証Config)

STEP 0:既定状態 — 1GbpsのリンクもLoopbackもコスト1。2経路が等コスト

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun

STEP 1:1つのインタフェースのbandwidthを下げる — コストが帯域幅から決まる。遠回りのほうが安くなる

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun

STEP 2:全4台の参照帯域幅を100Gbpsへ — コストが一斉に変わる。Loopbackは変わらない

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun

STEP 3:R4だけ既定へ戻す — そのルータのリンクが安くなり、経路がR4へ寄る

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun

STEP 4:R4も揃える — 等コストに戻り、FIBに2本載る

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun

STEP 5:1つのインタフェースにcostを設定 — 参照帯域幅より優先。往路だけ変わり復路は変わらない

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun

STEP 6:すべて既定へ戻す(最終状態) — STEP 0と同じ状態

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun

参考

RFCタイトル概要
RFC 2328OSPF Version 2コストの定義。各ルータインタフェースの出方向に結び付き管理者が設定すること(Section 2.1)、0より大きいこと(Section 9)、Router-LSAのメトリックフィールドが16ビットであること(Appendix A.4.2)。帯域幅から自動計算する方法は規定していない。

関連記事