OSPF【OSPFの概要】

CCNAの試験に向けて学習中。
復習に見返せるようにメモしていきます。
ほぼ自分の勉強メモです。
過度な期待はしないでください。


1.OSPFの概要
-

#### 1-1.OSPFの特徴
OSPF（Open Shortest Path First）は、ダイナミックルーティングで使用する
プロコトルの一つです。

##### ■1-1-1.IGPに分類
OSPFは、IGP※1に分類されます。同じくIGPに分類されるディスタンスベクタ型の
RIP※2で、問題となっていた部分が改良されたもので、RIPなどよりも大規模なネットワークを
主な対象としています。
>
※1 IGPは、自律システム（AS）内で経路情報交換をするルーティングプロトコルです。
※2 RIPは、ネットワークで接続したルータ間で使用するルーティングプロトコルです。
ホップ数(メトリック)を通知し合う事によって経路情報を生成します。

##### ■1-1-2.様々なルータのメーカーで使用出来る
OSPFは、RFCで標準仕様が規定されています。
その為、EIGRPなどのCisco独自のダイナミックルーティングプロトコルとは違い、
<font color="Green"><b>様々なルータのメーカーで使用</b></font>出来ます。
<br>

##### ■1-1-3.リンクステート型のプロトコルである
リンクステート型のルーティングプロトコルは、ルーティングテーブルではなく、
各ルータの<font color="DodgerBlue">インタフェースの情報(リンクステート情報)</font>を交換します。
このリンクステート情報は<font color="Red"><b>「LSA(Link State Advertisement)」</b></font>といい、
ルータが持つインタフェースの種類、そのインタフェースのIPアドレス、インタフェースのコスト、
接続されているネットワークのタイプなどが含まれ、ネットワーク内のOSPFが動作している、
他のルータに通知します。

OSPFでは、各ルータがネットワークのトポロジ※3を記録した<font color="Red"><b>「LSDB（Link-State Database）」</b></font>と、
呼ばれるデータベースを持っています。
各ルータから収集されたこのLSAはこのデータベースに格納され、各ルータに同一の内容になります。

OSPFでは、トポロジ内の各ルータは<font color="green"><b>ルータID</b></font>によて識別されています。
各ルータは、このLSDBを基に<font color="Red"><b>SFPアルゴリズム</b></font>を使用して自身を基点とした、
<font color="Red"><b>SFPツリー（最短経路ツリー）</b></font>を作成し、そこから最短の経路を作成し、
ルーティングテーブルに登録します。

