BGP报文格式
BGP协议栈结构
BGP 协议栈结构
+-------------------------------------+
| BGP |
+-------------------------------------+
| TCP Port = 179 |
+-------------------------------------+
| IPv4 Header Protocol = 4 |
+-------------------------------------+
| L2 Type = 0x0800 |
+-------------------------------------+
| L1 |
+-------------------------------------+
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的定义,可参考。
-
Res:保留位,占1个字节,发送者应将其设置为零,在接受的时候忽略;
-
SAFI:子地址族标识(Address Family Identifier),占1个字节,能力所支持的子地址族标识信息,用以和AFI一同确定网络层协议和IP地址间的关系,编码方式与多协议扩展中的规定相同。其值按照 RFC1700 中ADDRESS FAMILY NUMBERS的定义,具体可参考。
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 | 变长 | 包含要更新的路由属性列表,按其类型号从小到大的顺序排序,填写更新的路由的所有属性。每一个属性单元包括属性类型,属性长度,属性值三部分。详见。 |
| 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个字节(无符号位),表示属性的类型号。设置如。
-
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字节 | 定义错误的类型,非特定的错误类型用零表示。详细错误码参见。 |
| 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参考标准
| 标准 | 描述 |
|---|---|
| Exterior Gateway Protocol (EGP) | |
| Route Refresh Capability for BGP-4 | |
| A Border Gateway Protocol 4 (BGP-4) | |
No comments to display
No comments to display