BGP基础
5.1 BG[基础
2个字节AS号:1----65535
BGP报文交互中分为Speaker和Peer两种角色
5.2 BGP报文类型及格式
报文格式
BGP报文由BGP报文头和具体报文内容两部分组成。(RFC4271)
BGP的运行是通过消息驱动的,共有5种消息类型,这些消息有相同的报文头。这些消息通过TCP协议进行传播(端口号是179)。消息最长为4096字节,最短为19字节(只包含报文头)。
BGP报文头包括三的部分,总长19字节。各个部分的格式和功能如下:(RFC4271)
ͼ1
- Marker:占16字节,用于检查BGP对等体的同步信息是否完整,以及用于BGP验证的计算。不使用验证时所有比特均为1(十六进制则全“FF”)。
- Length:占2个字节(无符号位),BGP消息总长度(包括报文头在内),以字节为单位。长度范围是19~4096。
- Type:占1个字节(无符号位),BGP消息的类型。Type有5个可选值,表示BGP报文头后面所接的5类报文(其中,前四种消息是在RFC4271中定义的,而Type5的消息则是在RFC2918中定义的):
TYPEֵ | 报文类型 |
1 | OPEN |
2 | UPDATE |
3 | NOTIFICATION |
4 | KEEPALIVE |
5 | REFRESH(RFC2918) |
如果BGP报文头中的TYPE为1,则该报文为OPEN报文。报文头后面所接的报文内容如下,OPEN报文用于建立BGP连接:
ͼ1
字段 | 长度 | 含义 | ||||
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)。 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-...
Capability Code为1: Capability Value值是一个TLV三元组,共占4个字节: +-------+-------+-------+-------+ +-------+-------+-------+-------+ 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单播能力与路由刷新能力,其他能力需要另外设定。 | |||||
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报文头中的TYPE为2,则该报文为UPDATE报文。报文头后面所接的报文内容如下(RFC 4271),UPDATE报文用于通告路由。
报文格式
ͼ1
字段 | 长度 | 含义 | |
Withdrawn Routes Length | 2个字节(无符号位) | 标明Withdrawn Routes部分的长度。其值为零时,表示没有撤销的路由。 | |
Withdrawn Routes | 变长 | 包含要撤销的路由列表,列表中的每个单元包含1字节的Length域和可变长度的Prefix域。
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 | 2个字节(无符号位) | 标明Path Attributes部分和Network Layer Reachability Information两部分的长度。其值为零时,表示没有路由及其路由属性要通告。 | |
Path Attributes | 变长 | 包含要更新的路由属性列表,按其类型号从小到大的顺序排序,填写更新的路由的所有属性。每一个属性单元包括属性类型,属性长度,属性值三部分。其编码采用TLV格式。如下所示。 其中,Attr.TYPE占2个字节(无符号位),包括1字节的Flags(无符号位)和1字节的Type Code(无符号位)。 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个字节(无符号位),表示属性的类型号。设置如下表2。 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 | 发起聚合的路由器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 | 扩展团体属性 | ||
报文示例
ͼ4
ͼ5
如果BGP报文头中的TYPE为3,则该报文为NOTIFICATION报文。报文头后面所接的报文内容如下(RFC 4271),NOTIFICATION报文用于处理BGP进程中的各种错误。
ͼ1
各字段解释如下:
- Error code:占1个字节(无符号位),定义错误的类型,非特定的错误类型用零表示。
- 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断开连接 | ||
Error Code | Error Subcode | |
1: Message header error | 1: connection not synchronized | |
2: error message length | ||
3: error message type | ||
2: Open message error | 1: unsupported version number | |
2: error peer AS | ||
3: error BGP identifier | ||
4: unsupported optional parameter | ||
5: authentication failed | ||
6: unacceptable Holdtime | ||
7: unsupported capability | ||
3: Update message error | 1: malformed attribute list | |
2: unrecognized well-known attribute | ||
3: well-known attribute is missing | ||
4: attribute flags error | ||
5: attribute length error | ||
6: invalid origin attribute | ||
7: AS routing loop | ||
8: invalid Next-Hop attribute | ||
9: error optional attribute | ||
10: invalid network field | ||
11: abnormal AS-Path | ||
4: Hold timer expired | 0: no special definition of the error subcode | |
5: Finite state machine error | 0: no special definition of the error subcode | |
6: Cease | 1: maximum number of prefixes reached | |
2: administrative shutdown | ||
3: peer de-configured | ||
4: administrative reset | ||
5: connection rejected | ||
6: other configuration change | ||
7: connection collision resolution | ||
8: out of resources | ||
9: BFD session Down | ||
报文实例
如果BGP报文头中的TYPE为4,则该报文为KEEPALIVE报文。KEEPALIVE报文用于保持BGP连接。
KEEPALIVE报文只有BGP报文头,没有具体内容,故其报文长度应固定为19个字节。
如果BGP报文头中的TYPE为5,则该报文为REFRESH报文。报文头后面所接的报文内容如下(RFC 2918),REFRESH报文用于动态的请求BGP路由发布者重新发布UPDATE报文,进行路由更新。
ͼ1
Field字段 | Length长度 | Description描述 |
AFI | 2字节(无符号位) | 表示地址族id,与UPDATE报文中的定义相同。 |
Res. | 1字节(无符号位) | 所有为应全为零,在接收报文时,此位被忽略。 |
SAFI | 1字节(无符号位) | 与UPDATE报文中的定义相同。 |
报文实例
5.3 BGP的主要路由属性