OSPFv2パケットフォーマット

OSPF関連のパケットを見ると、OSPFのしくみがより詳しく理解できます。

本項では、OSPFv2関連のフォーマットについて説明します。

OSPFパケット

OSPFは、パケットで説明したパケットヘッダー構造をしています。

IPパケットヘッダー

フレームタイプはTCP/IPなのでEthernetII形式です。また、OSPFのプロトコル番号は、89です。

ペイロード部分に、次から示すOSPFのフォーマットに従った情報が入ります。

OSPFパケットヘッダー

OSPF関連では、OSPFパケットヘッダーが必ずあります。以下は、OSPFパケットヘッダーのフォーマットです。

OSPFパケットヘッダー

それぞれの項目の説明は、以下のとおりです。

【OSPFパケットヘッダーのフォーマット】
項目 英語 ビット 説明
バージョン Version 8 2固定です。
タイプ Type 8 1:Hello
2:Database Description(DBDパケット)
3:Link State Request(LSRパケット)
4:Link State Update(LSUパケット)
5:Link State Acknowledgment(LSAckパケット)
パケット長 Packet length 16 OSPFヘッダーを含む以降の長さです。
ルーターID Router ID 32 送信元のルーターIDです。
エリア番号 Area ID 32 0.0.0.0などのエリア番号です。
チェックサム Checksum 16 データの誤り検出。
認証タイプ AuType 16 認証しない場合は0。
認証用データ Authentication 64 認証しない場合は0(何でもよい)。

OSPFパケットヘッダーの後に続くデータは、タイプの値によって以下5種類のパケットに分類され、フォーマットが別になります。

つまり、OSPFパケットは以下の構成になっているということです。

  • IPパケットのペイロードにOSPF関連の情報が入る。TCPやUDPではない。
  • ペイロード部分には、最初に必ずOSPFヘッダーがある。
  • OSPFヘッダーに続いて、タイプによって異なるフォーマットを持つOSPFの情報が入る。

次からは、タイプ別のパケットフォーマットについて説明します。

Helloパケット

Helloパケットは、イーサネットでは10秒間隔で送信されます。ネイバー関係を結んだり、死活監視用で使われます。宛先IPアドレスは224.0.0.5で、すべてのOSPFルーターが受信します。OSPFパケットヘッダーに続いて、以下のフォーマットとなっています。

Helloパケットフォーマット

それぞれの項目の説明は、以下のとおりです。

【Helloのフォーマット】
項目 英語 ビット 説明
ネットワークマスク Network Mask 32 サブネットマスクです。
送信間隔 HelloInterval 16 デフォルトは10秒です。
オプション Options 8 オプションフラグです。
ルーター優先度 Router Priority 8 一番大きい数字のルーターがDRになります。
Helloパケット待ち時間 RouterDeadInterval 32 この時間Helloを受信できないと、ネイバーがダウンしたと見なします。デフォルトは40秒です。
DR Designated Router 32 DRのルーターIDです。DRがない場合、0.0.0.0になります。
BDR Backup Designated Router 32 BDRのルーターIDです。BDRがない場合、0.0.0.0になります。
ネイバーのルーターID Neighbor 32 検出できたネイバーのルーターID。複数台ある場合は、その数続きます。

DBDパケット

DBD(Database Description)パケットは、FULL(隣接関係)になる時に交換されるパケットです。宛先はユニキャストアドレスです。OSPFパケットヘッダーに続いて、以下のフォーマットとなっています。

DBDパケットフォーマット

それぞれの項目の説明は、以下のとおりです。

【DBDのフォーマット】
項目 英語 ビット 説明
MTUサイズ Interface MTU 16 パケット全体の長さです。イーサネットでは1500byteの場合が多いです。
オプション Options 8 オプションフラグです。
状態遷移関連 - 8 1〜5bit目:0固定。
6bit目:Iビット(Initビット)。DBDの最初のパケットで1。
7bit目:Mビット(Moreビット)。DBDが続く場合は1。
8bit目:MSビット(Master/Slaveビット)。状態遷移中は1台がマスターになり、1。
DDシーケンス番号 DD sequence number 32 通信が進むと増加。
LSAヘッダー LSA Header 160 LSA要約です。必要な数続きます。

DBD交換の最初は自身がマスターと認識しますが、ルーターIDが低い機器はスレーブになり、MSビットを0に変更します。DBD交換の間はマスター側から送信し、スレーブ側が応答する形でLSAヘッダーを交換します。マスター側から送信する度にDDシーケンス番号が増えます。

LSAヘッダーは必要な数繰り返しますが、MTUを超える場合はパケットが分割されます。

LSRパケット

LSR(Link State Request)パケットは、LSU(Link State Update)を要求するパケットです。宛先はユニキャストアドレスです。OSPFパケットヘッダーに続いて、以下のフォーマットとなっています。

