BGP勉強録

# BGPとは
BGPはBorder Gateway Protocolの略で、AS(Autonomous System)間の経路情報をやり取りする際に用いられるプロトコルです。
## ルーティングプロトコルでのBGPの位置付け
![スクリーンショット 2023-11-30 184638.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515347/7fdeacce-b736-a12c-ee63-545fe0d3ae58.png)
BGPはEGPに分類されるルーティングプロトコルです。

# IGPとEGP
BGPを詳しく調べる前に、IGPとEGPについても知っておいた方がいいでしょう。
## IGP
IGPはInterior Gateway Protocolの略で、ASの中などの単一ネットワーク内で完結するルーティングのときに使用するプロトコルの総称です。
例として、RIPやOSPFなどが挙げられます。
## EGP
EGPはExterior Gateway Protocolの略で、AS内では完結しない場合、つまりAS間同士でのやり取りの際に使用されます。
BGPはここに属します。

# BGPのフォーマット
## メッセージヘッダ
![スクリーンショット 2023-11-30 193949.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515347/d01a26cd-c0d4-b597-89ed-5ee2bb9d8781.png)
### Markerフィールド
このフィールドは16オクテットの長さから構成されています。Markerの値は受信側が計算でき、認証アルゴリズムを使うことができます。
### Lengthフィールド
このフィールドには、メッセージ全体の長さが入ります。
### Typeフィールド
Typeフィールドには、メッセージ自体の種類を示す値が入ります。
この値は以下の4種類から成ります。
- OPEN
TCPコネクション確立後に、BGPルーター間のルーティング情報の交換を行います。
- UPDATE
ルーティング情報の交換を行います。
- NOTIFICATION
エラーが検出された際に、送信されます。Notificationメッセージを送信した方が、TCPセッションを切断します。
- KEEPALIVE
相手の機器が動作しているかを確かめます。

## メッセージのフォーマット
次は先程のメッセージのフォーマットを詳しく見ていきましょう。
### OPEN
```
       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
       +-+-+-+-+-+-+-+-+
       |    Version    |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |     My Autonomous System      |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |           Hold Time           |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                         BGP Identifier                        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       | Opt Parm Len  |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                                                               |
       |             Optional Parameters (variable)                    |
       |                                                               |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
```
#### Version
メッセージプロトコルのバージョンを示します。現在使われているBGPのバージョンは **4** です。
#### My Autonomous System
送信者のAS番号が格納されます。
#### Hold Time
UPDATEメッセージやKEEPALIVEメッセージの受信を許容するまでの時間を表します。
受け取ったOPENメッセージでの値と自身の値を比較して、小さい方をHold Timeとして使用します。
#### BGP Identifier
送信元ルーターのIPアドレスの値が入ります。

### UPDATE
```
      +-----------------------------------------------------+
      |   Withdrawn Routes Length (2 octets)                |
      +-----------------------------------------------------+
      |   Withdrawn Routes (variable)                       |
      +-----------------------------------------------------+
      |   Total Path Attribute Length (2 octets)            |
      +-----------------------------------------------------+
      |   Path Attributes (variable)                        |
      +-----------------------------------------------------+
      |   Network Layer Reachability Information (variable) |
      +-----------------------------------------------------+
```
#### Withdrawn Routes Length
Withdrawn Routesフィールドの長さをオクテットで示します。
値が **0** だとWithdrawn Routesが無く、Withdrawn Routesフィールドも無いということになります。
#### Withdrawn Routes
取り消されたルートのコード化したIPアドレスの接頭ビットのリストが格納されます。
#### Total Path Attribute Length
Total Path Attributeの長さを格納します。
#### Total Path Attribute
このフィールドには属性のリストが置かれます。
#### Network Layer Reachability Information
IPアドレスとプレフィックス長を示します。

### NOTIFICATION
```
      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      | Error code    | Error subcode |   Data (variable)             |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
```
#### Error code
エラーコードの通知タイプを示します。
#### Error subcode
具体的なエラーコードを示します。
#### Data
エラーの内容を格納します。

### KEEPALIVE
KEEPALIVEメッセージは、メッセージヘッダのみで構成されており、他の情報は持っていません。この場合のLengthは19オクテットとなります。

# 今回を通して
BGPの全体像を少し掴むことができたと感じました。しかし、UPDATEメッセージのTotal Path Attribute部分が今回全然触れられていないので、次回はその部分の詳細に触れていきたいと思います。