弱者は決して許すことができない。許しは強者の態度である── ガンディー
ネットワーク

ルータ同士が同じ地図を持ち、各自が経路を計算する

図 5 で人が 1 行ずつ書いたルーティングテーブルの行が、OSPF ではどう自動で載るのか。Hello から O の行までと、線が切れたときの切替を 1 枚の図で追う

ぴぐおv1人の校閲なし(AI のみ)訂正なし
ネットワークospfルーティングconcept
目次

図 5 では、遠くのネットワークへの行を人が 1 行ずつルーティングテーブルに書きました。 この記事で変わるのは、その行を誰が書くかだけです。 ルータ同士が「自分の持つネットワークとコスト」を教え合い、行が自動で載ります。 図 5 の ②「自分のテーブルで一致する行を探す」は変わりません。

この連載は、ネットワークの言葉を 3 つの層に置いて読みます。 もの(物理か論理か)、結びつき(人が設定で付ける手動か、機器が学習する自動か、製造時に決まる固定か)、通信フロー(1 本の通信がそれらを順に通る道筋)の 3 つです。

登場するもの

ルータ ID

論理のもので、ルータ 1 台を区別する 32 ビットの番号です。 手動で付けるか、設定しなければ機器が自分の IP から決めます。

隣接テーブルと LSDB

どちらも論理で、自動で育ちます。 隣接テーブルは、見つけた隣のルータの一覧です。 LSDB(リンクステートデータベース)は、どのルータがどのネットワークをコストいくつで持っているかの一覧で、同じエリアの全員が同じになります。

エリア番号とコスト

エリア番号は論理・手動で、OSPF を動かす範囲の区切りです。この図は area 0 だけを使います。 コストも論理で、既定は帯域から決まり、手で上書きできます。

DR・BDR

同じ区間に何台もつながるとき、全員同士ではなく代表者(DR)と副代表(BDR)とだけ隣接します。この役は自動で選ばれます。

結びつき

  • インターフェース ⇄ OSPF を動かす範囲は手動です。PC 側の口は passive にして Hello を出しません。
  • ルータ ⇄ 隣のルータは自動です。Hello を 10 秒ごとに出して見つけます。
  • LSDB ⇄ ルーティングテーブルは自動です。最短経路の計算結果が O の行になります。この行の信用度(AD 値)は 110 です。

通信フロー

ルータ 3 台を area 0 で動かします。ルータ 1(支店)とルータ 2(データセンター)が直結し、ルータ 3 が迂回路です。

① ルータ 1 は、OSPF を動かすと決めたインターフェースから Hello を 10 秒ごとに出します。宛先は 224.0.0.5 です。

② 相手の Hello に自分のルータ ID が載っていれば、互いに見えている状態です(2-WAY)。

③ その区間の DR と BDR を選びます。優先度が大きい方、同じならルータ ID が大きい方です。

④ 隣接する相手と LSDB を突き合わせ、足りない分を LSA でもらいます。一致したら FULL です。

⑤ 全員の LSDB が同じ内容になった状態で、各ルータが自分を起点に最短経路を計算します。

⑥ 計算の結果が O の行としてルーティングテーブルに載ります。

⑦ 直結の口が down になれば、ルータ 1 は即座に計算し直して迂回路へ切り替えます。線はつながったまま Hello だけ来ない場合は、40 秒(Dead)待って隣を失ったと判断します。

遠くのネットワークの行を人が書かなくても、ルータが自分で載せ、切れたら書き直します。

図 13

図の上半分が構成図とフロー、中ほどが DR・BDR の別の例(4 台が 1 本の LAN にいる場合)、下半分がテーブルの推移と通信の中身の推移です。

