超簡単なOSPF+LSAの説明

## はじめに
ネットワークスペシャリスト試験の勉強の中でOSPF、LSAについて調べたので備忘録。

## OSPFとは
OSPF（Open Shortest Path First）は、**ルーティングプロトコル**の一種です。
※ルーティングプロトコルとは、ネットワーク内で「どの経路を通れば目的地に最適にたどり着けるか」を決めるルールのこと。

OSPFは、企業ネットワークやデータセンターなどの**一つの組織内のネットワーク**で使用されることが多いです。
※**IGP（Interior Gateway Protocol）** と呼ばれるカテゴリに属します。

OSPFの特徴は以下の通りです。
- リンクステート型のルーティングプロトコル
ネットワーク全体の地図を作り、最適な経路を計算する。
- 最短経路を計算する
「一番早く届くルート」を自動で選んでくれる。
- ネットワークの変化に素早く対応
どこかのルートが故障した場合、自動的に別のルートを探す。
- エリア分割による負荷分散が可能
大規模ネットワークでも効率的に動作する。

## OSPFの動作イメージ
なかなかイメージが難しいかもしれないので、以下のシナリオで説明してみたいと思います。

あなたの会社には、3つの拠点（A支社・B支社・本社）があります。
各拠点にはルータがあり、最適なルートを見つけるために**OSPF**を使っています。
ネットワーク構成は以下の通りです。
- <font color=green>本社ルータ</font>（ルータH）
A支社とB支社の両方とつながっている
- <font color=red>A支社ルータ</font>（ルータA）
本社ルータHとつながっている
- <font color=blue>B支社ルータ</font>（ルータB）
本社ルータHとつながっている

![ospf.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126543/333d2bbb-53f1-41af-b222-4908e422d234.png)


この構成で、A支社のPCからB支社のPCへ通信する最適なルートをOSPFで決めることを目標とします。

### ①OSPFネットワークへの参加（Helloパケット）
まず、ルータ同士が隣接関係を確立するためにHelloパケットを送ります。

<font color=red>ルータA</font>「やぁ、ここはOSPFネットワークかい？誰かいる？」（Helloパケット送信）
<font color=green>ルータH</font>「おっ、新しいルータ発見！俺は<font color=green>ルータH</font>、本社を担当している。君は？」（Helloパケット送信）
<font color=red>ルータA</font>「俺はA支社の<font color=red>ルータA</font>、よろしく！」

<font color=blue>ルータB</font>「俺はB支社の<font color=blue>ルータB</font>！誰かいる？」（Helloパケット送信）
<font color=green>ルータH</font>「よおB！俺は<font color=green>ルータH</font>だ、A支社の<font color=red>ルータA</font>もいるぞ！」（Helloパケット送信）

Helloパケットのやり取りにより、<font color=red>ルータA</font>、<font color=blue>ルータB</font>、<font color=green>ルータH</font>は**お互いの存在を認識**しました。

:::note
**Helloパケットとは？**
ルータがOSPFネットワークに参加する際に送信するパケット。
これにより、お互いの存在を確認し、隣接関係を確立する。

Helloパケットを受け取ったことを示す応答はありません。
お互いにHelloパケットを送信することで隣接関係が確立されます。
:::

### ②ルータ間のネットワーク情報の交換（LSA Type 1）
ルータは自分が知っているネットワーク情報を広報します。（LSA Type 1送信）

<font color=red>ルータA</font>「俺はA支社のネットワーク、192.168.1.0/24に接続してるぜ！」（LSA Type 1送信）
<font color=blue>ルータB</font>「俺はB支社のネットワーク、192.168.2.0/24に接続してるぞ！」（LSA Type 1送信）
<font color=green>ルータH</font>「了解！A支社は192.168.1.0/24、B支社は192.168.2.0/24だな！」（LSDBを更新）

<font color=green>ルータH</font>「<font color=red>ルータA</font>、B支社の192.168.2.0/24は<font color=blue>ルータB</font>が担当しているぞ！」（LSAのフラッディング）
<font color=green>ルータH</font>「<font color=blue>ルータB</font>、A支社の192.168.1.0/24は<font color=red>ルータA</font>が担当だ！」（LSAのフラッディング）

LSA Type 1の共有により、A支社・B支社がそれぞれ**相手のネットワーク範囲がどこにあるか**を理解しました。

:::note
**LSA Type 1（ルータLSA）とは？**
ルータが「自分がどのネットワークに接続しているか」を広報するもの。
他のルータは、その情報を元にルーティングを構築する。
:::