※3 トポロジについては[「ネットワークトポロジ」](https://www.m-system.co.jp/mstoday/plan/mame/b_network/0208/index.html)の記事参照
<br>

##### ■1-1-4.ルーティングテーブルのトラフィック量を軽減出来る
ディスタンスベクタ型のRIPなどでは、定期的にルーティングテーブルのほぼ全てを、
ルーティングアップデートにより隣のルータに送りますが、
OSPFでは、通常隣接するルータの生存確認の為に小さな<font color="Red"><b>Helloパケット</b>※4</font>だけを送信します。
その為、全ての情報を含むルーティングアップデートを定期的に送るRIPなどより、
トラフィック量※5が少なくすみます。
また、ネットワーク情報の変更があったとしても、全ての情報ではなく差分情報のみアップデートします。
>
※4 宛先の最短パスを構築するために機器がお互いに自身の情報を交換し合うパケットの事。
　HELLOパケットは<font color="red">10秒間隔</font>で送信されます。
※5 インターネットやLANなどのコンピューターなどの通信回線において、一定時間内に
　ネットワーク上で転送されるデータ量の事
<br>

##### ■1-1-5.コンバージェンスが速い
コンバージェンスとは、<font color="green"><b>「全てのルーターにルート情報が行き渡った状態の事」</b></font>をいいます。
OSPFでは、定期的にルーティングアップデートを送って変更を伝えていくディスタンスベクタ型とは
異なり、ネットワークに変更があると変更内容をすぐに送信して、他のルータに伝えます。
OSPFでは、あらかじめ全てのルータがネットワークの構成を把握しているので、
変更があれば、各ルータが変更箇所を把握し、データベースを更新して再計算するので、
高速にコンバージェンスが出来ます。
<br>

##### ■1-1-6.VLSMに対応している
OSPFは、サブネットマスクの情報をルーティングアップデートに含める事が出来る、
<font color="red"><b>クラスレスルーティングプロトコル</b></font>なので、<font color="green">VLSM（可変長サブネットマスク）</font>を利用し、
異なるサブネットマスクのネットワークがある環境でも問題なく対応出来ます。

>
クラスレスルーティングプロトコルとは、ルーティングアップデートにサブネットマスク情報を
含めるルーティングプロトコルで、RIPv2、OSPF、EIGRPなどある。
>
逆にクラスフルルーティングプロトコルは、ルーティングアップデートにサブネットマスク情報を
含めないルーティングプロトコルで、RIPv1、IGRPなどがある。


##### ■1-1-7.ネットワークを階層化出来る
OSPFは、全てのルータで共通です。
なので、大規模なネットワークでは、交換されるルート情報の数が非常に多くなり、
それにともなってデータベースサイズが巨大になります。
その結果、ルータのCPUサイクルやメモリを消費する事になるので、
このような事を解消するために、OSPFではネットワークを<font color="red"><b>「エリア」</b></font>という単位で、
分割し大規模ネットワークでもより効率よくルーティング出来るようにしています。

また、エリア分割の際、中心となるエリア（<font color="Red"><b>バックボーンエリア</b></font>）とその他のエリアに分けて、
ネットワークを階層化し管理します。
<br>

##### ■1-1-8.メトリックとして「コスト」を使用する
メトリックとは、<b>「最適なルートの選択基準」</b>を決めるためのもので、
最適な経路を判断する際の判断基準になります。
OSPFでは、メトリックに<font color="Red">コスト</font>を使用します。

コストは以下の計算式に基づき、算出されます。

```
コスト = 100M(bps) ÷ インターフェイスの帯域幅(bps)
```
例えば、
インターフェイスの帯域幅が「10Mbps」の場合は、コスト値は 100Mbps ÷ 10Mbps = 10となり、
コストは、「10」となります。

インターフェイスの帯域幅が「100Mbps」の場合は、コスト値は 100Mbps ÷ 100Mbps = 1となり、
コストは、「1」となります。

そして、宛先までのインターフェイスのコストを加算していき、<font color="green"><b>合計が最小値になるルートが、
最適なルートなります。</b></font>

下記の画像で見てみると、
<img width="700" alt="ファイル名" src="https://i.gyazo.com/a40181116cf04571046e5f5990163407.png">
R1 - R2 - R4を通るルートのコストは、30（10+10+10）
R1 - R3 - R4を通るルートのコストは、21（10+10+1）
なので、コストが小さいR3経由の通信経路を最適経路として判断します。
<br>
##### ■1-1-9.ルーティング認証をサポートしている
OSPFでは、全ての情報交換で認証を行うように設定出来ます。そうすることで、
信頼出来るルータとだけ情報を交換出来るようになります。
<br>

##### ■1-1-10.OSPFデメリット
OSPFは、各ルータにデータベースを持ち、そこから計算を行う為、
メモリやCPUへの負荷が大きくなります。

<br>
#### 1-2.OSPFの基本動作

##### ■1-2-1. ①Helloパケットを交換してネイバーを検出する
OSPFを動作させたルータは、<font color="green">マルチキャスト（<font color="red">224.0.0.5</font>：全OSPFルータ宛）</font>で、
OSPFパケットを送信しOSPFルータを自動検出します。これを<font color="red"><b>Helloパケット</b></font>といいます。
Helloパケットの役割は、隣接ルータの発見と生存確認です。Helloパケットを受け取り、
隣として認識したルータを、<font color="red">ネイバー</font>と呼びます。

Helloパケットには<font color="DodgerBlue"><b>認識されているネイバーの一覧が格納されており、受け取ったルータは、
その一覧を確認する事で、相手が自分を認識していかどうか判断します。</b></font>
各ルータは、ルータIDで識別されています。

Helloパケットを受け取る前のネイバー関係の初期状態は、<font color="red">Downステート</font>になっています。
<br>

##### ■1-2-2. ②ネイバーテーブルにネイバーを登録する
Helloパケットを受け取ったルータは、ネイバー一覧を保持する<font color="red">ネイバーテーブル</font>に、
送信元のルータを登録するが、この時 Helloパケットを受け取ったからといって、
送信元のルータを無条件にネイバーとして登録する訳ではありません。

OSPFでは近接ルータから受信した Helloパケットに、自身のルータの情報が含まれていると、
隣接関係が確立されます。
２台のルータで、以下の情報が一致していないと隣接関係は確立されません。

- Helloインターバル（Helloパケットの送信間隔）
- Deadインターバル（ネイバーがダウンしたとみなす時間）
- 認証の情報
- エリアID
- サブネットマスク
- スタブフラグ

Helloパケットを受け取ったルータは、ネイバー一覧を保持するネイバーテーブルに送信元の
ルータを登録します。が、送信元のルータはまだ認識していない為、
Helloパケットを受け取ったルータは、<font color="red">initステート</font>という状態になります。
<br>

##### ■1-2-3. ③相互を認識し、LSDBの交換の準備をする
ネイバーを認識したルータは、Helloパケットに自分の認識しているネイバー一覧を格納し、
送信元ルータにHelloパケットを返します。

そこで相手から受け取ったHelloパケットのネイバー一覧に自身が記録されていた場合、
送信元のルータは、自身に認識されていと分かったので、<font color="red">2-Wayステート</font>という状態になります。
その後、送信元ルータから届くHelloパケットのネイバー一覧に自身の記録が格納されている為、
Helloパケットを受け取ったルータのネイバーテーブルでも、2-Wayステートという状態になります。

これで、お互いを認識し他のでLSDBを同期させる準備が出来た状態です。
<br>

ここまでの一連の動作をまとめたのが下記の画像になります。
ルータの状態は、【　】の中に記載されています。
Helloパケットの送受信と共に変化しているのが認識出来ると思います。
<img width="600" alt="ファイル名" src="https://i.gyazo.com/e8d034da72ed4272d597e152578e4df4.png">
<br>

##### ■1-2-4. ④ルータ間で DBDパケットを交換する
ルータ間でHelloパケットを交換し、相互に2-Wayステートになった後
<font color="red"><b>DBD（Database Description）パケット</b>※6</font>を使用して各ルータが持つLSDBの情報を交換します。

DBDパケットを交換する時に、2つのルータ間でマスター（管理・制御する側）と、
スレーブ（制御される側）の関係を築きます。DBDパケットはシーケンス番号で管理されており、
その決定を行うルータがマスターになります。
マスターとスレーブの役割を選択しているルータの状態を <font color="red">Exstartステート</font>といい、
役割が決定し、DBDパケットを交換してお互いのLSDBを同期させている状態を、
<font color="red">Exchangeステート</font>といいます。

ここの一連の動作をまとめたのが下記の画像になります。
DBDパケットはシーケンス番号（seq）を付けて送付します。
また、<font color="green">マスターはルータIDが大きい方がなります。</font>
<img width="600" alt="ファイル名" src="https://i.gyazo.com/79c5f8bfede72df4006b16a293b80a04.png">
>
※6 自身のLSDBに含まれているLSAのリスト一覧。
ネイバールータとこのDBDを交換し合うことにより、自身に不足しているLSAが何なのかを
認識する事が出来る。

##### ■1-2-5. ⑤詳細なLSA情報を交換する
ルータは、Exchangeステートの時に相手から受け取ったDBDパケットに新しいLSAの情報が
見つかった場合、ネイバーに対して <font color="red"><b>LSR（Link State Request）パケット</b></font>を送信して詳細情報を、
要求します。
LSRパケットを受け取ったネイバーは、更新用の<font color="red"><b>LSU（Link State Update）パケット</b></font>を送信します。

ルータは、LSUパケットを受け取るとLSDBを最新の情報に更新します。
また、LSUパケットの確認応答として、<font color="green"><b>LSAckパケット</b></font>を送信します。

LSRパケットとLSUパケットを送信している時は、<font color="red">Loadingステート</font>になります。
お互いに最新の状態を取得し、最終的にLSDBの同期が完了すると、
<font color="green"><b>アジャセンシー（完全な隣接状態）</b></font>になります。この状態を、<font color="red">Fullステート</font>といいます。


Fullステートとなった後は、LSDBからSPFアルゴリズムを使用してSPFツリーを作成し、
最短経路をルーティングテーブルに登録します。
その後は、Helloパケットを送信してお互い生存確認を行う。

##### ■1-2-6. OSPFの状態遷移纏め

|状態|説明|
|:---|:---|
|Downステート|Helloパケットを受け取る前の初期状態|
|initステート|ネイバーからHelloパケットを受け取ったが、相手がこちらを確認してない状態|
|2-Wayステート|ルータが相互に認識している状態|
|Exstartステート|DBDパケットを交換する為のマスターとレシーブを選択している状態|
|Exchangeステート|DBDパケットを交換してお互いLSDBを同期させている状態|
|Loadingステート|LSRパケットを送信して最新のLSAをLSUパケットとして取得している状態|
|Fullステート|完全な隣接関係（アジャセンシー）を築いた状態|

<br>
#### 1-3.マルチアクセスの場合

##### ■1-3-1.マルチアクセスとは？
マルチアクセスとは、1つのインタフェースを通じて複数のルータなどと通信ができる状況です。
マルチアクセス環境では、<font color="red"><b>DR (Designated Router：代表ルータ)</b></font> と、<font color="red"><b>BDR (Backup Designated Router：バックアップ代表ルータ)</b></font>を選択し、
完全な隣接関係をDRとBDRとの間のみに限定する事で、LSUパケットなどのトラフィックを軽減します。
そうする事によって、各ルータがそれぞれ1対1で完全な隣接関係を結ばなくても、DRから全ての
LSAの情報を得ることが出来る為効率がアップします。

また、DRとBDRに選出されなかったルータを <font color="red">DROther</font>といい、DROtherのルータは、
お互いにネイバーとして認識はしているものの、DBDパケットなどを直接交換する事はありません。
その為、<b>DROther同士は 2-Wayステートで止まったままとなります。</b>
<br>

##### ■1-3-2.DRとBDRの選択
DRとBDRの選択基準として、<b>ルータプライオリティ</b>と<b>ルータID</b>を規定しています。

● ルータプライオリティ
ルータプライオリティは、ルータのインターフェイス事に決定できる値です。
Helloパケットに含まれている為、Helloパケットを送受信する事でお互いのルータプライオリティを
知る事が出来ます。
ルータプライオリティのデフォルト値は 1で、0を設定すると、DR及びBDRに選出されなくなります。

マルチアクセス環境では、<font color="green">ルータプライオリティの値が最も大きいルータが DR、
2番目に大きいルータが BDR</font>に選出されます。
<br>

● ルータID
ルータプライオリティが同じである場合、ルータIDを比較します。
ルータIDは、<font color="green">ルータIDの値が最も大きいルータが DR、2番目に大きいルータが BDR</font>に、
選出されます。

そして、ルータIDは次の順番で決定されます。
1. コマンドによって手動で設定する
2. ルータの有効な<font color="green">ループバックインターフェイス※7</font>のIPアドレスの中で最も大きなIPアドレスが選択される
3. 有効な物理インターフェイスのIPアドレスの中で最も大きなIPアドレスが選択される

上から順に優先度が高いルータIDの決定方法です。
ルータIDが変わってしまうと、ネイバーの確立からOSPFの処理をやり直さなければいけなくなります。
その為、ルータIDが変更されることがないように上記の優先度が決まっています。
>
※7 ループバックインターフェイスは、任意で作成することが出来る仮想的なインターフェイスで、
意図的にシャットダウンしない限りダウンしません。
従って、<font color="red">ループバックインターフェイスの方が物理インターフェイス</font>よりも優先されます。
<br>

● ルータIDの決定例
<img width="700" alt="ファイル名" src="https://i.gyazo.com/e329b45be9d71f253c617af26559fbef.png">
DRとBDRの選出方法は、先ずルータプライオリティの値が最も大きいルータになります。
なので、ルータプライオリティの値が 255の上記の図の下2つが選択されます。

次に、ルータプライオリティが同じである場合、ルータIDを比較し、その値が大きい方がDR、
2番目に大きいルータが BDRとなります。
ルータIDを比較すると、左側のルータが 2.2.2.2　右側のルータが 1.1.1.1. なので、
左側のルータの方が値が大きので DRとなり、右側のルータが BDRとなります。

<br>
#### 1-4.ルートの変更

##### ■1-4-1.メトリックの計算
<font color="DarkTurquoise">※メトリックの計算は上記の[メトリックとして「コスト」を使用する](https://qiita.com/k-yasuhiro/private/59d064b4dcca5beb6220#1-1-8%E3%83%A1%E3%83%88%E3%83%AA%E3%83%83%E3%82%AF%E3%81%A8%E3%81%97%E3%81%A6%E3%82%B3%E3%82%B9%E3%83%88%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B)を参照</font>

OSPFでは、コストを基に最適なルートが選択されて、そのルートがルーティングテーブルに、
登録されます。
<br>

##### ■1-4-2.等コストロードバランシング
最短のルートが複数ある場合には、デフォルトでで<b>4つ</b>迄ルートがルーティングテーブルに、
登録されます。これにより、トラフィックを分散する機能を<font color="green">等コストロードバランシング</font>と、
いいます。

下記の場合、コストが 20のルートが2つある事になります。
この時、RT-A（ルータA）は両方のルートをルーティングテーブルに登録します。
<img width="700" alt="ファイル名" src="https://i.gyazo.com/22ab424e731d57f0a6c60ca80cc9ba71.png">

<br>

##### ■1-4-3.ルートの変更
デフォルトで帯域幅をそのまま使用してコストの計算をした場合、
1Gbpsでも100Mbpsでも同じコストになる為、1Gbpsの方を最適なルートとしたくても
出来ませんでした。そこで、コストの値を調整する事で経路を変更します。

コスト値を変更するには、
● インターフェイスのコストの値を直接設定する
コマンドは、「(config-if)# ip ospf cost」

● インターフェイスの帯域幅を変えてコストの計算結果を変える
コマンドは、「(config-if)# bandwidth」

● コスト計算式の分母を「10の8乗」の値に変更する
コマンドは、「(config-router)# auto-cost reference-bandwidth」

<font color="green">コストを直接設定したり、帯域幅を変更したりする事</font>で、最適なルートを変更する事が出来ます。

※<font color="DarkTurquoise">コマンドの詳細については[OSPF](https://www.infraexpert.com/study/ospfz13.html)という記事参照</font>

<br>
#### 1-5.OSPFでの考慮事項

##### ■1-5-1.OSPFのネットワークタイプ

OSPFでは、ネットワークタイプにより動作が変わるプロトコルです。

マルチキャスト環境ではないネットワークでは、DRとBDRの選出をしなかったり、
マルチキャスト通信が行えないネットワークでは、ネイバーを自動で検出出来なかったりします。

下記の表がOSPFのネットワークタイプになります。

|タイプ|ネイバー検出　　|DR/BDR選出　　|適切なトポロジー|Helloインターバル|
|:---|:---|:---|:---|:---|
|ブロードキャスト|自動|有|フルメッシュ|10|
|NBMA ※7|手動|有|フルメッシュ|30|
|ポイントツーマルチポイント|自動|無|スター|30|
|ポイントツーマルチポイント（Non Broadcast )|手動|無|スター|30|
|ポイントツーポイント ※8|自動|無|スター|10|
>
※7 フレームリレーやATM接続などのWANリンクでセグメント上に2台以上のルータが接続できますが、
　ブロードキャスト機能のないネットワークで、このネットワークではDR/BDRの選出がされますが、
　OSPFネイバーは手動で設定する必要があります。
　<img width="500" alt="ファイル名" src="https://i.gyazo.com/fb2dbe48a681f54b33c9eddb287a485b.png">
>
※8 PPPまたはHDLC接続などのWANリンクで2台のルータだけで接続されるネットワーク、
　このネットワークでは2台のルータ間では必ずアジャセンシー関係（Full）になります
　<img width="500" alt="ファイル名" src="https://i.gyazo.com/ba68f018f7983216db3bb647603fd164.png">

<br>
##### ■1-5-2.パッシブインターフェイス
パッシブインターフェイスとは、OSPFは有効にしつつもHelloパケットを送信しないように、
する設定の事をいいます。

この設定を行うと、Helloパケットを送信しなくなります。また、受信したHelloパケットは、
無視するようになります。結果、<font color="green"><b>ネイバーとして認識されなくなります</b></font>。

● パッシブインターフェイスの設定例
下図のように、「R1」や「R3」では、PC側のネットワーク（192.168.0.0/24 と 172.16.0.0/16）も
経路情報として伝えるためにnetworkコマンドで設定する必要がありますが、
PC側のネットワークに隣接ルータがいない場合、ルーティングアップデートの送信は必要ありません。
パッシブインターフェイスの設定をする事で無駄なアップデートを抑制する事が出来ます。
<img width="700" alt="ファイル名" src="https://i.gyazo.com/4d51396c9bc13fd7b3bdd40307d637e4.png">

<br>
##### ■1-5-3.MTUサイズ
MTUとは、<font color="red">１回の通信で送信する事が出来るパケットの最大サイズ</font>の事をいいます。
OSPFでネイバーとやりとりする際、ネイバーのインターフェイスのMTUと自身のインターフェイスの
MTUのサイズが異なると、完全な隣接環境を築く事が出来ません。

なので、自身のMTUのサイズよりも大きいパケットを受け取った場合、それを無視しまい
結果、ネイバーとの状態が Exstartもしくは Exchangeステートから先に進まなくなります。

<br>
#### 1-6.マルチエリア OSPF

##### ■1-6-1.ネットワークの階層化
OSPFでは、ネットワークの集まりをグループとして管理出来ます。
このグループを<font color="red">エリア</font>といい、<font color="green">同一エリア内のルータ同士は詳細なトポロジを把握しますが、
他のエリアに関しては詳細な情報でなくルートの情報情報のみ<font>を保持します。

エリア間では、ルート情報を伝えるLSAをやり取りする事でトラフィック量を減らし、
メモリやCPUの負荷を軽減させます。

また、OSPFのエリアは、中心となるエリア（<font color="red"><b>バックボーンエリア</b></font>）に、
他のエリアが隣接する構成、バックボーンエリアを中心とした2階層の構成となります。
１つのエリアだけでOSPFを動作させる事を、<font color="red">シングルエリア OSPF</font>といい、
複数のエリアを作成してOSPFを動作させる事を、<font color="red">マルチエリア OSPF</font>といいます。

<img width="700" alt="ファイル名" src="https://i.gyazo.com/fb7e2aa34427d588afef4f009dab8e0d.png">

<br>
##### ■1-6-2.エリアを作成する際の注意点
エリアを作成する際、適当に作成しても上手く作動しません。
その為、下記の点を注意する必要があります。

● バックボーンエリアの作成
OSPFでは、エリアをわけるときに必ずバックボーンエリアというエリアを作成する必要があります。
エリアには識別番号を付けますが、バックボーンエリアは、<font color="red">エリア番号0</font>で表されます。

● 他のエリアをバックボーンエリアに接するように作成する
エリア間で通信する場合、必ずバックボーンエリアを通過しなければなりません。
なので、エリアを分割する際は必ずバックボーンエリアに接するように作成します。

● ルータをエリアの境界に配置する

<br>
##### ■1-6-3.ルータの役割
ルータはどのエリアに位置するかで役割が異なります。

<img width="700" alt="ファイル名" src="https://i.gyazo.com/baad771c54350c03e7a7a644992137c2.png">



|ルータの役割|説明|
|:---|:---|
|内部ルータ|全てのインターフェースが同じエリアに接続しており、その他のエリアには一切接していないルータ|
|バックボーンルータ|インターフェイスが1つでもバックボーンエリアに接しているルータ|
|ABR(Area Border Router)|エリア境界ルータ。つまり、インターフェイスが2つ以上のエリアと接しているルータ|
|ASBR(AS Boundary Router)|インターフェイスが異なるASに所属しているルータ|

## 関連投稿記事
[OSPF【OSPFの設定】](https://qiita.com/k-yasuhiro/items/b2eba433b8e580b48b31)



参考記事
-
<font color="DarkTurquoise">※[OSPF DR/BDR](https://server-network-note.net/2018/04/ospf-dr-bdr/)という記事参照</font>
<font color="DarkTurquoise">※[OSPF - router-id / ip ospf priority / ip ospf cost](https://www.infraexpert.com/study/ospfz13.html)という記事参照</font>
<font color="DarkTurquoise">※[OSPF - ABR / ASBR](https://www.infraexpert.com/study/ospfz4.html)という記事参照</font>