Skip to main content

BGP报文格式

BGP协议栈结构

BGP 协议栈结构
 +-------------------------------------+
 |                BGP                  |
 +-------------------------------------+
 |           TCP Port = 179            |
 +-------------------------------------+
 |       IPv4 Header Protocol = 4      |
 +-------------------------------------+
 |            L2 Type = 0x0800         |
 +-------------------------------------+
 |                  L1                 |
 +-------------------------------------+

BGP报文头基本格式

BGP报文由BGP报文头和具体报文内容两部分组成。BGP的运行是通过消息驱动的,共有5种消息类型,这些消息有相同的报文头。这些消息通过TCP协议进行传播(端口号是179)。消息最长为4096字节,最短为19字节(只包含报文头)。BGP报文头包括三的部分,总长19字节。

BGP报文头格式
  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     |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
BGP 报文头字段
字段 长度 含义
Marker 16B 用于检查BGP对等体的同步信息是否完整,以及用于BGP验证的计算。不使用验证时所有比特均为1(十六进制则全“FF”)。
Length 2B BGP消息总长度(包括报文头在内),以字节为单位。长度范围是19~4096。
Type 1B BGP消息的类型。Type有5个可选值,表示BGP报文头后面所接的5类报文(其中,前四种消息是在RFC4271中定义的,而Type5的消息则是在RFC2918中定义的)。
BGP TYPE值
TYPE值 报文类型
1 OPEN
2 UPDATE
3 NOTIFICATION
4 KEEPALIVE
5 REFRESH(RFC2918)

BGP OPEN

如果BGP报文头中的TYPE为1,则该报文为OPEN报文。报文头后面所接的报文内容如下,OPEN报文用于建立BGP连接。

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)                |
 +---------------------------------------------------------------+
BGP OPEN报文字段解释
字段 长度(B) 含义
Version 1 表示协议的版本号,现在BGP的版本号为4。
My Autonomous System 2 发送者自己的AS域号
Hold Time 2 发送者自己设定的hold time值(单位:秒),用于协商BGP对等体间保持建立连接关系,发送KEEPALIVE或UPDATE等报文的时间间隔。BGP的状态机必须在收到对等体的OPEN报文后,对发出的OPEN报文和收到的OPEN报文两者的hold time时间作比较,选择较小的时间作为协商结果。Hold Time的值可为零(不发KEEPALIVE报文)或大于等于3,我们系统的默认为180。
BGP Identifier 4 发送者的Router ID。
Opt Parm Len 1 表示Optional Parameters(可选参数)的长度。如果此值为0,表示没有可选参数。
Optional Parameters 可变 此值为BGP可选参数列表,每一个可选参数是一个TLV格式的单元(RFC3392)。
BGP OPEN Optional
  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)
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-...
  • Parm. Type:占1个字节(无符号位),为可选参数类型。我们现在的实现中,只在Type值为2时有意义,表示携带的参数为协商能力。

  • Parm. Length:占1个字节(无符号位),为Parameter Value的长度。

  • Parameter. Value:根据Parm.Type的不同值填写不同的参数内容,在Parm.Type为2表示协商能力时,Parameter.Value是表示所支持的各种协商能力的列表,列表中的每一个单元是如下的一个TLV三元组:

     +------------------------------+
     | Capability Code (1 octet)   |
     +------------------------------+
     | Capability Length (1 octet) |
     +------------------------------+
     | Capability Value (variable) |
     +------------------------------+
    • Capability Code:所支持的能力编号,占1个字节。Code为1时,表示支持的地址族能力;Code为2时,表示支持REFRESH能力。

    • Capability Length:表示Capability Value的长度,占1个字节。

    • Capability Value:根据Code值的不同其内容与长度也不同。 Capability Code为1时,Capability Value值是一个TLV三元组,共占4个字节:

       0       7      15      23      31 
       +-------+-------+-------+-------+
       |      AFI      | Res.  | SAFI  |
       +-------+-------+-------+-------+
      • AFI:地址族标识(Address Family Identifier),占2个字节,能力所支持地址族标识信息,用以和SAFI一同确定网络层协议和IP地址间的关系,编码方式与多协议扩展中的规定相同。其值按照 RFC1700 中ADDRESS FAMILY NUMBERS的定义,可参考Address Family Numbers

      • Res:保留位,占1个字节,发送者应将其设置为零,在接受的时候忽略;

      • SAFI:子地址族标识(Address Family Identifier),占1个字节,能力所支持的子地址族标识信息,用以和AFI一同确定网络层协议和IP地址间的关系,编码方式与多协议扩展中的规定相同。其值按照 RFC1700 中ADDRESS FAMILY NUMBERS的定义,具体可参考Subsequent Address Family Identifiers (SAFI) Parameters

      Capability Code为2(RFC2918) 表示支持路由刷新能力,即Route Refresh Capability。此能力的Code为2,length为零,无value部分。 需要说明的是,只有在能力协商中使能了支持Route Refresh Capability,路由器才能处理REFRESH报文。在默认情况下,我们的实现支持IPv4单播能力与路由刷新能力,其他能力需要另外设定。

