第3章 データが届くしくみ|3-3|コース全体 19回中11本目
ルーティングの基本 ― ルータはどうやって道を選ぶのか
ルータが次にどこへパケットを送るかをどう決めているのかを、ルーティングテーブルの読み方と最長一致のルールから理解する記事です。
ルータは、ルーティングテーブルを見て一番近い経路へ転送する。それだけです
ルータは宛先までの道のりを丸ごと知っているわけではありません。手元のルーティングテーブル(経路の一覧表)を見て、 宛先IPアドレスに最も近い経路を1つ選び、そこへパケットを渡す。それだけを1ホップずつ繰り返すことで、パケットは目的地にたどり着きます。
ルーティングテーブルの読み方
ルーティングテーブルは、次の4つの項目でできた表です。あるルータの実際のテーブルを例に、1行ずつ読んでいきます。
| 宛先ネットワーク | ネクストホップ | 出力インタフェース | メトリック |
|---|---|---|---|
| 0.0.0.0/0 | 203.0.113.1 | Gi0/0 | 1 |
| 10.0.0.0/8 | 192.168.1.2 | Gi0/1 | 2 |
| 10.1.0.0/16 | 192.168.1.6 | Gi0/2 | 1 |
| 10.1.2.0/24 | (直接接続) | Gi0/3 | 0 |
| 192.168.1.0/24 | (直接接続) | Gi0/1 | 0 |
- 1
宛先ネットワーク
この行がどの範囲の宛先を担当するかを示す。10.1.2.0/24 なら 10.1.2.0〜10.1.2.255 が対象。
- 2
ネクストホップ
次に渡す隣接ルータのIPアドレス。自分に直接つながっているネットワークには次のルータが不要なので「直接接続」になる。
- 3
出力インタフェース
パケットをどのポートから送り出すか。ネクストホップと対になっている。
- 4
メトリック
その経路のコスト(優先度の指標)。同じ宛先に複数の経路がある場合、値が小さい方が優先される。
たとえば宛先が 8.8.8.8 だったとします。このテーブルでは、ほかのどの行の宛先ネットワークにも当てはまらないため、 最後の受け皿である 0.0.0.0/0 の行が使われ、ネクストホップ 203.0.113.1 へ、Gi0/0 から送り出されます。
複数の行が当てはまるときは「最長一致」
さきほどのテーブルで、宛先が 10.1.2.55 だったらどうでしょうか。実は次の4つの行すべてに当てはまります。
| 宛先ネットワーク(行) | 10.1.2.55に一致する? |
|---|---|
| 0.0.0.0/0 | 一致する(プレフィックス長 0) |
| 10.0.0.0/8 | 一致する(プレフィックス長 8) |
| 10.1.0.0/16 | 一致する(プレフィックス長 16) |
| 10.1.2.0/24 | 一致する(プレフィックス長 24)← 最長なのでこれが選ばれる |
このように複数の行が同時に当てはまるとき、ルータはプレフィックス長が最も長い行(=最も範囲が狭く、宛先を限定できている行)を選びます。 これを最長一致(ロンゲストマッチ)と呼びます。この例では 10.1.2.0/24 が選ばれ、 直接接続の Gi0/3 からそのまま届けられます。
では宛先が 10.5.9.20 だったらどうでしょうか。当てはまるのは 10.0.0.0/8(プレフィックス長8)と0.0.0.0/0(プレフィックス長0)の2行だけです(10.1.0.0/16 と 10.1.2.0/24 は 2オクテット目が10.5と一致しないため対象外)。ここでも最長一致が働き、プレフィックス長が長い 10.0.0.0/8 の行が選ばれ、 ネクストホップ 192.168.1.2 へ渡されます。
デフォルトルート(0.0.0.0/0)
0.0.0.0/0 は、プレフィックス長が0、つまり「全てのIPアドレス」に一致する特別な行です。 ほかのどの行にも当てはまらなかったときに使われる、最後の受け皿として機能します。
プレフィックス長が0なので、最長一致のルールに従えば常に一番優先度が低くなります。 具体的な経路(/8 や /24 など)が1つでも一致すれば、そちらが必ず優先されます。 家庭用ルータでは「インターネットへの出口」がこのデフォルトルートに設定されています。
ルーティングテーブルは誰が作るのか:スタティックとダイナミック
ルーティングテーブルの中身は、大きく2つの方法で作られます。
スタティックルーティング(静的経路)
管理者が手作業で1行ずつ設定する方式です。経路が変わらない小規模なネットワークや、 「とりあえずこっちへ送る」というデフォルトルートの指定によく使われます。設定はシンプルですが、 回線障害などで経路が使えなくなっても自動では切り替わりません。
ダイナミックルーティング(動的経路)
ルータどうしがルーティングプロトコルという共通の手順で経路情報を教え合い、テーブルを自動的に作る方式です。 回線が切れれば、別のルータから聞いた情報をもとに自動で経路を組み替えます。規模が大きいネットワークほど、 手作業では追いつかないためこちらが使われます。代表的なプロトコルは次の3つです。
| 名前 | 方式 | 主な役割 |
|---|---|---|
| RIP | 距離ベクトル型 | ホップ数だけで経路を判断する。小規模網向けの古いプロトコル |
| OSPF | リンクステート型 | ネットワーク全体の地図を共有し、最短経路を計算する。組織内(AS内)で使う |
| BGP | パスベクトル型 | 組織と組織(AS間)で経路情報を交換する。インターネットの経路制御を支える |
深入りはしませんが、RIP・OSPFは同じ組織のネットワークの中(AS内)で使うIGP、 BGPは組織と組織の間(AS間)で使うEGPという住み分けだけ覚えておけば十分です。
TTLとループ防止
ルーティングテーブルの設定を誤ると、パケットがルータ間をぐるぐる回り続けるルーティングループが起きることがあります。 これを防ぐしくみがTTL(Time To Live)です。
- 1
送信元がTTLに初期値を入れる
初期値はOSによって異なる(例:Linuxは64、Windowsは128)。
- 2
ルータを1台通過するたびに1減る
ホストを経由しても減らない。減るのはルータ(L3の転送機器)を通るときだけ。
- 3
0になったら破棄
その時点のルータがパケットを破棄し、ICMPの「Time Exceeded」を送信元へ返す。
これにより、経路の設定ミスでループが起きても、パケットは有限回のホップで必ず消滅します。ネットワーク全体が 同じパケットで埋め尽くされる事態を防いでいるのが、この地味な1カウントダウンです。
経路を自分の目で見る
自分のPCのルーティングテーブルと、実際に通る経路をコマンドで確認してみます。
$ ip route default via 203.0.113.1 dev eth0 10.0.0.0/8 via 192.168.1.2 dev eth1 metric 2 10.1.0.0/16 via 192.168.1.6 dev eth2 10.1.2.0/24 dev eth3 proto kernel scope link src 10.1.2.1 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.1 # 先頭の default が 0.0.0.0/0(デフォルトルート)に対応します。 # Windowsは route print、macOSは netstat -rn で同じ内容が見られます。
$ traceroute 8.8.8.8 1 203.0.113.1 1.203 ms ← 自宅ルータ 2 198.51.100.9 5.446 ms ← プロバイダ 3 198.51.100.14 12.882 ms ← プロバイダの先 4 8.8.8.8 14.001 ms ← 目的地 # TTLを1, 2, 3…と1ずつ増やしながら送り、 # 各ルータが「TTL超過」で返す応答から1ホップずつ経路を割り出しています。
練習問題(全5問)
選んでから「採点する」を押すと、解説つきで答え合わせができます。
正解:パケットを次に渡す隣接ルータのIPアドレス
ネクストホップは「次にどのルータへ渡すか」を示すIPアドレスです。最終目的地とは限りません。1ホップずつ、次のルータへ渡す作業の繰り返しで宛先まで届きます。
正解:③ 10.1.2.0/24
3行とも10.1.2.55に当てはまりますが、最長一致の原則により、プレフィックス長が最も長い③ /24 が選ばれます。
正解:10.0.0.0/8
デフォルトルートはプレフィックス長が0で、どの行にも一致しないときの最後の受け皿です。具体的な経路である10.0.0.0/8の方がプレフィックス長が長いため、最長一致で優先されます。
正解:そのルータが破棄する
TTLが0になった時点でそのルータがパケットを破棄します。破棄したルータからICMPの「Time Exceeded(時間超過)」メッセージが送信元に返るのが一般的です。ルーティングループでパケットが永遠に回り続けるのを防ぐしくみです。
正解:各ルータがネットワーク全体の地図(リンクステート)を持ち、そこから最短経路を計算する
OSPFはリンクステート型のプロトコルです。各ルータがネットワーク全体のつながり方(リンクステートデータベース)を共有し、そこから最短経路を計算します。①は距離ベクトル型(RIP)、③はBGPの説明です。