BGP是怎么来的?为什么要使用BGP?

路由协议的分类

分类 包含协议 说明
IGP:用于域(AS)内路由选择。 RIP 距离矢量协议,多用于小型网络。
ISIS 链路状态协议,多用于运营商网络。
OSPF 链路状态协议,多用于企业中大型网络。
EIGRP CISCO私有路由协议,增强型距离矢量协议。
EGP:用于域(AS)间路由选择。 EGP BGP的前身,目前已经不再使用。
BGP 事实上目前唯一的域间路由选择协议。

ISPA和ISPB通过一条高速链路连接在一起,两个ISP想把各自的路由通告给对方。

区域间为什么不使用RIP协议?

ISPA和ISPB的边界路由设备必须有一个同步的过程,也就是说当R1和R2在建立邻居的时候,需要把自己的整个路由表传输给对方。而传统的RIP协议是使用UDP作为自己的传输协议的,这个协议的最大缺点就是不可靠,不适合传输大量的数据。

缺省情况下,RIP协议的路由更新报文的发送间隔为30秒,这样如果ISPA和ISPB的路由表非常大(达到100000条),30秒得时间间隔尚且不够完成路由的通告,这样整个高速链路就完全为RIP通告服务,而不能转发其他数据了。

解决区域间的问题思路

路由传递,一些路由数据的丢失,造成这个问题的主要原因是RIP使用的基础是UDP,UDP的特点不可靠。那如果采用TCP,TCP的特点就在于可靠。这样就解决了路由数据丢失的问题。

其次,由于RIP每隔30秒就会同步一次路由表,在之前路由条数相对比较少的情况下,尚可应付。现在面对规模如此巨大的路由表,难免不可支撑。这个问题也好解决,那就取消每隔30秒全量同步路由的机制,改为增量通告规则:如果路由没有变化,则不发任何通告;如果是路由增加,则通告给对方增加的路由;如果是路由删除,则通告给对方删除的路由;如果是路由修改,则首先通告一个路由删除,再通告一个路由增加。

这就是BGP协议的由来。在RIP协议上加以优化和改进。

那么采用TCP是怎么设计的?

  • TCP面向连接,基于TCP的协议必然有一个先建立连接的过程。要先建立连接,两端的设备就必须先互相知道对方的IP地址,并且路由可达。那么是采用静态配置的方式,还是动态建立连接的方式呢?BGP采用的是静态配置的方式,只要双方指定的地址路由可达,就可以建立连接。这样做有以下好处:可以与对端设备用任何IP地址建立邻居,而不限于某个固定接口的IP。这样,我们就可以采用环回地址而非直连接口地址建立BGP邻居,两台设备之间如果主链路中断了,只要有备份链路存在,就可以把流量切换到备份链路上,保持邻居不断,增加了BGP连接的稳定性。可以跨越多台设备建立邻居。由于是静态配置的方式,不一定只有直连设备才能建立BGP邻居,只要双方指定的地址路由可达(通过IGP或者静态路由),就可以建立邻居,这在AS内部建立IBGP连接时,就不用所有设备之间都建立IBGP连接。IBGP会在本期后面内容中提及。

  • 知道对方IP地址后,BGP会通过发送open报文来进行邻居的建立。如果连接不能建立,说明对端设备状态不正常,于是会等待一段时间再进行连接的建立,这个过程一直重复,直到建立连接。

  • 连接建立后,就可以进行路由表的同步了,BGP通过发送update报文进行路由表的同步。

  • 路由表同步完成后,并不是马上拆除这个连接,因为随时有可能会有路由的更新或者删除,建立TCP连接是一个非常耗费资源的过程,所以BGP通过定期发送keepalive报文进行TCP连接的维持,这样就可以不用重新建立连接,立刻就可以进行路由更新。

  • 如果经过一段时间(一般是3个keepalive报文发送周期)还没有收到对方的keepalive报文时,我们就认为对方出现了问题,于是可以拆除该TCP连接,并且把从对方收到的路由全部删除。