:::note
**LSDB（Link-State Database）とは？**
OSPFルータが持つ「ネットワーク全体の地図」のようなもの。
:::

:::note
**LSAのフラッディング（拡散）とは？**
OSPFでは、すべてのルータが**同じネットワークの地図（LSDB）** を持つ。
各ルータに対してLSDBを拡散することで、すべてのルータで同じLSDBを保持できるようになる。
（イメージ的には同期が近い）
:::

### ③ルータAとルータBが最適なルートを計算（SPFアルゴリズム）
ルータは認識したネットワーク情報を元に、最適なルートを計算します。

<font color=red>ルータA</font>「ふむ...192.168.2.0/24に行くには<font color=green>ルータH</font>経由が一番いいな！」
<font color=blue>ルータB</font>「192.168.1.0/24へは<font color=green>ルータH</font>経由が最適だな！」

<font color=red>ルータA</font>「OK、B支社の192.168.2.0/24は<font color=green>ルータH</font>経由で行くように設定完了！」（ルーティングテーブルの更新）
<font color=blue>ルータB</font>「A支社の192.168.1.0/24へ<font color=green>ルータH</font>経由で行くように設定した！」（ルーティングテーブルの更新）

これで、**A支社とB支社間のルートが確立**しました。
PC同士の通信が可能になったのです。

:::note
**SPF（Shortest Path First）アルゴリズムとは？**
OSPFではDijkstra（ダイクストラ）のアルゴリズムを使って、最短経路を計算する。
このアルゴリズムで、**どの経路が一番短いか（コストが低いか）** を導き、最適なルートを選択する。
:::

## ルートの再計算方法について
<font color=green>ルータH</font>と<font color=blue>ルータB</font>のリンクがダウンした場合を考えてみましょう。

OSPFではHelloパケットを一定間隔で送ることで、隣接ルータの生存確認をしています。

<font color=green>ルータH</font>「<font color=blue>ルータB</font>からHelloパケットが来なくなった...ダウンしたか！？」
<font color=green>ルータH</font>「とりあえず、<font color=blue>ルータB</font>の情報を削除したLSAを送るぞ！」（LSAのフラッディング）
<font color=red>ルータA</font>「えっ<font color=blue>B支社</font>のルートが削除されてる！」（LSDBの更新）

<font color=red>ルータA</font>「別のルートで<font color=blue>B支社</font>に行けないかSPFを再計算しよう！」

<ins>ここで、<font color=red>ルータA</font>と接続されている機器、<font color=orange>ルータC（別拠点）</font>と<font color=blue>ルータB</font>が接続されているものとします。</ins>

<font color=orange>ルータC</font>「俺は<font color=blue>ルータB</font>に接続してるぞ！」（LSA Type 1送信）
<font color=red>ルータA</font>「なるほど！<font color=orange>ルータC</font>経由なら<font color=blue>ルータB</font>に行けるのか！」（LSDBの更新）

このように、OSPFの強みは、**ネットワークの変化にすぐ対応できること**です。
どこかのリンクがダウンしても、新しいルートを自動計算します。

:::note 
**隣接ルータの生存確認**
OSPFでは、一定間隔（デフォルト：10秒）でHelloパケットを送信する。
デッドタイマー（デフォルト：40秒）経っても応答がなければ、そのルータは**ダウン**とみなされる。
ルータがダウンしたことを検知した場合、新しいLSAを送信する。
:::

## LSAのTypeについて
上の例を見てもらえばわかるように、OSPFでは**LSA（リンクステートアドバタイズメント）** を用いてネットワークの情報を交換し、すべてのルータが同じ**LSDB（リンクステートデータベース）** を持つように同期します。

LSAには複数の種類があり、それぞれが異なる役割を持っています。
ここでは基本的な、**Type1～5**までを紹介します。

### LSA Type 1（ルータLSA）
**自分がどのネットワークに接続しているルータか**を通知します。
- 送信者：すべてのOSPFルータ
- 範囲：OSPFの同じエリア内（エリアを越えない）
- 役割：
    - ルータが自分の接続しているネットワークを広告
    - 隣接ルータとの接続情報を共有
    - OSPFの最も基本的なLSA

ルータA：「俺は192.168.1.0/24につながってる！」

### LSA Type 2（ネットワークLSA）
**LAN上にどのルータが存在しているか**を通知します。

