OSPF パケットフォーマット

OSPFで使用するパケットの一覧です。

■OSPFパケット

OSPFのパケットはルータの情報を発信、交換するために使用します。パケットの構成は下図のようにIPヘッダの後にIPデータとしてOSPFパケットが続きます。そしてOSPFパケットはOSPFパケットヘッダの後に各パケットごとのデータが続きます。IPヘッダで指定するのプロトコル番号は89です。

パケット一覧

OSPFでは次の5つのパケットを使用します。Helloパケットは存在周知のために定期送信されます。DatabaseDescriptionパケットとLink State Requestパケットは初期同期時のみ使用されます。Link State UpdateパケットとLink State Acknowledgmentパケットは初期同期とLSAの更新で使用されます。

パケット名 Packet Type 用途
Hello packet 1 ルータの状態を通知するためのパケット
Database Description packet 2 初期同期でセッションを開始するためのパケット
Link State Request packet 3 初期同期でLSAを要求するためのパケット
Link State Update packet 4 初期同期とLSAの更新でLSAを搬送するためのパケット
Link State Acknowledgment packet 5 初期同期とLSAの更新で確認応答で使用するパケット

OSPFパケットヘッダ

パケットヘッダはルータがOSPFの相手として最低限の条件を満たしているかどうかを判断するために使用します。ヘッダ内にはパケットの種類やルータID、エリアIDなどの最も基本的情報を含んでいて、すべてのOSPFパケットの先頭に付加されます。認証情報も含まれていて、すべてのパケットに対して認証が行われます。AuTypeとAuthenticationのフィールドの説明はこのページの認証フィールドセクションも参照してください。

フィールド 内容
Virsion OSPFのバージョン番号。RFC2328はVersion2
2
Type OSPFで使用されるパケットタイプ
1 — Hello
2 — Database Description
3 — Link State Request
4 — Link State Update
5 — Link State Acknowledgment
Packet length OSPFヘッダを含んだバイト単位のパケットの長さ
Router ID パケットを作成したソースのルータID
Area ID このパケットが属するエリアの32ビットのエリアID。バーチャルリンクの場合は0.0.0.0
Checksum パケットの誤りを検出するためのチェックサム。
認証フィールドを除いたOSPFパケット全体を16ビット単位で1の補数の合計が計算されます。16ビットに満たない場合は0が補足されます。
チェックサムは暗号認証の場合には計算されません。NULL、シンプルパスワードの場合には計算されます。
AuType 認証を行う際の方法。RFC2328では次のように決められています
0 — Null authentication
1 — Simple password
2 — Cryptographic authentication
All others — Reserved

最新の状況はここで確認できます
https://www.iana.org/assignments/ospf-authentication-codes/ospf-authentication-codes.xhtml
Authentication 各認証方式で使用する64bitのフィールド

Helloパケット

Helloパケットはルータの存在や状態を通知するために使用します。ルータ同士の関係や属するエリアの状態を通知することでネイバーとの適切な関係を確立します。このパケットによって主に自分の存在通知、相手の存在認知の通知が行えます。後者の場合Neighborフィールドに認識したルータIDを格納できます。このパケットはHello TimerによってHelloIntervalの間隔で定期送信されます。

フィールド 内容
Network Mask インターフェースに割り当てられたサブネットマスク
Hello Interval Helloパケットを送信する間隔
Options ルータのサポートする機能レベルを示すためのフラグ。 RFC2328で定義されているオプションフィールドは次の通りです

0x02 — E- bit — AS外部LSAのフラッディング方法。スタブエリアの設定。0がスタブエリアを示す。
0x04 — MC-bit — マルチキャストの転送可否[RFC1584]
0x08 — N/P-bit — LS Type-7 LSAの有無[RFC1587]
0x10 — EA-bit — External-Attributes-LSAsの有無[draft-ietf-ospf-extattr-00]
0x20 — DC-bit — デマンド回線の処理[RFC1793]

ただし0x02と0x20以外のオプションフィールドはRFC2328以降のRFCによって更新、再定義されています。オプションの最新の登録状況はここを参照してください。
https://www.iana.org/assignments/ospfv2-parameters/ospfv2-parameters.xhtml#ospfv2-parameters-1  
Rtr Pri ルータの優先順位。DR、BDRの選択で使用される。0にするとDR、BDRの選定に参加しない。インターフェースデータ構造のRouter Priorityを設定
Router Dead Interval 応答のないルータをダウンしたと判断するまでの秒数
Designated Router このネットワークのDRのルータID。DRがない場合は0.0.0.0の設定
Backup Designated Router このネットワークのBDRのルータID。BDRがない場合は0.0.0.0の設定
Neighbor RouterDeadInterval内に確認されたルータのルータID。複数のネイバーIDを含めることができます。