举例说明

这是一个典型的BGP应用组网。图中,有3个AS,AS之间运行BGP协议。 AS65008域内运行OSPF协议。R1和R5上只运行BGP协议,R2和R4上运行OSPF和BGP协议,R3上只运行OSPF协议。这里先解释下EBGP和IBGP。

EBGP:运行于AS之间两台设备的BGP关系。如图中R1和R2、R4和R5

IBGP:运行于AS内部两台设备的BGP关系。如图中R2和R4

AS内部不是有IGP么,为什么还要建立IBGP关系?

这是因为如果R2和R4之间不建立BGP关系,那么如果R1要把路由传递给R5,经过AS65008时,就只能把BGP路由引入到IGP中,通过IGP进行传递。而把数以10万计的BGP路由引入到IGP中的后果是灾难性的。所以上图中,R2和R4之间建立了IBGP的关系。值得一提的是,如上文所提及,由于BGP是通过静态配置的方式建立TCP连接,所以并非只能在两台直连的设备上建立BGP关系,如上图,R2和R4间通过OSPF路由可达,可以建立IBGP关系。

如果R2和R4之间不建立IBGP会怎么样?答案是:数据包却无法传递给R4、R5。

这里,我们对路由的传递过程和数据包的传递过程分别进行分析。

路由的传递过程

R1―R2:由于两台设备直连,并且建立EBGP关系,R1可以直接发送update报文至R2。

R2―R4:两台路由非直连,但是两台路由建立了IBGP关系,R2将update报文发送给R4。即该update报文的目的IP是R4,于是R2查询自己的路由表,由于域内运行了OSPF协议,通过OSPF,R2查询到去R4的下一跳是R3,于是将该update报文发给R3,R3收到该报文后,虽然没有运行BGP协议,但是根据报文的目的IP,将该update报文发送给R4。

R4―R5:同样,两台设备直连,并且建立EBGP关系,R4可以直接发送update报文至R5。

这样,路由的传递就完成了。

数据包的传递过程

R5―R4:R5发送的数据包,源IP是R5,目的IP是R1,于是R5查询路由表,因为从R4收到一条R1的路由,该路由的下一跳标识为R4。于是将数据包发送给R4。

R4―R2:当R4收到从R5发过来的数据包时,该数据包的源IP是R5,目的IP是R1。于是,R4查询路由表,发现去往R1的路由下一跳是R2(我们假定R2上配置了peer next-hop-local命令),由于下一跳非直连,于是R4查询去R2的下一跳。由于域内运行了OSPF,R4发现,去R2的下一跳是R3,于是将数据包发给了R3。当R3收到该数据包时,由于数据包的目的IP是R1的IP,但是R3并没有运行BGP,所以R3上没有R1的路由。于是R3将该数据包丢弃。

这就是经常说到的数据层面的“路由黑洞”。

peer next-hop-local命令一般在ASBR(Autonomous System Boundary Router)上配置。 当设备通过EBGP邻居学到路由再转发给其他IBGP邻居时,默认不修改下一跳,但其EBGP邻居发来的路由的下一跳都是其EBGP邻居的Peer地址,本端对等体所属AS域内的IBGP邻居收到这样的路由后,由于下一跳不可达导致路由无法活跃。 因此,需要在ASBR上对IBGP邻居配置peer next-hop-local命令,使得发给IBGP邻居的路由的下一跳是其自身的地址,IBGP邻居收到这样的路由后(由于域内都配置了IGP)发现下一跳可达,路由即为活跃路由。

解决路由黑洞的几个方法

1:根据BGP同步机制将BGP路由引入到IGP中。(S系列交换机缺省不启用BGP同步机制,但可以通过命令synchronization命令启用),这个方案的弊端上文已经说明。

