03、BGP报文格式
BGP报文格式
BGP报文由BGP报文头和具体报文内容两部分组成。BGP的运行是通过消息驱动的,共有如下所示的5种消息类型,这些消息有相同的报文头。这些消息通过TCP协议进行传播(端口号是179)。消息最长为4096字节,最短为19字节(只包含报文头)。BGP报文头包括三部分,总长19字节。
报文头格式
BGP这五种报文具有相同的报文头格式。如图1所示。
字段名 |
长度 |
含义 |
---|---|---|
Marker |
16字节 |
用于检查BGP对等体的同步信息是否完整,以及用于BGP验证的计算。不使用验证时所有比特均为1(十六进制则全“FF”)。 |
Length |
2个字节(无符号位) |
BGP消息总长度(包括报文头在内),以字节为单位。长度范围是19~4096。 |
Type |
1个字节(无符号位) |
BGP消息的类型。Type有5个可选值,表示BGP报文头后面所接的5类报文。 |
TYPE值 |
报文类型 |
---|---|
1 |
OPEN |
2 |
UPDATE |
3 |
NOTIFICATION |
4 |
KEEPALIVE |
5 |
REFRESH |
OPEN报文
如果BGP报文头中的TYPE为1,则该报文为OPEN报文。报文头后面所接的报文内容如下,OPEN报文用于建立BGP连接。OPEN报文格式如图2所示。
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的BGP方式 |
UPDATE报文
如果BGP报文头中的TYPE为2,则该报文为UPDATE报文。报文头后面所接的报文内容如下,UPDATE报文用于通告路由。UPDATE报文格式如图3所示。
字段名 |
长度 |
含义 |
---|---|---|
Withdrawn Routes Length |
2个字节(无符号位) |
标明Withdrawn Routes部分的长度。其值为零时,表示没有撤销的路由。 |
Withdrawn Routes |
变长 |
包含要撤销的路由列表,列表中的每个单元包含1字节的Length域和可变长度的Prefix域。 |
Total Path Attribute Length |
2个字节(无符号位) |
标明Path Attributes的长度。其值为零时,表示没有路由及其路由属性要通告。 |
Path Attributes |
变长 |
包含要更新的路由属性列表,按其类型号从小到大的顺序排序,填写更新的路由的所有属性。每一个属性单元包括属性类型,属性长度,属性值三部分。其编码采用TLV格式。如下所示。 图4 BGP路径属性TLV格式
其中,Attr.TYPE占2个字节(无符号位),包括1字节的Flags(无符号位)和1字节的Type Code(无符号位)。 图5 TLV结构-Type
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个字节(无符号位),表示属性的类型号。设置如表6。 Attr.Value:根据不同属性的类型填写属性值。 |
Network Layer Reachability Information(NLRI) |
变长 |
包含要更新的地址前缀列表,每一个地址前缀单元由一个LV二元组(prefix length, the prefix of the reachable route)组成,其编码填写方法与Withdrawn Routes的填写方法相同。 |
属性类型 |
属性值 |
---|---|
1:Origin |
IGP |
EGP |
|
Incomplete |
|
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 |
发起聚合的Router 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 |
扩展团体属性 |
NOTIFICATION报文
如果BGP报文头中的TYPE为3,则该报文为NOTIFICATION报文。报文头后面所接的报文内容如下,NOTIFICATION报文用于处理BGP进程中的各种错误。NOTIFICATION报文格式如图6所示。
字段名 |
长度 |
含义 |
---|---|---|
Error code |
1字节 |
定义错误的类型,非特定的错误类型用零表示。详细错误码参见表8。 |
Error subcode |
1字节 |
指定错误细节编号,非特定的错误细节编号用零表示。 |
Data |
可变长 |
指定错误数据内容。 |
错误码 |
错误子码 |
---|---|
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断开连接 |
KEEPALIVE报文
如果BGP报文头中的TYPE为4,则该报文为KEEPALIVE报文。KEEPALIVE报文用于保持BGP连接。KEEPALIVE报文只有BGP报文头,没有具体内容,故其报文长度应固定为19个字节。KEEPALIVE报文格式如图7所示。
字段名 |
长度 |
含义 |
---|---|---|
Marker |
16字节 |
用于检查BGP对等体的同步信息是否完整,以及用于BGP验证的计算。不使用验证时所有比特均为1(十六进制则全“FF”)。 |
Length |
2字节 |
BGP消息总长度(包括报文头在内),以字节为单位。长度范围是19~4096。 |
Type |
1字节 |
BGP消息的类型。Type有5个可选值,表示BGP报文头后面所接的5类报文。Keepalive消息类型为4。 |
REFRESH报文
如果BGP报文头中的TYPE为5,则该报文为REFRESH报文。报文头后面所接的报文内容如下,REFRESH报文用于动态的请求BGP路由发布者重新发布UPDATE报文,进行路由更新。REFRESH报文格式如图8所示。
字段名 |
长度 |
含义 |
---|---|---|
AFI |
2字节(无符号位) |
表示地址族id,与OPEN报文中的定义相同。 |
Res. |
1字节(无符号位) |
所有位应全为零,在接收报文时,此位被忽略。 |
SAFI |
1字节(无符号位) |
与OPEN报文中的定义相同。 |