计算机网络4——网络层5外部路由选择协议

一、协议 BGP 的主要特点

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

  • 第一,互联网的规模太大,使得自治系统 AS 之间路由选择非常困难。连接在互联网主干网上的路由器,必须对任何有效的I地址都能在转发表中找到匹配的网络前缀。目前在互联网的主干网路由器中,一个转发表的项目数甚至可达到50万个网络前缀。如果使用链路状态协议,则每一个路由器必须维持一个很大的链路状态数据库。对于这样大的主干网用Diikstra 算法计算最短路径时花费的时间也太长。另外,由于自治系统AS各自运行自己选定的内部路由选择协议,并使用本AS指明的路径度量,因此,当一条路径通过几个不同AS 时,要想对这样的路径计算出有意义的代价是不太可能的。例如,对某AS来说,代价为1000可能表示一条比较长的路由。但对另一AS,代价为1000却可能表示不可接受的坏路由。因此,对于自治系统 AS之间的路由选择,要用“代价”作为度量来寻找最佳路由也是很不现实的。比较合理的做法是在自治系统之间交换“可达性”信息(即“可到达”或“不可到达”)。例如,告诉相邻路由器:“到达网络前缀N 可经过自治系统 A S x AS_x ASx"
  • 第二,自治系统 AS之间的路由选择必须考虑有关策略。由于相互连接的网络的性能相差很大,根据最短距离(即最少跳数)找出来的路径,可能并不合适。也有的路径的使用代价很高或很不安全。还有一种情况,如自治系统AS1要发送数据报给自治系统AS2,本来最好是经过自治系统 AS3。但 AS3不愿意让这些数据报通过本自治系统的网络,即使 AS1愿意付一定的费用。但另一方面,自治系统AS3愿意让某些相邻自治系统的数据报通过自己的网络,特别是对那些付了服务费的某些自治系统更是如此。因此,自治系统之间的路由选择办议应当允许使用多种路由选择策略。这些策略包括政治、安全或经济方面的考虑。例如,我国国内的站点在互相传送数据报时不应经过国外兜圈子,特别是,不要经过某些对我国的安全有威胁的国家。这些策略都是由网络管理人员对每一个路由器进行设置的,但这些策略并不是自治系统之间的路由选择协议本身。还可举出一些策略的例子,如:“仅在到达下列这些地址时才经过 A S x AS_x ASx”,“ A S x AS_x ASx A S y AS_y ASy、相比时应优先通过 A S x AS_x ASx”,等等。显然,使用这些策略是为了找出较好的路由而不是最佳路由。

由于上述情况,边界网关协议BGP只能是力求选择出一条能够到达目的网络前缀且比较好的路由(不能兜圈子),而并非要计算出一条最佳路由。这里所说的BGP路由,是指经过哪些自治系统AS可以到达目的网络前缀。当然,这选择出的比较好的路由,也有时不严格地称为最佳路由。BGP采用了路径向量(path vector)路由选择协议,它与距离向量协议(如RIP)和链路状态协议(如OSPF)都有很大的区别。

二、BGP路由

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

当两个边界路由器(例如下图中的R1和R2)进行通信时,必须先建立 TCP 连接(端口号为 179,TCP连接将在第5章中学习),这种TCP 连接又称为半永久性连接(即双方交换完信息后仍然保持着连接状态)。像R1和R2之间的这种连接称为eBGP连接,但通常就简称为 eBGP,e表示外部 extermal。现在,边界路由器 R1可通过 eBGP 向对等端 R2发送 BGP 路由“X,AS1,R,”,意思是“从R1经AS1可到达 X”。这样,通过 eBGP 连接,AS2中的边界路由器R2就知道了到达AS1中的前缀X的 BGP 路由。
在这里插入图片描述
但是,仅有边界路由器R2知道“到 AS1的前缀X的 BGP 路由”是远远不够的。边界路由器R2应当把获得的 BGP 路由,再转发给 AS 内部的其他路由器。为此,协议 BGP 规定,在AS内部,两个路由器之间还需要建立iBGP(也就是iBGP连接,i表示内部intermal),iBGP也使用TCP连接传送 BGP 报文。图 4-45(b)中表示边界路由器R2在三个iBGP 连接上,向 AS2内部的其他三个路由器转发自己收到的 BGP 路由。至此,AS2内的所有路由器都知道了这条 BGP 路由信息。由此可见,协议 BGP 并非仅运行在 AS 之间,而且也要运行在 AS 的内部。

这里要说明一下。(a)中的边界路由器R1通告给边界路由器R2的BGP 路由可能有很多条(在图中只画出了一条)。但R2根据本 AS管理员所规定的策略,可以拒绝某些路由(收到这种路由后即删除掉),而在iBGP连接上仅转发符合规定策略的BGP路由。

