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 です。
| 項目 | 内容 |
|---|---|
| 経路A | R1 - R2 - R3 |
| 経路B | R1 - R4 - R3 |
| ルータID | R1が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経路が等コスト |
| 1 | 1つのインタフェースのbandwidthを下げる | コストが帯域幅から決まる。遠回りのほうが安くなることもある |
| 2 | 全4台の参照帯域幅を100Gbpsへ | コストが一斉に変わる。Loopbackは変わらない |
| 3 | R4だけ既定へ戻す | そのルータのリンクが安くなり、経路がR4へ寄る |
| 4 | R4も揃える | 等コストに戻り、FIBに2本載る |
| 5 | 1つのインタフェースにcostを設定 | 参照帯域幅より優先される。往路だけ変わり復路は変わらない |
| 6 | すべて既定へ戻す | STEP 0と同じ状態(最終状態) |
STEP 0:既定の状態
show ospf interface briefのCost列が、この記事でいちばん見る場所です。1Gbpsの物理インタフェースもLoopbackも1で並んでいます。
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/1R1から3.3.3.3/32へは2本の経路が載ります。メトリックはどちらも3です。R1の出方向が1、R2(またはR4)の出方向が1、R3のLoopbackが1の合計です。
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 ospf、show ospf 1、show protocols ospf、show ospf interface、show running-config router ospf 1のすべてを確認しましたが1行もありません。値が既定のままなら設定にも現れません。
STEP 1:帯域幅を下げてコストを動かす
コストが帯域幅から決まることを確かめます。R1のR4向けインタフェースだけ、帯域幅を10Mbps相当にします。
(R1)
interface GigabitEthernet0/0/0/1
bandwidth 10000そのインタフェースのコストが10になりました。既定の参照帯域幅100Mbpsを10Mbpsで割った値です。
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を経由する遠回りを選んでいます。
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を回ると1+1+1+Loopbackの1で4になります。コストは距離でもホップ数でもないので、ホップ数の多い経路のほうが安くなることがあります。
STEP 2:参照帯域幅を上げる
1Gbpsも10Gbpsもコスト1に潰れる問題に対処します。参照帯域幅を100Gbpsにすれば、1Gbpsのリンクは100、10Gbpsのリンクは10、100Gbpsのリンクは1になり区別がつきます。
STEP 1のbandwidthを外したうえで、4台すべてに同じ値を入れます。
(R1・R2・R3・R4のすべてに投入する)
router ospf 1
auto-cost reference-bandwidth 1000001Gbpsの物理インタフェースが1から100に変わりました。Loopbackは1のままです。
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/32の201は、R1の出方向100+R2の出方向100+R3のLoopback1です。ループバック宛の経路に必ず1が足されるのはこのためです。
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です。
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: 100STEP 3:1台だけ揃え忘れるとどうなるか
R4だけ参照帯域幅を既定に戻します。運用で起こる設定漏れを再現します。
(R4のみ)
router ospf 1
no auto-cost reference-bandwidth 100000no auto-cost reference-bandwidthと値を省くと設定は外れません。 commitは通り、show configuration commit changesも変更なしを返しますが、show running-configには残ったままでコストも変わりません。値まで書く必要があります。
R4のインタフェースだけコストが1に戻りました。他の3台は100のままです。
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/1R4の両隣のリンクが他より100倍安くなったので、R1からR3への経路がR4側へ寄ります。等コストだった2本が1本に減り、メトリックも201から102へ下がりました。
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経由になっています。
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経路に戻ります。
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つのネクストホップと、フローを振り分けるハッシュの割り当てまで出ています。
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にします。
(R1)
router ospf 1
area 0
interface GigabitEthernet0/0/0/0
cost 50参照帯域幅から計算された100ではなく、設定した50が表示されます。インタフェース単位のcostが優先されます。
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/1R1からR3への経路はR2経由の1本になりました。50+100+1で151、R4経由の100+100+1で201より安いためです。
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本のままで、何も変わっていません。
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と同じ状態に戻ります。
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.txt | show 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出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
STEP 1:1つのインタフェースのbandwidthを下げる — コストが帯域幅から決まる。遠回りのほうが安くなる
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
STEP 2:全4台の参照帯域幅を100Gbpsへ — コストが一斉に変わる。Loopbackは変わらない
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
STEP 3:R4だけ既定へ戻す — そのルータのリンクが安くなり、経路がR4へ寄る
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
STEP 4:R4も揃える — 等コストに戻り、FIBに2本載る
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
STEP 5:1つのインタフェースにcostを設定 — 参照帯域幅より優先。往路だけ変わり復路は変わらない
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
STEP 6:すべて既定へ戻す(最終状態) — STEP 0と同じ状態
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
参考
| RFC | タイトル | 概要 |
|---|---|---|
| RFC 2328 | OSPF Version 2 | コストの定義。各ルータインタフェースの出方向に結び付き管理者が設定すること(Section 2.1)、0より大きいこと(Section 9)、Router-LSAのメトリックフィールドが16ビットであること(Appendix A.4.2)。帯域幅から自動計算する方法は規定していない。 |
関連記事
- OSPFとは
- OSPFのルータID
- OSPFパケットの種類とヘッダーフォーマット
- OSPFの認証
- OSPFの状態遷移
- OSPF Optionsフィールド
- OSPFのDRとBDR
- OSPF ネットワークタイプ
- OSPFのコスト(メトリック)
- OSPFの外部経路(スタティックの再配布)
- OSPFのマルチエリアとABR
- OSPFのバーチャルリンク
- OSPFのスタブエリアとトータリースタブエリア
- OSPFのNSSAとトータリーNSSA
- OSPFの経路集約
- OSPFのLSAとLSAヘッダー
- OSPFのRouter-LSA(Type 1)
- OSPFのNetwork-LSA(Type 2)
- OSPFのSummary-LSA(Type 3)
- OSPFのASBR Summary-LSA(Type 4)
- OSPFのAS External-LSA(Type 5)
- OSPFのNSSA External-LSA(Type 7)