2:物理全连接:以上图为例,如果AS65008内三台设备均通过物理线路连接起来,则R4可以直接将数据包发送给R2,而不需要通过R3转发。这个方案的弊端在于物理线路的铺设非常麻烦。

3:逻辑全连接:以上图为例,如果AS65008内三台设备均启用BGP进程,并且两两建立IBGP连接,则R3上也有R1的路由。可以成功转发数据。这个方案的弊端在于如果设备数量非常多,大量IBGP的连接难于管理。

逻辑全连接:众多的IBGP连接难于管理,该如何解决?

如果按照上面我们提到的解决路由黑洞的方法。拓扑图就会变成下面这样:

如上图所示,逻辑全连接的方案弊端在于数量众多的IBGP连接难于管理,有什么办法可以缓解这个问题呢?有两个方案可以解决IBGP连接数量过多的问题:联盟(confederation)和路由反射器(Route Reflector)。接下来我们来详细解释下这两种方案。

如果采用逻辑全连接的方式,需要建立3个IBGP连接。这只是转接AS(这里为AS200)内只有3台设备的情况,事实上,转接AS内如果每增加一台设备,需要建立的IBGP连接数量将呈几何级数上升。

BGP联盟可以将AS分割为多个子自治系统,从而让大型转接AS变得更具管理性。被分割的AS本身将成为联盟,而分割后的子自治系统则成为成员自治系统。联盟之外的AS将整个联盟视为一个AS,看不见成员自治系统。由于成员自治系统对外界来说是隐而不见的,因而成员自治系统可以使用公有或私有AS号(建议采用私有AS号)。

联盟可以极大的降低IBGP连接的数量。在联盟中,只需要在成员自治系统内进行IBGP的全连接,而成员自治系统间使用一种特殊的EBGP连接,我们称之为联盟EBGP。下面看下具体配置。


如上图,我们将AS200分成2个成员AS:AS65535和AS65534。而对于R1和R5来说,他们看到的中间的转接AS仍然是AS200。下面截取了R3的一些关键配置:

R3:
#
bgp 65535  /本机AS为成员AS号confederation id 200  /联盟ID,外部路由器看来,连接AS仍然为200confederation peer-as 65534  /说明本机连接了其他哪些成员ASpeer 10.0.12.1 as-number 65534  /和成员AS65534建立联盟EBGP连接peer 10.0.23.1 as-number 65535  /和本成员AS内部设备建立IBGP连接#ipv4-family unicastundo synchronizationpeer 10.0.12.1 enablepeer 10.0.23.1 enablepeer 10.0.23.1 next-hop-local  /这个配置并不生效,详细会在下文提及。
#

这样,整个AS200内,只需要建立一个IBGP连接和一个EBGP连接,就可以实现路由的传递和数据包的转发。

需要注意的是:联盟AS内仍然需要保证IGP的连通性,才能保证数据包的正确转发。
在联盟内部应遵守以下规则:

  • 联盟外部路由的NEXT-HOP在整个联盟中都是被保留的。
  • 被宣告到联盟之内的路由的MED属性在整个联盟中都被保留。
  • 路由的LOCAL_PREF属性在整个联盟中都被保留,而不仅仅是在为它们赋值的成员AS之内。
  • 在联盟内部需要将成员AS的AS号加入到AS_PATH列表中,但这些AS号不能被宣告到联盟之外。在默认情况下,成员AS号被列在AS_PATH中作为AS_PATH属性类型4,即AS_CONFED_SEQUENCE。如果在联盟中使用了手动聚合命令(aggregate)并配置了关键字as_set,那么位于聚合点之后的成员AS号将被列在AS_PATH中作为AS_PATH属性类型3,即AS_CONFED_SET.
  • AS_PATH中的联盟AS号用于实现环路避免功能,但是在联盟内部进行BGP路由选路过程中,选择最短AS_PATH时,不考虑这些联盟AS号。