Database Descriptionパケット

Database DescriptionパケットはLSAの一覧を交換するために使用します。このパケットは初期同期時にのみ使用されるパケットで、ネイバーとのセッションを確立してLSA一覧を交換することが目的です。LSA HeaderフィールドにLSAヘッダの一覧を格納し、それ以外のフィールドでセッションの管理を行います。

フィールド 内容
Interface MTU このインターフェースで送信できるIPデータグラムのサイズ(バイト単位)。仮想リンクの場合は0に設定
Options Helloパケットのオプションを参照
I Initビット。初期のDatabase Descriptionパケットであることを示す
M Moreビット。最後のDatabase DescriptionパケットではなくDatabase Descriptionパケットが続くことを示す
MS Master/Slaveビット。1がマスターを示す
DD sequence number Database Descriptionパケットのシーケンス番号。Initビットが設定されている場合は一意である必要があります
An LSA Hader 各LSAヘッダを連続して格納

Link State Requestパケット

Link State RequestパケットはネイバーにLSAの送信を要求するために使用します。このパケットは初期同期時のみ使用されるパケットで、自分に不足しているLSAをネイバーに要求するために使用します。そのためパケットヘッダの後には要求するLSAの情報だけが続く形で構成されています。LS typeからAdvertising Routerのフィールドが1セットとなり連続して配置します。

フィールド 内容
LS type 要求するLSAのLS Type
Link State ID 要求するLSAのLink State ID
Advertising Router 要求するLSAのルータID

Link State Updateパケット

Link State UpdateパケットはLSAを送信するために使用します。このパケットは初期同期とLSAの更新で使用されるパケットで、自分の持つLSAをネイバーに送信するために使用します。そのためパケットヘッダに続く#LSAsフィールドによってLSAの数を示し、その後のLSAsフィールドにLSAが連続して配置する構成となっています。

フィールド 内容
# LSAs このパケットに含まれるLSAの数
LSAs 各LSAを連続して格納

Link State Acknowledgmentパケット

Link State AcknowledgmentパケットはLSAの受領連絡をするために使用します。このパケットは初期同期とLSAの更新で使用されるパケットで、Updateパケットで受信したLSAを受け取ったことをネイバーに伝えます。パケットヘッダに続いてLSAのヘッダ情報だけが連続して配置する構成となっています。

フィールド 内容
An LSAs Header 各LSAのLSAヘッダを連続して格納

■LSA

ここからはリンク情報を格納するためのLSAフォーマットを説明します。動機などで配布される場合はLink State Updateパケットが使用されます。

LSA一覧

OSPFで使用するLSAのフォーマットは以下の4つです。LS Typeとしては5つに分かれていますが、ASBR-Summary-LSAはSummary-LSAの一部であるため同じフォーマットを使用します。

LSA名 LS Type 用途
Router-LSAs 1 ルータのリンク状態
Network-LSAs 2 マルチアクセスネットワーク情報
Summary-LSAs 3, 4 他エリア、ASBR情報
AS-external-LSAs 5 AS外のルート情報

LSAヘッダ

LSAヘッダはLSAの上部に配置されるブロックでLSAの基本情報を格納しています。このヘッダによってLSAのタイプやオプションの対応、作成したルータの情報など、すべてのLSAで共通の意味を持つ情報がわかるようになっています。ただし、Link State IDフィールドだけはLS typeによって持つ意味が異なります。

フィールド 内容
LS age LSAが発信されてからの秒数
Option Helloパケットのオプションを参照
LS type LSAのタイプ
1 — Router-LSAs
2 — Network-LSAs
3 — Summary-LSAs (IP network)
4 — Summary-LSAs (ASBR)
5 — AS-external-LSAs
Link State ID ネットワークの部位を識別するためのID。LS typeによって入る情報が異なる
LS type 1 — 発信元ルーターのルーターID
LS type 2 —ネットワークの指定ルーターのIPインターフェイスアドレス
LS type 3 —宛先ネットワークのIPサブネット
デフォルトルートの場合は0.0.0.0
LS type 4 —ASBRのルーターID
LS type 5 —宛先ネットワークのIPサブネット
デフォルトルートの場合は0.0.0.0  
Advertising Router オリジナルのLSAを発信したルータのルータID
LS sequence number LSAに与えられる連続番号
LS checksum LS ageを省いたLSAヘッダを含むLSAのチェックサム
Length LSAヘッダを含んだLSAのバイト単位の長さ

Router-LSA