LSRパケットフォーマット

それぞれの項目の説明は、以下のとおりです。

【LSRのフォーマット】
項目 英語 ビット 説明
LSタイプ LS type 32 LSAタイプ。
リンクステートID Link State ID 32 LSAタイプによって変わります。ルーターIDやネットワーク番号です。
広報ルーター Advertising Router 32 情報送信元のルーターIDです。

上記を1セットとして、リクエストが必要な分、続きます。

LSUパケット

LSU(Link State Update)パケットは、LSRに対する応答や経路変更時に送信されます。宛先は、DR/BDRは224.0.0.5(すべてのルーターが受信)、他のルーターは224.0.0.6(DR/BDRが受信)を使います。再送信では、ユニキャストも使います。OSPFパケットヘッダーに続いて、以下のフォーマットとなっています。

LSUパケットフォーマット

それぞれの項目の説明は、以下のとおりです。

【LSUのフォーマット】
項目 英語 ビット 説明
LSA数 LSAs 32 以降からのLSA数。
LSA LSA 可変 LSAタイプによって変わります。ルーターIDやネットワーク番号です。必要なLSAの数、繰り返します。

LSA部分には、以下のLSAヘッダーが必ず入ります。これは、DBDやLSAckで使われる20バイトのLSAヘッダーと同じフォーマットです。

LSAヘッダーフォーマット

それぞれの項目の説明は、以下のとおりです。

【LSAヘッダーのフォーマット】
項目 英語 ビット 説明
LSA経過時間 LS age 16 LSAが生成されてからの秒数。
オプション Options 8 オプションフラグです。
LSAタイプ LS type 8 1:ルーターLSA
2:ネットワークLSA
3:サマリーLSA
4:ASBRサマリーLSA
5:AS外部LSA
7:NSSA外部LSA
リンクステートID Link State ID 32 LSAタイプによって変わります。ルーターIDやネットワーク番号です。
広報ルーター Advertising Router 32 情報送信元のルーターIDです。
LSシーケンス番号 LS sequence number 32 各LSAが更新される度に増加。重複するLSAでは、数字が大きい方が新しいと判断。
LSチェックサム LS checksum 16 データの誤り検出。
長さ length 16 1つのLSAの長さです。LSAタイプによって変わります。

LS ageは、LSAの生存時間を管理します。通常、LSAに変更がなくても30分に一回LSAは送信されますが、60分間受信がなかったLSAは使われなくなります。これによって、存在しなくなった経路などが永遠に残ることを防げます。

LSAヘッダー以降は、LSAタイプによって内容が変わります。例えば、ルーターLSAでは、ルーターIDとともに、ABRやASBRなどがわかるフラグが含まれます。

このLSAヘッダーとルーターLSAなどの情報をセットにして、必要な分繰り返されます。また、この情報を元にLSDB(Link State DataBase)が作成されます。

LSAの情報は、ルーターを介してエリア内、および必要に応じて他エリアに転送されます。

LSAckパケット

LSAck(Link State Acknowledgment)パケットは、LSUに対する確認応答です。宛先は、DR/BDRは224.0.0.5(すべてのルーターが受信)、他のルーターは224.0.0.6(DR/BDRが受信)を使います。再送信の応答では、ユニキャストも使います。OSPFパケットヘッダーに続いて、以下のフォーマットとなっています。

【LSAckのフォーマット】
項目 英語 ビット 説明
LSAヘッダー LSA Header 160 先ほど説明したLSAヘッダーと同じです。

これらは、必要なLSAの数だけ繰り返されます。

LSAckによって、LSAが反映されていることが確認できます。

パケットのやりとり

OSPFのインターフェースが起動してからのパケットのやり取りを以下に示します。

  1. Helloパケットをやり取りし、DR/BDRが決定します。DR/BDR以外とは、ネイバー関係となります。
  2. DR/BDRと他のルーターとの間で隣接関係を結ぶため、DBDパケットをやり取りします。この時、自身が知っているLSAヘッダー情報も送信します。
  3. 受信したLSAヘッダーに基づいて、LSRによって相手のLSA情報を要求します。
  4. LSRで要求されたLSAを、LSUで送信します。
  5. LSAckによって、LSAが正常に受信できたことを応答します。

上記のやり取りによって、ルーター間で同一のLSA情報を保存したデータベース(LSDB)を持つようになります。

補足

OSPFパケットの宛先として、224.0.0.5や224.0.0.6などのマルチキャストアドレスになることを説明しましたが、これはイーサネットのブロードキャスト環境の時を想定しています。

宛先の使われ方は、接続されるネットワークによって変わります。例えば、仮想リンクでは宛先はすべてユニキャストで行われます。

最初のページOSPF状態遷移とLSDB