本社のサーバ室で、ルータ A とルータ B の経路表を並べてみる。
行き先と次の渡し先と距離が並ぶ、見慣れた形の表が、2 台それぞれの手元にある。並べて見ると、行のほとんどが同じだ。
別々のルータとして独立に動いているはずなのに、ほぼ同じ経路表が、別の場所で、同時に存在している。


別々に動いているはずの 2 台が、ほとんど同じ経路表に行き着いている。その手前で、何が同じだったのか。
距離ベクトル型では、経路の全体像が誰の手にも残らなかった
前のシリーズでは、ずっと隣りに聞いて回るやり方を歩いてきた。
「あなたからは、どこへ行けますか」「あと何台向こうですか」と、隣り同士で確かめ合い、自分の経路表を少しずつ書き換えてきた。隣りから渡ってきた答えを受け取って、自分の手元の表に書き足す。書き足した分を、また別の隣りに渡す。そうやって、距離の数字が少しずつ網に広がっていった。
そのとき、各ルータの手元には、自分が聞き終わった分の経路表だけが残っていた。
行き先と、次の渡し先と、距離。それで困らない場面もあった。けれど、もし誰かに「この網の全体像を見せて」と頼まれたら、どのルータも答えられなかった。誰も全体像を持っていなかったからだ。各ルータが見ていたのは、隣りから渡ってきた選択結果だけで、その選択がどのリンクを通って、どこを経由して導かれたのかは、手元に残っていなかった。
これが、隣りに聞いて回るやり方の手触りだった。素朴で、よく動いて、小さな網では今でも生きている。ただ、経路の全体像は、誰の手にも残らなかった。
各ルータが自分の見える隣りを書き、それが全員に行き渡って同じ内容になる
本社のルータ A とルータ B は、独立に動いていて、それでも経路表のほとんどの行が同じになっている。2 台が独立に経路表を作って、それでも同じ行に行き着いたとしたら、その手前で何が同じだったはずだろうか。
誰か 1 台が経路表を作って配っているのではないか。隣り同士で会話して、お互いの経路表を 1 行ずつ揃えていっているのではないか。あるいは、全員が同じ情報源を持っていて、各自がそれを読んで作っているのではないか。
本社では、3 つ目だ。
各ルータは、隣りに「あなたから何が見えますか」と聞き合うのではなく、自分自身から見える範囲を書き留めている。「私からは、ルータ A が見えている」「このリンクは生きている」「あちらの方向にも 1 本伸びている」。書き留める範囲は、自分から見える隣りと、そのリンクの状態だけ。それ以上は触らない。
ルータ A が書き留めた断片、ルータ B が書き留めた断片、支社のルータが書き留めた断片、ISP の中核のルータが書き留めた断片。それぞれの断片が、網全体に行き渡る。本社のルータ A も、ルータ B も、支社のルータも、ISP の中核のルータも、同じ内容のものを 1 つずつ手元に持っている。
中心の 1 台が描いて配っているわけではない。各ルータが自分の見える範囲を正直に書き、その断片が全員に行き渡って、結果として同じ内容のものができている。


隣りに聞いて回るやり方では、隣りが渡してきた選択結果を信じるしかなかった。隣りがその選択をどう導いたのか、どのリンクが生きていて、どこを経由したのか、その根拠は手元に残らなかった。網が小さいうちはそれで済むが、大きくなるほど、各ルータは隣りから受け取った経路の行だけで判断し、リンクの状態を自分の手元では確認できない場面が増える。
規格を書いた人たちが選んだのは、順序を逆にすることだった。経路を渡し合うのを止め、まず全員が同じ情報を手元に揃える。網のどこに何があり、どのリンクが生きているかを、全員が同じ内容で持つ。その上で、各ルータが手元でその情報を読み、自分の経路表を作る。経路を交換するのではなく、網の素材を交換する。網の素材を全員で同じ内容で持って、その素材を各自が読んで計算する。
本社のルータ A もルータ B も、自分の見える範囲だけを書き、その断片を網に流し、他のルータから来た断片を受け取っている。それを組み合わせて、同じ内容のものを手元に持っている。
各ルータが同じ内容を読んで、自分の経路表を計算する
本社のルータ A とルータ B の経路表を並べると、2 台が手元に持っているものは同じ内容だ。同じ網のどこに何があり、どのリンクが生きているかが、両方の手元に同じ内容で揃っている。
その上で、ルータ A は手元のものを読み、自分の位置から見た経路表を作る。ルータ B も、同じ手元のものを読み、自分の位置から見た経路表を作る。お互いに会話する必要はない。同じ内容を読んで、同じ手順で計算するので、どこに何があるかと、そこへの道のりの形は、両方で揃って見える。
独立に動いている 2 台が、それぞれの位置から一貫した経路表に行き着いていたのは、そのためだ。次にどのリンクへ渡すかは、自分の位置に応じて決まるので、行ごとの「次の渡し先」までは両方で揃わない。それでも、見えている宛先と道のりの形は揃って見える。
経路表に並ぶ行の形は、隣りに聞いて回るやり方のときと、見た目はそっくりだ。行き先があり、次の渡し先があり、距離がある。ただ、その行が「どこから来たもの」かが違う。隣りに聞いて回るやり方では、行は隣りから渡ってきた選択結果だった。今のやり方では、行は、各ルータが手元のものを読んで、自分で計算した結果だ。
由来が違うと、その経路表の信じ方も、少しだけ変わる。隣りに聞いて回るやり方では、隣りの選択を信じていた。今のやり方では、自分が計算した結果を信じている。自分の手元には、計算の素材がそのまま残っている。


このやり方には、名前がついている。
リンクステート型ルーティングは、同じ内容のものを全員で揃えて、その内容を読んで各自で経路表を作るやり方だ。
「リンクステート」という名前の中の「リンクの状態」というのが、各ルータが書き留めた素材のことを指している。自分から見える隣りと、そのリンクが生きているか、どんな状態か。それを全員で持ち合うから、リンクの状態を共有するやり方、という名前になっている。
隣りに聞いて回るやり方では、隣りから渡ってくるのは「経路の選択結果」だった。リンクステート型では、隣りから渡ってくるのは「経路の素材」だ。経路は、各ルータが素材を読んで自分で計算した結果として、手元に並ぶ。
経路表の行の由来の違い—隣りから来たものか、自分が地図を読んで計算したものか
本社のルータ A とルータ B が同じ経路表に行き着いていた手前にあったのは、両方が同じ内容を手元に持ち、それを独立に読んで計算していた、という一点だった。
ネットワークの世界には、隣りに聞いて回るやり方と、同じ内容を全員で揃えて各自で計算するやり方の、2 つの観測軸がある。どちらが上で、どちらが下、という優劣の話ではない。どちらの方が、目の前の網に合うか、という違いだ。
誰かが「OSPF」や「IS-IS」と口にしたときには、同じ内容を全員で揃えて各自が手元でそれを読んで経路表を作るやり方、という観測軸を起点にして読み進めていける。経路表をのぞき込んだときにも、その表の行が隣りから渡ってきた選択なのか、自分が計算した結果なのか、由来を区別して見られる。由来を区別して読めると、その経路表からどこまで信じてよいかも、少し変わってくる。
全員が同じ内容のものを持っていると言ったが、網が大きくなっていったときに、その「同じ内容のもの」は本当に 1 つで済むのか。
その問いの答えは、もう一段だけ先で待っている。