BGP 报文格式
BGP 报文由 BGP 报头(BGP Header) 和 BGP 负载(BGP Payload) 两部分组成。
+-----------------------------------------------------+
| BGP Header (19 bytes) |
+-----------------------------------------------------+
| BGP Payload (variable) |
+-----------------------------------------------------+
其中 BGP 报头由 16 字节的 标记(Marker)、2 字节的 **长度(Length)**和 1 字节的 **类型(Type)**组成:
- 标记字段是 16 个连续的 0xFF 字节,用于在 BGP 邻居之间同步和识别 BGP 报文。
- 长度字段标明 BGP 报文总长度,包括 BGP 报头和 BGP 负载。
- 类型字段用于指定 BGP 报文的类型,包括 OPEN、UPDATE、NOTIFICATION、KEEPALIVE
BGP Header:
+-----------------------------------------------------+
| Marker (16 bytes) |
+------------------------+----------------------------+
| Length (2 bytes) | Type (1 byte) |
+------------------------+----------------------------+
而 BGP 负载是根据 BGP 报文类型而不同。
BGP Payload:
+-----------------------------------------------------+
| Message-specific contents |
+-----------------------------------------------------+
其中最常见的是更新报文(UPDATE)。更新报文包含了路由信息,其格式如下:
+-----------------------------------------------------+
| Withdrawn Routes Length (2 bytes) |
+-----------------------------------------------------+
| Withdrawn Routes (variable) |
+-----------------------------------------------------+
| Total Path Attribute Length (2 bytes) |
+-----------------------------------------------------+
| Path Attributes (variable) |
+-----------------------------------------------------+
| Network Layer Reachability Information (variable) |
+-----------------------------------------------------+
更新报文包含了三个部分:撤销路由、路径属性 和 网络层可达性信息:
- 撤销路由用于撤销已被 BGP 路由器之前学习的路由信息
- 路径属性包含了路由器需要使用的各种属性信息,包括 AS_Path、Router ID、下一跳地址、前缀长度等等
- 网络层可达性信息包含了目标路由的 IP 前缀和前缀长度。
其他 BGP 报文的格式也类似,但负载部分的内容会有所不同。
OPEN 报文用于建立 BGP 邻居关系,其格式如下:
+-----------------------------------------------------+
| Version (1 byte) |
+----------------------+------------------------------+
| My Autonomous System (2 bytes) | Hold Time (2 bytes)|
+----------------------+------------------------------+
| BGP Identifier (4 bytes) |
+-----------------------------------------------------+
| Optional Parameters Length (1 byte) |
+-----------------------------------------------------+
| Optional Parameters (variable) |
+-----------------------------------------------------+
OPEN 报文的内容包括 BGP 版本号、本地自治系统号、保活时间、本地 BGP 标识符以及可选参数。可选参数用于传递一些扩展功能,例如支持多个地址族、MD5 认证等
KEEPALIVE 报文用于维持 BGP 邻居关系的存活状态,其格式如下:
+-----------------------------------------------------+
| Message Length = 19 (2 bytes) |
+-----------------------------------------------------+
| Type = KEEPALIVE (1 byte) |
+-----------------------------------------------------+
| (empty) |
+-----------------------------------------------------+
保持报文没有负载部分,只包括 BGP 报头和一个类型字段。
NOTIFICATION 报文用于通知邻居BGP路由器出现的错误情况,其格式如下:
+-----------------------------------------------------+
| Error Code (1 byte) |
+----------------------+------------------------------+
| Error Subcode (1 byte) | Data (variable) |
+-----------------------------------------------------+
通知报文包含了 错误代码、错误子代码 和一些 数据信息。常见的错误代码包括:报文头部格式错误、不支持的可选参数、不支持的 BGP 版本号、路由环路等。该报文的接收方会根据错误代码和子代码,进行相应的处理,例如关闭 BGP 邻居关系或重新连接等操作。
简单来说,BGP 报文包括头部与负载两部分,其中负载根据报文类型的不同而变化,包括 OPEN、UPDATE、NOTIFICATION、KEEPALIVE,不同类型的 BGP 报文在 BGP 协议的运行过程中扮演着不同的角色,例如建立和维护 BGP 邻居关系,交换路由信息和处理异常情况等。