【计算机网络系列】网络层⑩:路由选择协议——外部网关协议BGP

外部网关协议BGP

协议BGP的主要特点

在外部网关协议(或边界网关协议)BGP中,现在使用的是第4个版本BGP-4(常简写为BGP)。

协议BGP对互联网非常重要。前面介绍的路由选择协议RIP和OSPF,都只能在一个自治系统AS内部工作。因此,若没有协议BGP,那么分布在全世界数以万计的AS都将是一个个没有联系的孤岛。正是由于有了 BGP这种黏合剂,才使得这么多的AS孤岛能够连接成一个完整的互联网。从这个意义上考虑,协议BGP应当是所有路由选择协议中最为重要的一个。

我们知道,内部网关协议(如RIP或OSPF)主要是设法使数据报在一个AS中尽可能有效地从源站传送到目的站。在一个AS内部也不需要考虑其他方面的策略。然而BGP使用的环境却不同。这主要是因为以下的两个原因:

  • 互联网的规模太大,使得自治系统AS之间路由选择非常困难。
  • 自治系统AS之间的路由选择必须考虑有关策略。

由于上述情况,边界网关协议BGP只能是力求选择出一条能够到达目的网络前缀比较好的路由(不能兜圈子),而并非要计算出一条最佳路由。这里所说的BGP路由,是指经过哪些自治系统AS可以到达目的网络前缀。当然,这选择出的比较好的路由,也有时不严格地称为最佳路由。

BGP采用了路径向量路由选择协议,它与距离向量协议(如RIP)和链路状态协议(如OSPF)都有很大的区别。

BGP路由

在一个自治系统AS中有两种不同功能的路由器,即边界路由器(或边界网关)和内部路由器。一个AS至少要有一个边界路由器和相邻AS的边界路由器直接相连。在讨论协议BGP时,应特别注意边界路由器的作用。正是由于有了边界路由器,AS之间才能利用协议BGP交换可达性路由信息。

当两个边界路由器(例如图(a)中的 R 1 R_1 R1 R 2 R_2 R2)进行通信时,必须先建立TCP连接,这种TCP连接又称为半永久性连接(即双方交换完信息后仍然保持着连接状态)。像 R 1 R_1 R1 R 2 R_2 R2之间的这种连接称为eBGP连接,e表示外部external。现在,边界路由器 R 1 R_1 R1可通过eBGP向对等端 R 2 R_2 R2发送BGP路由X,AS1,R1,意思是“从 R 1 R_1 R1经AS1可到达 X X X”。这样,通过eBGP连接,AS2中的边界路由器 R 2 R_2 R2就知道了到达AS1中的前缀 X X X的BGP路由。
image.png

但是,仅有边界路由器 R 2 R_2 R2知道“到AS1的前缀X的BGP路由”是远远不够的。边界路由器 R 2 R_2 R2应当把获得的BGP路由,再转发给AS内部的其他路由器。为此,协议BGP规定,在AS内部,两个路由器之间还需要建立iBGP(i表示内部internal),iBGP也使用TCP连接传送BGP报文。图(b)中表示边界路由器 R 2 R_2 R2在三个iBGP连接上,向AS2内部的其他三个路由器转发自己收到的BGP路由。至此,AS2内的所有路由器都知道了这条BGP路由信息。由此可见,协议BGP并非仅运行在AS之间,而且也要运行在AS的内部

协议BGP规定,在一个AS内部所有的iBGP必须是全连通的。即使两个路由器之间没有物理连接,但它们之间仍然有iBGP连接(如下图所示)。
image.png
eBGP和iBGP并不是两个不同的协议。

  • eBGP是在不同AS的两个对等端之间的BGP连接
  • iBGP是同一AS的两个对等端之间的BGP连接。

在这两种不同连接上传送的BGP报文,都遵循同样的协议BGP,使用同样的报文格式和具有同样的属性类型。唯一的不同点就是在发送BGP路由通告时的规则有所不同。这就是,

  • 从eBGP对等端收到的BGP路由,可通过iBGP告诉同AS内的对等端。
  • 反过来,即从iBGP对等端收到的BGP路由,可通过eBGP告诉在不同AS的对等端。

但是,从iBGP对等端收到BGP路由,不能转告给同一个AS内不同iBGP的对等端。

