BGP(1):BGP 的基本机制

“网络那么大,一锅炖不下”。为了解决“大网”的问题,OSPF 和 IS-IS 都提出了 Area(分区)概念。但是这个 Area 指的是在1个 AS(Autonomous System,自治系统)内分成多个 Area。而多个 AS 之间该如何互通,OSPF、IS-IS 并没有任何解决方案。

我们知道,当前的 IGP(Interior Gateway Protocol,内部网关协议)事实上只包括 OSPF、IS-IS、RIP。前两者不能解决 AS 之间的互通,而RIP 更加无能无力(它连1个 AS 内的“大网”都无力解决,遑论 AS 之间)。

如此看来,如果单靠 IGP,那么世界上将形成一个个孤岛:任意2个 AS 之间都无法互联。

 

说明:关于 AS,请参见“7.6.1.1 自治系统简介”。

 

“世界那么空,我与谁相拥”。如果都是一个个孤岛,那么对于每一个 AS 而言,它的外部都是“空空的世界”。这显然是不能接受的,而且也与事实不符——这个世界早已经是互联互通的 Internet。

解决 AS 孤岛问题的方案就是 EGP(Exterior Gateway Protocol,外部网关协议)。

和 IGP 一样,EGP 也是一类协议的统称,它包括 EGP(这个时候,它是一个协议的名称,而不是一类协议的统称)和 BGP(Border Gateway Protocol,边界网关协议)。

由于 EGP(指的是独立一个协议)已经被淘汰,不再使用,所以现在一般来说,就直接以 BGP 来指代 EGP(指的是一类协议),或者说干脆就已经“忘记”了 EGP,就是只有 BGP。

那么 BGP 是如何解决 AS 孤岛的问题呢?这要从 BGP 的基本机制说起。

 

10.1 BGP 的基本机制

在谈 BGP 基本机制之前,我们首先要明确 BGP 所要解决的本质问题。

“大网”问题,永远都是那句话“网络那么大,一锅炖不下”。这里的网络,指的是“全世界”的3层网络(公网)。

为了解决“大网”问题,网络层提出了1个综合解决方案。

(1)将“全世界”的3层网络,分成不同的 AS

(2)每个 AS 内部的路由计算,相对独立。这样“全世界”1张“巨大”网就被分隔成多个“较大”网(AS),减少了路由的计算量

(3)每个“较大”网(AS)又被分隔成多个“小”网(Area),每个“小”网的路由计算相对独立,这样进一步减少了路由得计算量

(4)BGP 的目标是将多个“较大”网(AS)互联,也就是使得“全世界”这张“巨大”网能够互联

可以看到,BGP 是“全世界”这张“巨大”网互联的综合解决方案的一部分,它所解决的本质问题还是“大网”问题,只不过它的直接目标是“将多个 AS 互联”而已。

为了“互联多个 AS”,BGP 的方案是将一个 AS 内部的路由表项通告给另一个 AS,也就是 BGP 的基本机制:路由通告。

路由通告,形象地说,就是“我们不生产路由,我们只是路由的搬运工”。

BGP 的路由通告分为 eBGP 路由通告、iBGP 路由通告。“eBGP”、“iBGP”又是什么意思呢?这得先从 BGP 的相关概念说起。

 

10.1.1 BGP 的相关概念

BGP 只是一个协议,协议就是一张“纸”而已(不是有句话吗,叫撕毁协议,撕的就是“纸”啊)!所以说,要想让 BGP 发挥作用,还需要路由器——运行 BGP 协议的路由器。

1个运行 BGP 协议的路由器,叫作 BGP Speaker。这些 BGP Speakers,互相交互,从而达到搬运路由的目的。

不是任意两个 BGP Speaker 都能互相交互,互相搬运路由。两个 BGP Speaker 必须组成一对(BGP peer,BGP 对等体),才能互相交互、搬运路由。

通信世界里,有很多地方涉及到 peer 这个概念,有的对等体是自动发现的,有的对等体是人工配置。BGP 的对等体就是靠人工配置。BGP peer 的两端(两个路由器),互相是彼此的 BGP 邻居。

如果组成 BGP peer 的两个路由器,分属两个 AS,那么它们之间运行的的 BGP 就称作 eBGP(External Border Gateway Protocol);如果两个路由器,同属一个 AS,那么它们之间运行的 BGP 就称作 iBGP(Internal Border Gateway Protocol)。如图10-1所示。

图10-1中,R1 与 R3 之间、R2 与 R4 之间运行的是 iBGP,R1 与 R2 之间运行的是 eBGP。

 