上述规则的本质原因是整个联盟都被外界视为一个自治系统。对于规则2、3、4、5,将在后面说到AS_PATH属性和MED属性时,进行详细说明。

首先,我们在R1上通过Loopback1口发布一条路由:10.1.4.0/24,这条路由通过EBGP连接发送给R2时,NEXT-HOP为R1建立连接的接口地址10.0.14.4/24。正常来说,R2和R3建立的是EBGP连接,R2在将这条路由发送给R3时,会将这条路由的NEXT-HOP修改为自己和R3建立EBGP连接的接口地址10.0.12.1/24,但是我们发现并不是这样:

可以看到,R3上10.1.4.0/24路由的NEXT-HOP依然是10.0.14.4。这时,我们在R3上配置命令peer 10.0.23.1 next-hop-local。由于R3和R4之间是IBGP关系,正常来说配置了这条命令之后,R3在把该路由发送给R4时,会将NEXT-HOP设置为本设备接口地址。在R4上查看BGP路由发现,NEXT-HOP依然为10.0.14.4。


这就是由于外部路由的NEXT-HOP在联盟内部都是被保留的。这也解释了为什么我们之前说:联盟内部必须要保证IGP的连通性,如果联盟内部没有运行IGP,那么R4和R3上将没有到达10.0.14.0/24网段的路由,导致该BGP路由不生效。

接着我们在R5上也通过Loopback1接口引入一条路由10.1.5.0/24,并且在R4上配置命令peer 10.0.23.1 next-hop-local。查看R3上的BGP路由表:


可以看到,10.1.5.0/24这条路由的NEXT-HOP被修改为R4建立IBGP的接口地址10.0.23.1。这是因为,peer next-hop-local在仅仅在外部路由在联盟内部传递的情况下是不生效的。

路由反射器

下面是一个路由反射器的示例:


如图,左边组网内有5台设备,如果采用IBGP全连接方式,将会有众多连接需要管理,非常麻烦。之前我们说过,IBGP有一个防环机制,任何从IBGP收到的路由,都不会发给其IBGP对等体,这是为何我们要建立逻辑全连接的原罪。聪明的人们想到,能不能有条件的打破这个规则呢?

我们发现,对于左图,如果我们只允许任何一台设备转发从IBGP对等体收到的路由,都是不会产生路由环路的。于是,我们指定其中一台设备可以转发从IBGP对等体收到的路由,则其他设备只需要和该设备建立IBGP连接,就可以保证路由能够传递到所有的设备上。这就是路由反射器的思想。

根据右图,我们先介绍下路由反射器中的一些概念:

  • 路由反射器RR(Route Reflector):允许把从IBGP对等体学到的路由反射到其他IBGP对等体的BGP设备,类似OSPF网络中的DR。

  • 客户机(Client):与RR形成反射邻居关系的IBGP设备。在AS内部客户机只需要与RR直连。

  • 非客户机(Non-Client):既不是RR也不是客户机的IBGP设备。在AS内部所有非客户机与所有RR之间仍然必须建立全连接关系。

  • 始发者(Originator):在AS内部始发路由的设备。Originator_ID属性用于防止集群内产生路由环路。这点会在后面详细介绍。

  • 集群(Cluster):路由反射器及其客户机的集合。Cluster_List属性用于防止集群间产生路由环路。这点会在后面详细介绍。

RR向IBGP邻居发布路由规则如下:

  • 从非客户机学到的路由,发布给所有客户机。
  • 从客户机学到的路由,发布给所有非客户机和客户机(发起此路由的客户机除外)。
  • 从EBGP对等体学到的路由,发布给所有的非客户机和客户机。

我们根据交换机的难题来看下路由反射器的配置。


如上图,R2、R3、R4任何一台作为RR都可以,本例我们用R3作为RR。R3的关键配置如下:

#bgp 200peer 10.0.12.1 as-number 200peer 10.0.23.1 as-number 200#ipv4-family unicastundo synchronizationreflector cluster-id 1  /配置cluster-id,缺省为设备router id,可选配置peer 10.0.12.1 enablepeer 10.0.12.1 reflect-client   /配置10.0.12.1为客户机peer 10.0.23.1 enablepeer 10.0.23.1 reflect-client
#

我们在R1上发布10.1.4.0/24这条路由,查看R4的路由表,发现R4已经收到这条路由,在R4上查看这条路由的详细信息:

这条路由的NEXT-HOP为10.0.23.2
这条路由的Cluster_list属性中,已经记录了0.0.0.1。集群使用AS内唯一的Cluster ID作为标识。为了防止集群间产生路由环路,路由反射器使用Cluster_List属性,记录路由经过的所有集群的Cluster ID。

  • 一条路由第一次被RR反射的时候,RR会把本地Cluster ID添加到Cluster List的前面。如果没有Cluster_List属性,RR就创建一个。

  • 当RR接收到一条更新路由时,RR会检查Cluster List。如果Cluster List中已经有本地Cluster ID,丢弃该路由;如果没有本地Cluster ID,将其加入Cluster List,然后反射该更新路由。

当AS内部存在多个集群时,可能会产生集群环路,当RR从其他集群收到Cluster_list中含有1的路由时,将其丢弃,从而防止了集群间的路由环路。

同样我们看到,这条路由的Originator已经被记录为10.0.1.1。这个ID是R2的Router ID。Originator_ID由RR产生,使用的Router ID的值标识AS内这条路由的始发者,这里,10.1.4.0/24这条路由在AS200内的始发者是R2。当RR收到这条路由时,会将R2的Router ID加在这条路由中作为Originator_ID属性。当设备接收到这条路由时,会比较Oringinator_ID和设备本身的Router ID,如果相同,则丢弃该路由。这样就防止了在集群内部的路由环路。

联盟和路由反射器比较

联盟和路由反射器都是在大规模自治系统中减少IBGP对等体数量的有效方法,和联盟相比,路由发射器有以下两个好处:

  • 联盟中的所有路由器都必须理解和支持联盟机制,而路由反射方案只需要路由反射器了解路由反射机制即可,客户路由器和RR之间只建立不同的IBGP连接。

  • 无论从所需的配置命令还是从拓扑结构的设计上说,路由反射器的实现都更加的简单。

如上面所述就是一个典型的例子,通过路由反射器,只需要在R3上增加一条配置命令,即可解决问题。但是如果希望用各种EBGP机制来管理大规模AS,那么联邦将是一个更优的解决方案。

当然,在某些场景下,联盟和路由反射器同时使用将更加事半功倍。一个简单的例子:

BGP路由协议的那些事?(上)相关推荐

  1. CCNP CISCO 路由器 BGP路由协议在GNS3player模拟器上的配置示例详解

    文章目录 BGP概述 BGP特征 BGP术语 通过示例来了解BGP路由协议的特征(IBGP和EBGP)基本配置 BGP概述 通常可以将路由协议分为IGP(内部网关协议)和EGP(外部网关协议),EGP ...

  2. BGP路由协议的那些事?(中)

    上一篇我们解决了路由黑洞的问题.本篇我们来聊聊BGP的防环机制 BGP的两种防环机制 EBGP的路由环路 首先我们来看一下EBGP的路由环路是怎么形成的,如上图所示:三个AS通过3台设备两两建立EBG ...

  3. 计算机网络:BGP路由协议

    BGP路由协议的概述 首先,再当前的互联网中,BGP是目前唯一支持的外部网关协议EGP的协议,用于自治系统AS之间传递路由信息,目前的版本为4. 从图中可以看出,BGP协议是连接自治系统AS的&quo ...

  4. 【网络安全】BGP线路是什么意思?最全BGP路由协议技术详解

    [网络安全]BGP线路是什么意思?最全BGP路由协议技术详解 一.BGP 的基本概念 自治系统AS(Autonomous System) AS 是指在一个实体管辖下的拥有相同选路策略的 IP 网络.B ...

  5. 把有限的精力放在最有意义的事上

    人的生命有限,精力更有限,如何把有限的精力放在有意义的事上,才是最重要的. 1.工作上,不做'飞机搞',就是工作时间不做那些和工作无关的事.想着做好工作,提高工作质量和产出. 2.学习上,网路上知识林 ...

  6. 2021:不要在一件事上纠缠太久!

    2021年,不要在一件别扭的事上纠缠太久. 纠缠久了,你会烦,会痛,会厌:会累,会神伤,会心碎. 实际上,到最后,你不是跟事过不去,而是跟自己过不去. 这8句智慧之言,送给你. 01 我们之所以活得累 ...

  7. 把精力专注在“一件事”上的林曦老师,太容易让人着迷了!

    对现代人来讲,所有需要文字输出的地方,都依赖于各种先进的汉字输入输出工具,写字已经慢慢的淡出了很多人的世界,此外,大多数人习惯于拼音输入法,借助联想功能完成句子.所以提高学习能力,提升自己的心力,用传 ...

  8. 华为手机怎么刷android系统,怎样刷入安卓原生系统 在手机系统更新这件事上,小米华为和OPPOvivo谁更有良心...

    原标题:在手机系统更新这件事上,小米华为和OPPOvivo谁更有良心? 用国产手机的朋友可能都有一种感受,对于系统升级这块,有的厂商很积极,但有的厂商却非常的不积极.比如小米,华为,一加等在系统升级方 ...

  9. 关于EasyX和graphics.h的那些事(上)

    关于EasyX和graphics.h的那些事(上) 做为一个100分的C++程序菜鸟,如何入手C++是一个难题.因此,我们会选择从控制台做小游戏开始上手,但是我实在是受够了控制台的画风!! 比如说是这 ...

最新文章

  1. 斯坦福神经网络神经元对特征提取的影响JS演示
  2. 征战全球16年:中国手机出海简史
  3. alter table add column多个字段_WordPress 在文章列表快速编辑中编辑自定义字段
  4. linux cpu load 值,理解Linux系统中的load average(图文版)转
  5. linux下c语言绘图库_Linux 下的图形库介绍
  6. XX证券 机器学习平台使用情况访谈总结
  7. 解决mendeley不能输入中文的情况
  8. Python vtk学习(1)
  9. activemq之调用问题研究
  10. Windows核心编程_实现QQ好友来消息时任务栏头像闪烁功能
  11. 《BI那点儿事》数据流转换——百分比抽样、行抽样
  12. eclipse sdk 无法更新
  13. Delphi 7 升级到 Delphi 2010 总结
  14. linux系统论文题目大全_操作系统专业论文选题 操作系统毕业论文题目如何定
  15. 操作系统学习笔记02【进程控制——进程互斥的硬件实现方法】【自用】
  16. xmind的简单使用教程
  17. error: C2679
  18. 为什么单例模式中的Double Check要加volatile
  19. bigdicmal除法精度设置_使用java求高精度除法,要求保留N位小数
  20. python plot坐标轴显示比例一致_绘图,x轴和y轴的比例相同

热门文章

  1. 利用T0定时器定时 100ms,每当定时时间到就使 P1.7 求反
  2. 【MySQL综合练习1】
  3. Oracle学生表练习
  4. 什么是维度表和事实表
  5. 镜头camera shot
  6. bmp、jpg转换为icon图像
  7. ubuntu解决网络连接的优先级
  8. 华为手机输入键盘声音_华为键盘声音怎么设置
  9. Linux 下的DNW
  10. 我的2018年计划-抓重点,出成绩,提高核心竞争力