协议 BGP规定,在一个AS内部所有的iBGP必须是全连通的。即使两个路由器之间没有物理连接,但它们之间仍然有iBGP连接(如下图所示)
在这里插入图片描述
图4-47形象地说明了eBGP和iBGP的作用。图中画出了四个自治系统AS,每一个AS都必须运行本AS选择的内部网关协议IGP,例如OSPF或RIP。而协议BGP是在iBGF连接和eBGP 连接之上运行的。

我们还需要指出,虽然eBGP和iBGP的最后一个字母P是代表“协议(Protocol)”,但eBGP和iBGP并不是两个不同的协议。根据RFC4271,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是在iBGF连接和eBGP 连接之上运行的。
在这里插入图片描述
后面我们经常要讲到 BGP路由,因此下面介绍一下BGP路由的一般格式。前面例子中的BGP路由正是按照这种格式书写的。
在这里插入图片描述
前缀的意思很明确,就是通告的 BGP路由终点(子网前缀)。

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

AS-PATH(自治系统路径)是通告的BGP路由所经过的自治系统。BGP路由每经过一个AS,就将其自治系统号ASN加入到AS-PATH中(本节在举例中没有使用具体的ASN数字号码,而是用 AS1,AS2等符号来表示不同的 AS)。从这里可以清楚地看出,“BGP 路由”必须指出通过哪些自治系统 AS,但不指出路由中途要通过哪些路由器。

NEXT-HOP(下一跳)是通告的 BGP 路由起点。

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

其次,R4要利用内部网关协议,找到从R4到R2的最佳路由中的下一跳。在本例中,查出下一跳是 R3。于是 R4在转发表中增加了到达前缀X的下一跳是 R3这一项目。
在这里插入图片描述
用类似的方法,路由器R3也在自己的转发表中增加了到达前缀X的项目。

在这里插入图片描述
这样,路由器 R3只要收到要到达前缀X的分组,都按照R4→R3→R2→R1→X的路径最后到达前缀 X。

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

在实际的转发表中,“前缀匹配”项目都用CIDR 记法表示。由于路由器有两个以上的接口,因此“下一跳”项目用进入该路由器的接口的IP地址来表示。在讲解协议 BGP 的原理时,我们就用更简洁的符号来表示。

三、三种不同的自治系统 AS

在互联网中自治系统AS的数量非常之多,其连接图也是相当复杂的。但归纳起来,可以把 AS 划分为下图中所示的三大类,即末梢 AS(stub AS)穿越 AS(transit AS)对等AS(peering AS)
在这里插入图片描述

末梢 AS是比较小的AS(如图中的AS4,AS5和AS6),其特点是这些 AS 或者把分组发送给其直接连接的 AS,或者从其直接连接的AS接收分组,但不会把来自其他AS的分组再转发到另一个AS。末梢AS必须向所连接的AS付费才能发送或接收分组。图中链路旁边的人民币符号¥表示需要对转发分组付费。

末梢 AS也可以同时连接到两个或两个以上的AS(如上图中的AS、)。这种末梢 AS就称为多归属 AS(multihomed AS)。多归属 AS 可以增加连接的可靠性,因为若有一条连接出现故障,那么还有另一条连接可用。作为末梢AS的AS5不能把 AS5发送过来的分组转发到 AS3。同理,AS5也不能把 AS3发送过来的分组转发到AS2。这就是说,末梢 AS 不是穿越 AS,它不允许分组穿越自己的自治系统。末梢AS5也不能把(AS5→AS2→AS4),这样的BGP 路由信息通告给 AS3。如果 AS3有分组要转发给 AS4,可以通过对等 AS2转发,但不能通过末梢 AS5。

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

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

四、BGP的理由选择

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

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

  1. 本地偏好 LOCAL-PREF(LOCALPREFerence)值最高的路由要首先选择
    • 在BGP路由中的属性里面有一个选项叫作本地偏好,在属性中记为LOCAL-PREF。本地偏好也就是本地优先,“本地”的意思是指,从本 AS 开始的、到同一个前缀的不同 BGP路由中,挑选一个较好的(即偏好值最高的)路由。这可由路由器管理员或网络管理员根据政治上或经济上的策略来设置。
    • 但是,即使所有的通信量都通过这条高速链路,使得链路负荷过重,协议BGP也无法把一些负载调整到负载较轻的那条低速链路上。
    • 如果从几条 BGP路由中找不出本地偏好值最高的路由,则执行下一条。
  2. 选择具有 AS 跳数最少的路由
    反例:
    在这里插入图片描述
  3. 使用热士豆路由选择算法
    如果按前两种方法都无法选择最好的路由,那么就在要进入BGP路由的AS,执行热土豆路由选择算法。例如在下图中,从AS,出发,共有两条BGP路由可到达 AS3
  • BGP路由1:从R3离开AS1,然后进入 AS2,再到 AS3。
  • BGP路由2:从R4离开AS1,然后进入AS2,再到AS3。

