前の話では、OSPF の「隣(neighbor)」が Hello というパケットのやり取りで保たれる関係だと見た。隣は一度設定したら終わりの固定された相手ではなく、Hello が届き続けるあいだだけ維持される動的な関係だ。show ip ospf neighbor で隣の状態を確認し、debug ip ospf で Hello が止まる動作も見た。
隣は見つかった。維持する仕組みもわかった。
けれど、隣を見つけただけでは、まだ何かが足りない。
誰か 1 台のマスタールータが地図を作って、各ルータに最短経路を配ってくれるわけではない。
各ルータが自分の周りのリンク状態を LSA という断片として配る。受け取った断片を LSDB に集め、5 台のルータ全員が同じ地図を持つ。地図が揃ったあと、各ルータが自分の手元で SPF を使って最短経路を計算する。誰かが答えを配るのではなく、同じ材料が揃うから各自で計算できる。


考えてみよう
5 秒だけ自分の頭で先に置いてみてほしい。隣たちは、自分の周りのリンクの状態を、どうやって伝え合うのだろうか。中心の誰かが地図を作って、各ルータに最短経路を配ってくれるのだろうか。それとも、別の仕組みで動いているのだろうか。
1. 隣たちは自分の周りの状態をどう伝え合うのか
OSPF を喋るルータは、自分の周りのリンクの状態を、決まった形の断片として全員に配る。「自分は R2 と R3 にリンクを持っている」「そのリンクは通信できる」といった、自分の担当範囲だけを記述したデータだ。各ルータが、自分の周りぶんだけを出力する。
この断片には名前がある。「LSA(Link State Advertisement)」と呼ばれる。直訳すると「リンクの状態の広告」。各ルータが「私の周りのリンクは、こうなっています」と全員に向けて広告する、ひとかたまりの情報だ。
5 台のルータ(R1〜R5)で考えると、たとえばこうなる。
R1は「自分はR2とR3にリンクを持っている」という断片を全員に配るR2は「自分はR1とR3にリンクを持っている」という断片を全員に配るR3は「自分はR1とR2とR4にリンクを持っている」という断片を全員に配るR4は「自分はR3とR5にリンクを持っている」という断片を全員に配るR5は「自分はR4にリンクを持っている」という断片を全員に配る
各ルータが、自分の周りだけを断片として配る。


