计算机网络课程总结--BGP协议
路由器工作在IP层,其作用是根据IP地址将数据包传输到正确的目的地,因此路由器必须要知道网络的“地图”才能正确投递,而这个网络的“地图”就是存储在路由表中的路由规则,简称为路由。
根据获得路由的方式可以将其分为静态路由和动态路由,静态路由就是管理员静态配置的路由,动态路由则是路由器通过算法动态地学习和调整而得到的路由。而常说的路由协议就是指这些动态路由的学习算法,根据其作用域的不同,又可分为内部网管协议(IGP)和边界网络协议(BGP);内部网络协议包括RIP,OSPF等,边界网关协议则包括BGP等。
本文主要讲述BGP相关的一些知识。
当网络过大的时候,也会导致路由表过大而难以维护,这时候采用分治的方法,将一个大网络划分为若干个小网络,这些小网络称为自治系统(AS),BGP的诞生就是用于自治系统间的通信。其在网络中的位置如下
那么是不是AS之间的通信都要使用BGP?答案并不是,只有当两AS间存在多条路径,需要做路由策略和选择才需要BGP;如果AS只有一个出口或者所有出口指向一个ISP的时候,是不需要BGP的。
基本概念
BGP允许基于策略(policy-based)的路由选择,策略与政治、安全和经济等因素相关,由AS的网络管理者确定,也就是说人为影响的因素较大。
从上面可知,每个划分后的小网络称为AS,每个AS都有自己独特的AS号码(ASN),ASN的原来使用16位表示。但是由于和和IP地址一样,ASN同样面临分配告罄的危机,自2006年12月1日起,原为16位(1-65535) 的ASN扩展为32位空间。
AS根据其位置的不同,也被分为为不同类型的AS。
一般来说,AS号码只是在一家ISP与至少两家ISP做对等互联,交换路由的时候才需要用到,也就是说一个国家的AS号码的数量实际上是跟大中型ISP的数量有关。
BGP 是运行在TCP协议上的,与其他路由协议对比如下
BGP 是一种距离矢量路由协议,但避免了环路;其避免环路的策略是不仅仅记录路径代价,还记录下全路径信息。如下图所示
BGP有两种邻居,其中运行在同一个AS内的BGP邻居称为IBGP(Interior BGP),不同AS间的邻居称为EBGP(Exterior BGP),注意无论是IBGP或者EBGP,上面都必须运行着BGP协议,也就是说与BGP路由器直连的内部路由器不一定是它的IBGP,如下图所示
注意:BGP邻居不是自动发现的,而是手动配置的,原因有以下两点: 1)可以与对端设备用任何IP地址建立邻居,而不限于某个固定的接口IP。这样,当两台 设备采用环回地址而非直连地址建立BGP邻居时,即使主链路中断了,也可以切换到备份链路 上,保持邻居不断。这种稳定性正是BGP作为大型网络路由承载的必要特质。 2)可以跨越多台设备建立邻居。当一个AS有多个设备运行BGP 建立域内全连接时,不必每台设备物理直连,只要用IGP保证建立邻居的地址可达,即可建立全网连接,减少不必要的链路建设。
BGP报文
BGP报文类型有以下四种:
- Open报文:打招呼,“你好,交个朋友吧”(协商参数)
- Keepalive报文:我还活着,别不理我(30秒钟交换一次)
- Update报文:有新闻(链路的变化)
- Notification报文:我不跟你玩了(异常情况的通报,终止连接)
BGP的工作机制也可以通过这四种报文描述: 1)通过TCP建立BGP连接时,发送OPEN报文 2)连接建立后,如果有路由器需要发送路由或路由发生变化时,发送UPDATE报文 3)稳定后,周期发送KEEPALIVE报文,维持连接有效性 4)当本地BGP运行中发生错误时,发送NOTIFICATION报文通告BGP对端
路由注入及通告
首先要明确一点,BGP路由器的路由注入和通告都是为了修改BGP路由表。
当路由器之间建立BGP邻居之后,就可以相互交换BGP路由。一台运行了BGP协议的路由器,会将BGP得到的路由与普通路由分开存放,所以BGP路由器会同时拥有两张路由表。
一张是存放普通路由的路由表,被称为IGP路由表,就时平时我们使用命令show ip route
看到的路由表,IGP路由表的路由信息只能从IGP协议和手工配置获得,并且只能传递给IGP协议;另外一张就是运行BGP之后创建的路由表,称为BGP路由表,需要通过命令show ip bgp
才能查看,BGP路由表的路由信息只能传递给BGP协议,如果两台BGP邻居的BGP路由表为空,就不会有任何路由传递。
在初始状态下,BGP的路由表为空,没有任何路由,要让BGP传递相应的路由,只能先将该路由注入BGP路由表,之后才能在BGP邻居之间传递。注入的方式有多种,如 1)动态注入:将IGP(如OSPF)发现的路由纯动态地注入到BGP路由表中,这种方式配置简单,但操控性差,可能不稳定。具体过程及配置如下图所示: 2)半动态路由注入:通过IGP协议(如OSPF)学习到的路由,再通过 network 发布到BGP中。具体过程及配置如下图所示:
3)静态路由注入:工配置的静态路由,再由network发布到BGP中。具体过程及配置如下图所示:
在BGP路由表注入路由后,BGP路由器之间会将这些路由在BGP路由器间进行通告。通告要遵守以下规则
- BGP 路由器只把自己使用的路由通告给相邻体
- BGP 路由器从EBGP获得的路由会向它的所有BGP相邻体通告(包括EBGP和IBGP)
- BGP路由器从IBGP获得的路由不会向它的IBGP相邻体通告(避免内部产生环路)
- BGP 路由器从IBGP获得的路由是否通告给它的EBGP相邻体要依IGP和BGP同步的情况而定
对于最后一条,只有当 IGP 与 BGP 同步时(也就是该路由可以通过 IGP 获得),才能通告,反之不通告,这样做的目的是为了避免路由黑洞。
路径属性
在默认情况下,到达同一目的地,BGP只走单条路径,并不会在多条路径之间执行负载均衡。对于IGP路由协议,当有多条路径可以到达同一目的地时,则根据最小metric值来选择最优路径,而 BGP 存在多条路径到达同一目的地时,对于最优路径的选择,BGP并不会以metric值大小为依据,BGP对于最优路径的选择,需要靠比较路由条目中的Path Attributes,即路径属性,只有在比较多条路由的属性之后,才能决定选择哪条为最优路径。
BGP的路径属性可以划分为以下四类:
- 公认强制 (Well-Known Mandatory):所有的路由中都需要写入公认强制属性
- 公认自选 (Well-Known Discretionary):能够理解和支持即可,不一定要写入路由
- 可选可传递 (Optional Transitive):不一定要理解或支持
- 可选不可传递(Optional Nontransitive):只有特定的BGP路由器才能理解和传递
对于任何一台运行BGP的路由器,都必须支持公认强制属性,并且在将路由信息发给其它BGP邻居时,必须在路由中写入公认强制属性,这些属性是被强制写入路由中的,一条不带公认强制属性的路由被BGP路由器被视为无效而被丢弃,一个不支持公认强制属性的BGP,是不正常的,不合法的BGP。BGP路由必须携带的公认强制属性有三个:Origin,Next_Hop,AS-path
。
origin属性
origin属性为起源属性,描述路由是以何种方式注入到BGP路由表中的,主要有以下两种情况
1)以 network
命令注入到BGP路由表中,origin 属性为 IGP
2)以 redistribute
命令注入到BGP路由表中,origin 属性为
Incomplete 其中,IGP优先级比Incomplete的要高。
AS Path属性
描述了该路由经过的AS组成的路径,AS路径中不能算上自己的AS,从离自己最近的AS开始,以目的网络的AS结束。下图为 AS5 到 AS1 的路由的AS Path属性
借助路由的AS Path属性,可以避免环路,具体操作就是收到一条AS Path属性中含有自己AS的路由的时候丢弃该路由。
在选路的时候,优先选AS PATH
最短的那条,如果AS PATH
距离相等,则优选本AS内到出口路由器最短的那根,如果还相等,则选择Router_ID(发送路由的路由器)最小的那根
但是要注意,这种选择并不总是明智的,如下图所示
Next Hop属性
指示下一个AS的路由器入口的网段,同一个AS内Next hop的值不变,如下图所示
local pref属性
可选的属性,用于引导流量,local pref的缺省值是100,如下图所示
MED(Multi Exit Distiguisher)属性
当AS有多个出口的时候,告诉上游的AS如何选最优的路,MED值越小,优先级越高
BGP 选路的策略为
其他概念
BGP过滤 BGP 拥有强大的过滤功能,可以按照以下规则进行过滤:
- 可按照路由的IP地址过滤
- 可依照路由经过的AS-Path过滤
- 可以依照路由的属性过滤
- 可以依照路由到来的接口过滤
BGP聚合 由于BGP路由器的路由表庞大,往往超过10万条,通过BGP聚合(BGP支持CIDR)解决这个问题,如下图AS100先将内部的路由聚合再通告给AS200
BGP联盟和反射 从前面的描述可知,从IBGP收到的路由不会通告给其他的IBGP(避免环路),所以AS内部的IBGP必须全连接。但是IBGP相邻体过多,逻辑全链接不现实,实际中通过BGP联盟和反射解决这个问题。
BGP联盟就是将大的AS分割成小的AS,从而减少全连接的数目。
BGP反射是通过将网络内的路由器划分为客户机,非客户机以及路由反射器的角色,从而减少IBGP间的连接,如下图所示:
BGP反射中需要遵循以下规则
- 来自客户机的路由通告给其它的客户机和非客户机
- 来自非客户机的路由只通告给它的客户机
- 来自EBGP的路由向所有相邻体通告
BGP衰减 BGP衰减是为了处理不稳定的路由(如路由频繁更新),避免影响整个互联网络的稳定运行
路由抑制可以阻止公布不稳定的路由,它为每条路由分配一个动态的度量数字用来反映稳定程度,当一条路由出现摆动,就给他分配一个惩罚值,摆动得越多,惩罚值越大。当一段时间不摆动,惩罚值降低,在一个半衰期后,降到原来的一半。如果惩罚值超过抑制上限,该路由就被抑制,只有当一个半衰期后惩罚值降低到重新使用界限时,才重新使用。
BGP配置
通常在路由器配置BGP需要开启BGP进程,指定AS号码,指定邻居(EBGP或IBGP)并注入BGP路由,如下是一个简单的例子
1
2
3
4
5
6//开启BGP进程,指定AS号
Router(config)#router bgp as-number
//注入BGP路由
Router(config-router)#network network-number [mask network-mask]
//指定EBGP或IBGP(as-number 决定)
Router(config-router)#neighbor ip-address remote-as as-number
除此以外,还有一些检查BGP工作情况的命令如下所示