Skip to main content

4. Message Formats (消息格式)

4. Message Formats (消息格式)

本节描述 BGP 使用的消息格式。

BGP 消息通过 TCP 连接发送。消息仅在完全接收后才被处理。最大消息大小为 4096 字节。所有实现都必须支持此最大消息大小。可以发送的最小消息由没有数据部分的 BGP 头组成 (19 字节)。

所有多字节字段均采用网络字节序。

4.1. Message Header Format (消息头格式)

每条消息都有一个固定大小的头。根据消息类型, 头后面可能有也可能没有数据部分。这些字段的布局如下所示:

   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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ +
| Marker |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Length | Type |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Marker (标记):

此 16 字节字段为兼容性而包含; 它必须设置为全 1。

Length (长度):

此 2 字节无符号整数指示消息的总长度 (包括头), 以字节为单位。因此, 它允许在 TCP 流中定位 (标记字段的) 下一条消息。Length 字段的值必须始终至少为 19 且不大于 4096, 并且可以根据消息类型进一步约束。不允许在消息后填充额外数据。因此, 给定消息的其余部分, Length 字段必须具有所需的最小值。

Type (类型):

此 1 字节无符号整数指示消息的类型代码。本文档定义了以下类型代码:

                     1 - OPEN
2 - UPDATE
3 - NOTIFICATION
4 - KEEPALIVE

[RFC2918] 定义了一个额外的类型代码。

4.2. OPEN Message Format (OPEN 消息格式)

建立 TCP 连接后, 每一侧发送的第一条消息是 OPEN 消息。如果 OPEN 消息可接受, 则发回确认 OPEN 的 KEEPALIVE 消息。

除了固定大小的 BGP 头之外, 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 (版本):

此 1 字节无符号整数指示消息的协议版本号。当前 BGP 版本号为 4。

My Autonomous System (我的自治系统):

此 2 字节无符号整数指示发送者的自治系统编号。

Hold Time (保持时间):

此 2 字节无符号整数指示发送者为保持定时器的值提议的秒数。在接收到 OPEN 消息后, BGP 发言者必须使用其配置的保持时间和 OPEN 消息中接收的保持时间中较小的一个来计算保持定时器的值。保持时间必须为零或至少三秒。实现可以基于保持时间拒绝连接。计算出的值指示在从发送者接收连续的 KEEPALIVE 和/或 UPDATE 消息之间可以经过的最大秒数。

BGP Identifier (BGP 标识符):

此 4 字节无符号整数指示发送者的 BGP 标识符。给定的 BGP 发言者将其 BGP 标识符的值设置为分配给该 BGP 发言者的 IP 地址。BGP 标识符的值在启动时确定, 并且对于每个本地接口和 BGP 对等体都是相同的。

Optional Parameters Length (可选参数长度):

此 1 字节无符号整数指示 Optional Parameters 字段的总长度 (以字节为单位)。如果此字段的值为零, 则不存在可选参数。

Optional Parameters (可选参数):

此字段包含一个可选参数列表, 其中每个参数编码为 <Parameter Type, Parameter Length, Parameter Value> 三元组。

0                   1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-...
| Parm. Type | Parm. Length | Parameter Value (variable)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-...

Parameter Type 是一个 1 字节字段, 明确标识各个参数。Parameter Length 是一个 1 字节字段, 包含 Parameter Value 字段的长度 (以字节为单位)。Parameter Value 是一个可变长度字段, 根据 Parameter Type 字段的值进行解释。

[RFC3392] 定义了 Capabilities Optional Parameter (能力可选参数)。

OPEN 消息的最小长度为 29 字节 (包括消息头)。

4.3. UPDATE Message Format (UPDATE 消息格式)

UPDATE 消息用于在 BGP 对等体之间传输路由信息。UPDATE 消息中的信息可用于构建描述各个自治系统关系的图。通过应用要讨论的规则, 可以检测并从自治系统间路由中删除路由信息环路和某些其他异常。

