Mímisbrunnr知恵の泉

← コンピュータネットワーク 一覧

🎓 レベル:発展 | 重要度:A(必須) 📎 前提:距離ベクトル型(RIP/EIGRP)

要点(BLUF)

リンクステートの考え方

距離ベクトルが「隣の噂を信じる」のに対し、リンクステートは「全員が同じ地図を持ち、各自で最短を計算」します。

  1. 各ルータが自分のリンク状態(LSA:どの隣と、コストいくつで繋がるか)を全域にフラッディング
  2. 全LSAを集めて**LSDB(リンクステートデータベース=地図)**を作る。全ルータで同一。
  3. 各ルータが自分を起点に**ダイクストラ(SPF)**で最短木を計算し、テーブルへ。
graph TD
  L["全ルータが同一のLSDB(地図)を保持"]
  S["各自がダイクストラで最短経路木を計算"]
  T["ルーティングテーブルへ反映"]
  L --> S --> T

コスト:帯域で決まる

OSPFのメトリックはコストで、既定では コスト = 参照帯域 / インターフェース帯域(参照帯域は既定100Mbps)。速いほど低コスト=優先されます。

# OSPF コスト = 参照帯域(bps) / インターフェース帯域(bps)(最低1, 切り捨て)
ref_bw = 100_000_000          # 既定の参照帯域 100Mbps
def ospf_cost(if_bw_bps, ref=ref_bw):
    return max(1, ref // if_bw_bps)

for name, bw in [("FastEthernet 100M", 100_000_000),
                 ("Ethernet 10M", 10_000_000),
                 ("Gigabit 1G", 1_000_000_000)]:
    print(f"{name:18} -> cost {ospf_cost(bw)}")

実行結果:

FastEthernet 100M  -> cost 1
Ethernet 10M       -> cost 10
Gigabit 1G         -> cost 1

注目:既定の参照帯域100Mbpsだと、1Gと100Mが同じコスト1になってしまう(高速回線を区別できない)。そこで実務では auto-cost reference-bandwidth を上げて区別します。これはOSPF設計の定番の落とし穴です。

隣接確立とDR/BDR

OSPFはまずHelloパケットで隣接(neighbor)を見つけ、条件が合えばアジャセンシを確立してLSDBを同期します。

Router(config)# router ospf 1
Router(config-router)# router-id 1.1.1.1
Router(config-router)# network 192.168.1.0 0.0.0.255 area 0
Router(config-router)# auto-cost reference-bandwidth 10000

network のワイルドカードマスク(0.0.0.255)は、サブネットマスクのビット反転である点に注意。

エリア:規模を分割する

全ルータが全LSAを持つと、大規模ではLSDBとSPF計算が重くなります。エリアに分割し、エリア内の詳細を境界(ABR)で集約して外に出すことで、計算範囲と更新の波及を局所化します。すべてのエリアはバックボーン area 0に接続する規約です。

なぜ全体地図を持つのか(設計の直観)

噂(距離ベクトル)は速く伝わらず、誤りも混じってループを生みます。全員が同じ正確な地図を持てば、各自の計算結果は整合し、ループが原理的に起きにくく、収束も速い。地図の共有コスト(メモリ・フラッディング)を払う代わりに、正しさと速さを買う——これがリンクステートの取引です。大規模ネットの主役がOSPF/IS-ISである理由です。

⚠️ よくある誤解

対応 lab

関連