- 送信者：DR（デザインルータ）のみ
- 範囲：OSPFの同じエリア内（エリアを越えない）
- 役割：
    - ブロードキャストネットワーク（LAN）上に接続されているすべてのルータ情報を共有
    - すべてのルータが全員とHelloパケットを交換しないように、**DR（デザインルータ）** が代表して情報を送る

ルータH（DR）：「このLANにはルータAとルータBがいるぞ！」

:::note
**DR（デザインルータ）とは？**
LANなどでOSPFの情報を効率的に管理する**代表ルータ**。
OSPFでは、LANなどのブロードキャスト可能なネットワークにおいて、ルータ同士が全員とHelloパケットをやり取りすることでパケットの逼迫につながる。
その解決策として、1台のルータを代表にしてネットワーク全体の情報をまとめる。

ちなみに、DRはネットワーク内のルータで最もプライオリティ値（OSPF Priority）が高いものが選出される。
:::

### LSA Type 3（サマリLSA）
**他のエリアのネットワーク情報**を通知します。
- 送信者：ABR（エリアボーダールータ）
- 範囲：OSPFの異なるエリア間
- 役割：
    -  OSPFのエリアをまたぐネットワーク情報を広報する
    -  例えば、エリア0（バックボーン）にあるネットワークをエリア1に伝える

ルータH（ABR）：「エリア0には192.168.1.0/24もあるぞ！」

:::note
**ABRとは？**
**OSPFの異なるエリアを接続するルータ**。
OSPFではネットワークを複数のエリアに分割することで、ルータが処理するルート情報を減らしてネットワークのスケーラビリティを向上させる仕組みがある。
その異なるエリアを接続するルータが**ABR**となる。
:::

### LSA Type 4（ASBRサマリLSA）
**ASBRの情報**を通知します。
- 送信者：ABR
- 範囲：OSPFの異なるエリア間
- 役割：
    - ASBRの情報を広報
    - LSA Type 5（外部LSA）を送るASBRをネットワーク全体に通知する

ルータH（ABR）：「外部ネットワークに接続するときはASBRルータXに聞け！」

:::note
**ASBR（Autonomous System Boundary Router）とは？**
**OSPFと外部ネットワーク（BGPやスタティックルートなど）をつなぐルータ**。
OSPFは基本的にOSPF内部のルータ同士でネットワーク情報をやり取りするプロトコルだが、
現実のネットワークではOSPFの外（別のASやBGP、スタティックルート）と通信する必要がある。
そのとき、外部ネットワークの情報をOSPF内に広報する役割を持つルータがASBR。
簡単に言うと、**OSPFと外部ネットワークの窓口**。
:::

### LSA Type 5（外部LSA）
**BGPなどの外部ルート情報**をOSPFに広報します。

- 送信者：ASBR
- 範囲：OSPFの全エリア（スタブエリアを除く）
- 役割：
    - OSPFの外（例えばBGP経由のインターネット等）のルートをOSPFネットワークに広報する

ASBR：「インターネットの8.8.8.8/32は俺のところ経由だ！」

:::note
**スタブエリアとは？**
**OSPFのトラフィックを減らして、ルーティングをシンプルにするためのエリア**。
OSPFは大規模なネットワークでも使えるように設計されているため、エリアを分割して管理する仕組みがある。
しかしエリアが増えると、それぞれのルータが管理する経路情報（LSA）が増えてしまい、処理負荷が高くなる。
解決策として、**OSPFのルート情報を制限し、不要なLSAを抑えて処理負荷を減らす**のがスタブエリア。
簡単に言うと、スタブエリアのルータは外部ネットワークの情報は受け取らず、とりあえずデフォルトゲートウェイに通信を送る、みたいなイメージ。
:::

## BGPとOSPFについて
OSPFとBGPは担う役割が異なるルーティングプロトコルです。
OSPFは**内部のルート情報を管理するプロトコル**であるのに対し、
BGPは**インターネット状の異なるAS（Autonomous System）をつなぐルーティングプロトコル**です。

簡単に言うと、BGPは**異なるISP同士のルーティング情報をやり取りする**プロトコルです。

また、属するカテゴリも
OSPFが**IGP（Interior Gateway Protocol）** であるのに対し、
BGPは**EGP（Exterior Gateway Protocol）** です。

BGPについては別記事で詳しく解説したいと思います。

## まとめ
普段の業務で意識するのはLAN内のネットワークが主だったので、デフォルトゲートウェイを抜けた後の通信について知る良い機会でした。
インターネットって複雑な仕組みで出来てるんですね...