OSPFの基本を理解する（概要）

#はじめに
はじめまして、先日よりCCNA相当の実機演習を始めました。
今回は実験の備忘録としてリンクステート型のルーティングプロトコルであるOSPFの概要についてまとめます。
OSPFはコストを用いた経路算定や差分アップデート、エリアを用いたネットワークの分割と大規模なネットワークには欠かせないルーティングプロトコルです。RIPのようなディスタンスベクタ型のルーティングプロトコルとの違いやOSPFならではの効率的な機能について実機を用いて学習していきます。

#OSPF
まず、OSPFとはなんぞや、というところです。
上にも書いてある通り、OSPFはリンクステート型のルーティングプロトコルに分類されます。

__リンクステート型__とはネットワークの中でどのルータがどのネットワークにどのようにつながっているか、ネットワーク内すべての情報をLSDB（リンクステートデータベース）に格納し、このLSDBを元に経路の決定を行います。
OSPFとよく比べられるRIPは__ディスタンスベクタ型__と呼ばれ隣接ルーター間で経路表を交換し合い、宛先まで経由するルーターの数（ホップ数）が最短になる経路を選択します。

ぱっと聞く限り、RIPの方が処理がシンプルでデメリットも特に無さそうな感じがします。（小規模なNWにおいてはその通りなのですが）
まずはOSPFの主要な機能と、RIPに比べどういったメリットがあるのか見ていきましょう。

##パケット
まずはOSPFで用いられるパケットとやり取りの紹介です。
正直自分自身技術書等でパケットの紹介を見ても全くピンときた試しがないのでざっくり紹介します。
次の実験編で実際のパケットを見ればしっくりくるかもしれません。
下はルーター同士でLSA（IPアドレスやサブネット、接続されているインターフェースを含むリンクの情報）を交換する際のやり取りです（上から）。
<dl>
  <dt>1.Helloパケット</dt>
  <dd>隣接ルーターとの関係を確立。
  <dd>数十秒に一回送出されて関係の確立維持（キープアライブ）にも利用される。</dd>
  <dt>2.DD(Database Description)
　<dd>自分の持っているLSDBを要約して伝える（紹介）。</dd>
  <dt>3.LSR(Link-State Request)</dt>
　<dd>他のルーターから送られてきたDDと自分のLSDBを比べ、足りないLSAを要求する（リクエスト）。</dd>
  <dt>4.LSU(Link-State Update)</dt>
　<dd>LSRを受け取ったルーターが該当するLSAをまとめて送信する（アップデート）。</dd>
  <dt>5.Ack</dt>
　<dd>LSUを正常に受け取り、自分のLSDBを更新したことを通知するパケット。</dd>
</dl>

##代表ルーター/バックアップ代表ルーター（DR/BDR）
同じNW内に複数ルーターが存在する場合、すべてのルーター間で上のやり取りをするととんでもない量のパケットが流れる事は想像できるでしょう。しかも結局はどのルーターも同じようなLSDBを作ることになります。それならNW内で誰か代表者を決めてその代表者とのみやり取りをすれば無駄なパケットが減るんじゃないのか。ということでOSPFではDR/BDRという仕組みが用いられている。

<dl>
  <dt>DR(Designated Router)</dt>
  <dd>いわゆる代表ルーター
　<dd>同一ネットワーク内でLSDBをまとめ、ネイバー関係の確認、NW変更時のLSDBのアップデート情報の公布等を行う。</dd>
  <dt>BDR(Backup Designated Router)</dt>
  <dd>DRのバックアップを行う。DRのダウンを検知するとDRに昇格し、新たにBDRが選出される。</dd>
  <dt>DROTHER</dt>
  <dd>DR/BDR以外のルーターはすべてこれに含まれる。</dd>
</dl>

###OSPFのメリット・デメリット
OSPFのメリット、デメリットは以下の通りです。

<dl>
  <dt>メリット</dt>
  <dd>1.「コスト」を用いた経路選定</dd>
　<dd>2.差分アップデート</dd>
　<dd>3.ループが発生しない</dd>
　<dd></dd>
  <dt>デメリット</dt>
  <dd>1.初期の経路収束時にやり取りする情報が多く時間がかかる</dd>
　<dd>2.複雑な処理を行うためルーターへ負担がかかる</dd>
</dl>

ざっとこんな感じです。
ただ挙げられてもしっくりこないと思うので一つづつ見ていきましょう。

####メリット
#####1.「コストを用いた経路選定」
中～大規模NWにおいてRIPが用いられない大きな理由の一つがこれです。
画像のようなNWを例に考えてみましょう。すべてのルーターが100BASE-TX(Fast Ether)のケーブルで接続されており、ルーターにはRIPが設定してあるものとします。
PC1がPC2に対してデータを送信します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2179899/3911f328-da87-6dfd-917e-301d035bd836.png)
PC1からデータを受け取ったルータ1は自分の持っている経路情報を元にルーターの経由する数の最も少ない上の経路を選択します。特に問題なくデータは届きます。
それでは下の画像ではどうでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2179899/4e1917fb-7179-2092-007b-89f0addd1d3d.png)
R2とスイッチが最大転送速度10Mbpsの10BASE-Tケーブルで接続されています。
PC1とPC2がやり取りするデータがPING程度なら問題はありませんが動画のストリームや大容量データのやり取りとなると話は変わってきます。R2を通る経路では全体の通信速度が10BASE-Tの10Mbpsになってしまい通称**ボトルネック**と呼ばれる箇所が生まれます。
最初にも書いた通りRIPは宛先まで経由するルーターの数のみで経路選択を行っています。そのため、人間なら一目で「下のルート通った方がいいじゃん」と思うようなボトルネック箇所があっても素直にホップ数のみでルーティングしてしまうのがRIPです。
一方でOSPFは「コスト」と呼ばれる帯域幅を定数で割った値が経路選択に用いられます。