Router-LSAはルータのローカルリンク情報を格納するために使用します。各ルータが接続するインターフェースを元に個別に作成してネイバーに同期し、エリア内に伝搬します。作成するルータに複数のリンクがある場合は数を指定して複数配置できます。またリンク毎に持つ#TOSで指定した数のTOSメトリックも連続して配置することができます。ただし、OSPFではTOS(Type of service)に関する機能はRFC2178から削除(OSPFパケットヘッダのオプションフィールド0x01 — T-bitが廃止)されました。下図をはじめとして他のLSA内に残っているTOSに関するフィールドはRFC1583に対する後方互換のためです。ここではTOSに関する説明は割愛します。

フィールド 内容
V 仮想リンクを持つことを示す
1の場合はルート計算時にそのエリアのTransitCapabilityがTrueになります
E ASBRであることを示す
B ABRであることを示す
# Links このLSAに含まれるリンクの数
Link ID Typeフィールドに応じたネットワーク情報
Type1 — ネイバーのルータID
Type2 — DRのIPアドレス
Type3 — IPサブネットのネットワークアドレス
Point-to-Point回線の場合はオプションによって選択
オプション1:相手のIPアドレス
オプション2:IPサブネットのネットワークアドレス
Type4 — ネイバーのルータID
Link Data Typeフィールドに応じたネットワーク情報
Type1 — MIB-II ifIndex value or IPアドレス
Type2 — IPアドレス
Type3 — IPサブネットのサブネットマスク
Point-to-Point回線の場合はオプションによって選択
オプション1:255.255.255.255
オプション2:IPサブネットのサブネットマスク Type4 — IPアドレス
Type OSPFのリンク状態を示すタイプ
1 — Point-to-Point connection
2 — Transit Network
3 — Stub Network
4 — Virtual Link
# TOS TOSメトリックの数。追加のTOSメトリックがない場合0
Metric リンクに対するコスト。TOSを使用する場合は「TOS 0」のコスト
TOS TOSのタイプ指定情報。次の2, 4, 8, 16のいずれか
0 — 0000 — normal service
2 — 0001 — minimize monetary cost
4 — 0010 — maximize reliability
8 — 0100 — maximize throughput
16 — 1000 — minimize delay
TOS metric TOSのメトリック。指定しない場合はTOS 0のコストを使用

Network-LSA

Network-LSAはブロードキャスト回線で使用する疑似的なノードを格納するために使用します。ブロードキャスト回線を持ち、役割がDRのルータが作成しネイバーと同期します。このLSAはRouter-LSAと同様にエリア内に伝搬します。Attached Routerフィールドには回線上に存在するすべてのルータのルータIDが入ります。このNetwork-LSAは計算上で必要となる疑似的なノードであるため、メトリックは0です。

フィールド 内容
Network Mask このルートのサブネットマスク
Attached Router ネットワークに接続している各ルータのルータID

Summary-LSA

Summary-LSAはエリア外のルート情報をリンク情報として格納するために使用します。ABRがルーティングテーブルから作成し、他方のエリアに対して配布します。LSAの種類としてはSummary-LSAとASBR-Summary-LSAは別物として扱うこともありますが、両者は本質的に同じでありパケットフォーマットは同じです。このLSAは一つのIPサブネットごとに1つのSummary-LSAが対応しエリア内に伝搬しますが、ASBR-Summary-LSAはバーチャルリンクとスタブエリアには配布しません。またRouter-LSA同様にTOSの情報が連続して配置されている可能性があります

フィールド 内容
Network Mask このルートのサブネットマスク
デフォルトルートとLS Type 4の場合は0.0.0.0
Metric このルートのメトリック。TOSを使用する場合は「TOS 0」のコスト
TOS このルートのTOS値(Router-LSAのTOS参照)
TOS Metric TOSのメトリック。指定しない場合はTOS 0のコストを使用

AS-external-LSA

AS-external-LSAはAS外のルート情報をリンク情報として格納するために使用します。ASBRが他のプロトコルなどの情報から作成しスタブエリアとバーチャルリンクを除くAS全体に伝搬します。一つのIPサブネットごとに1つのAS-external-LSAが対応し、Router-LSA同様にTOSの情報が連続して配置されている可能性があります

フィールド 内容
Network Mask 外部ルートのサブネットマスク
デフォルトルートの場合は0.0.0.0
E 外部ルートのメトリックタイプ。
0 — タイプ1(加算)
1 — タイプ2(加算なし)
Metric このルートのメトリック。TOSを使用する場合は「TOS 0」のコスト
Forwarding address このルートの転送先アドレス。0.0.0.0の場合はASBRに転送される
External Route Tag ASBR間で情報交換に使用するタグ。OSPFの機能としては使用しない
TOS このルートのTOS値(Router-LSAのTOS参照)
TOS Metric TOSのメトリック。指定しない場合はTOS 0のコストを使用

■認証フィールド

