基本概念
l BGP是一种外部网关协议,与内部网关协议(IGP)不同,不在于发现和计算路由,而在于AS之间选择最佳路由和控制路由的传递。
l 动态路由协议分为两类,一类是IGP(内部网关协议)例如rip、ospf、isis等。
一类是BGP(外部网关协议)例如BGP等。
l BGP支持VLSM(变长子网掩码)、CIDR(无类域间路由)、自动手动路由汇总。BGP定义了多种路径属性。路径属性影响BGP路由的优选。
l BGP使用TCP作为传输协议。在传输层采用TCP封装,使用目的TCP端口179,本地端口随意
l 增量更新:路由更新时,只发送更新的路由。(只在初始化时通告自身所有路由信息)
l 无环路:从设计上就避免了环路。(追问)
- AS-path属性防止AS之间环路的
- IBGP水平分割,防止AS内部环路的
- 在路由反射器中有两个,第一个是Originator-ID,是用来防止集群内产生环路的。
- 第二个是Cluster_List 是用来防止集群间产生环路的。
l 路由策略丰富:有13条选路原则
l 可防止路由振荡 (需要补充)
l 易于拓展:通过TLV进行拓展
l 简述工作流程:AS之间两台互为对等体的BGP路由器首先会建立TCP连接,随后协商各项参数并建立对等体关系。初始情况下双方会同步双方的BGP路由表。同步完成之后,路由器不会周期性地发送BGP路由更新,而只发送增量更新或在需要时进行触发性更新。减小带宽损耗。这是因为BGP往往被用于大批量路由信息,不能像IGP那样时时更新。
l 学习目标:
- 了解BGP的应用场景及协议特点。
- 熟悉BGP对等体关系的类型及区别。
- 熟悉BGP各种报文的功能及格式
- 理解BGP对等体关系的建立过程。
- 理解IBGP水平分割的原理。
- 理解BGP路由黑洞问题,了解其解决办法。
1、BGP对等体关系类型
将建立BGP邻居关系的路由器称为BGP对等体。BGP对等体关系有两种,一种是EBGP,另一种是IBGP。
两台路由器具备有IP连通性,并且能够顺利地基于TCP179端口建立连接,就可以建立BGP对等体关系,因此是可以跨设备连接的
1.EBGP对等体关系
如果两台BGP路由器位于不同AS,它们之间的关系成为EBGP对等体关系。
每条BGP路由都携带多个属性,这些属性称为路径属性。
通常情况下,EBGP对等体关系基于直连接口建立。因为缺省情况下BGP协议报文的TTL值为1,所以只能被传送1跳。
当然,如果要在两台非直连的路由器之间建立EBGP,那么就要手动修改TTL的值了。
2.IBGP对等体关系
l 位于同一个AS,则成为IBGP对等体关系。不要求必须直连。但是要依赖AS中的IGP协议(如ospf等)来发现对方路由从而建立TCP,成为IBGP对等体关系。
2、IBGP水平分割
用于解决BGP路由在一个同AS内传递时,防止环路。因为AS_Path在AS内是不会变化的。BGP规定,当路由器从一个IBGP对等体学习到某条BGP路由时,它将不能再把这条路由通告给任何IBGP对等体关系,这就是BGP水平分割规则。
缺点:当同AS内会有部分BGP路由器学习不到路由的问题(例如R5)。这个问题有很多种解决办法。
方法一:IBGP全互联模型
AS内部的所有路由器都两两之间建立IBGP对等体关系。缺点:这种方法只使用于规模较小的AS。
如果规模大路由器多,两两之间都建立IBGP对等体会对网络及设备带来很大的负担。
好在还有其他两种解决方法。分别是路由反射器及联盟。后面会讲。
3、路由黑洞问题及BGP同步规则
由于BGP路由器之间无需直连也可建立对等体关系,然而会带来一个麻烦,例如路由黑洞。(务必做实验进一步了解)
l 去往:R1把1.0.0.0/8发布到BGP中,R3通过IBGP对等体直接通告给了R7(R3在BGP路由中的Next_hop设置为它自己的地址),R7再通告给R2,最终R2学到1.0.0.0/8的路由。
回来:R2把数据包发往R7。R7收到后发现下一跳是R3,但是它必须先传给R4或者R6,但这两台路由器并没有配置BGP,所以丢失。产生了路由黑洞。
l 为了避免路由黑洞,BGP引入了同步规则(缺省情况下是关闭的)当一台路由器通过IBGP对等体学习到一条BGP路由时,不能用这条路由或把这条路由通告给自己的EBGP对等体。
要求BGP路由引入IGP路由中,实现IGP和BGP同步。同步规则主要用于规避BGP路由黑洞问题。
l 避免路由黑洞的方法。
第一种方法:IBGP全互联
AS内的所有路由器都运行BGP,并实现IBGP对等体关系全互联。缺点:不适合规模庞大的拓扑。
第二种方法:重分发
R3将BGP路由引入AS中的OSPF。满足了同步规则,缺点是BGP信息量巨大的情况下,引入IGP协议是非常危险的操作。可以用路由策略进行过滤再进行重分发。
第三种方法:MPLS多协议标签交换
在报文的数据帧头部和IP头部中间插入一个标签头部,因为IP头部“躲藏”了在标签头部之后。因此只需根据标签头部中的标签进行选路,即使转发设备没有到达目的的网络的路由也不会影响数据转发。此时是基于标签进行选路及转发。而不是基于目的IP地址。
第四种方法:RR反射器 (实际情况中,最好的方法)
第五种方法:联盟
在诸多成熟方案可供选择的情况下,依然激活同步规则也就显得没有意义了。
对等体交互原则
BGP对等体交互原则:
- 只将最优的路由通告给BGP对等体。
- 2. 从EBGP对等体学习到BGP路由,通告给所有EBGP和 IBGP对等体。
- 从自己的IBGP对等体学习到BGP路由时,只发给EBGP对等体,它不会将这些路由通告给其他IBGP对等体————IBGP的水平分割
- 4. 只发送更新的BGP路由。——增量更新
- 当一台路由器从自己的IBGP对等体学习到BGP路由时,如果BGP同步被激活(默认关闭),则路由器只有从IGP协议也学习到相应的路由时,才会将这些BGP路由通告给EBGP对等体。如果BGP同步关闭,即使没有从IGP协议学习到相应路由,它也会将这些BGP路由通告给EBGP对等体。
4、Router-ID
BGP Router-ID是网络设备的标识符,长度32bit,与IPv4格式一样。在规划BGP网络时,需确保设备的Router-id的唯一性。
Router-ID可让BGP自动选取也可以手工配置。建议手工配置。
报文类型及格式
|
标记:用于协议兼容性,16字节,固定为1 |
|
长度:BGP报文的长度(包括头部在内) |
|
类型:BGP报文类型 1.Open报文、2.Update报文、3.Notification报文、4.Keepalive报文、5.Route-Refresh |
Open报文
是TCP连接建立后发送的第一个消息。用于建立BGP对等体之间的连接关系,对等体在接收到Open报文并协商成功后,
将发送Keepalive报文确认并保持连接的有效性。确认后,对等体之间就可以进行其他报文的交换了。
|
版本 |
BGP的版本,BGPv4则值为4 |
|
AS号 |
BGP报文发送方所处AS号 |
|
保活时间 (Hold time) |
在建立对等体时要协商Hold time,双方保持一致,不一致则以较小的作为协商结果。如果保持时间为0,则标识不发生Keepalive报文。如果在这个时间内没有收到Keepalive报文或Update报文,则认为BGP中断。(以秒为单位) |
|
路由标识符 BGP Identifiter |
BGP路由器的Router ID ,以32bit IP形式表示,用于标识路由器。 |
|
可选参数长度 |
BGP报文中,可选参数的长度 |
|
可选参数 |
Open报文可含多个可选参数,每个可选参数使用类型(Type)、长度(Length)及值(Value)的三元组格式描述。可选参数用于告诉和协商对等体的某些拓展能力特征。 |
Update报文
Update报文用于在对等体之间通告路由信息。在一个Update报文中通告一条或多条相同路径属性的路由。
拥有不同的路径属性的BGP路由需使用不同的Update报文来通告。还能够用于撤销一条或多条BGP路由。
|
撤销路由的长度 |
用于标识撤销路由的条目数。 包含0条、1条或者多条准备撤销的BGP路由, |
|
撤销的路由条目 |
用于存放需要被撤销的BGP路由前缀。 每条BGP路由前缀包含两元,分别是前缀长度及路由前缀。 如果有多条BGP路由,那么这个字段将包含一个BGP路由前缀列表。 |
|
总路径属性长度 |
指示了Update报文中路径属性的总长度 |
|
路径属性 |
当BGP路由器用Update报文向邻居通告BGP路由时就会包含路径属性字段。 |
|
网络层可达信息 |
用于存放需要被通告的BGP路由。 每条BGP路由前缀包含两元,分别是前缀长度及路由前缀。 如果有多条BGP路由,那么这个字段将包含一个BGP路由前缀列表。 |
Keepalive报文
对等体之间会周期性发送Keepalive报文来了解存活情况。前面在Open报文内说过,BGP路由器会为对等体维护一个保活计时器(Hold timer),
如果保活计时器超时,则BGP对等体视为不可达。此时则需重新建立。对等体之间交互的keepalive报文会刷新保活计时器,防止超时。
保活计时器的时间缺省为180s,keepalive报文周期性发送间隔为60s,也就是1/3。Keepalive报文还用于确认对方发送过来的Open报文。里面只包含头部信息
Notification报文
当BGP检测到一个错误时,就用Notification报文来告知对等体。
|
错误代码 |
该字段的值是一个无符号整数,指示了错误的类型 |
|
错误子代码 |
在错误代码上进一步指示了错误的类型 |
|
数据 |
用于描述错误的原因 |
错误类型可查看“报文格式大全”进行进一步细看。
Route-Refresh报文
通告Open消息告诉BGP邻居本地支持路由刷新能力
在BGP路由器有Route-Refresh能力下,在刷新路由时,如果是基于入口(impot)刷新,
本地BGP路由器会向对等体发送一个Route-Refresh报文,收到该报文的对等体将重新发给本地BGP路由器。
这样可以在不中BGP连接的情况下,对BGP路由表进行动态刷新。(注意:大规模不要使用)
<R1>refresh bgp all import
(Export:是向对方发 Import:是让对方发)
5、查看对等体
在路由器上使用display bgp peer命令查看BGP对等体的邻居情况。
从上图可以看到,R1存在2个IBGP对等体关系(因AS都相同),且两对等体之间的状态为Establish,说明已经完成对等体关系的建立。
6、BGP路由表
存储着设备发现的所有BGP路由,当设备收到BGP路由后,如果有路由策略,则执行完后,被处理过的路由才会被加载到BGP路由表中。
当设备发现多条到达相同目的网段的BGP路由时,只有最优的才会被选择。(没有配置BGP路由负载分担的情况下)。
使用display bgp routing-table命令可以查看BGP路由表。例如:
从图中可以看到被发现的BGP路由。每条路由都会被执行可用性检查。也就是查询到去往Next hop的路由(IGP),
有则视为可用(Valid),否则视为不可用(Invalid)。在表中,可用的在行首有星号“*”标记,反之没有。
图中还可以看到去往172.16.1.0/24的有两条路由,路由器会选择最优的那条。最优的路由在行首有尖括号“>”标记。
图中的下一跳1.1.1.1的为最优。Next_Hop不可达的不可用路由是不会参加最优路由器竞争的。
从IBGP对等体学习到的路由会标记“i”,如果是从EBGP学习到的则没有。
查看某一条路由的详细信息可以用display bgp routing-table 172.16.1.0 查询。