eBGP 与 iBGP,只是在一些地方有所不同,其他绝大部分是一样的,我们会在本章后续的讲述中,逐步展开它们之间的异同。另外本章如无特别说明,所讲述的 BGP 内容对 eBGP、iBGP 都适用。

这里有一个疑问:我们一直说 BGP 是为了互联不同的 AS,那么 AS 内部为什么还要运行 BGP 协议,为什么还要有所谓的 iBGP 呢?这就与 BGP 的路由通告及场景有关。

 

10.1.2 BGP 的路由通告

BGP 路由通告,简单地说,就是“BGP peer,互相把自己知道的路由表信息,告诉对方”,如图10-2所示。 

 

图10-2是以 eBGP 为例,示意了1个 BGP 的路由通告。R1 将自己路由表中的表项(分别是到达“11.1.1.0/24, 12.1.1.0/24, 13.1.1.0/24”网段的路由表项)通告给 R2。R2 也将自己路由表中的表项(分别是到达“21.1.1.0/24, 22.1.1.0/24, 23.1.1.0/24”网段的路由表项)通告给 R1。

那么,R1 和 R2 的“路由表”具体指的是什么呢?R1 和 R2 又是在什么时机向对端通告路由呢?

 

10.1.2.1 BGP 的路由表和路由通告时机

路由器中,每个协议都有自己的路由表,BGP 也不例外。BGP 通告的就是 BGP 路由表中的内容。

我们知道 IGP 的目标就是动态构建路由,也就是说 IGP 可以自动地将其路由表从“0”变成“1”,但是 BGP 该如何构建其路由表呢?

这是一个非常严峻的问题。因为 BGP 路由表的初始化是一张空表,如果 BGP 没有机制构建其路由表,那么 BGP 路由表将永远为空。这也就意味着 BGP 的路由通告毫无意义。

BGP 路由表的来源,并没有 IGP 那样“轰轰烈烈”的过程(比如 OSPF:邻居发现、邻接关系建立、链路状态泛洪,路由计算),它的来源有如下几种。

(1)人工输入:人工直接添加 BGP 路由表

(2)从 IGP 路由表引入:通过命令行配置了相关引入规则后,IGP 路由表中相应的路由表项会自动进入 BGP 路由表,以后 IGP 路由表发生变化,相应的表项也会自动进入 BGP 路由表

(3)从 EGP 路由导入(因为 EGP 路由协议已经废弃,所以这个可以忽略)

(4)IGP 路由重分布(redistribute)进入 BGP 路由

(5)BGP peer 的路由通告

以上的几种来源,如图10-3所示。

 

图10-3 BGP 路由表的构建

BGP 路由表有了内容以后,它就可以通告出去(图10-3的“输出”)。那么它何时向它的邻居(BGP peer 的另一端)通告路由呢?

有1个题目:在 BGP 协议中,每隔()时间向邻居发送路由通告

A. 30 秒

B. 60 秒

C. 120 秒

D. 无固定周期

这个题目的潜台词是:BGP 是在什么时机向邻居发送路由通告?

答案是:只要 BGP 路由表一变化,就向邻居发送路由通告!所以选 D!

 

以上所说的内容,对于 eBGP 和 iBGP 来说,两者都是一样的。但是涉及到具体通告的细节,两者又有所不同。

 

10.1.2.2 eBGP 的路由通告

BGP 路由表里有内容以后,BGP peer 就可以互相通告了。BGP 路由器收到邻居发过来的路由通告,会做2件事情(我们这里先忽略具体细节)。

(1)填入自己的路由表中

(2)再通告给它的另外的邻居

可以看到,BGP 路由器收到其邻居发送过来的路由通告,再通告给它的其它邻居,这其实就是相当于“泛洪”过程,如图10-4所示。

 

图10-4 eBGP 路由通告示意

图10-4表达的是1个 eBGP 通告示意。R1/R2、R3/R4、R4/R1 互相组成eBGP peer。R1 通告给 R2 的路由,R2 会继续通告给 R3,R3 也会继续通告给 R4,R4 也会通告给 R1。

需要说明的是,R1->R2->R3->R4,这样的通告链,是没有问题的。但是,R1->R2->R3->R4->R1 这个通告链,即 R1 的路由,绕了一圈,又通告给自己,这会形成路由环路。eBGP 解决“路由通告环路”的问题,我们放到10.3.2.4节讲述,这里暂且忽略。

全世界的 AS,就是通过 eBGP 的路由通告泛洪,从而知道了每一个 AS 内的路由,避免了一个个 AS 孤岛。

 

10.1.2.3 iBGP 的路由通告

eBGP 路由通告泛洪,连接了每一个 AS,但是还是无法做到让每个 AS 内的路由器都能连接“全世界”,如图10-5所示。

 

