00 学習目標
01 フォワーディングと経路選択
02 静的 vs 動的
03 距離ベクトル(RIP)
04 リンクステート(OSPF)
05 AS と IGP/EGP
06 BGP の仕組み
07 ループとハイジャック
08 まとめ
09 確認問題
学習目標
本講を終えると、以下の問いに学術的な言葉で答えられるようになります。
ルータがパケットを受け取ってから次ホップへ渡すまでの一連の処理(受信→宛先 IP 確認→ルーティングテーブル参照→次ホップへ転送 ) を順を追って説明できる
ルーティングテーブルからの経路選択ルール Longest Prefix Match(最長一致) を、複数の候補プレフィクスから選ぶ具体例で説明できる
静的ルーティング と 動的ルーティング の違い、後者が必要な理由(障害復旧・トポロジ変化への自動追従) を述べられる
動的ルーティングの3方式 ─ 距離ベクトル型(Distance Vector) / リンクステート型(Link State) / パスベクトル型(Path Vector) の動作原理(Bellman-Ford / Dijkstra / AS パス伝搬) と長所・短所を比較できる
AS(Autonomous System) の概念、 IGP(域内ルーティング:RIP/OSPF/IS-IS/EIGRP) と EGP(域間ルーティング:BGP-4) の役割分担を説明できる
BGP-4 の特徴(ポリシーベース、TCP 179 番、ピアリング/トランジット、AS_PATH 属性) を述べ、なぜインターネット全体が「IGP+BGP の二段構え」で動いているのかを理解する
ルーティングループの発生メカニズムと、その回避策(TTL / Split Horizon / Poison Reverse / ホールドダウン ) の概要を説明できる
BGP の経路ハイジャック・経路リークが、世界規模の通信障害につながる仕組みを直感的に説明できる
このレッスンの目次
ルータの仕事 ─ パケット受信から次ホップへ
ネットワーク層には大きく2つの仕事があります。1パケットごとに高速に処理する フォワーディング(forwarding) と、テーブルそのものを作る ルーチング(routing) です。本セクションではまず、ルータが1パケットを受け取ってからどのように次ホップを決めるのか ─ つまり フォワーディングのアルゴリズム を整理します。
POINT
ルータは1パケットごとに次の4ステップを実行します。
1. パケット受信 (入力ポートからフレームを受け取り、IP データグラムを取り出す)
2. 宛先 IP の確認 (IPv4 ヘッダから 32 bit の宛先アドレスを読む)
3. ルーティングテーブル参照 (Longest Prefix Match で候補プレフィクスのうち最も長く一致するエントリを選ぶ)
4. 次ホップへ転送 (対応する出力ポート/次ホップアドレスへフレームを送り出す)
ルーティングテーブルの正体
ルータの中には ルーティングテーブル(forwarding table とも呼ぶ) と呼ばれる表があり、各エントリは (宛先プレフィクス, 出力インタフェース, 次ホップ IP, メトリック) といった形をしています。「192.0.2.0/24 宛のパケットは eth1 から、次ホップ 10.0.0.2 へ 」のようなルールが多数並んでいると思ってください。
ルータ内部:1パケットが通り抜けるまで
入力ポート
受信・デカプセル
パケット
ルーチング処理部
宛先 IP を抽出
↓
ルーティングテーブル参照
↓
出力ポートを選択
ルーティングテーブル
宛先プレフィクス
→出力
10.0.0.0/8
eth0
192.0.2.0/24
eth1
192.0.2.128/25
eth2
0.0.0.0/0
eth0
(default route)
出力 eth0
出力 eth1
出力 eth2
選ばれた行:192.0.2.0/24 → eth1
コントロールプレーン(ルーチングプロトコル:RIP / OSPF / BGP)
隣接ルータと経路情報を交換し、ルーティングテーブルを事前に 作る
(本講のメインテーマ。テーブル「を作る」処理。1パケットごとには動かない)
図の見方:上段が データプレーン (1パケットごとに高速処理) 、下段が コントロールプレーン (テーブルを作る処理) 。本講で学ぶ RIP/OSPF/BGP は下段で動き、その結果が上段のテーブルに書き込まれます。
Longest Prefix Match(最長一致) ─ なぜ必要か
同じ宛先 IP に対して、ルーティングテーブルの複数のエントリが「俺が当てはまる」と主張することがよくあります。例えば 192.0.2.130 宛のパケットは、上の表だと 0.0.0.0/0 (デフォルト) ・192.0.2.0/24 ・192.0.2.128/25 の3本に一致します。このとき マスク長(プレフィクス長) が最も長い ものを選ぶ ─ それが Longest Prefix Match です。
POINT
複数のエントリが当てはまるときは、より細かい(プレフィクス長が長い)もの が勝つ。これにより「会社全体は本社のルータへ、ただし営業部のサブネットだけ別ルートへ」のような 例外的な経路 を、短いルールに対する上書きとして自然に書ける。
小問:宛先 IP 10.1.2.3 に対し、ルーティングテーブルに次の3行 ─ 10.0.0.0/8 (eth0) / 10.1.0.0/16 (eth1) / 10.1.2.0/24 (eth2) ─ がある。Longest Prefix Match で選ばれる出口は?
A. eth0(/8 が最初に書いてあるから)
B. eth2(プレフィクス長が最も長い /24 が勝つ)
C. eth1(中間のものを選ぶ)
D. ECMP で3本に等分する
正解:B 。Longest Prefix Match では マスク長が最大のもの が勝つので、/24 の eth2 が選ばれます。「上から順」「最初に書いた行」ではない点に注意。10.1.2.0/24 は 10.1.0.0/16 の 例外 として扱われます。
考えてみよう: 郵便配達でも「東京都」宛のルールと「東京都千代田区」宛のルールがあれば、千代田区行きは後者が優先されるはず。Longest Prefix Match はその「より細かい指示が勝つ」を機械的に行う仕組みです。
静的ルーティングと動的ルーティング
ルーティングテーブルを 誰が・どうやって 作るのかには2つの方式があります。管理者が手で書く 静的ルーティング と、ルータ同士が情報を交換して自動で作る 動的ルーティング です。実運用では両者を組み合わせて使います。
静的ルーティング(static)
管理者が手書き でテーブルを設定する。
・小規模・トポロジが固定的・経路が変わらない場面に向く
・隣接ルータと情報交換しないので CPU・帯域を消費しない
・障害が起きても自動で迂回しない (管理者が設定し直すまで切れたまま)
・代表例:家庭ルータの「デフォルトゲートウェイは ISP の機器」、企業の小規模拠点
動的ルーティング(dynamic)
ルータ同士が情報を交換 し、テーブルを自動で組み立て・更新する。
・規模が大きくトポロジが変化する環境(障害・新リンク追加) に向く
・障害が起きても 収束(convergence) によって自動で迂回経路に切り替わる
・経路情報を流すための帯域・CPU・メモリを消費する
・代表例:ISP/企業バックボーンの OSPF、AS 間の BGP
用語:収束(convergence) ─ ネットワーク内のすべてのルータが、同じトポロジ情報に基づく一貫したルーティングテーブルを持つに至った状態。動的ルーティングの良し悪しは「どれだけ早く収束するか」で大きく決まります。
もっと詳しく:実運用ではハイブリッド
大規模ネットワークでも、すべてを動的にしているわけではありません。たとえばユーザの家庭用回線は ISP 側で静的に「あなた宛の /29 は VLAN 100 へ」のように固定されており、ISP 内部のバックボーンだけが OSPF や IS-IS で動的に動く、というのが一般的です。変化しない部分は静的、変化する部分は動的 ─ これが実運用の鉄則です。
距離ベクトル型(Distance Vector) ─ RIP と Bellman-Ford
動的ルーティングの最初の方式は 距離ベクトル型(Distance Vector: DV) です。各ルータが「自分から各宛先までの距離(コスト)」だけを保持し、それを 隣接ルータにのみ 知らせ合うことで、間接的に全体の地図を作ります。代表的なプロトコルが RIP(Routing Information Protocol) 、計算アルゴリズムは Bellman-Ford 法 です。
POINT
距離ベクトル型のスローガン:「自分の経路表を、隣にだけ、定期的に伝える 」。
・各ルータは 各宛先までのコスト しか持たない(全体の地図は知らない)
・隣からの情報を受けて、必要なら自分の表を更新し、再び隣に伝える
・全員の表が変わらなくなれば 収束
Bellman-Ford 式の更新ルール(分散ルーティング版)
各ルータ x は、各宛先 y について次の更新式を回します。
Dx (y) = minv ∈ neighbors(x) { c(x, v) + Dv (y) }
すなわち「自分から y へのコスト」=「隣 v までのリンクコスト + 隣 v が知っている y までのコスト」を、すべての隣について取って 最小 を選ぶ。
これだけで「ルーティングのアルゴリズム」と紹介されることが多いですが、これは 本来の Bellman-Ford アルゴリズム を分散環境向けに変形した形です。元のアルゴリズムを押さえておくと、なぜこの式で正しく収束するのかが腹落ちします。
本来の Bellman-Ford アルゴリズム(中央集権版)
Bellman-Ford は、教科書的には次のように定義される 単一始点最短路アルゴリズム です。重み付き有向グラフ G = (V, E) と始点 s が与えられたとき、s から各頂点 v までの最短距離 d[v] を計算します。Dijkstra と違い 負の重みも許容 でき、負閉路の検出までできるのが特徴。
POINT
アルゴリズムの3要素:
1. 初期化 :d[s] = 0 、それ以外の頂点は d[v] = ∞
2. 緩和(relaxation) :辺 (u, v) ごとに、もし d[v] > d[u] + w(u,v) なら d[v] := d[u] + w(u,v) と更新
3. これを |V|-1 回繰り返す :全辺に対する緩和を |V|-1 回ループする
オプション:|V| 回目で更新が起きたら負閉路 がある(最短路は定義不能)。
擬似コード
function BellmanFord(G, w, s):
# 1) 初期化
for each v in V(G):
d[v] := infinity
prev[v] := nil
d[s] := 0
# 2) |V|-1 回の緩和パス
for i := 1 to |V| - 1:
for each edge (u, v) in E(G):
if d[v] > d[u] + w(u, v):
d[v] := d[u] + w(u, v)
prev[v] := u
# 3) 負閉路検出(オプション)
for each edge (u, v) in E(G):
if d[v] > d[u] + w(u, v):
return "negative cycle reachable from s"
return d, prev
「緩和 」は1ステップだけ見るととてもシンプルです。「もし u 経由で行くほうが今知っている経路より安いなら、その値で更新」というだけ。これを |V|-1 回 繰り返すと、すべての頂点に最短距離が確定します。
Bellman-Ford をステップで追う
例として 4 頂点 A, B, C, D の有向グラフを考えます。始点は A。辺は A→B(1) 、A→C(4) 、B→C(2) 、B→D(5) 、C→D(1) の順に緩和します。
A から Bellman-Ford 法で最短距離を求める
1
4
2
5
1
A
B
C
D
初期化
d[A]=0
d[B]=∞
d[C]=∞
d[D]=∞
始点 A だけ 0。他はまだ到達不明。
辺 A→B を緩和
d[B] > d[A] + 1 ?
∞ > 0 + 1 なので更新
d[B]=1, prev[B]=A
A=0, B=1, C=∞, D=∞
辺 A→C を緩和
d[C] > d[A] + 4 ?
∞ > 0 + 4 なので更新
d[C]=4, prev[C]=A
A=0, B=1, C=4, D=∞
辺 B→C を緩和
d[C] > d[B] + 2 ?
4 > 1 + 2 なので更新
d[C]=3, prev[C]=B
A=0, B=1, C=3, D=∞
辺 B→D を緩和
d[D] > d[B] + 5 ?
∞ > 1 + 5 なので更新
d[D]=6, prev[D]=B
A=0, B=1, C=3, D=6
辺 C→D を緩和
d[D] > d[C] + 1 ?
6 > 3 + 1 なので更新
d[D]=4, prev[D]=C
A=0, B=1, C=3, D=4
1パス終了
この例では、2回目以降にもう一度
全辺を緩和しても値は変わりません。
最短距離: A=0, B=1, C=3, D=4
prev を逆にたどると D への経路は
A → B → C → D
ステップ1. 初期化。 始点 A だけ距離 0、他の頂点はまだ到達できるか分からないので ∞ にします。ここから辺を1本ずつ見ていきます。
ステップ2. A→B を緩和。 A までは 0 で来られるので、A→B の重み 1 を足すと B まで 1。いまの B は ∞ なので、d[B]=1 に更新します。
ステップ3. A→C を緩和。 A→C 直行ならコスト 4。C はまだ ∞ なので、いったん d[C]=4 としておきます。
ステップ4. B→C を緩和。 B までは 1、B→C は 2 なので、B 経由なら 1+2=3 。直行の 4 より安いため、d[C] を 3 に更新します。これが Bellman-Ford の「安い道を見つけたら上書き」の核心です。
ステップ5. B→D を緩和。 B までは 1、B→D は 5 なので、D までの候補は 1+5=6 。D はまだ未知なので、d[D]=6 にします。
ステップ6. C→D を緩和。 C までは 3、C→D は 1 なので、C 経由なら 3+1=4 。B→D 経由の 6 より安いので、d[D]=4 に更新します。
ステップ7. 1パス終了。 この例では1回目の全辺緩和で最短距離がそろいます。一般には辺の処理順によって、最大で |V|-1 回、全辺の緩和を繰り返します。
◀ 戻る
次へ ▶
⟳ 最初に戻る
1 / 7
緩和ごとの更新表
処理 見る辺 判定 更新後の距離
初期化 なし A だけ 0、他は ∞ A=0, B=∞, C=∞, D=∞
1 A→B(1) ∞ > 0+1 なので更新 A=0, B=1, C=∞, D=∞
2 A→C(4) ∞ > 0+4 なので更新 A=0, B=1, C=4, D=∞
3 B→C(2) 4 > 1+2 なので更新 A=0, B=1, C=3, D=∞
4 B→D(5) ∞ > 1+5 なので更新 A=0, B=1, C=3, D=6
5 C→D(1) 6 > 3+1 なので更新 A=0, B=1, C=3, D=4
図の見方:Bellman-Ford は「辺を1本見る → その辺を使うと安くなるなら更新」を繰り返します。A→C 直行は 4 ですが、途中で A→B→C が 1+2=3 と分かるので C の値が書き換わります。最後に D も A→B→C→D = 4 へ改善されます。
なぜ |V|-1 回で十分か
最短路は 単純路 (同じ頂点を 2 度通らない)なので、含まれる辺の数は最大で |V|-1 本。各イテレーションで「最短路の k 番目までの辺」が確定することが帰納法で示せます。これは Bellman の最適性原理 (最短路の部分路もまた最短路)の直接の帰結です。
計算量 :O(|V| × |E|)。Dijkstra(O((|V|+|E|) log |V|))より遅いが、負の重みを扱える という強み
負閉路 :|V| 回目の緩和でも更新が起きるなら、グラフに s から到達可能な負閉路がある(最短路は -∞ に発散する)。これを 1 ステップ余分に回すだけで検出できる のが Bellman-Ford の特徴
分散版への変形 ─ なぜルーティングに使えるか
中央集権 Bellman-Ford の前提は「誰か(中央のコンピュータ) がグラフ全体を把握している 」こと。インターネットでは誰もそんな場所にいません。そこで、中央のテーブルを 各ルータが自分の行だけ持つ 形に分解します。
POINT
分散化のキモ:
・「全頂点 × 全頂点」のテーブル D[u, v] を、ルータ x は D[x, *] (自分の行)だけ保持
・緩和操作の引数 D[u, v] はもはや見えない → 代わりに 隣 v が放送してくる Dv (*) ベクトル を使う
・各ルータは Dx (y) = min over v ∈ neighbors(x) { c(x, v) + Dv (y) } を周期的に計算 → これが分散版の緩和
中央集権版 → 分散版への対応関係
中央集権 Bellman-Ford 分散 Bellman-Ford(ルーティング)
全グラフを保持 各ルータは 自分の隣のリンクコスト しか直接知らない
全辺を順に緩和 各ルータが 自分の行 を更新(隣の D ベクトルから)
|V|-1 回のループ 定期的・非同期 に更新を放送(RIP は 30 秒周期)
同期実行で停止条件あり ルータ毎の 不動点反復 ─ 全員のベクトルが安定 = 収束
負閉路を検出可能 明示的な検出はなし(代わりに カウント・トゥ・インフィニティ として表面化、後述)
つながる知識: 分散版では「同期で全員が同時に更新」する保証はありませんが、それでも リンクが安定なら有限時間で収束 する、という嬉しい性質があります(Bertsekas らの非同期反復の理論)。逆に、リンクが頻繁に変動する 環境では収束する前に新しい変動が起き、永久に追いつけない場合がある ─ これが距離ベクトル型の弱点となり、後の リンクステート型(全員が地図を共有) の登場につながります。
RIP の具体仕様
コスト =ホップ数 (経由するルータの数)。各リンクのコストは 1 で固定
最大 15 ホップ 。16 は「到達不能」を示す番兵値となり、規模が制限される
30 秒ごと に経路情報を隣にフラッディング(マルチキャスト 224.0.0.9 )
180 秒間更新が来なければそのリンクは切断と判断
歴史的には小規模 LAN・CPU の弱いルータ時代に普及
収束プロセスをステップで見る
ノード A・B・C が一直線につながり、リンクコストはすべて 1 とします。各ノードが持つのは「各宛先までのコスト」のみ。次/前ボタンで収束過程を1ステップずつ追ってください。
A
B
C
cost 1
cost 1
A の表
宛先 コスト 次ホップ
A 0 ─
B ? ?
C ? ?
B の表
宛先 コスト 次ホップ
A ? ?
B 0 ─
C ? ?
C の表
宛先 コスト 次ホップ
A ? ?
B ? ?
C 0 ─
ステップ1. 起動直後。各ノードは 自分自身宛のコスト 0 しか知らず、他はすべて未知(?)。これからお互いに情報を交換していきます。
ステップ2. A・B・C はそれぞれ 直接接続している隣 を発見します。A は B との間にコスト 1 のリンクがあると分かるので、A の表に B → 1, 次ホップ B が入ります。同様に B は A・C を、C は B を直接の隣として記録。
ステップ3. 各ノードが 30 秒経過(RIP の周期) し、自分の表を 隣にだけ 送信。A は「B へのコストは 1」、B は「A へのコストは 1, C へのコストは 1」、C は「B へのコストは 1」を周囲に送る。
ステップ4. A は B から「C への距離 1」を聞き、Bellman-Ford で DA (C) = c(A,B) + DB (C) = 1 + 1 = 2 と計算し、表に C → 2, 次ホップ B を追加。C も同様に A → 2, 次ホップ B を学びます。
ステップ5. 全ノードの表に変化がなくなるまでもう1〜2周、定期更新を繰り返します。3 ノードという小ささでは2〜3周で安定。これを 収束 と呼びます。
ステップ6. もしリンク B-C が切れたら、B は C 宛の経路を失い、A から見ても C へ到達不能。次の周期で更新が広がり、最終的に「C 宛は到達不能」と全体に伝わる。更新の伝搬には数十秒〜数分かかる (これが収束の遅さの正体)。
◀ 戻る
次へ ▶
⟳ 最初に戻る
1 / 6
図の見方:各ルータは 隣からの情報だけ をもとに自分の表を更新。「全体の地図」は誰も持っていないが、繰り返し情報交換することで結果として全員の表が一致する(収束する)。
もっと詳しく:Bellman-Ford とカウント・トゥ・インフィニティ問題
距離ベクトル型の弱点が カウント・トゥ・インフィニティ(count to infinity) です。あるリンクが切れたとき、ループ状の経路情報が「2→3→4→…」と少しずつ増えていき、最大値(RIP では 16) に達するまで止まらない現象です。具体例:A-B-C が一直線で C 宛経路を持っているとき、B-C が切れると B は A から「C へ 2」と聞いて自分のコストを 3 に更新、A は B から「C へ 3」と聞いて 4 に、…と 誤情報が増幅しながら循環 。
対策の代表は次の3つ。
Split Horizon :学んだ経路を、その経路を教えてくれた隣には送り返さない
Poison Reverse :Split Horizon に加えて、教えてくれた隣には「コスト無限大(=到達不能)」と 明示的に 通知する
ホールドダウンタイマ :ある経路が悪化(コスト増加) したらしばらく更新を受け付けない時間を設け、振動を防ぐ
これらは RIP・EIGRP の実装に組み込まれています。「距離ベクトル型は素朴だが、ループ対策のテクニックの集合体」と理解してください。
考えてみよう: 日常で例えるなら「自分の知っている最短距離だけを近所の友達に教え合う」ようなもの。誰も全体地図を持っていないのに、繰り返すうちにみんなが正しい距離を知るようになる ─ これが分散アルゴリズムの面白さです。
リンクステート型(Link State) ─ OSPF と Dijkstra
距離ベクトル型の弱点を解決するために登場したのが リンクステート型(Link State: LS) です。各ルータは「自分の周囲のリンク状態」を ネットワーク全体に 広報し、結果として全員が同じ 地図(リンクステートデータベース) を手に入れます。地図さえあれば、各自で Dijkstra のアルゴリズム で最短経路木(SPT) を計算するだけで経路が決まります。代表的なプロトコルが OSPF(Open Shortest Path First) と IS-IS です。
POINT
リンクステート型のスローガン:「自分の周りのリンク状態を、全員に広報する 」。
・各ルータは LSA(Link State Advertisement) でリンク情報をフラッディング
・全ルータが同じ LSDB(Link State Database) を持つ
・各自が Dijkstra 法(SPF) で自分を根とした最短経路木を計算
・収束が速くループに強い、ただしメモリ・CPU 消費は大きい
OSPF の動作の流れ
Hello パケット (マルチキャスト 224.0.0.5 )を 10 秒に1回送り、隣接関係を発見・維持。40 秒応答が無ければリンクダウン判定
確立した隣接関係上で LSA(Link State Advertisement) を交換し、LSDB を同期
リンクの状態に変化があった場合のみ、変化を フラッディング で AS 内のすべての OSPF ルータに広報(イベント駆動)
各ルータは LSDB に基づいて Dijkstra 法 を実行し、自身を根とする最短経路木(SPT) を計算 → ルーティングテーブルへ反映
OSPF の特徴
リンクのコストは任意 (管理者が帯域・遅延などに応じて設計可能)。すべて 1 にすればホップ数と一致するが、ふつうは 108 /帯域[bps] のような自動設定
大規模 AS では「エリア」階層 (階層化 OSPF) を導入。バックボーンエリア(area 0) と複数の通常エリアに分け、エリア境界ルータが要約情報のみを交換することで LSDB のサイズと SPF 計算量を抑える
RIP と比べて収束が早く、ループに陥りにくい(全員が地図を持つので)
IETF が標準化したオープンプロトコル。多ベンダ環境で広く採用
Dijkstra 法の疑似コード
Dijkstra 法は、始点から各頂点までの「いま分かっている最短距離」を少しずつ確定していくアルゴリズムです。OSPF では、各ルータが LSDB という同じ地図を持ったうえで、自分自身を始点 にしてこの計算を行います。
入力:
G = (V, E) // ルータを頂点、リンクを辺とする地図
start // 自分自身のルータ
初期化:
for each v in V:
dist[v] = ∞ // start から v までの最短距離候補
prev[v] = none // v へ行く直前の頂点
fixed[v] = false // 距離が確定したか
dist[start] = 0
本体:
while fixed でない頂点が残っている:
u = fixed でない頂点のうち dist[u] が最小のもの
fixed[u] = true // u までの最短距離を確定
for each 辺 (u, v, cost) in E:
if fixed[v] == false and dist[u] + cost < dist[v]:
dist[v] = dist[u] + cost
prev[v] = u
出力:
dist[v] = start から v までの最短コスト
prev[v] を逆にたどると、最短経路木(SPT)が得られる
POINT
Dijkstra 法の考え方は 「一番近い未確定ノードから順に確定する」 こと。リンクコストが負にならない前提では、一度いちばん近いと分かったノードは、後からもっと短い経路で上書きされません。OSPF のリンクコストも負にならないため、この性質を使えます。
ステップで追う: A から最短経路木を作る
次の小さな地図で、A を始点にして Dijkstra 法を実行します。ボタンを押すごとに「確定するノード」と「新しく分かる最短距離」が増えていきます。
A を始点にした Dijkstra 法
2
5
1
3
2
3
4
1
A
B
C
D
E
F
G
d=0
d=2
d=5
d=3
d=5
d=6
G=9 候補
d=7
SPT 完成
赤線 = 最短経路木に入るリンク / 点線 = 一時的な候補
ステップ1. 初期化。 始点 A の距離だけ dist[A]=0 にし、B〜G は ∞ とします。まだ確定しているのは何もありませんが、最初に選ばれるのは距離 0 の A です。
ステップ2. A を確定して、隣を更新。 A から直接つながる B と C を見ると、dist[B]=2 、dist[C]=5 になります。次に選ぶのは、未確定の中で最小の B です。
ステップ3. B を確定して、B から伸ばす。 B 経由で D へ行くと 2+1=3 、E へ行くと 2+3=5 。A から見た候補距離は D=3、C=5、E=5 になります。最小の D を次に確定します。
ステップ4. D を確定する。 D 経由で F へ行くと 3+3=6 。C へは 3+2=5 で、すでに A 直通の 5 と同じなので更新しません。未確定の最小は C と E の 5 です。
ステップ5. C を確定する。 C と E はどちらも距離 5 で同点なので、ここでは C を先に選びます。C から D へ戻る候補は 5+2=7 で、すでに D は 3 で確定済みなので更新しません。
ステップ6. E を確定する。 E から G へ行く候補は 5+4=9 なので、一旦 dist[G]=9 と考えられます。ただし、まだ F が未確定なので最終決定ではありません。
ステップ7. F を確定し、G を更新。 F へは D 経由で dist[F]=6 。そこから G へ行くと 6+1=7 で、E 経由の 9 より短いので dist[G] を 7 に更新します。
ステップ8. G を確定して完了。 すべてのノードの最短距離が確定しました。prev を逆にたどると、A-B、A-C、B-D、B-E、D-F、F-G が最短経路木になります。
◀ 戻る
次へ ▶
⟳ 最初に戻る
1 / 8
Dijkstra 法の更新表
ステップ 確定する頂点 新しく分かること 未確定の候補距離
初期化 なし A=0、他は∞ B=∞, C=∞, D=∞, E=∞, F=∞, G=∞
1 A B=2、C=5 B=2, C=5
2 B D=3、E=5 D=3, C=5, E=5
3 D F=6。C は 5 のまま C=5, E=5, F=6
4 C 新しい短い経路なし E=5, F=6
5 E E 経由で G=9 が候補になる F=6, G=9
6 F F 経由で G=7 に改善 G=7
7 G 全頂点が確定 なし
Dijkstra の最短経路木イメージ
A から見た最短経路木 (Dijkstra)
A
(根:cost 0)
B
cost 2
C
cost 5
D
cost 3
E
cost 5
F
cost 6
G
cost 7
2
5
1
3
3
1
赤い太線 = 最短経路木の枝、灰色破線 = 使われなかった候補リンク
図の見方:LSDB という地図がある以上、A は自分を根とした最短経路木を 1度の Dijkstra 計算 で得られる。各宛先の「次ホップ」もこの木を辿るだけで決まる。距離ベクトル型のような繰り返しの噂話は不要。
距離ベクトル型 vs リンクステート型 ─ 比較
観点 距離ベクトル型(RIP) リンクステート型(OSPF)
各ルータが持つ情報 各宛先までのコストのみ ネットワーク全体の地図(LSDB)
情報を伝える相手 隣接ルータのみ (フラッディングで)AS 全体
計算アルゴリズム Bellman-Ford(分散) Dijkstra(各自で集中計算)
収束速度 遅い(数十秒〜数分) 速い(秒オーダ)
ループ耐性 弱い(対策必須) 強い(地図を共有しているため)
メモリ・CPU 消費 少ない 多い(LSDB 保持と SPF 計算)
規模 小〜中規模(最大 15 ホップ制限) 大規模(階層化で更にスケール)
AS(自律システム) と IGP/EGP の役割分担
インターネットは 1つの巨大なフラットなネットワーク ではありません。ISP・大学・企業・クラウド事業者などが、それぞれ独自のポリシーで運用する AS(Autonomous System: 自律システム) という単位の集まりとして成立しています。AS には AS 番号(ASN) という背番号(IANA 経由で各 RIR が割り当て) が付与されており、現在世界には 数万の AS が存在します。
POINT
インターネットは「AS のメッシュ 」。
・AS 内 の経路を決める = IGP(Interior Gateway Protocol) ─ RIP / OSPF / IS-IS / EIGRP
・AS 間 の経路を決める = EGP(Exterior Gateway Protocol) ─ BGP-4 が事実上の唯一の標準
この二段構えにすることで、規模(数万 AS) と 各組織の独自ポリシー を両立している。
なぜ分けるのか
もし全世界のルータを1つの OSPF で動かそうとしたら、LSDB のサイズと SPF 計算量が爆発し、誰のどんな細かい変化も全世界に届いてしまいます。さらに、企業 X が「うちの経路は競合 Y を経由させたくない」のような 運用ポリシー を表現する手段がありません。そこで「AS の内側 は技術的最適性で(IGP)、AS の外側 はビジネスポリシーで(EGP)」と役割を分けるのです。
インターネット = 数万の AS のメッシュ
AS 100
(例: 大学ネットワーク)
内部は OSPF (IGP)
AS 200
(例: ISP 大手)
内部は IS-IS (IGP)
AS 300
(例: クラウド事業者)
内部は OSPF (IGP)
eBGP (EGP)
eBGP (EGP)
※ AS 内は各組織が好きな IGP を選ぶ。AS 間は BGP-4 一択 (現実的に他に選択肢はない)
図の見方:同じ色の雲(=AS) の中はその組織が好きなように IGP で経路を組み立てる。雲と雲の間は eBGP セッション でつながり、AS 番号と「経由した AS のリスト(AS_PATH) 」だけを交換する。
Q. すでに OSPF があるのに、なぜ AS 間にはわざわざ別の方式 BGP が必要なのか? まず自分なりに考えてからクリック。
解答を見る
規模 :OSPF を全世界に広げると LSDB が爆発する。AS 単位で要約しないと持たない
ポリシー :OSPF は「最短コスト」しか考えないが、AS 間では「同業他社は経由したくない」「商用契約の安い経路を優先」など ビジネス的判断 が要る。これを 属性ベース で表現する仕組みが必要
収束イベントの隔離 :他社 AS の内部障害で自社のルータが SPF 計算で忙しくなるのは困る。AS 内部の細かいリンク変動は AS 外には漏らさない設計が望ましい
信頼境界 :他組織から流れてくる経路情報は 無条件に信頼できない 。受信時にフィルタするための仕組みが要る
BGP は「最短性」ではなく 「ポリシー」 を主眼に設計されている、というのが OSPF との根本的な違いです。
主な IGP 一覧
プロトコル 方式 標準化 主な使われどころ
RIP / RIPv2 距離ベクトル IETF(RFC 2453 等) 小規模 LAN・教育用途。実運用は減少
OSPF v2/v3 リンクステート IETF(RFC 2328 / 5340) 企業・大学バックボーン、ISP 内部の主流
IS-IS リンクステート ISO / IETF(RFC 1142 等) 大手 ISP のバックボーン(OSPF と双璧)
EIGRP 拡張距離ベクトル(DUAL) Cisco 由来 / 公開化(RFC 7868) Cisco 装置中心の企業ネット
BGP-4 ─ インターネットの背骨
BGP-4(Border Gateway Protocol version 4) は AS 間ルーティングの標準で、インターネットの背骨を形成する パスベクトル型(Path Vector) プロトコルです。「経由した AS のリスト(AS_PATH ) 」と各種 属性(attribute) を伝え合い、各 AS のポリシーに従って最良経路を選びます。
POINT
BGP-4 の重要ポイント:
・パスベクトル型 (距離ベクトルの拡張、AS 番号のリストを運ぶことでループを検出)
・TCP ポート 179 上で動くアプリケーション(信頼性は TCP に任せる)
・eBGP (AS 間)と iBGP (同一 AS 内の BGP ルータ間)の2モードがある
・経路選択は最短性ではなく 属性とポリシー で決まる(LOCAL_PREF, AS_PATH 長, MED, …)
・隣接関係は ピアリング (対等)と トランジット (上流に経路を提供してもらう契約) という商業形態を持つ
BGP メッセージの種類
OPEN :セッション開始時、AS 番号や保持時間を交換し合意
UPDATE :経路の追加・撤回(withdraw) を通知。本体の経路情報がここに乗る
KEEPALIVE :相手生存確認のため定期的に送信
NOTIFICATION :エラー時にセッションを切断する通知
パスベクトル型のスローガン
距離ベクトル型では「コスト」だけを伝えました。BGP は 「経路全体(経由した AS のリスト) 」を伝える 方式です。これによって、自分の AS 番号がリストに含まれていればすぐに 「ループだ」と検出 でき、距離ベクトル型の弱点(カウント・トゥ・インフィニティ) を構造的に回避します。
192.0.2.0/24 への経路情報が AS_PATH を伸ばしながら伝搬していく
AS 300
192.0.2.0/24 の出元
AS 200
AS 100
AS 50
AS_PATH = [300]
[200, 300]
[100, 200, 300]
各 AS は受信した AS_PATH の先頭に自分の AS 番号を追加 して隣に転送する
図の見方:AS 300 が 192.0.2.0/24 を持っているとき、その経路は AS_PATH を伸ばしながら隣の AS へ伝搬する。AS 50 から見ると「AS 100 → 200 → 300 と辿れば届く」と分かる。リストに自分の AS 番号があれば即座にループ検出できる仕組み。
ピアリングとトランジット ─ ビジネス的な関係
ピアリング(peering, 相互接続)
2つの AS が 対等な立場 で互いの顧客向け経路だけを交換する契約。両者にとってトラフィック量・利益のバランスが取れているときに無償で行われる(セトルメントフリー )。
例: 大手 ISP 同士、コンテンツ事業者と ISP の直接接続(JPNAP/JPIX 等の IX 経由が一般的)。
トランジット(transit, 通過提供)
上流の AS に 料金を払って 、自社のトラフィックを インターネット全体に届けてもらう 契約。下流の小規模 ISP・企業から見ると「インターネットの残り全部」への経路を1社で買うイメージ。
例: 中小 ISP が Tier 1 系のキャリアに対して結ぶ商用接続。
BGP の経路選択は技術的最短性ではなく、これらの商業的関係(LOCAL_PREF 属性で表現) が最優先になります。「最短だが高コストの経路」より「やや遠いが安いピアリング経路」が選ばれることはごく日常的です。
もっと詳しく:BGP の AS_PATH 属性
AS_PATH は BGP UPDATE メッセージに乗る属性で、宛先プレフィクスへ到達するために 経由した AS 番号の並び を保持します。重要な性質は次の通り。
ループ検出 :受信時に AS_PATH に自分の AS 番号が含まれていればその経路は即廃棄
経路選択 :LOCAL_PREF が同じなら、AS_PATH の長さが短い経路 が優先される(BGP の決定アルゴリズムの一段)
AS_PATH プリペンド(prepend) :出力時に自分の AS 番号を意図的に複数回 並べて経路を「長く見せかける」テクニック。同じ宛先に対して複数経路を持たせつつ、特定の経路を避けてもらいたいときに使う「裏口の調整スイッチ」のような役割
経路集約(aggregation) :複数のプレフィクスをまとめる際に AS_SET の形で表現される(現代では非推奨化が進む)
AS_PATH を読むだけで「このプレフィクスに到達するためにどの組織を経由するのか」が分かるため、運用者は show ip bgp <prefix> でこの属性を確認しながら経路問題のデバッグを行います。
小問:BGP-4 を OSI 参照モデルに当てはめると、もっとも適切なのはどれ?
A. 第2層 データリンク層(隣接ルータと直接やり取りするから)
B. 第3層 ネットワーク層(経路を扱うルーチングプロトコルだから)
C. 第7層 アプリケーション層(TCP の上で動くアプリだから)。ただし役割上は L3 を制御する
D. 第4層 トランスポート層(TCP を使うから)
正解:C 。BGP は TCP ポート 179 上で動くため、OSI 階層的には アプリケーション層(L7) に位置します。一方で その役割 は L3(ネットワーク層) のフォワーディングテーブルを作ることなので、文脈によっては「概念上は L3」と語られます。「動くレイヤ」と「目的のレイヤ」が乖離している例として、BGP はよく問われるポイントです。OSPF は IP 上で直接(プロトコル番号 89)、RIP は UDP 上で動くなど、ルーチングプロトコルでも実装層はバラバラです。
3方式まとめ・ループ回避・経路ハイジャック
最後に、ここまでの3方式を1つの表に並べ直し、ルーチングが直面する2つの大きな問題 ─ ルーティングループ と BGP 経路ハイジャック ─ を整理します。
RIP / OSPF / BGP の比較
RIP(IGP・距離ベクトル)
方式: 距離ベクトル(Bellman-Ford)
メトリック: ホップ数のみ。最大 15
更新: 30 秒ごとの定期フラッディング(マルチキャスト 224.0.0.9)
収束: 遅い(数十秒〜数分)。ループ対策に Split Horizon, Poison Reverse, ホールドダウンが必須
長所: シンプル・実装が軽い・教育的に分かりやすい
短所: 規模に弱い、収束が遅い、ホップ数だけだと帯域差を反映できない
使いどころ: 小規模 LAN や演習。実運用では OSPF/IS-IS に置き換えられがち
OSPF(IGP・リンクステート)
方式: リンクステート(Dijkstra)
メトリック: 任意のコスト(帯域から自動算出が一般的)
更新: Hello で隣接維持(10 秒)、変化時のみ LSA をフラッディング(マルチキャスト 224.0.0.5)
収束: 速い(秒オーダ)。地図共有でループに強い
長所: スケール、収束速度、エリア階層化、ベンダ中立
短所: LSDB のメモリと SPF 計算 CPU、設定がやや複雑
使いどころ: 企業・大学の AS 内部、ISP 内部の主流
BGP-4(EGP・パスベクトル)
方式: パスベクトル(AS_PATH を伝搬)
メトリック: 属性とポリシー(LOCAL_PREF, AS_PATH 長, MED, …)
転送: TCP 179 番上で UPDATE / KEEPALIVE / OPEN / NOTIFICATION を送受信
収束: 中程度(秒〜分)、ポリシー変更には伝搬待ちが必要
長所: 数万 AS 規模、ビジネスポリシーを表現できる、構造的にループ検出可
短所: 経路選択が複雑、誤設定が世界に波及しうる、認証が弱い(後述)
使いどころ: AS 間ルーティングの事実上の唯一の標準
ルーティングループの問題
2台以上のルータがお互いに「君のほうが宛先に近いね」と判断し合い、パケットが 同じ場所をぐるぐる回り続ける 現象を ルーティングループ と呼びます。発生原因はトポロジ変化時の更新タイミングのずれや、誤設定など多岐にわたります。インターネットでは次の4種の防衛機構を組み合わせて被害を最小化しています。
パケット側の保険:TTL
IP ヘッダの TTL(Time To Live) はルータを1ホップ通過するたびに 1 ずつ減り、0 になったパケットは破棄され ICMP Time Exceeded を返す。ループに陥っても無限に回り続けることはない 。OSPF/RIP/BGP の制御の前段にある「最後の砦」。
プロトコル側の対策:Split Horizon / Poison Reverse / ホールドダウン
Split Horizon :学んだ経路を、教えてくれた隣には送り返さない
Poison Reverse :教えてくれた隣には「コスト無限大」と明示して死亡告知
ホールドダウン :経路が悪化したらしばらく更新を受け付けない振動防止
これらは主に 距離ベクトル型 で必須。リンクステート型は地図共有で構造的にループに強い。
BGP 経路ハイジャックと経路リーク
BGP は元々 性善説 で設計されており、隣の AS が広告してきた経路を「本物かどうか」を技術的に検証する手段がありませんでした。これが原因で次のような事故が世界規模で起きています(標準編では「歴史的な事例として概要を押さえる」程度で十分です)。
経路ハイジャック: 自分の AS のものではないプレフィクスを誤って(あるいは悪意で) 広告し、本来宛先でない場所へトラフィックを引き寄せる現象。著名な事例として2008年の YouTube への到達が一部地域で別 ISP に吸い込まれた事件などが知られる[要確認:具体年・関係 AS は最新の解説で再確認のこと]
経路リーク(route leak): 顧客から学んだ経路を本来流すべきでない上流ピアにも広告してしまい、自分の AS が大量のトランジットトラフィックを抱え込んでしまう運用事故。短時間でも世界の一部の到達性が崩れる
対策の方向性: RPKI(Resource Public Key Infrastructure) による ROA(Route Origin Authorization) でプレフィクス起点 AS の正当性を暗号学的に検証する、BGPsec で経路全体を署名する、といった取り組みが進んでいます。詳細は 発展編の「DDoS 対策(スクラビング/Anycast/RPKI) 」回で扱います。
つながる知識: BGP は通信工学の問題であると同時に、運用ポリシー・契約・国際関係まで巻き込む社会技術 でもあります。「インターネットは技術と契約の集合体」だと実感できる代表例。
まとめと用語チェック
SUMMARY
1. ルータは 受信→宛先 IP 確認→ルーティングテーブル参照→次ホップへ転送 の4ステップでパケットを処理する
2. テーブルでは Longest Prefix Match により、最も長く一致するエントリが選ばれる
3. テーブルの作り方には 静的 (管理者の手書き) と 動的 (プロトコルで自動) の2系統がある
4. 動的ルーティングの3方式: 距離ベクトル(RIP / Bellman-Ford) 、リンクステート(OSPF / Dijkstra) 、パスベクトル(BGP)
5. AS(自律システム) の内部は IGP (RIP/OSPF/IS-IS/EIGRP) で、AS 間は EGP=BGP-4 でつなぐ二段構え
6. BGP-4 は TCP 179 で動き、AS_PATH と各種属性に基づく ポリシールーティング を行う(最短性ではなくビジネス的判断が支配的)
7. ループ対策は TTL (IP 側) と Split Horizon / Poison Reverse / ホールドダウン (プロトコル側) の合わせ技
8. BGP は性善説設計のため、経路ハイジャック・経路リーク という運用上の弱点を持ち、RPKI 等で対策中
用語チェック
用語 1行説明
フォワーディング ルータが1パケットごとに行う転送処理(データプレーン)
ルーチング テーブルそのものを作る処理(コントロールプレーン)
ルーティングテーブル (宛先プレフィクス, 出力, 次ホップ, …) のエントリの集合
Longest Prefix Match 複数候補のうち最長のプレフィクスが勝つルール
静的ルーティング 管理者が手作業で経路を書く方式
動的ルーティング ルータ同士の情報交換でテーブルを自動生成する方式
収束(convergence) 全ルータの表が一貫した状態に落ち着くこと
距離ベクトル型 各宛先のコストだけを隣に伝える方式(RIP/Bellman-Ford)
リンクステート型 リンク状態を全体に広報し各自で SPF を計算(OSPF/Dijkstra)
パスベクトル型 AS パス全体を伝える方式(BGP)
RIP 距離ベクトル型 IGP。最大 15 ホップ、30 秒周期
OSPF リンクステート型 IGP。Hello/LSA、SPF、エリア階層
IS-IS リンクステート型 IGP。大手 ISP のバックボーンで OSPF と双璧
EIGRP Cisco 由来の拡張距離ベクトル型 IGP(DUAL)
AS(自律システム) 共通の管理ポリシーで運用される独立ネットワーク
IGP / EGP AS 内 / AS 間ルーティングプロトコルの分類
BGP-4 AS 間ルーティングの事実上の唯一の標準、TCP 179
eBGP / iBGP AS 間 / 同一 AS 内の BGP セッション
AS_PATH BGP 経路属性の代表。経由した AS 番号のリスト
ピアリング / トランジット AS 間の対等接続 / 上流による通過提供契約
TTL IP ヘッダのホップ数制限。0 で破棄しループを防ぐ
Split Horizon 教えてくれた隣に同じ経路を送り返さないループ対策
Poison Reverse 教えてくれた隣にコスト無限大を明示通知する強化版
ホールドダウン 経路の悪化情報直後の更新を一定時間無視する振動対策
経路ハイジャック 他 AS のプレフィクスを誤って/悪意で広告する事故
確認問題
問1. ルータがルーティングテーブルから経路を選ぶ際の規則 Longest Prefix Match の説明として最も適切なものを1つ選べ。
次の選択肢から最も適切なものを選択してください。
A. 最も短いプレフィクスを優先するルール
B. ルーティングテーブルの先頭から順に並ぶ最初のエントリを選ぶルール
C. 宛先 IP に該当する複数のエントリのうち、プレフィクス長が最も長いものを選ぶルール
D. もっとも新しく追加されたエントリを選ぶルール
正解:C
Longest Prefix Match では、宛先 IP にマッチする候補のうち マスク長が最大 のものが選ばれる。例:10.1.2.3 に対し /8・/16・/24 がいずれも一致するなら、最も具体的な /24 のエントリが採用される。これによりデフォルトルートに対する例外を細粒度で書ける。A は逆、B は実装によらない誤り、D は無関係。
問2. 距離ベクトル型(RIP) とリンクステート型(OSPF) の違いとして最も正しいものを1つ選べ。
次の選択肢から最も適切なものを選択してください。
A. RIP は AS 間で動き、OSPF は AS 内で動くプロトコルである
B. RIP は隣にコスト情報を伝え合うのに対し、OSPF は全ルータがネットワーク全体の地図(LSDB) を持ち各自で Dijkstra を計算する
C. RIP はリンクステート型、OSPF は距離ベクトル型である
D. RIP は TCP 上で動き、OSPF は UDP 上で動く
正解:B
RIP は距離ベクトル型(Bellman-Ford) で隣接ルータとコスト情報のみを交換するのに対し、OSPF はリンクステート型でフラッディングにより全ルータが LSDB を共有し、各自が Dijkstra で SPT を計算する。A は両者とも IGP(AS 内) なので誤り。C は方式が逆。D も実装(RIP は UDP 520、OSPF は IP プロトコル番号 89 で直接) と異なる。
問3. 自律システム(AS) と BGP-4 に関する説明として、誤っているものを1つ選べ。
次の選択肢から最も適切なものを選択してください。
A. AS は共通の管理ポリシーで運用される独立したネットワークの単位で、IANA から AS 番号(ASN) が割り当てられる
B. BGP-4 は AS 間ルーティング(EGP) の事実上の標準であり、TCP ポート 179 を用いる
C. BGP-4 はパスベクトル型で、AS_PATH に自分の AS 番号が含まれていればループとして検出する
D. BGP-4 の経路選択は OSPF と同様に常に最短ホップ(最短コスト) が最優先される
正解:D(誤った記述)
BGP-4 の経路選択は ポリシー が支配する。LOCAL_PREF(自社内ポリシー) が最優先され、その後に AS_PATH 長、ORIGIN、MED…と続く。OSPF のような単純な最短コストではなく、商業的な契約関係(ピアリング/トランジット) を反映できる点が AS 間ルーティングの本質。A・B・C はいずれも正しい記述。
問4. ルーティングループの被害を最小化するために IP 層 で組み込まれている保険に最も近いものを1つ選べ。
次の選択肢から最も適切なものを選択してください。
A. IP ヘッダの TTL を1ホップごとに減らし、0 になったパケットを破棄する
B. ルータが同じパケットを2回受信したらすべて破棄する
C. パケットの送信元アドレスを書き換えて返送する
D. TCP の3ウェイハンドシェイクで合意した経路を強制する
正解:A
TTL(IPv4) / Hop Limit(IPv6) は 1ホップごとに 1 減算 され、0 になると破棄され ICMP Time Exceeded が送信元に返る。これによってループに陥ったパケットも有限ホップで消える。Split Horizon や Poison Reverse はプロトコル側の対策で本問の文脈とは別。B は IP の標準動作ではない、C は別物、D は TCP は経路を強制できない。traceroute はこの TTL の仕組みを逆手に取って各ホップを可視化する。
問5. BGP の経路ハイジャック(誤った AS が他組織のプレフィクスを広告してしまう事故) に対して、近年 IETF/RIR が推進している対策技術として最も適切なものを1つ選べ。
次の選択肢から最も適切なものを選択してください。
A. RIP に Split Horizon を導入する
B. RPKI と ROA によってプレフィクス起点 AS の正当性を暗号学的に検証する
C. すべての AS で OSPF を有効化し AS の境界を消す
D. すべての BGP メッセージを UDP 上に切り替える
正解:B
RPKI(Resource Public Key Infrastructure) は IP プレフィクスとそれを起点として広告できる AS を ROA(Route Origin Authorization) という署名付きオブジェクトで結びつける枠組み。BGP ルータは ROA を参照してハイジャックを検出・拒否できる。A は AS 内 IGP のループ対策、C は AS 概念の意味を破壊する誤り、D は BGP の信頼性が失われる誤り。さらに進んだ仕組みとして AS_PATH 全体を署名する BGPsec もある。