BGP OPEN AFI及SAFI编码说明
AFI编码 AFI说明 SAFI编码 SAFI说明 说明
1 IPv4地址族 1 单播 IPv4单播
: : 2 组播 IPv4组播
: : 128 VPN IPv4的L3VPN
2 IPv6地址族 1 单播 IPv6单播
: : 2 组播 IPv6组播
: : 128 VPN IPv6的L3VPN
196 二层 128 VPN L2VPN的Kompella方式

BGP UPDATE

如果BGP报文头中的TYPE为2,则该报文为UPDATE报文。报文头后面所接的报文内容如下(RFC 4271),UPDATE报文用于通告路由。

UPDATE报文格式
 0                         7                          15  Length
 +-----------------------------------------------------+
 |              Unfeasible routes length               |  2B
 +-----------------------------------------------------+
 |                  Withdrawn Routes                   |  Variable
 +-----------------------------------------------------+
 |             Total Path Attribute Length             |  2B
 +-----------------------------------------------------+
 |                   Path Attributes                   |  Variable
 +-----------------------------------------------------+
 |       Network Layer Reachability Information        |  Variable
 +-----------------------------------------------------+
BGP UPDATE报文字段解释
字段 长度 含义
Unfeasible routes length 2B 标明Withdrawn Routes部分的长度。其值为零时,表示没有撤销的路由。
Withdrawn Routes 变长 包含要撤销的路由列表,列表中的每个单元包含1字节的Length域和可变长度的Prefix域。 Length:待撤销路由的掩码。其值为零时,表示匹配所有的路由。 Prefix:传送的IP地址前缀必须用整字节表示。 例如:假定待撤销的路由为200.200.200.200,其编码用16进制表示可如下: Mask掩码(十进制) Length Prefix 32 20 C8 C8 C8 C8 25 19 C8 C8 C8 80 20 14 C8 C8 C0 15 0F C8 C8
Total Path Attribute Length 2B 标明Path Attributes的长度。其值为零时,表示没有路由及其路由属性要通告。
Path Attributes 变长 包含要更新的路由属性列表,按其类型号从小到大的顺序排序,填写更新的路由的所有属性。每一个属性单元包括属性类型,属性长度,属性值三部分。详见BGP路径属性TLV格式
NLRI 变长 包含要更新的地址前缀列表,每一个地址前缀单元由一个LV二元组(prefix length, the prefix of the reachable route)组成,其编码填写方法与Withdrawn Routes的填写方法相同。
BGP路径属性TLV格式
 0                         7                        15  Length
 +---------------------------------------------------+
 |                     Attr. TYPE                    |  2B
 +-------------------------+-------------------------+
 |    Attr. Length         |                            1B or 2B
 +-------------------------+-------------------------+
 |                     Attr. Value                   |  Variable
 +---------------------------------------------------+

其中,Attr.TYPE占2个字节(无符号位),包括1字节的Flags(无符号位)和1字节的Type Code(无符号位)。

