BGP基础
BGP本身不产生路由,而是通过引入其他类型的路由在对等体中建传播。
5.1 BG[基础
实现AS之间路由距离矢量性动态路由协议。消息通过TCP协议进行传播(端口号是179)。消息最长为4096字节,最短为19字节(只包含报文头)。
5.1.1 BGP简介
BGP是用于取代最初的EGP而设计的另一种网关协议,能够进行路由优选、避免路由环路、更搞笑地传递路由和维护大量的路由。早期发布BGP-1(rfc1105)、bgp-2(rfc1163)和BGP-3(RFC1267)。1994年开始使用BGP-4(RFC1771);2006年之后单播IPv4网络使用的版本是BGP-4(RFC4271),其他网络使用的版本是MP-BGP(RFC4760);再后来开发的BGP-4+提供了对IPv6单播网络的支持,用于控制IPv6单播网络中路由的传播和选择。
AR150/150-S/160/200/200-S/1200/1200-S/2200/2200-S/3200系列路由器同时支持BGP-4、BGP-4+和MP-BGP。在BGP视图下的配置将对BGP-4、BGP-4+和MP-BGP同时生效,默认下,在BGP IPv4单播地址族下配置的命令也可以在BGP驶入下直接配置,但只对BGP4生效。
1、 BGP中的AS
2个字节AS号:1----65535
4个字节AS:1----4294976295(可有不通标识格式)
支持4个字节的设备能够与支持2个字节的设备兼容。
2、BGP分类
EBGP:当BGP设备接收EBGP对等体发来的路由信息时,会将路由信息AS_Path列表中带有本地AS号的路由丢弃。
IBGP:运行于同一AS内部的BGP。为了防止AS内产生环路,BGP设备不将从IBGP对等体学习到的路由发布给其他IBGP对等体,并默认需要与所有IBGP对等体建立全连接才能实现AS内部各IBGP设备间的路由互通。
为了解决现实网络中多数情况下AS内部各IBGP设备间很难实现安全连接的问题,BGP 提供了“路由反射器”和“联盟”两种解决方案。
如果在AS内一台BGP设备收到EBGP 对等体发送的路由后,需要通过另一台BGP设备将该路由信息传播给其他AS时,则建议将这两台BGP设备配置运行IBGP。IBGP对等体不一定就是直接连接的。
1、 两种BGP报文交互角色
BGP报文交互中分为Speaker和Peer两种角色
A、Speaker:BGP Speaker(发言者) 发送BGP报文的设备。角色是针对具体报文发送过程而言的,网络中每台BGP路由器均可称为自己发送BGP报文的Speaker。
B、Peer:相互交换报文的Speaker之间互称Peer(对等体)。多个相关的对等体可以构成对等体组(Peer Group),然后可以为这个对等体组进行集中配置。
4、BGP的路由器ID(Router ID)
BGP也是采用Router ID(路由器ID)来标识一个唯一的BGP设备。会在BGP会话建立时发送的Open报文中携带,也是一个32位值,通常是IP地址的形式。若不是唯一的,则对等体之间不能建立BGP连接。
可以手动指定,也可以让BGP自己在设备上选取。默认loopback地址优先,物理接口中最大的IP地址次之。一旦选出路由器ID,除非发生接口地址删除等事件,否则即使配置了更大的接口ip地址,也会保持原来的路由器ID。
5.1.2 BGP AS
公网AS,2个字节:1----64511
私网AS,2个字节:64512----65534
特殊用途AS:65535
1、BGP AS号格式
2009.1之前 1----65535 2个字节 RFC4271
2009.1开始 65536----4294967295 RFC5396 IANA(机构)
两种标识格式:
A、Asplain AS(无格式AS)
2个字节或4个字节的十进制数,
B、Asdot AS(点分AS)
2个字节的AS号(最大值为65535)直接用他的是兼职整数标识
4个字节的AS号用点分计数法标识。计数方法:先把十进制转换成二进制,然后从右向左每16位(2个字节)分成一端,在两段之间以小圆点分割,再将两段分别转换成十进制。
2、保留的AS号
在RFC 4893 BGP-4标准中,支持2个字节AS向4个字节的过渡。但在这个标准中新增了保留的AS号23456。后来又在新的RFC 5398中规定了新的保留AS号,它们是在64496----64511直接的2个字节AS号和在65536----65551之间的4个字节AS号。
5.1.3 BGP地址族
最初的BGP-4标准仅支持IPv4,扩展后形成MP-BGP(Multi-Protocol BGP,多协议BGP)。在RFC(Multiprotocol Extensions for BGP-4)中定义了两个新的可选非过渡属性(“非过渡属性”是该属性不能传递到其他设备上,仅在本地设备上使用),BGP的多种协议扩展都用到了这两个属性。
A、扩展协议可达NLRI(MP_REACH_NLRI,属性类型14)
B、扩展协议不可达NLRI(MP_UNREACH_NLRI,属性类型15)
这两种扩展属性适用于所有报文,为了对不同的扩展类型进行区分,在两种属性中携带了BGP地址族和子地址族信息。“地址族”是一种网络层协议配置模块,把不同类型的网络分块进行配置。其目的就是把针对运行不同网络层协议的网络分别进行功能配置,这样配置起来就更加有条理,因为这些不同网络层协议的地址格式的应用需求或许根本不一样。
为了进一步区分同一类型网络中不同类型的网络应用(如IPv4和IPv6网络中有单播、组播、VPN等),又可在地址族下划分子地址族。“地址族”使用AFI(Address Family Identifier,子序列地址族标识符)。
5.2 BGP报文类型及格式
BGP-4协议有5种报文:Open(建立)、Update(更新)、Notification(通知)、Keepalive(保持活跃)和Route-refresh(路由刷新)。这些报文的报头相同。
报文格式
BGP报文由BGP报文头和具体报文内容两部分组成。(RFC4271)
BGP的运行是通过消息驱动的,共有5种消息类型,这些消息有相同的报文头。这些消息通过TCP协议进行传播(端口号是179)。消息最长为4096字节,最短为19字节(只包含报文头)。
BGP报文头包括三的部分,总长19字节。各个部分的格式和功能如下:(RFC4271)
图1 BGP报文头格式
- 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) |
5.2.1 Open报文格式
TCP连接建立后发送的第一个报文,包含本地Speaker信息及用于后面与对等体间建立TCP会话的信息,用于建立BGP对等体之间的连接关系。Open报文中的各字段信息必须在对等体至今进行路由信息交换之前协商确定好。
如果BGP报文头中的TYPE为1,则该报文为OPEN报文。报文头后面所接的报文内容如下,OPEN报文用于建立BGP连接:
图1 OPEN报文格式
字段 |
长度 |
含义 |
||||
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 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-... | Parm. Type | Parm. Length | Parameter Value (variable) +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-...
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单播能力与路由刷新能力,其他能力需要另外设定。 |
||||
表1 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方式 |
||
报文实例
5.2.2 Update报文格式
如果BGP报文头中的TYPE为2,则该报文为UPDATE报文。报文头后面所接的报文内容如下(RFC 4271),UPDATE报文用于通告路由。
报文格式
图1 UPDATE报文格式
字段 |
长度 |
含义 |
|
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格式。如下所示。 图2 BGP路径属性TLV格式 其中,Attr.TYPE占2个字节(无符号位),包括1字节的Flags(无符号位)和1字节的Type Code(无符号位)。 图3 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个字节(无符号位),表示属性的类型号。设置如下表2。 Attr.Value:根据不同属性的类型填写不同内容。 |
|
Network Layer Reachability Information(NLRI) |
变长 |
包含要更新的地址前缀列表,每一个地址前缀单元由一个LV二元组(prefix length, the prefix of the reachable route)组成,其编码填写方法与Withdrawn Routes的填写方法相同。 |
|
表1 路由属性的类型号列表 |
|||
属性类型 |
属性值 |
||
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 withdrawn路由的更新报文
图5 添加路由的更新报文
5.2.3 Notification报文格式
如果BGP报文头中的TYPE为3,则该报文为NOTIFICATION报文。报文头后面所接的报文内容如下(RFC 4271),NOTIFICATION报文用于处理BGP进程中的各种错误。
图1 NOTIFICATION报文格式
各字段解释如下:
- 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 |
||
报文实例
5.2.4 Keepalive报文格式
如果BGP报文头中的TYPE为4,则该报文为KEEPALIVE报文。KEEPALIVE报文用于保持BGP连接。
KEEPALIVE报文只有BGP报文头,没有具体内容,故其报文长度应固定为19个字节。
5.2.5 Route-refresh报文格式
如果BGP报文头中的TYPE为5,则该报文为REFRESH报文。报文头后面所接的报文内容如下(RFC 2918),REFRESH报文用于动态的请求BGP路由发布者重新发布UPDATE报文,进行路由更新。
图1 REFRESH报文格式
Field字段 |
Length长度 |
Description描述 |
AFI |
2字节(无符号位) |
表示地址族id,与UPDATE报文中的定义相同。 |
Res. |
1字节(无符号位) |
所有为应全为零,在接收报文时,此位被忽略。 |
SAFI |
1字节(无符号位) |
与UPDATE报文中的定义相同。 |
报文实例
5.3 BGP的主要路由属性
随着通过Update报文发送的BGP路由信息仪器发布的一组参数。对特定的路由进行了进一步的描述,使路由接收者能够根据路由属性值对路由进行过滤和选择。相当于metric
5.3.1 BGP路由属性分类
BGP路由信息包括许多属性,分为以下4类。
A、公认必须遵循(Well-known mandatory):所有BGP设备都可以识别此类属性(这就是“公认”的含义),且必须在Update报文中存在(这就是“必须遵守”的含义),否则对应的路由信息就会出错。
B、公认任意(Well-known discretionary):所有BGP设备都可以识别此类属性,但不要求必须存在于Update报文中(这就是“任意”的含义),即就算缺少这类属性,路由信息也不会出错。
C、可选过渡(Optional transitIve):BGP设备可以不用识别此类属性,如果BGP设备不识别此类属性,仍然会接收这类属性(这就是“可选”的含义),且可将该属性通告给其他对等体(这就是“过渡”的含义)。
D、可选非过渡(Option non-transitive):BGP设备可以不是被此类属性,如果BGP设备部是捏此类属性,也会接收这类属性,但在接收时忽略该属性,不会将该属性通告给其他对等体(这既是“非过渡”的含义),即在本地路由器上使用