UPDATE 消息用于向对等体通告共享公共路径属性的可行路由, 或从服务中撤回多个不可行路由 (见 3.1)。UPDATE 消息可以同时通告一条可行路由并从服务中撤回多个不可行路由。UPDATE 消息始终包括固定大小的 BGP 头, 还包括其他字段, 如下所示 (注意, 某些显示的字段可能不会出现在每个 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 (撤回路由长度):

此 2 字节无符号整数指示 Withdrawn Routes 字段的总长度 (以字节为单位)。它的值允许确定网络层可达性信息字段的长度, 如下所述。

值 0 表示没有路由从服务中撤回, 并且此 UPDATE 消息中不存在 WITHDRAWN ROUTES 字段。

Withdrawn Routes (撤回路由):

这是一个可变长度字段, 包含正从服务中撤回的路由的 IP 地址前缀列表。每个 IP 地址前缀编码为形式为 <length, prefix> 的 2 元组, 其字段描述如下:

         +---------------------------+
| Length (1 octet) |
+---------------------------+
| Prefix (variable) |
+---------------------------+

这些字段的使用和含义如下:

a) Length (长度):

Length 字段指示 IP 地址前缀的位长度。长度为零表示匹配所有 IP 地址的前缀 (前缀本身为零字节)。

b) Prefix (前缀):

Prefix 字段包含一个 IP 地址前缀, 后跟使字段末尾落在字节边界上所需的最少尾随位。请注意, 尾随位的值是无关的。

Total Path Attribute Length (总路径属性长度):

此 2 字节无符号整数指示 Path Attributes 字段的总长度 (以字节为单位)。它的值允许确定网络层可达性字段的长度, 如下所述。

值 0 表示此 UPDATE 消息中既不存在网络层可达性信息字段也不存在路径属性字段。

Path Attributes (路径属性):

除了仅携带撤回路由的 UPDATE 消息之外, 每个 UPDATE 消息中都存在可变长度的路径属性序列。每个路径属性是可变长度的三元组 <attribute type, attribute length, attribute value>

Attribute Type 是一个 2 字节字段, 由 Attribute Flags 字节和 Attribute Type Code 字节组成。

      0                   1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Attr. Flags |Attr. Type Code|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Attribute Flags 字节的高位 (位 0) 是 Optional 位。它定义属性是可选的 (如果设置为 1) 还是众所周知的 (如果设置为 0)。

Attribute Flags 字节的第二高位 (位 1) 是 Transitive 位。它定义可选属性是可传递的 (如果设置为 1) 还是非可传递的 (如果设置为 0)。

对于众所周知的属性, Transitive 位必须设置为 1。(有关可传递属性的讨论, 请参见第 5 节。)

Attribute Flags 字节的第三高位 (位 2) 是 Partial 位。它定义可选可传递属性中包含的信息是部分的 (如果设置为 1) 还是完整的 (如果设置为 0)。对于众所周知的属性和可选非可传递属性, Partial 位必须设置为 0。

Attribute Flags 字节的第四高位 (位 3) 是 Extended Length 位。它定义 Attribute Length 是 1 字节 (如果设置为 0) 还是 2 字节 (如果设置为 1)。

Attribute Flags 字节的低 4 位未使用。发送时必须为零, 接收时必须忽略。

Attribute Type Code 字节包含 Attribute Type Code。当前定义的 Attribute Type Code 在第 5 节中讨论。

如果 Attribute Flags 字节的 Extended Length 位设置为 0, 则路径属性的第三个字节包含属性数据的长度 (以字节为单位)。

如果 Attribute Flags 字节的 Extended Length 位设置为 1, 则路径属性的第三和第四个字节包含属性数据的长度 (以字节为单位)。

路径属性的其余字节表示属性值, 并根据 Attribute Flags 和 Attribute Type Code 进行解释。支持的 Attribute Type Code 及其属性值和用途如下:

a) ORIGIN (Type Code 1):

ORIGIN 是一个众所周知的强制属性, 定义路径信息的来源。数据字节可以采用以下值:

Value      Meaning

