NET // communication networks
LESSON 22 / 標準編

ネットワーク層 ─ ルーティング(IGP/EGP・BGP 概要)

パケットが世界の反対側まで届くのは、無数のルータが「次にどこへ渡せばよいか」を分担して知っているからです。本講では ルーティングテーブルLongest Prefix Match から始めて、距離ベクトル型(RIP)・リンクステート型(OSPF)・パスベクトル型(BGP) の3方式を比較し、AS(自律システム)を結ぶ BGP-4 の役割と実際の経路ハイジャック事例まで、図と対話的な収束デモで体系的に学びます。

学習目標

本講を終えると、以下の問いに学術的な言葉で答えられるようになります。

本講は 標準 IP・サブネット・NAT・ICMP で扱った フォワーディング(1パケットの転送) を前提に、その下敷きとなる ルーチングテーブル がどう作られるのかに踏み込みます。次回 標準 リンク層: Ethernet/MAC/ARP では、ルータが「次ホップ」を決めた後、隣の機器までフレームを届ける物理に近い仕組みへと降りていきます。

このレッスンの目次

01 フォワーディングと経路選択 ネットワーク層には大きく2つの仕事があります。1パケットごとに高速に処理する フォワ… 02 静的 vs 動的 ルーティングテーブルを 誰が・どうやって 作るのかには2つの方式があります。管理者が… 03 距離ベクトル(RIP) 動的ルーティングの最初の方式は 距離ベクトル型(Distance Vector: D… 04 リンクステート(OSPF) 距離ベクトル型の弱点を解決するために登場したのが リンクステート型(Link Sta… 05 AS と IGP/EGP インターネットは 1つの巨大なフラットなネットワーク ではありません。ISP・大学・… 06 BGP の仕組み BGP-4(Border Gateway Protocol version 4) は… 07 ループとハイジャック 最後に、ここまでの3方式を1つの表に並べ直し、ルーチングが直面する2つの大きな問題 … 08 まとめ 本講の重要語句を整理 09 確認問題 理解度を問題でチェック

ルータの仕事 ─ パケット受信から次ホップへ

ネットワーク層には大きく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/24192.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 で選ばれる出口は?
正解: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=∞
1A→B(1)∞ > 0+1 なので更新A=0, B=1, C=∞, D=∞
2A→C(4)∞ > 0+4 なので更新A=0, B=1, C=4, D=∞
3B→C(2)4 > 1+2 なので更新A=0, B=1, C=3, D=∞
4B→D(5)∞ > 1+5 なので更新A=0, B=1, C=3, D=6
5C→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 の最適性原理(最短路の部分路もまた最短路)の直接の帰結です。

分散版への変形 ─ なぜルーティングに使えるか

中央集権 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 の具体仕様

収束プロセスをステップで見る

ノード 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つ。

これらは 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 の動作の流れ

  1. Hello パケット(マルチキャスト 224.0.0.5)を 10 秒に1回送り、隣接関係を発見・維持。40 秒応答が無ければリンクダウン判定
  2. 確立した隣接関係上で LSA(Link State Advertisement) を交換し、LSDB を同期
  3. リンクの状態に変化があった場合のみ、変化を フラッディング で AS 内のすべての OSPF ルータに広報(イベント駆動)
  4. 各ルータは LSDB に基づいて Dijkstra 法 を実行し、自身を根とする最短経路木(SPT) を計算 → ルーティングテーブルへ反映

OSPF の特徴

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]=2dist[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=∞
1AB=2、C=5B=2, C=5
2BD=3、E=5D=3, C=5, E=5
3DF=6。C は 5 のままC=5, E=5, F=6
4C新しい短い経路なしE=5, F=6
5EE 経由で G=9 が候補になるF=6, G=9
6FF 経由で G=7 に改善G=7
7G全頂点が確定なし

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 が必要なのか? まず自分なりに考えてからクリック。

主な 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 メッセージの種類

パスベクトル型のスローガン

距離ベクトル型では「コスト」だけを伝えました。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 を読むだけで「このプレフィクスに到達するためにどの組織を経由するのか」が分かるため、運用者は show ip bgp <prefix> でこの属性を確認しながら経路問題のデバッグを行います。

小問:BGP-4 を OSI 参照モデルに当てはめると、もっとも適切なのはどれ?
正解:C。BGP は TCP ポート 179 上で動くため、OSI 階層的には アプリケーション層(L7) に位置します。一方で その役割 は L3(ネットワーク層) のフォワーディングテーブルを作ることなので、文脈によっては「概念上は L3」と語られます。「動くレイヤ」と「目的のレイヤ」が乖離している例として、BGP はよく問われるポイントです。OSPF は IP 上で直接(プロトコル番号 89)、RIP は UDP 上で動くなど、ルーチングプロトコルでも実装層はバラバラです。

3方式まとめ・ループ回避・経路ハイジャック

最後に、ここまでの3方式を1つの表に並べ直し、ルーチングが直面する2つの大きな問題 ─ ルーティングループBGP 経路ハイジャック ─ を整理します。

RIP / OSPF / BGP の比較

RIP(IGP・距離ベクトル)

OSPF(IGP・リンクステート)

BGP-4(EGP・パスベクトル)

ルーティングループの問題

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 が広告してきた経路を「本物かどうか」を技術的に検証する手段がありませんでした。これが原因で次のような事故が世界規模で起きています(標準編では「歴史的な事例として概要を押さえる」程度で十分です)。

対策の方向性: 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 と双璧
EIGRPCisco 由来の拡張距離ベクトル型 IGP(DUAL)
AS(自律システム)共通の管理ポリシーで運用される独立ネットワーク
IGP / EGPAS 内 / AS 間ルーティングプロトコルの分類
BGP-4AS 間ルーティングの事実上の唯一の標準、TCP 179
eBGP / iBGPAS 間 / 同一 AS 内の BGP セッション
AS_PATHBGP 経路属性の代表。経由した AS 番号のリスト
ピアリング / トランジットAS 間の対等接続 / 上流による通過提供契約
TTLIP ヘッダのホップ数制限。0 で破棄しループを防ぐ
Split Horizon教えてくれた隣に同じ経路を送り返さないループ対策
Poison Reverse教えてくれた隣にコスト無限大を明示通知する強化版
ホールドダウン経路の悪化情報直後の更新を一定時間無視する振動対策
経路ハイジャック他 AS のプレフィクスを誤って/悪意で広告する事故
NEXT: 次回 標準 リンク層: Ethernet/MAC/ARP/CSMA-CD では、ルータが選んだ「次ホップ」までフレームを実際に届ける物理に近い世界に降りていきます。本講で扱った「IP の住所」と次回の「MAC の住所」を ARP がつなぎます。

確認問題

問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 もある。
← PREV
第21回 DHCP と IP 自動設定
NEXT →
第23回 Ethernet・ARP・スイッチング