下图形象地说明了eBGP和iBGP的作用。图中画出了四个自治系统AS,每一个AS都必须运行本AS选择的内部网关协议IGP,例如OSPF或RIP。而协议BGP是在iBGP连接和eBGP连接之上运行的。
image.png
下面介绍一下BGP路由的一般格式。前面例子中的 BGP路由正是按照这种格式书写的。

BGP路由 = “前缀, BGP属性” = “前缀, AS-PATH, NEXT-HOP”
  • 前缀的意思很明确,就是通告的BGP路由终点(子网前缀)。
  • AS-PATH(自治系统路径)是通告的BGP路由所经过的自治系统。BGP路由每经过一个AS,就将其自治系统号ASN加入到AS-PATH中。从这里可以清楚地看出,“BGP路由”必须指出通过哪些自治系统AS,但不指出路由中途要通过哪些路由器。
  • NEXT-HOP(下一跳)是通告的BGP路由起点。

BGP属性有好几种类型,但最重要两个就是这里列出的AS-PATHNEXT-HOP

到这里,路由问题并未都解决完。例如,在下图中AS2内的路由器 R 4 R_4 R4在收到BGP路由“X,AS1,R1”后,知道了“从 R 1 R_1 R1出发就能到达AS1中的前缀X”。但路由器 R 4 R_4 R4应当怎样构造自己的转发表呢?这需要经过两次递归查找
image.png
首先, R 4 R_4 R4要把这条BGP路由的起点进行转换。原来的BGP路由是“ R 1 → X R_1\rightarrow X R1X”,路由的起点 R 1 R_1 R1并不在AS2中。AS2中的路由器都不能识别 R 1 R_1 R1。因此现在 R 4 R_4 R4要把 BGP路由的起点改为 R 1 R_1 R1的对等端 R 2 R_2 R2,把BGP路由变为“ R 2 → R 1 → X R_2\rightarrow R_1\rightarrow X R2R1X”。由于 R 2 R_2 R2位于AS2中,因此AS2里面的所有路由器都能把分组转发到 R 2 R_2 R2,然后就能再经过 R 2 R_2 R2,最后到达前缀 X X X

其次, R 4 R_4 R4要利用内部网关协议,找到从 R 4 R_4 R4 R 2 R_2 R2的最佳路由中的下一跳。在本例中,查出下一跳是 R 3 R_3 R3。于是 R 4 R_4 R4在转发表中增加了到达前缀 X X X的下一跳是 R 3 R_3 R3这一项目。
image.png
用类似的方法,路由器 R 3 R_3 R3也在自己的转发表中增加了到达前缀 X X X的项目。
image.png
这样,路由器 R 4 R_4 R4只要收到要到达前缀X的分组,都按照 R 4 → R 3 → R 2 → R 1 → X R_4\rightarrow R_3\rightarrow R_2\rightarrow R_1\rightarrow X R4R3R2R1X的路径,最后到达前缀 X X X

总之,每一个路由器收到一条新的BGP路由通告后,必须经过上述步骤,才能在自己的转发表中,增加到达终点的“下一跳”的相应项目。

三种不同的自治系统AS

在互联网中自治系统AS的数量非常之多,其连接图也是相当复杂的。但归纳起来,可以把AS划分为图中所示的三大类,即末梢AS (stub AS)、穿越AS (transit AS)和对等AS(peering AS)。
image.png
末梢AS是比较小的AS(如图中的AS4,AS5和AS6),其特点是这些AS或者把分组发送给其直接连接的AS,或者从其直接连接的AS接收分组,但不会把来自其他AS的分组再转发到另一个AS。末梢AS必须向所连接的AS付费才能发送或接收分组。

图中链路旁边的人民币符号¥表示需要对转发分组付费。

末梢AS也可以同时连接到两个或两个以上的AS。这种末梢AS就称为多归属AS。多归属AS可以增加连接的可靠性,因为若有一条连接出现故障,那么还有另一条连接可用。

  • 作为末梢AS的AS5,不能把AS3发送过来的分组转发到AS2。同理,AS5也不能把AS2发送过来的分组转发到AS3。这就是说,末梢AS不是穿越AS,它不允许分组穿越自己的自治系统
  • 末梢AS5也不能把(AS5→AS2→AS4)这样的BGP路由信息通告给AS3。如果AS3有分组要转发给AS4,可以通过对等AS2转发,但不能通过末梢AS5。