BGP路径属性-Type
0                       7                       15  
+-----------------------+-----------------------+ Length
| O| T| P| E| U| U| U| U| Attr. Type Code | 2B
+-----------------------+-----------------------+
  • Attr.Flags:占1个字节(8个bit),表示属性的标记,其每个bit位的意义如下显示:

    • O: Optional bit, 属性的可选性。决定属性是否为必携带属性。带可选属性(optional)设为1,公认属性(well-known)设为零。

    • T: Transitive bit 属性的可传递性。对于可选属性,是可传递的设为1,非可传递的设为0。对于公认属性必须设为1。

    • P: Partial bit 属性的局部性。对于可传递的可选属性是局部的设为1,是完全的设为零。对于非可传递的的可选属性和公认属性,必须设为零。

    • E: Extended Length bit 决定该属性的长度字段(即Attr. Length)是否需要扩展。不需要扩展则设为零,Attr. Length占1个字节;需要扩展则设为1,Attr. Length占2个字节。

    • U: Unused bits 低4位没有使用,发送时必须全部设为零,并且在接收时被忽略。

  • Attr.Type Code:占1个字节(无符号位),表示属性的类型号。设置如BGP 路由属性的类型号列表

  • Attr.Value:根据不同属性的类型填写不同内容。

路由属性类型号

BGP 路由属性的类型号列表
VALUE 属性类型 属性值
1 Origin IGP
: : EGP
: : Incomplete
2 2:As_Path AS_SET
: : AS_SEQUENCE
: : AS_CONFED_SET
: : AS_CONFED_SEQUENCE
3 Next_Hop 下一跳的IP地址
4 Multi_Exit_Disc MED用于判断流量进入AS时的最佳路由
5 Local_Pref Local_Pref用于判断流量离开AS时的最佳路由
6 Atomic_Aggregate BGP Speaker选择聚合后的路由,而非具体的路由
7 Aggregator 发起聚合的路由器ID和AS号
8 Community 团体属性
9 Originator_ID 反射路由发起者的Router ID
10 Cluster_List 反射路由经过的反射器列表
14 MP_REACH_NLRI 多协议可达NLRI
15 MP_UNREACH_NLRI 多协议不可达NLRI
16 Extended Communtities 扩展团体属性

BGP Notification

如果BGP报文头中的TYPE为3,则该报文为NOTIFICATION报文。报文头后面所接的报文内容如下(RFC 4271),NOTIFICATION报文用于处理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)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+...
BGP Notification 报文格式字段解释
字段 长度 含义
Error code 1字节 定义错误的类型,非特定的错误类型用零表示。详细错误码参见BGP Notification 错误码解释
Error subcode 1字节 指定错误细节编号,非特定的错误细节编号用零表示。
Data 可变长 指定错误数据内容。

错误码表

BGP Notification 错误码解释
错误码 错误子码
1:消息头错误 1:连接未同步
: 2:错误的消息长度
: 3:错误的消息类型
2:Open消息错误 1:不支持的版本号
: 2:错误的对等AS
: 3:错误的BGP标识符
: 4:不支持的可选参数
: 5:认证失败
: 6:不可接受的保持时间
: 7:不支持的能力
3:Update消息错误 1:畸形属性列表
: 2:不可识别的公认属性
: 3:缺少公认属性
: 4:属性标志错误
: 5:属性长度错误
: 6:无效Origin属性
: 7:AS路由环路
: 8:无效Next_Hop属性
: 9:可选属性错误
: 10:无效网络字段
: 11:畸形AS_Path
4:Hold Timer溢出 0:没有特别的错误子码定义。
5:有限状态机错误 0:没有特别的错误子码定义。
6:终止 1:前缀超过最大值。
: 2:管理关闭
: 3:删除邻居
: 4:管理重置
: 5:连接失败
: 6:其他配置改变
: 7:连接冲突
: 8:资源短缺
: 9:BFD断开连接

BGP KEEPALIVE

如果BGP报文头中的TYPE为4,则该报文为KEEPALIVE报文。KEEPALIVE报文用于保持BGP连接。KEEPALIVE报文只有BGP报文头,没有具体内容,故其报文长度应固定为19个字节。

KEEPALIVE报文格式
 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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