OSPFではセキュリティの機能としてOSPFパケットの認証を行うことができます。OSPFで使われる認証はOSPFパケットヘッダに認証情報を含め、受信時に認証を行います。機密保護などの認証以外のセキュリティ機能はサポートしていません。ここでは認証の種類とパケットヘッダーの認証フィールドの使用について説明します。また認証方法によってチェックサムの有無も関係するため同時に説明します。

認証に関係するパケットフォーマット

下図はOSPFのパケットヘッダです。この中で認証に関係するのは白の部分で示したChecksum、AuType、Authenticationです。Checksumフィールドは認証フィールドを除いたパケットのチェックサム値が入ります。AuTypeフィールドは認証方式を指定します(下表)。Authenticationフィールドは認証で使用する情報が入ります。

AuType 種類 特徴
0 認証なし 認証処理なし
1 パスワード認証 クリアテキストによる認証
2 暗号認証 暗号を使用した認証

認証なしの場合

認証を行わない場合、パケットの送信側では必ずチェックサムが計算されセットされます。チェックサムは64ビットの認証フィールドを除いたOSPFパケット全体を16ビット単位で1の補数の合計です。16ビットに満たない場合は0が補足されます。そして認証方法の指定としてAuTypeフィールドが0にセットされます。Authenticationフィールドは使用されません。

認証なしの場合、パケットの受信側での動作はAuTypeフィールドが0である上で、Checksumの値だけがチェックされます。

パスワード認証の場合

パスワード認証の場合、前提として認証情報をインターフェース(インターフェースデータ構造)に設定しておく必要があります。認証情報はネイバーと同じものを設定する必要があります。

その上でパケットの送信側はチェックサムを認証なしの場合と同様に計算しパケットにセットします。そして認証方法の指定としてAuTypeフィールドを1にセットします。Authenticationフィールドにはパスワードがクリアテキストで設定されます。

パスワード認証の場合、パケットの受信側での動作はAuTypeが1である上で、Authenticationフィールドの値がインターフェースデータ構造のAuthentication Keyと一致することがチェックされます。また同時にチェックサムの値もチェックされます。

暗号認証の場合

暗号認証の場合、前提としてシークレットキーと暗号化アルゴリズムの組み合わせをインターフェースに設定しておく必要があります。この組み合わせ情報はKey IDで識別できるように管理されていなければなりません。RFC2328で例として使われている暗号化アルゴリズムはMD5ですが、Key IDによって識別するためMD5と決まっていません。

その上で送信側は以下の動作を行います。

1)チェックサムを0に設定。チェックサムはメッセージダイジェストがその機能を果たすため使用しない

2)AuTypeフィールドを2に設定。AuTypeが2の場合にはAuthenticationフィールドは下図のように構造が変化

3)AuTypeフィールドに続く16bitの範囲(Checksumフィールドの下)はフィールドが定義されておらず常に0に設定

4)事前に用意した認証情報と暗号化アルゴリズムの組み合わせをKey IDフィールドに番号で設定

5)Auth Data Lenフィールドにパケットの最後に付加されるMessage digestフィールドの長さを設定

6)Cryptographic sequence numberフィールドにリプレイ攻撃を防ぐためのシーケンス番号を設定

7)ここまで作成したパケットとシークレットキーを使用して暗号化

8)暗号化された認証情報をMessage digestとしてOSPFパケットの後ろに付加

受信側では以下の動作を行います。

1)パケットに設定されたKey IDと同じ番号の設定をインターフェース内で見つける。見つからない場合はパケットを破棄

2)パケットのCryptographic sequence numberの値をチェックし、送信側のデータ構造の番号より小さい場合はパケットを破棄

3)パケットのMessage digestフィールドを取り除き送信時と同様の手順でMessage digestを作成

4)オリジナルのMessage digestと作成したMessage digestを比較。一致しない場合はパケットは破棄され、一致する場合は受け入れ

フィールド 内容
Key ID   Message digestを作成するために使用するアルゴリズムとシークレットキーの組み合わせを識別するための番号。インターフェースごとに一意
Auth Data Len   OSPFパケットの後ろに追加されたMessage digestのバイト単位の長さ。MD5の場合は16
Cryptographic sequence number   符号なし32ビットの減少しないシーケンス番号。リプレイ攻撃を防ぐために付加。具体的な番号は規定されておらず、実装次第。ネイバーデータ構造の要素
Message digest シークレットキーを追加したOSPFパケット(Cryptographic sequence numberを含んだ)を暗号化した情報(MAC値)。暗号計算はアルゴリズムによって異なる(MD5の詳細はRFC1321参照)。Message digestはIPヘッダの長さフィールドには含まれるが、OSPFのメッセージ長には含まれない

インターフェースには複数のキーを設定しておくことができ、それによって使用するキーの切り替えが可能になります。各キーには時間定数が想定されていますが、ここでは説明を割愛します。「RFC2328 D.3 Cryptographic authentication」参照。