OSPF:ルータ同士が Hello で隣を見つけ、同じ地図(LSDB)を持ち、各自が最短経路を計算する 図 5・補 1 では人がテーブルに 1 行ずつ書いた。OSPF ではルータが「自分の持つネットワーク」を教え合い、行が自動で載る エリア 0(この図は単一エリアだけ。OSPF を動かす範囲) PC 側の口は passive(Hello を出さない) PC-A 192.168.10.10 GW 192.168.10.1 ルータ 1 ルータ ID 1.1.1.1 Gi0 192.168.10.1 Gi1 172.16.12.1 Gi2 172.16.13.1 ルータ 2 ルータ ID 2.2.2.2 Gi0 172.16.12.2 Gi1 192.168.3.1 Gi2 172.16.23.1 PC-C 192.168.3.10 GW 192.168.3.1 支店 データセンター ルータ 3 ルータ ID 3.3.3.3 Gi0 172.16.13.2 Gi1 172.16.23.2 この区間の DR=ルータ 2・BDR=ルータ 1(優先度が同じならルータ ID が大きい方) 172.16.12.0/30 コスト 10 7 172.16.13.0/30 コスト 10 DR=ルータ 3 172.16.23.0/30 コスト 10 DR=ルータ 3 平常時:直結はコスト 10、ルータ 3 経由は 10+10=20。ルータ 1 は小さいほうの直結を選ぶ(テーブルの数字は相手の LAN 側 1 を足して 11) ⑦ 直結の線が切れると、ルータ 1 は地図から計算し直してルータ 3 経由に切り替える(コスト 20+1=21) 隣を見つけてから、ルーティングテーブルに行が載るまで 1 Hello 10 秒ごと・全員あて 2 2-WAY 双方向を確認 3 DR・BDR 代表者を選ぶ 4 FULL LSDB を同じに 5 計算 最短経路(SPF) 6 O の行 テーブルに載る ExStart・Exchange・Loading は ② と ④ の間の状態(LSDB を突き合わせている最中)。同じ区間の DROther 同士は ② で止まる 同じ区間に 3 台以上つながるとき:全員と隣接せず、代表者(DR)と副代表(BDR)とだけ隣接する(別の例:4 台が 1 本の LAN にいる場合) 代表者を決めないと:4 台で 6 組。n 台なら n(n−1)/2 組(6 台なら 15 組) ルータ 4 ルータ 5 ルータ 6 ルータ 7 組の数だけ LSDB のやり取りが起きる。台数が増えるほど急に増える 代表者を決めると:隣接は 5 組。n 台なら 2n−3 組(6 台なら 9 組) ルータ 4 ルータ 5 ルータ 6(BDR) ルータ 7(DR) 太線=FULL の隣接 点線=2-WAY のまま(互いを知るだけで LSDB は交換しない) 2 台だけの Ethernet 区間でも Cisco の既定では選ぶ(上の図の DR 表示) フロー ① ルータ 1 は、OSPF を動かすと決めたインターフェースから Hello を 10 秒ごとに出す。宛先は 224.0.0.5(OSPF ルータ全員あて) ② Hello には自分のルータ ID と「いま見えている隣のルータ ID の一覧」が入る。相手の Hello に自分の ID があれば双方向が確認できた=2-WAY ③ その区間の代表者(DR)と副代表(BDR)を選ぶ。優先度(既定 1・0 は選ばれない)が大きい方、同じならルータ ID が大きい方 ④ 隣接する相手と LSDB(自分の持つネットワークとコストの一覧=地図)を突き合わせ、足りない分を LSA でもらう。一致したら FULL ⑤ 全員が同じ地図を持った状態で、各ルータが自分を起点にした最短経路(コストの合計がいちばん小さい道)を計算する ⑥ 計算の結果がルーティングテーブルに O の行として載る(自動)。行の信用度 AD は 110 ⑦ 直結の口が down になればルータ 1 は即座に気づいて計算し直す。線はつながったまま Hello だけ来ない場合は、40 秒(Dead)待って隣を失ったと判断する 増えたもの/3 層で見ると もの:ルータ ID(論理・手動で付けるか機器が自分の IP から決める)/エリア番号(論理・手動)/隣接テーブル(論理・自動)    LSDB=リンクステートデータベース(論理・自動。同じエリアの全員が同じ内容)/コスト(論理・帯域から自動、手で上書き可) 結びつき:インターフェース ⇄ OSPF を動かす範囲(手動)/ルータ ⇄ 隣のルータ(自動・Hello)/LSDB ⇄ ルーティングテーブル(自動・計算結果) フロー:図 5 の ②「自分のテーブルで一致する行を探す」は変わらない。変わったのは、その行を誰が書いたか(手動から自動へ) 図 1〜7 との接続 図 5・補 1 で手で書いた 192.168.3.0/24 の行は外しておく。残すと AD がスタティック 1 < OSPF 110 で、スタティックが勝ち O の行は載らない 補 1 のフローティングスタティックは予備の行を人が書いて眠らせた。OSPF は予備の道も地図から計算し直すので、行を書かなくてよい 図 7 の 3 つの問題(途中の経路表を書けない・社内住所が運ばれない・中身が読める)は解けない。OSPF は自分たちのルータ同士の話 各テーブルの推移(○番のフローで追加された行。青字。⑦ は切替後) 前提: 3 台とも area 0 で OSPF を動かし、PC 側の口は passive にしてある。図 5 で手で書いたスタティックの行は外してある ルータ 1: 隣接テーブル ② 追加: 2.2.2.2 Gi1 2-WAY ② 追加: 3.3.3.3 Gi2 2-WAY ④ 両方とも FULL に進む ルータ 1: LSDB(3 台とも同じ内容) ④ 追加: ルータ 1 の LSA(持つ網とコスト) ④ 追加: ルータ 2 の LSA ④ 追加: ルータ 3 の LSA ルータ 1: ルーティングテーブル 前提: 192.168.10.0/24 → Gi0(直結・図 5 と同じ) 前提: 172.16.12.0/30 → Gi1(直結) ⑥ 追加: O 192.168.3.0/24 [110/11] Gi1 ルータ 3: 隣接テーブル ② 追加: 1.1.1.1 Gi0 ② 追加: 2.2.2.2 Gi1 ④ 両方とも FULL に進む ルータ 1: 切替後のテーブル ⑦ 直結の行が消える(口が down) ⑦ O 192.168.3.0/24 [110/21] Gi2 (10+10+1。迂回のぶんコストが増える) PC-A 側の設定 変更なし。GW は 192.168.10.1 のまま ⑦ の切替中に数パケット落ちる 通信の中身の推移(フローごとのフレーム/パケット) ① Hello(10 秒ごと・OSPF ルータ全員あて) 宛先 MAC 01:00:5e:00:00:05 送信元 MAC MAC R1-Gi1 宛先 IP 224.0.0.5 送信元 IP 172.16.12.1 データ Hello フレーム=全部。ただしスイッチが見るのは MAC とタグの部分だけ パケット=この部分。ルータはここ(IP)を見る ② Hello のデータの部分に入るもの 自分のルータ ID・エリア番号・Hello 間隔 10・Dead 40・優先度・いま思っている DR と BDR の ID・見えている隣のルータ ID の一覧 ② 双方向の判定 相手から来た Hello の一覧に自分のルータ ID が載っていれば「相手にも自分が見えている」=2-WAY。ここまでは全員と行う ④ 隣接を組む最中の LSU(要求してきた相手あて・1 対 1) 宛先 MAC MAC R2-Gi0 送信元 MAC MAC R1-Gi1 宛先 IP 172.16.12.2 送信元 IP 172.16.12.1 データ LSU ⑤⑥ 計算の結果 ルータ 1 は自分を起点に最短経路を計算し、192.168.3.0/24 の出口を Gi1・コスト 11(10+相手の LAN 側 1)と決めてテーブルに載せる ⑥ PC-A → PC-C の本番(ルータ 1 → ルータ 2 の区間) 宛先 MAC MAC R2-Gi0 送信元 MAC MAC R1-Gi1 宛先 IP 192.168.3.10 送信元 IP 192.168.10.10 データ ping ⑦ 直結が切れた後(同じ通信がルータ 3 経由になる) 宛先 MAC MAC R3-Gi0 送信元 MAC MAC R1-Gi2 宛先 IP 192.168.3.10 送信元 IP 192.168.10.10 データ ping 通信の中身(宛先 IP・送信元 IP)は図 5 と同じで変わらない。変わるのは、出口を決める行が手動で書かれたか計算で載ったか OSPF はポート番号を使わない。TCP/UDP を通さず IP の中に直接入る(IP プロトコル番号 89)。宛先は 224.0.0.5(OSPF ルータ全員)と 224.0.0.6(DR・BDR が受け取る) 宛先 MAC 01:00:5e:00:00:05 は 224.0.0.5 に対応するマルチキャストの MAC。TTL は 1 で、ルータを越えない ④ の LSU が 1 対 1 なのは、相手が「この LSA をください」と要求してきたぶんを返しているから(RFC 2328 10.7) 落ち着いた後に新しい情報を配り直すときは宛先が変わる。ブロードキャストの区間では DR・BDR が 224.0.0.5、それ以外のルータは 224.0.0.6(RFC 2328 13.3) コストの既定は 10^8 ÷ インターフェースの帯域(基準 100 Mbps)。100Mbps も 1Gbps も 1 に丸まるため、基準を上げるか手でコストを付ける(勉強会は手で 10 と 20 を付けた) Hello 10 秒・Dead 40 秒は Cisco IOS の既定(勉強会の実機出力 Timer intervals configured, Hello 10, Dead 40 で確認) RFC 2328 Appendix C.3 は規格の決めごとではなく設定値の説明で、LAN の例として Hello 10 秒を挙げる Dead 40 秒という例示値は C.3 に無い(HelloInterval の何倍か、例えば 4 倍にせよ、とだけ書いてある) 代表者は先に決まると、後から優先度の大きいルータが来ても交代しない(RFC 2328 9.4)。DROther 同士が 2-WAY で止まる根拠は同 10.4 EIGRP は Cisco が作った同類のプロトコル(基本部分は RFC 7868・Informational として公開)。現行の CCNA(200-301 v1.1)の範囲表に EIGRP の記載は無い(0 件) その範囲表の 3.4 は「単一エリアの OSPFv2」で、3.4.a 隣接/3.4.c ブロードキャスト(DR/BDR の選出)/3.4.d ルータ ID。この図はそこを扱っている 未検証:切替に実際かかる秒数は測っていない(勉強会の観察は「パケットが数個落ちた後に復旧」まで) 出典 RFC 2328 https://www.rfc-editor.org/rfc/rfc2328.txt    9.4 代表者の選び方/10.4 隣接を組む相手/10.7 要求への返し方/13.3 配り直しの宛先/Appendix A.1 番号/Appendix C.3 タイマー 出典 Cisco OSPF FAQ https://www.cisco.com/c/en/us/support/docs/ip/open-shortest-path-first-ospf/9237-9.html (コスト=基準 100 Mbps ÷ 帯域) 出典 Cisco ルータ ID の決まり方 https://www.cisco.com/c/en/us/support/docs/ip/open-shortest-path-first-ospf/23862-duplicate-router-id-ospf.html 出典 RFC 7868 https://www.rfc-editor.org/rfc/rfc7868.txt (EIGRP) ## 図 5・補 1 との接続