BGP Keepalive 报文字段
字段 长度 含义
Marker 16B 用于检查BGP对等体的同步信息是否完整,以及用于BGP验证的计算。不使用验证时所有比特均为1(十六进制则全“FF”)。
Length 2B BGP消息总长度(包括报文头在内),以字节为单位。长度范围是19~4096。
Type 1B BGP消息的类型。Type有5个可选值,表示BGP报文头后面所接的5类报文(其中,前四种消息是在RFC4271中定义的,而Type5的消息则是在RFC2918中定义的)。Keepalive消息类型为4。

BGP REFRESH

如果BGP报文头中的TYPE为5,则该报文为REFRESH报文。报文头后面所接的报文内容如下(RFC 2918),REFRESH报文用于动态的请求BGP路由发布者重新发布UPDATE报文,进行路由更新。

REFRESH报文格式
0       7      15      23      31
+-------+-------+-------+-------+
| AFI | Res. | SAFI |
+-------+-------+-------+-------+
BGP REFRESH报文字段
字段 长度 描述
AFI 2字节(无符号位) 表示地址族id,与UPDATE报文中的定义相同。
Res. 1字节(无符号位) 所有位应全为零,在接收报文时,此位被忽略。
SAFI 1字节(无符号位) 与OPEN报文中的定义相同。

BGP Path Attributes

PA Origin 格式
 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0|1|0|0| 0 | 1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Length = 1 | Value |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
PA Origin 字段
Value 说明
0 IGP
1 EBGP
2 Incomplete
PA AS Path 格式
 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0|1|0|0| 0 | 2 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -----
| Type | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Autonomous System[1] |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ AS PATH[1]
: ... :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Autonomous System[n1] |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----
: ... :
: ... :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----
| Type | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Autonomous System[1] |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ AS PATH[N]
: ... :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Autonomous System[n2] |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----
PA AS Path 字段
字段 长度 描述
Path segment Type 1B 描述AS PATH的类型。
Path segment Length 1B 携带的AS数量。
Autonomous System 4B AS号
PA AS Path - Type 字段
Type 说明
1 AS_Set
2 AS_Sequence
3 AS_Confed_Sequence
4 AS_Confed_Set
PA Next_Hop
 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0|1|0|0| 0 | 3 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
PA Multi_Exit_Disc
Local_Pref
Atomic_Aggregate
Aggregator
Community
Originator_ID
Cluster_List
MP_REACH_NLRI 格式
 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
+---------------+---------------+
|1|0|0|1| 0 | 14 |
+---------------+---------------+
| Length |
+---------------+---------------+---------------+---------------+
| Address Family Identifier | SAFI | Length of NHNA|
+-------------------------------+---------------+---------------+
: Network Address of Next Hop : Length of NHNA
+---------------+------------------------------------------------...
| Reserved | NLRI (Variable)...
+---------------+------------------------------------------------...
MP_REACH_NLRI 字段
字段 长度 含义
AFI 2B 地址族标识
SAFI 1B 子地址族标识
Length of Next Hop Network Address 1B 下一跳地址的长度
Network Address of Next Hop Variable 下一跳地址
Reserved 1B 保留字段
NLRI 4B 网络层可达信息,根据AFI,SAFI会有不同的格式。
MP_UNREACH_NLRI 格式
+---------------------------------------------------------+ Length
| Address Family Identifier | 2B
+---------------------------------------------------------+
| Subsequent Address Family Identifier | 1B
+---------------------------------------------------------+
| Withdrawn Routes | VARIABLE
+---------------------------------------------------------+
MP_UNREACH_NLRI字段
字段 长度 含义
AFI 2B 地址族标识
SAFI 1B 子地址族标识
Withdrawn Routes Variable 撤销路由
Extended Communtities 格式
 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
+---------------+---------------+
|1|1|0|0| 0 | 16 |
+---------------+---------------+
| Length |
+---------------+---------------+---------------+---------------+
|
+---------------+---------------+---------------+---------------+

参考标准

BGP参考标准
标准 描述
RFC 827 Exterior Gateway Protocol (EGP)
RFC 2918 Route Refresh Capability for BGP-4
RFC 4271 A Border Gateway Protocol 4 (BGP-4)
IANA注册表 Border Gateway Protocol (BGP) Parameters