BGP のシーケンス
BGP は TCP/179 番ポートを使います。TCP というと一般に PC とサーバ間で使うイメージがありますが、BGP を使うためには 2 台のルータが TCP コネクションを確立します。RFC 上ではどちらから TCP syn を送信する、といった決まりはありません。
一般的な BGP 開始シーケンスを以下に示します。
また、一般的な BGP 終了シーケンスを以下に示します。
参考までに、BGP のパケットキャプチャを以下からダウンロードできます。
BGP のメッセージの種類
BGP のヘッダフォーマットを以下に示します。
Marker には 16 Bytes の bit 全てに 1 がセットされます。
Length にはメッセージ全体の長さ (Bytes) がセットされます。
Type にはメッセージタイプがセットされます。BGP のメッセージタイプは以下の 5 種類です。
- Open = BGP 開始
- Update = ルート情報交換
- Notification = エラーや警告を通知
- KeepAlive = Open の返事、および互いの死活監視
- Route-Refresh = ルート情報の一括削除を相手に通知
Openメッセージの役割とフォーマット
Open メッセージは TCP 3way Handshake の後に送られる BGP 開始のメッセージです。
Open メッセージのフォーマットを以下に示します。
Version には BGP のバージョンをセットします。現在のバージョンは 4 です。
My Autonomous System には自分の AS 番号をセットします。なお、RFC 4271 で標準で定められているのは 2 Bytes (1~65535) ですが、思いのほか BGP が流行ったため、2 Bytes では収まりきらなくなってきました。そのため、RFC 6793 で 4 Bytes への拡張が為されています。4 Bytes への拡張が使われるかどうかは、Optional Parametes の Capabilities でネゴシエーションされます。
Hold Time には相手からの通信が途絶えてどのくらいの時間が経過すると BGP を終了するかを[秒] でセットします。相手と異なる場合、小さいほうの値が使われます。
BGP Identifier には BGP のルータ ID をセットします。Cisco 等の機器ではループバックアドレスの最上位 IP アドレス (ループバックアドレスが無ければそれ以外の最上位 IP アドレス) がセットされます。BGP は相手をこのルータ ID で識別します。
Opt Parm Length には以降のオプション領域の長さ (Bytes) を定めます。
また、オプション領域には TLV 形式で Type=1 Byte, Length=1 Byte, Value=variable (Lengthで指定) のエントリが任意の数含まれます。
Updateメッセージの役割とフォーマット
Update メッセージは ルート情報を交換するメッセージです。
Update メッセージのフォーマットを以下に示します。
Withdrawn Routes とは削除すべきルート情報のことです。複数ルートの指定が可能で、削除ルートの全体の長さを Withdrawn Routes Length で指定し、その後に具体的な削除ルートを Withdrawn Routes で指定します。
また、その次にはルーティングテーブルに載せてほしいルート情報を指定します。載せてほしいルートのことを BGP では NLRI (Network Layer Reachability Information) と呼びます。
ルート情報 (NLRI) には属性 (Path Attributes) が付随します。必須の属性もあれば任意の属性もあり、Total Path Attribute で長さを指定し、次の Path Attributes で具体的な属性を指定します。例えば NextHop も属性という扱いですし、MED (metric) も属性です。
Update を行うタイミングとして考えられるのは以下 4 つのケースです。
- Open -> KeepAlive の直後
- トポロジ変更による情報更新
- network コマンド設定直後
- 後述する Route-Refresh メッセージ直後
route-map 等で属性変更のための設定変更をしたときは Update は行われず、そのため属性は変更されません。なので一度、clear ip bgp * soft 等で再度 Update をする必要があります。
Notificationメッセージの役割とフォーマット
Notification は主にエラーメッセージ等を通知するために使われます。
Notification メッセージのフォーマットを以下に示します。
例えば BGP のネイバーを shutdown する等した場合には Error code=6 により通知されることがあります。
詳細については RFC 4271 の Section 4.5 をご参照下さい。
KeepAliveメッセージの役割とフォーマット
KeepAlive メッセージは相手に「まだ生きてるよ!」 というのを伝え続け、BGP セッションを維持するために使われます。
ただし、実はそれ以外にも、OPEN メッセージの返信としても使われます。これは RFC にも記載されています。
[RFC 4271 の Section 4.2 から引用]
After a TCP connection is established, the first message sent by each side is an OPEN message. If the OPEN message is acceptable, a KEEPALIVE message confirming the OPEN is sent back.
KeepAlive にはフォーマットがありません。BGP メッセージヘッダのメッセージタイプにて Type=4 が指定されるだけです。
Route-Refreshメッセージの役割とフォーマット
Route-Refresh は clear ip bgp * soft コマンド等でルート情報を一括削除したことを通知する際に使われます。BGP のセッションを終了されることなく、ルート情報交換だけを最初からやり直す方法です。
Withdrawn Routes では相手にルート削除を促しますが、Route-Refresh は自分がルート削除したことを相手に通知し、相手から再度 Update メッセージを送ってもらうよう促します。
この機能は RFC 2918 で個別に拡張されています。AS 番号の 4 Bytes 拡張と同様、OPEN メッセージ内の Optional Parameters の Capability でネゴシエーションします。
Route-Refresh のフォーマットを以下に示します。
コメント