0 IGP - Network Layer Reachability Information
is interior to the originating AS

1 EGP - Network Layer Reachability Information
learned via the EGP protocol [RFC904]

2 INCOMPLETE - Network Layer Reachability
Information learned by some other means

此属性的用法在 5.1.1 中定义。

b) AS_PATH (Type Code 2):

AS_PATH 是一个众所周知的强制属性, 由一系列 AS 路径段组成。每个 AS 路径段由三元组 <path segment type, path segment length, path segment value> 表示。

路径段类型是一个 1 字节长度字段, 定义了以下值:

Value      Segment Type

1 AS_SET: unordered set of ASes a route in the
UPDATE message has traversed

2 AS_SEQUENCE: ordered set of ASes a route in
the UPDATE message has traversed

路径段长度是一个 1 字节长度字段, 包含路径段值字段中 AS 的数量 (不是字节数)。

路径段值字段包含一个或多个 AS 编号, 每个编码为 2 字节长度字段。

此属性的用法在 5.1.2 中定义。

c) NEXT_HOP (Type Code 3):

这是一个众所周知的强制属性, 定义应该用作 UPDATE 消息的网络层可达性信息字段中列出的目标的下一跳的路由器的 (单播) IP 地址。

此属性的用法在 5.1.3 中定义。

d) MULTI_EXIT_DISC (Type Code 4):

这是一个可选的非可传递属性, 是一个 4 字节无符号整数。此属性的值可以由 BGP 发言者的决策过程用于在相邻自治系统的多个入口点之间进行区分。

此属性的用法在 5.1.4 中定义。

e) LOCAL_PREF (Type Code 5):

LOCAL_PREF 是一个众所周知的属性, 是一个 4 字节无符号整数。BGP 发言者使用它来通知其其他内部对等体通告发言者对通告路由的偏好程度。

此属性的用法在 5.1.5 中定义。

f) ATOMIC_AGGREGATE (Type Code 6)

ATOMIC_AGGREGATE 是一个长度为 0 的众所周知的任意属性。

此属性的用法在 5.1.6 中定义。

g) AGGREGATOR (Type Code 7)

AGGREGATOR 是一个长度为 6 的可选可传递属性。该属性包含形成聚合路由的最后一个 AS 编号 (编码为 2 字节), 后跟形成聚合路由的 BGP 发言者的 IP 地址 (编码为 4 字节)。这应该与用于发言者 BGP 标识符的地址相同。

此属性的用法在 5.1.7 中定义。

Network Layer Reachability Information (网络层可达性信息):

此可变长度字段包含 IP 地址前缀列表。网络层可达性信息的长度 (以字节为单位) 未明确编码, 但可以计算为:

      UPDATE message Length - 23 - Total Path Attributes Length
- Withdrawn Routes Length

其中 UPDATE message Length 是固定大小 BGP 头中编码的值, Total Path Attribute Length 和 Withdrawn Routes Length 是 UPDATE 消息可变部分中编码的值, 23 是固定大小 BGP 头、Total Path Attribute Length 字段和 Withdrawn Routes Length 字段的组合长度。

可达性信息编码为一个或多个形式为 <length, prefix> 的 2 元组, 其字段描述如下:

         +---------------------------+
| Length (1 octet) |
+---------------------------+
| Prefix (variable) |
+---------------------------+

这些字段的使用和含义如下:

a) Length (长度):

Length 字段指示 IP 地址前缀的位长度。长度为零表示匹配所有 IP 地址的前缀 (前缀本身为零字节)。

b) Prefix (前缀):

Prefix 字段包含一个 IP 地址前缀, 后跟足够的尾随位以使字段的末尾落在字节边界上。请注意, 尾随位的值是无关的。

UPDATE 消息的最小长度为 23 字节 -- 固定头的 19 字节 + Withdrawn Routes Length 的 2 字节 + Total Path Attribute Length 的 2 字节 (Withdrawn Routes Length 的值为 0 且 Total Path Attribute Length 的值为 0)。

