哈工大计算机网络课程网络层协议详解之:BGP协议详解
在之前的网络层协议中,我们介绍了Internet网络两个自治系统内的路由协议:RIP协议和OSPF协议。这两个协议应该来说是自治系统内协议的两个代表性协议,前一个基于距离向量路由算法,后一个基于链路状态路由算法。
在这一节中,我们进一步介绍Internet网络作为一个层次化路由,在自治系统间采用什么样的路由协议。为此引入BGP协议。
Internet AS间路由协议:BGP
BGP协议:边界网关协议(Border Gateway Protocol)。BGP协议目前已经成为Internet网络中域间(自治系统间)路由协议标准。目前正在使用的是BGP4,也就是第四版的BGP协议。BGP协议也是将Internet“粘合”为一个整体的关键,也正是因为有了这样的协议,才使得能够在全球性的大规模的Internet网络中实现路由信息的分发。
BGP为每个AS提供了一种手段:
- eBGP:从邻居AS获取子网可达性信息。 即根据邻居连接的自治系统,到达哪些子网的信息。
- iBGP:向所有AS内部路由器传播子网可达性信息。
- 当把上述信息传播给自治系统内的每个路由器之后,每个路由器都可以基于可达性信息与策略,确定到达其他网络的最优路径。
有了BGP协议之后,事实上使得整个互联网中的任何一个子网,在互联网中有了这样一种途径或机制,能够让它在整个互联网中向其他子网通告自己的存在,告诉其他子网/网络如何将数据传输到它对应的子网中来。这也是BGP协议之所以重要和存在的意义和价值。
BGP协议基础
BGP会话(session)
BGP协议的内容和原理较为复杂,本节首先在这里介绍协议的基础概念,便于后续理解。
BGP会话(session): BGP协议的主要工作过程是通过在路由器之间,交换BGP报文来完成的。在两个BGP路由器(“Peers”)之间交换BGP报文的过程称为一个BGP会话。在完成BGP会话的过程中,两端的路由器在术语中被称为”Peer“,类似P2P应用中的”Peer“概念。事实上,是为了强调两个路由器间没有绝对的主次关系,而是对等的两方。
利用BGP的报文交换,从而实现:
-
一个BGP的Peer路由器可以向另一个路由器通告去往不同目的前缀(prefix) 的路径(“路径向量(path vector)“协议)。这里的前缀也就是CIRD地址中的用来表示网络地址前缀。在网络中,我们经常使用前缀来表示一个子网,或者是一个任意大的IP网络。
由于BGP协议交换的是一个子网层次的,或者说一个自治系统层次的目的地址,因此我们也成BGP协议是一个路径向量协议。因为它交换的是一个完整的自治系统路径。这跟我们之前介绍的自治系统内通告交换的距离向量或链路状态分组都是有差别的。在这些通告中,交换的是到达目的网络或路由器的最小费用路径,而BGP协议中通告是交换到达目的网络(自治系统)的一个完整的自治系统路径。
-
BGP协议的报文交换基于半永久的TCP连接。
说明BGP协议同RIP协议一样,也是应用进程来实现的。更进一步说,使用的是TCP的传输层协议,在两个路由器Peer间要交换BGP报文,需要先建立连接。由于BGP协议的特殊性,一个BGP会话的连接建立后,可能长时间不会拆除。因为有时我们也称BGP协议的连接是一个半永久的TCP连接。
BGP报文
BGP协议中定义了多种类型的报文,最典型的四种报文包括:
- OPEN报文:与Peer建立TCP连接,并认证发送方。
- UPDATE报文:更新路径,通告新路径(撤销原路径)。当一个Peer向另一个Peer通告可达性信息的时候,就可以利用UPDATE报文进行通告,比如告知对方通过哪一条路径到达哪一个子网。也可以用于撤销原路径,比如原先通告的路径可能因为各种问题无法连通了,撤销原先通告的路径。
- KEEPALIVE:在无UPDATE时,保活TCP连接;也用于对OPEN请求报文的确认。
- NOTIFICATION:报告之前报文的差错;也被用于关闭连接。
总结:BGP协议主要是通过建立TCP连接,建立BGP会话来交换BGP报文,从而完成网络可达性信息(网络前缀路径)的传输和交换。
下面以一个例子来介绍BGP协议过程:
假设当自治系统AS3通告一个前缀给自治系统AS1 时:
-
路由器3a会向路由器1c发送一个BGP报文,利用BGP报文来交换可达性信息。
-
当一个自治系统向另一个自治系统通告前缀可达性信息时,作为这个自治系统实际上做了一个承诺:即该自治系统(e.g. AS3)承诺可以将数据报转发给该子网。
-
AS3在通告中会聚合网络前缀。
由于BGP协议按层次路由的概念来说,属于最高层路由。因此,在网络前缀可达性信息通告过程中,会尽可能的进行路由聚合(会尽可能的把符合条件的网络前缀聚合在一起)。从而减少通告的报文量,节省带宽使用。
分发路径信息
事实上,作为BGP协议在分发路径信息时,会利用BGP会话来进行,而BGP会话按我们上面讲的进一步可以区分为外部会话和内部会话。
还是以上面图中为例
-
在3a和1c之间,建立的BGP会话,跨越了两个不同的自治系统,事实上是两个不同自治系统的网关路由器之间建立TCP连接,按照TCP连接会话的方式进行通信。这种会话方式就被称为外部会话。
-
在1c收到AS3发来的网络前缀可达性信息后,则可以利用iBGP向AS1内的所有路由器分发新的前缀可达性信息。
-
进一步,作为AS1内部的路由器,1b可以(也可能不)通过1b—2a的eBGP会话,向AS2通告新的可达性信息。
当路由器获取新的前缀可达性信息时,即在其转发表中新增加关于该前缀的入口(路由项)。
路径属性与BGP路由(route)
下面我们接着看一个BGP协议在通告路径时,都包含什么样的信息。
我们前面介绍过,通告时一定会包含网络前缀信息,通告给不同的自治系统到达目的网络所需要走的链路,并让其记录在转发表中。
实际上,除了上述的网络前缀信息之外,还包括BGP协议的一些属性。
- 前缀+属性 构成了BGP路由。
BGP协议定义了若干属性,比较重要的两个属性包括:
-
AS-PATH(AS路径):包含前缀通告所经过的AS序列:
这个AS路径信息表示,在通告到达某个前缀路径的时候,可能经过了一系列的AS自治系统。因此这个路径就包含了这些自治系统的序列。比如,这个AS序列: AS 67, AS 17,表示需要把数据发送到某一网络前缀路径时,需要先经过自治系统67,再经过自治系统17,然后就是到达目的自治系统。
-
NEXT-HOP(下一跳):开始一个AS-PATH的路由器接口,指向下一跳AS。
由于BGP协议是更高层次的协议,它所对应的维度是一个个的自治系统。因此,在BGP协议中,它的可达性信息中所表示的下一跳应该是一个自治系统,而不是路由器的概念。
比如下面这个例子,假设当路由器3a向路由器1c利用外部BGP会话,发送了一个前缀可达性信息,这里就包含了上述两个重要的属性:自治系统(AS)路径、下一跳AS。
因为从AS3发送的BGP报文可能经过了若干个自治系统才到达AS1,因此,AS-PATH包含了报文经过的所有自治系统路径:AS3、AS67、AS17…。
另一个重要信息下一跳,按我们上面介绍的,指向开始一个自治系统路径的路由器接口,比如这里AS3中路由器3a的发送接口11.11.1.1。
当AS1接收到前缀可达性信息后,还可能会继续向其相邻的自治系统中继续进行分发,以此类推。因此在BGP协议中,下一跳属性是非常重要的信息,因为假设存在多条路径可达目的子网时,下一跳属性就指明了每一次转发时下一跳应该具体走哪一条路径。
比如在图中的AS2,如果它向右侧的其他网络通告AS路径时,**通过2c和2b分发到达目的自治系统所对应的AS路径一定是相同的,但是两个通告的下一跳是不同的,路由器2c分发的是其路由器接口对应的IP地址,而2b则是其路由器接口对应的IP地址。**那么对于右侧的自治系统网络来说,最终选择2c还是2b,则对应了之前层次化路由中介绍过的,比如热土豆路由的方式来解决。
在介绍完上述BGP协议中的基本概念后,接下来深入介绍BGP协议如何再不同自治系统间进行路由选择的算法。
BGP路由选择
网关路由器收到对端网关路由的通告后,利用其输入策略(import policy)决策接受/拒绝该路由。这个输入策略重点就是要考虑策略问题:
- 比如,根据某个策略,从不将流量路由到AS x。那么当你的AS-PATH中包含了这个自治系统x,就拒绝采用通告的这个路由信息。
因此,基于BGP的路由算法实际上是一种基于策略(policy-based)的路由。 在BGP协议的策略约束中,实际上很多都是由网络管理人员设置的,这个设置有的时候是策略,策略可能是技术层面的策略,也可能是企业层面的政策问题,再上层也可能是国家的政策问题(比如通告的路由的自治系统路径包含了敌对国家的自治系统)。
当路由器利用BGP协议获取了到达某一目的AS的多条路由时,基于以下准则选择:
-
本地偏好(perference)值属性:策略决策(policy decision)。 比如在实际中会人为的为某些AS路径设置不同的偏好值,这个偏好值越大,代表选择的偏向性越高,反之亦然。这个偏好值也反映了BGP协议基于策略这样一个特性。
-
当偏好值没有或者相等的情况下,进一步会考虑最短AS-PATH路径。 也就是把数据送到目的网络所经过的最短自治系统个数。注意,这里的最短是自治系统个数,而不是经过的链路费用或者路由器个数。
-
另外一个准则是最近NEXT-HOP路由器:热土豆路由(hot phtato routing)。
比如在上一节中的例子,可能从某个自治系统的两个路由器发送后,后续经过的自治系统路径一定是相同的,此时应该选择从这两个路由器中的哪个发送呢?这个时候的准则就是选择到达下一跳路由器(也就是下一个自治系统网关路由器)越近,就选择哪一个内部路由器转发。
-
附加准则
接下来,通过一个示例观察BGP路由选择策略:
-
在BGP协议层面,以自治系统AS为粒度,因此上述网路的A、B、C都表示一个自治系统AS,这里表示提供商网络ISP的自治系统。
-
X、W、Y是客户网络(customer network/AS)。
-
W、Y是桩网络(stub network/AS):只与一个其他AS相连。这种网络的跨自治系统路由相对来说更加简单了,不需要更复杂的BGP路由选择。因为离开或进入自治系统完全只能走一个接口,因此可能使用一个静态的路由配置就完成了。
-
X是双宿网络(dual-homed network/AS):连接两个其他AS。
作为客户自治系统,与运营商ISP自治系统最大区别在于,客户自治系统通常都不提供过路流量的传输。换句话说,如果数据报的目的地址不是在客户自治系统的内部网络的,而是需要做路由转发操作,实际上客户网络是不会这样做的。只有运营商的网络才提供这种路由转发服务。
在上述例子中,客户网络X是不提供经过它来路由B到C的流量。因为,网络X不会向B通告任何一条到达网络C的路由。
现在假设网络A向网络B通告一条路径:经过自治系统A可以将数据发送到自治系统W,AS-PATH为:AW。
作为网络B,由于X是B的客户网络,所以它会把这个路径可达性信息进一步转发给网络X, 此时的AS-PATH为:BAW。
那么,此时存在的问题是:网络B是否应该向C通告路径BAW呢?
BGP协议作为自治系统间的路由协议,事实上,运营商之间如何去交换网络可达性路径信息,其实并没有一个法律或是标准来完全约束。但是有一些通常大家遵循的基本原则:
- 作为任何一个网络提供商,它提供路由的时候,只为它的客户网络提供服务。
在这种原则下,由于网络C和网络W均不是网络B的客户,网络B路由CBAW的流量没有任何收益,因此便不会把路由信息:CBAW通告给网络C。
In a word,在自治系统间路由时遵循的一个基本原则是:提供商网络通常只为它的客户网络提供路由服务。
对于网络B来说,它的客户是网络X,因此只有到达或离开网络X的流量,才会为其提供路由服务。在这样的原则下也意味着,网络B不把BAW的路径信息通告给网络C,从而强制网络C只能把数据路由给A在路由到目的网络W。
为什么采用不同的AS内与AS间路由协议?
最后,我们再总结归纳一下,在介绍了诸如RIP协议、OSPF协议、BGP协议之后,为什么在Internet网路中要根据不同的层次采用不同的路由协议?这样的好处是什么?
自治系统内的路由和自治系统间的路由其实主要从这几个方面考虑:
- 策略(policy)
- inter-AS:在自治系统间期望能够管理控制流量如何被路由,以及确定哪些路由可以经过其网络等。这些信息都很难单独利用一个算法来计算。
- intra-AS:在自治系统内期望能够对路由信息进行单一管理,无需策略决策。
- 规模(scale)
- 从规模角度来说,层次化路由也是必须的。层次路由将网络划分不同的自治系统,从而缩小了路由算法计算路由信息时的规模,节省路由表大小,较少路由更新流量,也省了带宽消耗。
- 基于层次化路由的策略,可以适应大规模互联网。
- 性能(performance)
- intra-AS:在自治系统内部侧重性能,因为没有不同自治系统间的差异。
- inter-AS:策略主导。
小结
实际上BGP协议是一个非常复杂的协议,我们上述讲解的也只是BGP协议中非常基本的概念和逻辑,作为初步的了解。如果想深入研究里面的算法和思想,需要更进一步的参阅相关书籍。