图10-5 如果没有 iBGP

图10-5中,R1 与 R2 是 BGP Speaker,互相组成 BGP peer,通过 eBGP 路由通告,都具有到达两个 AS 域的路由信息。但是,图10-5中的 R3、R4,假设没有运行 BGP 协议,那么它们只能知道各自域内的路由信息,也就是说,R3 与 R4 之间的路由其实是不通的。

如此一来,我们说“通过 eBGP 路由通告就能把一个个 AS 孤岛连起来”,还是远远不够的,这个“世界”并没有完全连通。

解决这个问题的方案有不少,其中对于 BGP 来说,就是 iBGP,其基本思路如下。

(1)AS 内的路由器也运行 BGP协议

(2)AS 内的 BGP Speaker 互相组成 BGP peer

(3)BGP peer 之间,互相进行路由通告

如此一来,对于 AS 内部的每一个路由器,它也能“感知”到“外面的世界”。

然而 ...... “理想很丰满,现实很骨感”,与 eBGP 相比,iBGP 的路由通告却有一个“要命”的特性。

eBGP 的路由通告规则是:一个路由器接到其邻居的路由通告后,可以再通告给它的另一个邻居,它的邻居可以再通告给它的邻居,这也就是所谓的“一传十十传百”的路由通告泛洪。

但是 iBGP 的路由通告只能是1跳,如图10-6所示。

 

图10-6 iBGP 路由通告只能通告1跳

图12中,R1/R6,R4/R5 是 eBGP peer,R1/R2,R2/R3,R3/R4,R4/R1 是 iBGP peer。

R6 通告给 R1 的路由,R1 可以通告给 R2(1跳),但是 R2 不会再通告给 R3(超过1跳)。

R6 通告给 R1 的路由,R1 可以通告给 R4(1跳),R4 可以通告给 R5(是 eBGP,不受 iBGP 1跳的限制),但是 R4 不会再通告给 R3(超过1跳)。

R5 通告给 R4 的路由,同理。

如此可以看到,R3 并没有 AS3 的路由,也没有 AS1 的路由,这也意味着 AS1 “外部”的世界,对于 R3 来说,还是“遥不可及”。这一切都是因为“iBGP 路由通告只能有1跳”这个“要命”的特性所造成的。

为了“理想的丰满”,必须解决“现实的骨感”,为此 BGP 提出了“路由反射器”和“BGP 联邦”等两个方案。这两个方案我们放到10.4节再讲述。这里暂且认为 iBGP 解决了它的问题,最终使得 AS 内的路由器都“知晓”了其他 AS 的路由。

“世界那么大,我想去看看”。BGP 通过 eBGP 的路由通告、iBGP 的路由通告(以及相应的附属解决方案),使得全世界的3层网络达到了互联互通。

 

说明:

(1)“iBGP 路由通告只能有1跳”,可以得出1个推论:1个 BGP 路由器从 iBGP 邻居收到的路由,不能再通告给它的其它 iBGP 邻居,只能再通告传给它的 eBGP 邻居。

(2)除了 iBGP 路由通告,还有一种方法可以将 AS 外部的路由“导入”到 AS 域内的路由器,那就是路由重分布(redistribute,笔者觉得这个应该翻译为“重发布”更好),即域内其他路由器还是只运行IGP 协议,eBGP Speaker 使用路由重分布的方法,将其自身的路由信息,告知 AS 域内的其他路由器

 

10.1.3 BGP 机制小结

由于路由器“算力”的局限,全世界这么一张“巨大”的3层网络若想互联互通,必须要有一系列的综合解决方案。而这个综合解决方案的基本思路就是“分而治之”。

于是这张“巨大”的3层网络被分割成多个 AS,每个 AS 内部做相对独立的路由计算。但是“分而治之”解决了路由器的“算力”问题的同时,又引发了另一个问题:不同的 AS 之间如何“互联互通”?

BGP 的目标就是为了解决不同 AS 之间的互通问题,它的解决方案就是 BGP 路由通告。AS 域间的路由通告称为 eBGP 路由通告,AS 域内的路由通告称为 iBGP 路由通告。

eBGP 路由通告具有“一传十十传百”的泛洪特质,而 iBGP 的路由通告只能通告1跳。“泛洪”可以传遍“全”网络(AS 域间),但是却会引发通告环路;“1跳”不会引发通告环路,却无法传遍“全”网络(AS 域内)。为了解决这些问题,BGP 又推出了对应的解决方案。

如果抛开细节,我们可以看到:BGP 的基本机制就是“路由通告”。

那么 BGP 的路由通告具体通告的是什么内容呢?我们来看看 BGP 的报文格式。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值