在这里插入图片描述
假定这两条BGP路由的本地偏好相同,同时所经过的AS个数也相同。在这种情况下AS1中的每一个路由器,就应采用热土豆路由选择算法。

这种算法把分组比喻为烫手的热土豆,要尽快地转发出去。对于上图的例子,就是要使分组尽快离开AS1,而不考虑从哪个路由器离开AS1。或者说,要让分组经过最少的转发次数离开本AS。这时要使用内部网关协议(如协议 OSPF或RIP)。对于不同的路由器,得出的选择结果是不同的。

例如,对于AS1中的路由器R1,若要使转发的分组尽快离开AS1,应选择R作为其下一跳,因此应选择 BGP路由2。这样,R,的转发路径应当是:R1→R4→BGP路由1。
4. 选择路由器 BGP 标识符的数值最小的路由
当以上几种方法都无法找出最好的BGP路由时,就可使用BGP标识符来选择路由。在BGP进行交互的报文中,其首部有一4字节的字段,叫作BGP标识符,记为BGPID。这个字段被赋予一个无符号整数作为运行BGP的路由器的唯一标识符。具有多个接口的路由器有多个IP地址。BGPID就使用该路由器的IP地址中数值最大的一个。

五、BGP 的四种报文

四种报文:

  1. OPEN(打开)报文,用来与BGP连接对等端建立关系。
    OPEN 报文是两个路由器之间建立了TCP连接后接着就必须发送的报文。OPEN 报文的作用是相互识别对方,协商一些协议参数(如计时器的时间)。收到OPEN 报文的路由器就发回KEEPALIVE报文表示接受建立BGP连接。
  2. UPDATE(更新)报文,用来通告某一路由的信息,以及列出要撤销的路由。
    UPDATE报文是BGP协议的核心,用来撤销它以前曾经通知过的路由,或宣布增加新
    的路由。撤销路由可以一次撤销许多条,但增加新路由时,每个更新报文只能增加一条。
  3. KEEPALIVE(保活)报文,用来周期性地证实与对等端的连通性。
  • 虽然 BGP 连接的两端建立了TCP连接,传输报文是可靠的,但TCP 上层的 BGP 是否始终正常工作还无法确知。在对等端之间定期传送BGP路由表是不可取的,因为BGP路由表往往过于庞大,这样做会使网络的通信量过大。因此协议BGP采用的方法是让BGP连接的两个对等端之间,周期性地交换KEEPALIVE报文,以表示协议工作正常。KEEPALIVE报文只包含 BGP报文的通用首部(19字节长),因此不会在网络上产生多少开销。
  • 每个路由器都有一个保持时间计时器(Hold Timer)。路由器每收到一个 BGP 报文,这个计时器就重置一次,继续从0开始计时。如果在商定的保持时间内没有收到对等端发来的任何一种 BGP 报文,就认为对方已经不能工作了。发送KEEPALIVE 报文的时间间隔取为双方事先商定的保持时间(Hold Time)的1/3。例如,在BGP连接建立阶段,双方商定保持时间为180秒,那么KEEPALIVE报文就每隔60秒发送一次。如果两个对等端选择的保持时间不一致,就选择数值较小的一个作为彼此使用的保持时间。保持时间也可选择为0。在这种情况下就永远不发送KEEPALIVE报文,表明这条BGP连接总是正常工作的。
  1. NOTIFICATION(通知)报文,用来发送检测到的差错。

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

BGP 报文是作为TCP报文的数据部分来传送的(如图4-53所示)。四种类型的BGP报文具有同样的首部。

在这里插入图片描述

最近更新

  1. TCP协议是安全的吗?

    2024-05-03 12:46:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-03 12:46:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-03 12:46:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-03 12:46:02       20 阅读

热门阅读

  1. NFT是什么?有什么用途?

    2024-05-03 12:46:02       15 阅读
  2. 【Linux】理解 Ubuntu 中的 kill 和 killall 命令

    2024-05-03 12:46:02       14 阅读
  3. 微服务架构面试题(四)

    2024-05-03 12:46:02       16 阅读
  4. 忘记Docker中Gitlab的root密码

    2024-05-03 12:46:02       11 阅读
  5. 学习 Rust 的第十四天:如何使用HashMap

    2024-05-03 12:46:02       14 阅读
  6. 大话C语言:第4篇 关键字

    2024-05-03 12:46:02       15 阅读