如图所示的穿越AS1往往是拥有很好的高速通信干线的主干AS,其任务就是为其他的AS有偿转发分组。通常都会有很多的AS连接到穿越AS上。

对等AS(如图中的AS2和AS3)是经过事先协商的两个AS,彼此之间的发送或接收分组都不收费,这样大家转发分组都比较方便。

这里我们要强调一下,BGP路由必须避免兜圈子的出现。现观看图中的几个自治系统AS。

  • AS3向AS1通告可到达AS6的BGP路由中的属性AS-PATH[AS3 AS6]
  • AS1在收到的BGP路由的属性AS-PATH中的最前面,添加上自己的AS,通报给AS2:[AS1 AS3 AS6]
  • AS2收到BGP路由后,向AS3通报BGP路由属性AS-PATH[AS2 AS1 AS3 AS6]
  • 当AS3收到BGP路由后,检查属性AS-PATH序列中已经有了自己的AS3,如果AS3接受这个路由,并添加上本AS号,则将在属性AS-PATH中出现两个AS3:[AS3 AS2 AS1 AS3 AS6]

这就构成了一个兜圈子的BGP路由,因此AS3应立即删除此BGP路由,因而避免了兜圈子路由的出现。请记住,在属性AS-PATH不允许出现相同的AS

AS3还可向AS2通报可到达AS6的另一条BGP路由,其AS-PATH[AS3 AS6]。因此AS2知道有两条BGP路由可到达AS6,其AS-PATH[AS2 AS1 AS3 AS6][AS2 AS3 AS6]

BGP的路由选择

假如从一个AS到另外一个AS 中的前缀X只有一条BGP路由,那么就不存在选择BGP路由的问题,因为这时 BGP路由是唯一的。

但如果到前缀X有两条或更多的BGP路由可选择,那么就应当根据以下的原则,按照这里给出的先后顺序,选择一条较好的BGP路由。

(1)本地偏好LOCAL-PREF值最高的路由要首先选择。

在BGP路由中的属性里面有一个选项叫作本地偏好,在属性中记为LOCAL-PREF。本地偏好也就是本地优先,“本地”的意思是指,从本AS开始的、到同一个前缀的不同BGP路由中,挑选一个较好的(即偏好值最高的)路由。这可由路由器管理员或网络管理员根据政治上或经济上的策略来设置。

例如在下图中,AS1分别用高速和低速链路连接到AS2和 AS3,并从这两个AS获悉,可通过AS2或AS3到达AS4。但AS1认为,若有分组要从AS1转发到AS4,应优先选择路由器 R 1 R_1 R1离开AS1。于是就把从 R 1 R_1 R1离开AS1的BGP路由的属性LOCAL-PREF值设为300,而把从 R 2 R_2 R2离开AS1的BGP路由的LOCAL-PREF值设为200。这一信息通过iBGP通告AS1内部的所有路由器。这样,凡是有分组要转发到AS4,都优先选择从 R 1 R_1 R1离开AS1。
image.png
但是,即使所有的通信量都通过这条高速链路,使得链路负荷过重,协议BGP也无法把一些负载调整到负载较轻的那条低速链路上。
如果从几条BGP路由中找不出本地偏好值最高的路由,则执行下一条。

(2)选择具有AS跳数最少的路由。

现观察下图的例子。从AS1到AS5共有两条BGP路由,即AS1→AS2→AS3→AS5AS1→AS4→AS5。根据选择具有AS跳数最少的原则,我们应选择只通过1个AS的BGP路由,即AS1→AS4→AS5。但是没有想到,分组在AS4中反而要经过更多次数的转发(或许AS4是个很大的AS),可能要花费更长的时间。可见选择经过AS 数量最少的路由AS1→AS4→AS5未必更好。这个例子再次说明了协议BGP无法选择出最佳路由。
image.png
(3)使用热土豆路由选择算法。

如果按前两种方法都无法选择最好的路由,那么就在要进入BGP路由的AS,执行热豆路由选择算法。例如在下图中,从AS1出发,共有两条BGP路由可到达 AS3。

  • BGP路由1:从R3离开AS1,然后进入AS2,再到AS3 o
  • BGP路由2:从R4离开AS1,然后进入AS2,再到AS3 o

