计算机网络课程总结--BGP协议

路由器工作在IP层,其作用是根据IP地址将数据包传输到正确的目的地,因此路由器必须要知道网络的“地图”才能正确投递,而这个网络的“地图”就是存储在路由表中的路由规则,简称为路由。

根据获得路由的方式可以将其分为静态路由和动态路由,静态路由就是管理员静态配置的路由,动态路由则是路由器通过算法动态地学习和调整而得到的路由。而常说的路由协议就是指这些动态路由的学习算法,根据其作用域的不同,又可分为内部网管协议(IGP)和边界网络协议(BGP);内部网络协议包括RIP,OSPF等,边界网关协议则包括BGP等。

本文主要讲述BGP相关的一些知识。

当网络过大的时候,也会导致路由表过大而难以维护,这时候采用分治的方法,将一个大网络划分为若干个小网络,这些小网络称为自治系统(AS),BGP的诞生就是用于自治系统间的通信。其在网络中的位置如下

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类型

一般来说,AS号码只是在一家ISP与至少两家ISP做对等互联,交换路由的时候才需要用到,也就是说一个国家的AS号码的数量实际上是跟大中型ISP的数量有关。

BGP 是运行在TCP协议上的,与其他路由协议对比如下

BGP与其他路由协议所在位置对比

BGP 是一种距离矢量路由协议,但避免了环路;其避免环路的策略是不仅仅记录路径代价,还记录下全路径信息。如下图所示 BGP避免环路

BGP有两种邻居,其中运行在同一个AS内的BGP邻居称为IBGP(Interior BGP),不同AS间的邻居称为EBGP(Exterior BGP),注意无论是IBGP或者EBGP,上面都必须运行着BGP协议,也就是说与BGP路由器直连的内部路由器不一定是它的IBGP,如下图所示 BGP的邻居类型

注意: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 Path属性中含有自己AS的路由的时候丢弃该路由。

在选路的时候,优先选AS PATH最短的那条,如果AS PATH距离相等,则优选本AS内到出口路由器最短的那根,如果还相等,则选择Router_ID(发送路由的路由器)最小的那根

但是要注意,这种选择并不总是明智的,如下图所示

as path选路并非最优

Next Hop属性

指示下一个AS的路由器入口的网段,同一个AS内Next hop的值不变,如下图所示

next hop 属性

local pref属性

可选的属性,用于引导流量,local pref的缺省值是100,如下图所示

local pref 属性

MED(Multi Exit Distiguisher)属性

当AS有多个出口的时候,告诉上游的AS如何选最优的路,MED值越小,优先级越高 MED属性

BGP 选路的策略为

BGP选路策略

其他概念

BGP过滤 BGP 拥有强大的过滤功能,可以按照以下规则进行过滤:

  • 可按照路由的IP地址过滤
  • 可依照路由经过的AS-Path过滤
  • 可以依照路由的属性过滤
  • 可以依照路由到来的接口过滤

BGP聚合 由于BGP路由器的路由表庞大,往往超过10万条,通过BGP聚合(BGP支持CIDR)解决这个问题,如下图AS100先将内部的路由聚合再通告给AS200

BGP聚合

BGP联盟和反射 从前面的描述可知,从IBGP收到的路由不会通告给其他的IBGP(避免环路),所以AS内部的IBGP必须全连接。但是IBGP相邻体过多,逻辑全链接不现实,实际中通过BGP联盟和反射解决这个问题。

BGP联盟就是将大的AS分割成小的AS,从而减少全连接的数目。

BGP联盟

BGP反射是通过将网络内的路由器划分为客户机,非客户机以及路由反射器的角色,从而减少IBGP间的连接,如下图所示:

BGP反射

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配置

除此以外,还有一些检查BGP工作情况的命令如下所示

检查BGP配置