図 5 で手書きした 192.168.3.0/24 の行は外しておきます。 同じ宛先の行が複数あるときは信用度(AD 値)の小さい行が勝つので、スタティックの 1 が OSPF の 110 に勝ち、O の行が載らないからです。

補 1 のフローティングスタティックは、予備の行を人が書いて眠らせる書き方でした。OSPF は予備の道も LSDB から計算し直すので、予備の行を書かずに済みます。

図 7 の 3 つの問題(途中のルータの経路表を書けない・社内の住所が運ばれない・中身が読める)は、OSPF では解けません。教え合えるのは自分たちのルータの間だけだからです。

次の図 14 からは「壊れても止まらない」の塊に入り、線を 2 本にします。

未検証・注意

  • 切替に実際かかる秒数は測っていません。観察できたのは「パケットが数個落ちた後に復旧する」までで、図にも秒数を書いていません。
  • DR・BDR で隣接の組数が減ること(4 台なら 6 組が 5 組)は、RFC 2328 1.2 の記述と組の数え方から書いています。通信量は測っていません。
  • Hello 10 秒・Dead 40 秒は Cisco IOS の既定として実機の表示で見た値です。RFC 2328 Appendix C.3 は規格の決めごとではなく設定値の説明で、そこに Sample value が載っているのは HelloInterval だけ、Dead 40 秒という例示値は無い、という確認記録を図の担当から引き継いでいます。この記事を書くにあたっての取得では C.3 の本文まで届かなかったので、こちらでは読めていません。
  • コストの既定は 10 の 8 乗 ÷ インターフェースの帯域です。この式では 100 Mbps も 1 Gbps も 1 に丸まり、道の優劣が付きません。図は手で付けたコスト(10 と 20)で描いています。ルーティングテーブルに出る 11 と 21 は、そこに相手の LAN 側インターフェースのコスト 1 を足した値です。
  • EIGRP は Cisco が作った同類のプロトコルで、基本部分は RFC 7868(Informational)として公開されています。現行の CCNA(200-301 v1.1)の範囲表に EIGRP の記載はありません。

