コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB
ルーティングと経路選択
世界中の宛先を、全部覚えることはできない
ルーターの仕事は「次にどこへ渡すか」を決めることだけです。最終目的地まで自分で届けるわけではありません。
とはいえ、世界には数十億の宛先があります。1 つずつ覚えるのは不可能です。ではどうやって次を決めているのか。答えは、宛先を 1 つずつではなく、範囲でまとめて覚えることです。
表を引いて、一番細かい行を選ぶ
ルーターは経路表という表を持っています。1 行が「この範囲宛なら、次はここへ渡す」という対応です。
プレーンテキスト
192.168.1.0/24 直結している
10.0.0.0/8 次は 10.0.0.1 へ
0.0.0.0/0 次は 192.0.2.1 へ宛先が 10.5.0.1 なら 2 行目に当てはまります。ここで問題になるのが、複数の行に当てはまる場合です。10.5.0.1 は 3 行目の 0.0.0.0/0 にも当てはまっています。
このとき選ばれるのは、範囲が一番狭い行です。/8 は 1600 万個をまとめた大雑把な行、/0 はすべてを含む行なので、より細かく指定している /8 が勝ちます。書いた順番は関係ありません。「一番具体的な指示に従う」と覚えてください。
最後の 0.0.0.0/0 は、どれにも当てはまらなかったときの行き先です。家の PC の経路表はほぼこれ 1 行だけで、「自分の網の中でなければ全部ルーターに投げる」という内容になっています。この投げ先をデフォルトゲートウェイと呼びます。数十億の宛先を覚えなくて済むのは、この 1 行があるからです。
注意したいのは、経路表が行き先を指すだけで、その先が本当に生きているかまでは保証しない点です。設定を間違えれば、データは指示どおり存在しない方向へ渡され、そのまま消えます。「設定はちゃんと入っているのに届かない」という状態が成立しうるのは、この表が単なる指示書だからです。
誰が表を書くのか
小さな網なら、管理者が手で書けば足ります。壊れたら手で直します。手で書くか自動にするかは、規模よりも変化の速さで決めます。構成が変わらない網なら手書きで十分ですし、そのほうが挙動を読み切れます。
インターネット全体ではそうはいきません。回線は日々増減し、事故で経路が消えます。そこでルーターどうしが「私はこの範囲へ行けます」と互いに知らせ合い、表を自動で更新します。組織の内側では OSPF、組織と組織のあいだでは BGP という取り決めが使われます。
BGP は互いの申告を信用して動きます。だから誤った申告がそのまま事故になります。ある組織が「私はこの範囲へ行ける」と誤って広めた結果、世界中の通信がそこへ吸い込まれて特定のサービスが繋がらなくなる事故が、実際に何度も起きています。
経由地を目で見る
途中の経路は traceroute コマンドで確認できます。
プレーンテキスト
$ traceroute example.com
1 192.168.1.1 1.2 ms
2 192.0.2.1 8.8 ms
3 198.51.100.1 9.1 ms1 行が 1 ホップです。どこまで進んで止まったかが見えるので、「特定の地域からだけ遅い」といった切り分けに使えます。途中の行が空欄になっていても異常とは限りません。応答を返さない設定のルーターがあるだけ、ということがよくあります。
復習ミニクイズ
インターネット全体の AS 間ルーティングで使われるプロトコルはどれですか