image.png
假定这两条BGP路由的本地偏好相同,同时所经过的AS个数也相同。在这种情况下,AS1中的每一个路由器,就应采用热土豆路由选择算法。这种算法把分组比喻为烫手的热土豆,要尽快地转发出去。对于上图的例子,就是要使分组尽快离开AS1,而不考虑从哪个路由器离开AS1。或者说,要让分组经过最少的转发次数离开本AS。这时要使用内部网关协议(如协议OSPF或RIP)。对于不同的路由器,得出的选择结果是不同的。例如,

  • 对于AS1中的路由器R1,若要使转发的分组尽快离开AS1,应选择R4作为其下一跳,因此应选择BGP路由2。这样,R1的转发路径应当是:R1→R4→BGP路由2。
  • 同理,对于R2,若要使转发的分组尽快离开AS1,应选择R3作为其下一跳,因此应选择BGP路由1。这样,R2的转发路径应当是:R2→R3→BGP路由1。

(4)选择路由器BGP标识符的数值最小的路由。

当以上几种方法都无法找出最好的BGP路由时,就可使用BGP标识符来选择路由。在BGP进行交互的报文中,其首部有一4字节的字段,叫作BGP标识符,记为BGP ID。这个字段被赋予一个无符号整数作为运行 BGP的路由器的唯一标识符。具有多个接口的路由器有多个IP地址。BGP ID就使用该路由器的IP地址中数值最大的一个。

BGP的四种报文

在协议BGP刚运行时,BGP连接的对等端要相互交换整个的BGP路由表。但以后只需要在BGP路由发生变化时,才更新有变化的部分。这样做对节省网络带宽和减少路由器的处理开销方面都有好处。

在RFC 4271中规定了BGP-4的四种报文:

  1. OPEN(打开)报文,用来与BGP连接对等端建立关系。
  2. UPDATE(更新)报文,用来通告某一路由的信息,以及列出要撤销的路由。
  3. KEEPALIVE(保活)报文,用来周期性地证实与对等端的连通性。
  4. NOTIFICATION(通知)报文,用来发送检测到的差错。

OPEN报文是两个路由器之间建立了TCP连接后接着就必须发送的报文。OPEN报文的作用是相互识别对方,协商一些协议参数(如计时器的时间)。收到OPEN报文的路由器,就发回KEEPALIVE报文表示接受建立BGP连接。

UPDATE报文是BGP协议的核心,用来撤销它以前曾经通知过的路由,或宣布增加新的路由。撤销路由可以一次撤销许多条,但增加新路由时,每个更新报文只能增加一条。

虽然BGP连接的两端建立了TCP连接,传输报文是可靠的,但TCP上层的BGP是否始终正常工作还无法确知。在对等端之间定期传送BGP路由表是不可取的,因为BGP路由表往往过于庞大,这样做会使网络的通信量过大。因此协议BGP采用的方法是让BGP连接的两个对等端之间,周期性地交换KEEPALIVE报文,以表示协议工作正常。KEEPALIVE报文只包含BGP报文的通用首部,因此不会在网络上产生多少开销。

每个路由器都有一个保持时间计时器(Hold Timer)。路由器每收到一个BGP报文,这个计时器就重置一次,继续从0开始计时。如果在商定的保持时间内没有收到对等端发来的任何一种BGP报文,就认为对方已经不能工作了。发送KEEPALIVE报文的时间间隔取为双方事先商定的保持时间的1/3。例如,在BGP连接建立阶段,双方商定保持时间为180秒,那么KEEPALIVE报文就每隔60秒发送一次。如果两个对等端选择的保持时间不一致,就选择数值较小的一个作为彼此使用的保持时间。保持时间也可选择为0。在这种情况下就永远不发送KEEPALIVE报文,表明这条BGP连接总是正常工作的。

BGP可以很容易地解决距离向量路由选择算法中的“坏消息传播得慢”这一问题。当某个路由器或链路出故障时,可以从不止一个邻站获得路由信息,因此很容易选择出新的路由。

在ASN升级到4字节后,号码ASN的范围从065535扩大到了04294967295。这样就在互联网中存在两种不同的BGP报文。旧BGP报文使用2字节ASN,而新BGP报文使用4字节的ASN,这时BGP路由中的路径属性记为AS4-PATH。使用新的和旧的BGP报文的路由器若要进行通信,必须解决如何正确识别其ASN的问题。

BGP报文是作为TCP报文的数据部分来传送的。四种类型的BGP报文具有同样的首部。
image.png

猜你喜欢

转载自blog.csdn.net/qq_37085158/article/details/128514726