OSPFで使用するパケットの一覧です。
Contents
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の相手として最低限の条件を満たしているかどうかを判断するために使用します。ヘッダ内にはパケットの種類やルータ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パケットはルータの存在や状態を通知するために使用します。ルータ同士の関係や属するエリアの状態を通知することでネイバーとの適切な関係を確立します。このパケットによって主に自分の存在通知、相手の存在認知の通知が行えます。後者の場合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パケットは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パケットはネイバーに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パケットはLSAを送信するために使用します。このパケットは初期同期とLSAの更新で使用されるパケットで、自分の持つLSAをネイバーに送信するために使用します。そのためパケットヘッダに続く#LSAsフィールドによってLSAの数を示し、その後のLSAsフィールドにLSAが連続して配置する構成となっています。
フィールド | 内容 |
# LSAs | このパケットに含まれるLSAの数 |
LSAs | 各LSAを連続して格納 |
Link State AcknowledgmentパケットはLSAの受領連絡をするために使用します。このパケットは初期同期とLSAの更新で使用されるパケットで、Updateパケットで受信したLSAを受け取ったことをネイバーに伝えます。パケットヘッダに続いてLSAのヘッダ情報だけが連続して配置する構成となっています。
フィールド | 内容 |
An LSAs Header | 各LSAのLSAヘッダを連続して格納 |
ここからはリンク情報を格納するためのLSAフォーマットを説明します。動機などで配布される場合はLink State Updateパケットが使用されます。
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で共通の意味を持つ情報がわかるようになっています。ただし、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はルータのローカルリンク情報を格納するために使用します。各ルータが接続するインターフェースを元に個別に作成してネイバーに同期し、エリア内に伝搬します。作成するルータに複数のリンクがある場合は数を指定して複数配置できます。またリンク毎に持つ#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はブロードキャスト回線で使用する疑似的なノードを格納するために使用します。ブロードキャスト回線を持ち、役割がDRのルータが作成しネイバーと同期します。このLSAはRouter-LSAと同様にエリア内に伝搬します。Attached Routerフィールドには回線上に存在するすべてのルータのルータIDが入ります。このNetwork-LSAは計算上で必要となる疑似的なノードであるため、メトリックは0です。
フィールド | 内容 |
Network Mask | このルートのサブネットマスク |
Attached Router | ネットワークに接続している各ルータのルータID |
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外のルート情報をリンク情報として格納するために使用します。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」参照。