```math
 OSPFコスト＝100(Mbps)÷インターフェースの帯域幅
```

つまり目的地まで速度を加味した最短ルートを選ぶことができるようになるわけです。
上の画像で行けば各インターフェースのコストは以下のようになりRIPとは異なる経路を取るようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2179899/662d9a7c-617b-1080-9986-646df000d7c1.png)
これが「コスト」の概念です。

#####2.「差分アップデート」
次に差分アップデートについてです。
差分アップデートとは、データベースに対してなにか変更が加えられた場合、変更箇所のみを報告して同期を取ることです。
RIPはNW内で定期的に自分の経路表を送信することで互いの経路表を更新しています。そのため数十秒に一回程度RIPパケット（経路表）が一斉に交換されることとなり、帯域を圧迫するだけでなく大きなネットワークでは経路の変更が行き渡るのに時間を要することとなります。
一方OSPFは、最初こそすべての情報を交換して経路が収束するまで時間がかかるものの、差分アップデートを利用することで変更された情報のみをNWに流しデータベースを更新します。また、代表ルーター/バックアップ代表ルーター（DR/BDR）を用いてDRのみが経路情報を集めLSDBを作成し、その情報をマルチキャストを用いて他のルーターと同期することですべてのルーター同士で情報を交換し合う必要がなくなります。結果的にNWに流れるパケットが減るだけでなく、マルチキャストを用いることで一気に情報を伝えることができるので変更時の経路収束が迅速に行えるという利点もあります。

#####3.「ループが発生しない」
OSPFではNW内すべてのルーターがどのように接続されているのか、NWの全体像をそれぞれのルーターが持っています。そのため、最終的に2つのルーターが同じネットワークにつながっていた場合であってもループが発生することはなく、むしろ設定次第では負荷状況に応じた振り分け（ロードバランシング）をすることもできます。
また、流れてきた経路情報をそのままルーティングテーブルに格納してしまうRIPはホップ数（経由するルーターの個数）が15台までという制約があり、大規模なNWには向きませんでした。しかし前述の通りOSPFではループが発生しないためホップ数の上限が撤廃されています。

####デメリット
#####1.初期の経路収束時にやり取りする情報が多く時間がかかる
メリット2でもちょこっと書いた通りOSPFの設定を行った際、初回経路収束時に「ネイバー確立→LSDBDD（紹介）→LSR（リクエスト）→LSU（アップデート）→Ack（確認）」というようなやり取りが発生するため大量にパケットが流れることになる。
変更時こそ差分アップデートを用いて少ないパケットでLSDBを更新できるものの、初回経路収束時には帯域をある程度圧迫し、時間もそこそこかかってしまいます。

#####2.複雑な処理を行うためルーターへ負担がかかる
これはそのままです。
ネットワーク全体図（トポロジマップ）の作成やトポロジマップとSFPアルゴリズム（ダイクストラ）を用いた経路計算。とルーターがしなければならない処理がRIPと比べより多く、より複雑です。そのため大規模なNWではルーターにかかる負担が大きくなります。

#まとめ
OSPFはRIPに比べより大規模なNWに利用可能であり、差分アップデートやDR/BDRといった機能によってより高速な経路収束とNW変更時の情報伝達が高速化されています。
また、ルーティングにおいてはダイクストラを用いたSFPツリーを作成することでNW全体の構成を各ルーターが持つことになり、ループが発生せず、コストの概念によって帯域幅を含めたルートを算出することができるプロトコルです。
#最後に
こういった記事書くのは初めてでこんな感じでいいのかさっぱりわかりませんがまたちょこちょこ書いていこうと思います。
次回は実際実機を用いてOSPFについて行った実験とその結果について~~書こうと思います。~~→[かけました](https://qiita.com/flatbit/items/eb778cf6792ff8006f84"OSPFの基本を理解する(実験編)")

以下は一緒に実験を行った仲間と実験のまとめ記事です。
・[@jun4869](https://qiita.com/jun4869)　[[Cisco892サービス統合型ルータでRIPを学ぶ](https://qiita.com/jun4869/items/c541453fbc67b7794fc0#_reference-e82ddea5f8d480fc1532)]
・[@si4ii](https://qiita.com/si4ii) [[cisco L2スイッチを使ってVLAN・タグVLAN・LAG構築の実機演習](https://qiita.com/si4ii/items/7bfb157bcd02d8584259)]
・[@kshoki0508](https://qiita.com/kshoki0508) [[標準ACLによるルーティング実験](https://qiita.com/kshoki0508/items/a3b98d0216692e2cf031)]
・[@MakotoTaguchi](https://qiita.com/MakotoTaguchi) [[Cisco Packet TracerでNAPTを設定しよう](https://qiita.com/MakotoTaguchi/items/17487208f05c4e0b5c49)]