「全員に配る」と言ったが、本当に全員に届くのだろうか。途中で落ちたり、順番が前後したりはしないのだろうか。
OSPF はここに、確実な仕組みを置いている。届かなければ再送する。届いたら確認の応答を返す。各断片には新しさを示す印が付いていて、古い断片は新しい断片で上書きされる。再送、確認、新旧の区別。この 3 つが組み合わさって、各ルータの断片は確実に全員に届く。
2. 受け取った断片は LSDB に蓄積される — 全員の蓄積が揃うと地図になる
配り終わると、その先で何が起きるのか。
各ルータには、受け取った断片を保存する場所がある。「LSDB(Link State Database)」と呼ばれる。直訳すると「リンクの状態のデータベース」。受け取った LSA が、ここに蓄積されていく。
各ルータの LSDB に、5 枚の断片が積まれていく。R1 の LSDB には、R1 自身の断片 + R2 からの断片 + R3 からの断片 + R4 からの断片 + R5 からの断片の、5 枚が並ぶ。R2 の LSDB にも、R3 の LSDB にも、R4 の LSDB にも、R5 の LSDB にも、同じ 5 枚が並ぶ。
全ルータの LSDB が揃ったとき、全員が同じ地図を持つ。
中心のルータが全体の地図を配るわけではない。各ルータが対称的に自分の周りだけを配り、全員が持ち寄ることで全体の地図ができあがる。
各ルータの LSDB は単なる「届いた順の一覧」ではなく、5 枚が揃って初めて地図として意味を持つ。揃ったあとは、5 つの LSDB の中身が完全に一致する。「全員が同じ地図を持つ」という言葉の具体的な意味は、「全ルータの LSDB が同じ内容で揃っている」ということだ。
3. 各自が独立に SPF で最短経路を計算する — 同じ地図だから答えが一致する
地図ができたあと、各ルータは何をするのか。
多くの場合、こう予想したくなる。
地図ができたなら、誰か 1 台がその地図を見て最短経路を計算し、結果を全員に配ってくれるのではないか?
OSPF の世界では、地図ができたあと、各ルータがそれぞれ独立に最短経路を計算する。R1 は R1 で、R2 は R2 で、R3 は R3 で、それぞれ計算する。誰かが計算して配るわけではない。
ここで使われる計算プロセスには、名前がある。OSPF の文脈では「SPF(Shortest Path First)」と呼ばれる。中核では、Dijkstra 法(Dijkstra's algorithm)という古典的な最短経路探索のアルゴリズムが使われている。地図(LSDB)を入力として、自分自身を起点とした各宛先までの最短経路を出す。
各ルータが独立に計算するのに、出てくる答えは矛盾しないのだろうか。R1 が考えた経路と、R3 が考えた経路と、R5 が考えた経路がバラバラだったら、ネットワーク全体で一貫した経路にならないのではないか。
各ルータは、独立に計算しているけれど、入力となる地図が同じだ。全ルータの LSDB が揃って一致している。同じ地図を入力として、それぞれ自分自身を起点として計算するから、出力されるツリーの起点は違っても、ネットワーク全体としては矛盾しない一貫した経路になる。
賢者がいるのではない。地図が揃うから、各自の答えが勝手に一致する。
計算結果は、各ルータのルーティングテーブルに反映される。CLI では、show ip route ospf というコマンドが使える。
R1#show ip route ospf
O 10.1.30.0/24 [110/2] via 10.1.1.2, 00:01:23, GigabitEthernet0/0
O 10.2.1.0/24 [110/3] via 10.1.1.3, 00:00:42, GigabitEthernet0/0
O 10.2.2.0/24 [110/4] via 10.1.1.3, 00:00:42, GigabitEthernet0/0
各行の頭に O が付いている。これが OSPF が学習した経路を示すマークだ。O で始まる行が、SPF が出した最短経路として、ルーティングテーブルに並んでいる。
各行の角括弧の中の数字や、リンク名、時刻列の意味は、ここでは追わない。SPF が出した最短経路が、ルーティングテーブルの O 行として書き込まれている。地図共有と独立計算の結果が、最終的にこの形で現れる。
4. 全員が同じ地図を持つから、各自の答えが揃う
OSPF が動く核心は、3 つの動作の組み合わせだ。
- 配る: 各ルータが自分の担当範囲のリンク状態を断片(
LSA)として全員に配る - 集める: 受け取った断片を
LSDBに蓄積し、全ルータのLSDBの中身が完全に一致した状態を作る - 計算する: 地図が揃った後、各ルータが独立に
SPFで最短経路を計算する
この 3 つが順に動くことで、ネットワーク全体の経路が一貫したかたちで決まる。
誰か 1 台が経路を集中管理しているネットワークではない。各ルータが対称的に自分の担当範囲を配る平等な積み重ねによって、地図ができあがる。地図ができあがってから、各ルータがそれぞれ独立に最短経路を出す。
賢者がいるのではない。地図が揃うから、各自の答えが勝手に一致する。
明日、現場で show ip route ospf を打つときには、この O で始まる各行が「配る・集める・計算する」の 3 ステップと、自律的な地図共有の積み重ねによって計算されていることを、呼び戻してほしい。
各ルータは、地図のなかから「これが最短」と判定するとき、何を頼りにしているのだろう。地図には何が書かれていて、計算の入力として何が効いているのだろう。
この問いに、次の話で正面から向き合う。