出典

関連

この記事の校閲記録

誰が・いつ・どの版の・どの段落を・何の観点で見て、何と言ったかを全件そのまま出す(追記のみ・削除しない)。

段落 36 のうち出典つき 13・出典なし 23

v1 2 件
  • AIAI (claude-fable-5) が AI 確認未解決

    出典 URL 5 本を再取得し、到達できることと引用の所在を確かめた。RFC 2328 は 10.7 が Receiving Link State Request Packets であることを確認。Appendix C.3 は今回の取得では本文まで届かず読めなかったため、Hello と Dead の例示値についての記述は図の担当の確認記録を引き継いだ(未検証として本文に明記)。コスト=基準帯域 100 Mbps ÷ インターフェース帯域は Cisco の OSPF FAQ、ルータ ID の決まり方は Cisco の Duplicate Router ID のページ、EIGRP が Informational の RFC 7868(2016 年 5 月)であることは RFC 本文で確認した。切替秒数・DR/BDR による通信量の削減・C.3 の本文は未検証として残した。校正チェックリストを通し、例え話・体言止め・結論の先取り・未定義語の初出を検査した。守秘: 実名・社名・会場名・地名・金額なし

  • AIAI (claude-fable-5) が 編集未解決

    公開前の校閲。未検証・注意の RFC 2328 Appendix C.3 の項が、C.3 の中身を断定しながら次の文で「本文は読めていません」と述べていて食い違っていたため、断定の部分を図の担当からの引き継ぎとして帰属させ、こちらでは読めていないことと分けて書き直した。本文の「手で付けたコスト(10 と 20)」と図のテーブルの 11・21 がずれて見えるので、差が相手の LAN 側インターフェースのコスト 1 であることを同じ項に 1 文足した。DR・BDR の選び方(優先度が大きい方、同点はルータ ID が大きい方)、AD 値 110、隣接の組数 6 組→5 組、コストの式は図の担当メモと照合して修正していない。図の担当メモの未検証 6 項目が本文に引き継がれていることも照合した。

参考文献

更新履歴

  • 連載のトピックを「ネットワーク基礎」から「ネットワーク」へ改名(32 本+目次。slug と URL は不変)
  • 公開: 連載「ネットワーク基礎」図 8〜24 の記事 17 本と目次の更新

機械可読の記録