UPDATE 消息最多可以通告一组路径属性, 但可以通告多个目标, 前提是这些目标共享这些属性。给定 UPDATE 消息中包含的所有路径属性都适用于 UPDATE 消息的 NLRI 字段中携带的所有目标。

UPDATE 消息可以列出多个要从服务中撤回的路由。每个这样的路由由其目标 (表示为 IP 前缀) 标识, 该目标在 BGP 发言者 - BGP 发言者连接的上下文中明确标识先前向其通告的路由。

UPDATE 消息可能仅通告要从服务中撤回的路由, 在这种情况下, 消息将不包括路径属性或网络层可达性信息。相反, 它可能仅通告可行路由, 在这种情况下, WITHDRAWN ROUTES 字段不需要存在。

UPDATE 消息不应该在 WITHDRAWN ROUTES 和 Network Layer Reachability Information 字段中包含相同的地址前缀。但是, BGP 发言者必须能够处理这种形式的 UPDATE 消息。BGP 发言者应该将这种形式的 UPDATE 消息视为 WITHDRAWN ROUTES 不包含地址前缀。

4.4. KEEPALIVE Message Format (KEEPALIVE 消息格式)

BGP 不使用任何基于 TCP 的保持活动机制来确定对等体是否可达。相反, KEEPALIVE 消息在对等体之间频繁交换, 以防止保持定时器过期。KEEPALIVE 消息之间的合理最大时间将是保持时间间隔的三分之一。KEEPALIVE 消息的发送频率不得超过每秒一次。实现可以根据保持时间间隔调整其发送 KEEPALIVE 消息的速率。

如果协商的保持时间间隔为零, 则不得发送定期 KEEPALIVE 消息。

KEEPALIVE 消息仅由消息头组成, 长度为 19 字节。

4.5. NOTIFICATION Message Format (NOTIFICATION 消息格式)

当检测到错误条件时发送 NOTIFICATION 消息。BGP 连接在发送后立即关闭。

除了固定大小的 BGP 头之外, 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 (错误代码):

此 1 字节无符号整数指示 NOTIFICATION 的类型。已定义以下错误代码:

Error Code       Symbolic Name               Reference

1 Message Header Error Section 6.1

2 OPEN Message Error Section 6.2

3 UPDATE Message Error Section 6.3

4 Hold Timer Expired Section 6.5

5 Finite State Machine Error Section 6.6

6 Cease Section 6.7

Error subcode (错误子代码):

此 1 字节无符号整数提供有关所报告错误性质的更具体信息。每个错误代码可能有一个或多个与之关联的错误子代码。如果未定义适当的错误子代码, 则为错误子代码字段使用零 (未指定) 值。

Message Header Error subcodes (消息头错误子代码):

      1 - Connection Not Synchronized.
2 - Bad Message Length.
3 - Bad Message Type.

OPEN Message Error subcodes (OPEN 消息错误子代码):

      1 - Unsupported Version Number.
2 - Bad Peer AS.
3 - Bad BGP Identifier.
4 - Unsupported Optional Parameter.
5 - [Deprecated - see Appendix A].
6 - Unacceptable Hold Time.

UPDATE Message Error subcodes (UPDATE 消息错误子代码):

      1 - Malformed Attribute List.
2 - Unrecognized Well-known Attribute.
3 - Missing Well-known Attribute.
4 - Attribute Flags Error.
5 - Attribute Length Error.
6 - Invalid ORIGIN Attribute.
7 - [Deprecated - see Appendix A].
8 - Invalid NEXT_HOP Attribute.
9 - Optional Attribute Error.
10 - Invalid Network Field.
11 - Malformed AS_PATH.

Data (数据):

此可变长度字段用于诊断 NOTIFICATION 的原因。Data 字段的内容取决于错误代码和错误子代码。有关更多详细信息, 请参见第 6 节。

请注意, 可以通过以下公式从消息 Length 字段确定 Data 字段的长度:

         Message Length = 21 + Data Length

NOTIFICATION 消息的最小长度为 21 字节 (包括消息头)。