目 录
第一章 概 述 2
第二章 BGP协议基础 3
2.1 需求之一—路由传播 3
2.2 需求之二—下一跳问题 5
2.3 需求之三—自环问题 7
2.4 需求之四—ISP内部连接 9
2.5 需求之五—出口流量控制(一) 11
2.6 需求之五—出口流量控制(二) 13
2.7 路由选择分析 14
2.7.1 下一跳可达与路由选择 14
2.7.2 本地优先与路由选择 16
2.7.3 AS-PATH属性与路由选择 16
2.7.4 MED属性与路由选择 16
2.8 总结 17
第三章 BGP协议高级特性及MBGP 19
3.1 BGP团体属性和扩展团体属性 19
3.2 BGP多协议扩展(MBGP) 21
第四章 总结 23
要害词:
BGP,本地优先属性,MED,AS-PATH,下一跳属性,BGP多协议扩展(MBGP),团体属性,扩展团体属性,MP_REACH_NLRI
缩略语:
BGP:Border Gateway Protocol,边界网关协议
MBGP:Multi-Protocol Border Gateway Protocol,BGP多协议扩展
MPLS:Multi-Protocol Label Switch,多协议标记交换
VPN:Virtual Private Network,虚拟私有网络
MP_REACH_NLRI:多协议网络层可达信息
内容提要:
本文根据实际中的需求介绍了BGP的一些基础概念,包括BGP对等体,BGP属性等,重点介绍了下一跳,MED,本地优先和AS-PATH等重要属性,在第三?薪樯芰薆GP的团体属性和扩展团体属性,并介绍了BGP的多协议扩展,正是多协议扩展BGP在现在的MPLS-VPN,QOS等技术中得到了广泛应用。本文的目的是让读者在最快的时间内把握BGP,并应用到实践中
第一章 概 述
随着宽带网络技术和数据通信技术的不断融合,宽带网络设备也逐渐引入各种各样的数据通信技术,比如,MPLS,MPLS-VPN,Multicast,QoS等,这些技术有一个共同的特点,就是需要边界网关路由协议(BGP)的支持,利用BGP丰富的属性来传递自己的信息。
这些技术目前来说却如火如荼,不论是电信运营商还是普通网络用户,都表现出了很大的热情,都在大张旗鼓的建设以这些技术为平台的城域网络。暂且不管这些技术到底有没有传说中的完善,既然客户有这样高的热情,我们作为网络设备运营商,也完全有必要跟随市场,来给用户提供全套的解决方案,这样我们必须尽快的熟悉这些技术并附注应用。
当然,在不熟悉动态路由协议,尤其是BGP的情况下,学习好这些新技术是不可能的,为了帮助读者尽快的了解和把握动态路由协议,尤其是BGP协议,我们写了这篇文章,该文章使用一种比较通俗的方式来讲述BGP,目标是让有一定路由基础而又对BGP不熟悉的读者,在最快的时间内把握BGP。
在阅读本文的时候,建议读者有耐心并有信心,相信大多数有耐心的读者读完本文后,都会明白BGP到底是怎么一回事,而且从根本上了解了BGP的运行原理和使用场合。本文还有一个特点就是,对BGP的介绍不是局限在传统的BGP4路由协议上,在介绍BGP4路由协议的基础上,同时也介绍了BGP扩展(MBGP),这正是在MPLS-VPN,Multicast等技术中大量使用的协议。
在本文的后边给出了一些建议的读物。读者在把握本文概念的基础上,阅读后边建议的文章可以加深对BGP的理解,并扩展自己的视野。
第二章 BGP协议基础
从本章开始,我们从一系列实际需求出发来介绍一些基础的概念,在本文中,我们没有介绍BGP,而是根据实际需求对RIP协议逐步进行改造,在完成本文的叙述后,RIP就被我们改造成了BGP协议。所以,只要读者把握了本文介绍的每个实际需求及根据该需求的改造结果,就已经把握了BGP的一个特性。
2.1 需求之一—路由传播
现在我们提出一个需求:两个ISP通过一条高速POS链路连接起来,这两个ISP想把各自的路由通知给对方。如下图所示:
图中ISP1的路由器RT1知道ISP1的所有路由,而ISP2的边界路由器RT2知道ISP2的所有路由,当然,这两个路由器是通过IGP路由协议,比如OSPF完成这一点的。
假设没有BGP,我们怎样解决这个问题呢?
实际上,解决这个问题的方案很多,这里我们使用这样一种解决方式:让RT1和RT2运行RIP2协议,而且仅仅在RT1和RT2互连的POS接口上运行,在RT1和RT2上分别把ISP1的路由和ISP2的路由引入RIP。这样RIP进程就每隔三秒种,把自己的路由表通告给对方一次,互相学习之后,两个ISP的边界路由器RT1和RT2就知道了对方的路由,这样在RT1和RT2上再把RIP路由引入到两个ISP运行的IGP协议即可。
可见,在这里我们使用RIP解决了两个ISP的路由传播问题,但有一个严重的缺陷:默认情况下,RIP每隔三秒钟把自己的路由表通告一遍,这样假如两个ISP的路由表非常大(达到100000条),完成这个通告的过程也需要不止三秒的时间,这样整个POS链路就完全为RIP通告服务,而不能转发其他数据了。
为了解决这个问题,我们对RIP协议做如下改造:
1、去掉RIP的每三秒通告一次路由表的规则;
2、引入增量通告规则,即假如路由没有变化,则不发任何通告,一旦路由有变化,则按照下列规则进行:假如是路由增加,则通告给对方增加的路由,假如是路由删除,则通告给对方删除的路由,假如是路由修改(比如修改了下一跳等),则首先通告一个路由删除,再通告一个路由增加。
这样改进之后,只要路由表不进行大的改变,整个POS链路上就会很平静。
细心的读者可能会发现另外一个问题:开始的时候,ISP1和ISP2的两个边界路由器必须有一个同步的过程,也就是说,两个边界路由器RT1和RT2刚开始建立邻居关系的时候,需要把自己的整个路由表传输给对方。而传统的RIP协议是使用UDP作为自己的传输协议的,这个协议的最大缺点就是不可靠,不适合传输大量的数据。所以我们为了传输庞大的路由表,可以考虑使用其他的传输协议,当然,最轻易想到的就是TCP协议。
于是,我们再对RIP进行改进:把用于传输的协议由UDP改为TCP。这样改进之后,RIP使用的发现和维护邻居的机制也应该改变(RIP使用HELLO报文来发现和维护邻居),我们可以这样考虑:
1、因为要建立TCP连接,所以ISP两端的路由器必须知道对方的IP地址,我们通过静态配置的方式告知路由器;
2、ISP边界路由器知道对方的IP地址后,就可以尝试跟对方建立连接了,假如连接不能建立,说明对方还未激活,于是会等待一段时间再进行连接的建立,这个过程一直重复,直到连接建立;
3、假如TCP连接建立起来,两端的设备必须交换某些数据以确认对方的能力或确定自己下一步的行动,即所谓的能力交互。这个过程是必须的,因为任何支持IP 协议栈的设备都支持TCP连接的建立,而不是每个支持IP协议栈的设备都支持我们扩展的RIP协议,所以我们必须在该TCP连接上进行确认;
4、确认了对方支持我们扩展的RIP协议后,我们就可以进行路由表的同步了。因为TCP是基于数据流传输服务的,所以设备一次可以传输大量的数据给对方,而不用担心数据的丢失(因为有TCP机制保证);
5、两端路由表同步完成之后,并不是立即拆除这个连接,因为以后假如有路由表改变了,需要重新进行同步(注重,这里是增量同步),假如把这个TCP连接给拆除了,以后同步的时候必须重新建立,这样需要消耗很多资源,假如利用保持的TCP连接,就可以不用重新建立连接而马上进行数据的传输;
6、我们称建立连接的两台设备互为对等体(PEER),因为这两个设备是跨越ISP的,所以我们称为外部对等体,以后会出现内部对等体的概念。为了确保两头设备的扩展RIP进程都在存活,我们要求两端的设备周期性的通过该TCP连接发送HELLO消息,以向对方确认自己还存活;
7、假如一端设备在一个存活超时的时间内没有接收到对方的HELLO消息,则认为对方已经停止运行RIP进程,于是拆除该TCP连接,并把从对方接收到的路由全部删除。
这样的改进之后,完成路由表的传递这个任务已经超超有余了,并且还可以做到对路由表的简单维护(比如当认为对方RIP进程停止后,就删除从对方接收到的路由表)。
& 本部分有下列要点:
1、为了避免经常性的大量数据传输,我们去除了RIP协议中周期发送整个路由表的机制,引入了增量机制;
2、为了克服UDP协议的不可靠传输,我们改变了RIP的传输协议,改用TCP,而且引入了邻居维护机制(在TCP协议上传输HELLO报文)和路由表维护机制(当判定外部对等体DOWN掉之后,删除从该对等体获得的路由表)。
2.2 需求之二—下一跳问题
在上一部分中,我们对RIP做了改造,使之很适合传播大量的路由,但这样的改造又产生了一些问题,首先是下一跳的确定问题,请看下面的网络图形:
在这个图形中,三个路由器RT1,RT2和RT3通过广播式的网络(在该图中是以太网)连接起来,其中RT1和RT2之间建立了我们上面介绍的扩展RIP TCP连接,RT2和RT3之间也建立了该连接,这样RT2会从RT3学习到路由,并且把学习到的路由通告给RT1,这时候,根据RIP协议的规则,RT1会把RT2作为到到RT3上路由的下一跳,但实际情况是,RT1只要直接把RT3作为下一跳即可,因为这是个广播网络,而假如把RT2作为下一跳,理论上是没有任何问题的,因为RT2还是要把数据报递交给RT3,但这样会浪费RT2很多资源。能不能想个办法,让RT1直接把RT3作为他的下一跳呢?
解决的办法也有很多,在这里我们这样解决:
1、在路由器上,给每条通告的路由附加上一个IP地址值,该地址值指出了通往该路由的下一跳;
2、一般情况下,路由器在向外通告自己的路由的时候,把下一跳改写为向外通告的接口的IP地址,但假如通过的路由的原来的下一跳跟自己往外通告的接口位于同一个广播网络,则不修改下一跳,而直接发送出去。
引入这样的规则后,上面图中的问题便解决了:RT2从RT3接收到的路由的下一跳是RT3的连接广播网络的端口,而当RT2在把从RT3获得的路由通告给RT1的时候,RT2判定出口的IP地址跟通告的路由位于同一个广播网络(通过IP地址判定),则不修改下一跳,直接把这些路由通告给RT1。需要注重的是,RT2在向RT1通告不是从RT3获得的路由的时候,还是要把路由的下一跳修改为自己通告的接口。
在大多数情况下,这样的处理是合适的,但有些情况就不适合,比如下面的网络:
RT1,RT2和RT3通过一种叫做NBMA(非广播多路访问,典型的如ATM,帧中继等)的网络连接起来,这时候,RT1和RT2之间,以及RT2和RT3之间建立了PVC,而RT1和RT3之间没有建立PVC,在这样的情况下,假如RT2再进行刚才的动作,在向RT1通告从RT3获得的路由的时候,不修改下一跳,这样RT1就会把下一跳当成RT3,问题产生了:RT3和RT1之间根本没有PVC,所以RT1和RT3之间根本没法通信,这样必然会阻断一部分数据流量。
为了解决这个情况,我们采取一种折中的方案:默认情况下,按照开始提出的规则,即假如通告的路由的下一跳跟通告的接口位于同一个三层网段,则不修改下一跳,但提供一个配置命令,这个配置命令强制路由器修改下一跳为通告的接口,而不管通告的路由的下一跳是什么。
采用这种方案,我们就可以适应任何网络了:在广播网络中,我们不需任何配置,路由器根据实际情况修改下一跳,在非全连通的NBMA网络(注重是非全连通的,全连通的情况下不会产生该问题)中,我们可以通过配置命令强制路由器修改下一跳为通告接口。
到此为止,我们已经很完善的解决了下一跳问题,我们在解决该问题的时候,给通告的每条路由都附加了一个数据:下一跳的IP地址。这样在通告路由的时候,必须按照下面的格式:
{IP网络号,掩码位数,下一跳IP地址...}
我们之所以在下一跳IP地址后边加了一个省略号,是因为在后面的时候,我们还要在通告的每条路由后边添加其他的数据。为了方便,我们把添加的这些为解决某些问题的数据称为属性。在这里我们第一次引入了属性的概念,读者一定要理解,因为在BGP中,不论怎样强调属性的概念都不过分。记住,属性就是跟路由束缚在一起的一些数据,这些数据为了解决某些问题(比如下一跳等)。
引入属性的概念后,我们就可以把解决下一跳问题而跟路由束缚在一起的这个下一跳称为下一跳属性。
& 本部分有下列要点:
1、为了解决下一跳问题,我们引入属性的概念,并在通告路由的时候附加下一跳属性;
2、一般情况下,路由器在通告路由的时候,根据实际情况修改下一跳(主要是看通告的接口的IP地址是不是跟通告的路由的下一跳位于同一个网络,假如是,则不修改下一跳,否则把下一跳修改为通告的接口),但为了适应某些非凡的情况,比如非全连接的NBMA网络,我们引入一个命令,该配置命令强迫路由器修改下一跳为自己;
3、一定要把握本部分介绍的属性的概念,并足够重视这个概念(在BGP中,不论怎样重视这个概念都不过分)。
2.3 需求之三—自环问题
在RIP协议中,最大的一个问题就是自环问题,为了解决该问题,引入了许多机制,比如毒性逆转,水平分割,抑制时间,最大跳数等,这些机制只能部分的解决自环问题,而不能从根本上避免自环问题。当我们把RIP进行扩展,来传播ISP之间的路由的时候,这个自环问题依然存在,但在这样高端的场合,部分解决自环问题不是我们需要的。我们必须寻找合适的办法来从根本上解决自环问题。
首先看一下在我们的扩展RIP协议中,自环是怎样产生的,如下面的图形所示:
三个ISP通过三台高端路由器进行三角形连接,三台路由器两两之间都建立我们这里的扩展RIP连接。假设在ISP1中有一条路由192.168.16.0/24,RT1把该路由通告给了RT3,RT3又通告给了RT2,RT2重新通告给RT1。这时候假如由于某种原因,192.168.16.0/24路由在RT1中消失了,RT1会重新安装从RT2获得的路由。这样环路就产生了:在RT3中,192.168.16.0/24的下一跳是RT1,在RT2中,192.168.16.0/24的下一跳是RT3,在RT1中,192.168.16.0/24的下一跳是RT2。
可以看出,路由自环发生的根本原因就是192.168.16.0/24这条路由的起源和经过的ISP是不明确的。假设我们给192.168.16.0/24路由附加一系列数值,这些数值反映了该条路由经过的每个ISP,这样就不会有自环了:假设在RT1上,为该路由附加一个起始数值,该数值代表ISP1,然后通告给RT3,在RT3望外通告给路由的时候,在原来的基础上再加上一个数值,该数值代表ISP3,然后通告给ISP2,同样的道理,RT2通告给RT1的时候,也附加上一个针对ISP2的数值。这样当RT1接收到192.168.16.0/24这条路由后,检查附加的代表具体ISP的数值列表,假如在列表中发现了自己,则不接收该路由。
很明显,我们附加在路由上面的代表具体ISP的数值就是AS号,因为AS号唯一区别了一个ISP(可以简单的这样认为)。这样在通告路由的时候,就应该按照下列格式:
{IP网络号,掩码位数,下一跳IP地址,{起始AS号,经过的AS1,经过的AS2,。。。},。。。}
可以看出,我们附加的这些AS号也是作为路由属性出现的,该属性反映了路由经过的AS,也就是到达起始AS经过的AS路径,所以叫做AS-PATH属性。
& 本部分有下列要点:
1、为了从根本上解决路由自环问题,我们引如AS-PATH属性的概念,在通告的每条路由上,都附加AS-PATH属性,假如接收到该路由的路由器发现自己所在的AS号出现在AS-PATH属性列表中,则拒绝接收该路由。
2.4 需求之四—ISP内部连接
在上面我们介绍的都是跨越ISP来传递路由的情况,而把每个ISP看做一个黑盒子,下面我们将揭开这个黑盒子,看一看其中的秘密。
首先一个问题就是怎样把从其他ISP获得的路由通告给ISP内部路由器。通常情况是,ISP通过几台高端路由器组成一个核心网络,在该核心网络的边缘连接一些会聚路由器,来完成专线接入向核心层的会聚,如下面图形所示:
在这个例子中,核心路由器CR1通过高速链路连接其他ISP,通过我们扩展的RIP协议来从其它ISP获得路由,并把自己的内部路由通告给其他ISP。按照我们上面讨论的结果,CR1上已经从其他的ISP获得了大量的路由(这些路由的数目可能非常大,在INTERNET上达到10万条),这时候,CR1要通过某种方式把这些获得的路由通告给同是核心路由器的CR2和CR3。
很明显,我们也选择扩展RIP协议进行完成该任务。这时候,就需要CR1和CR2,CR1和CR3分别建立TCP连接,并协商自己的能力,完毕后开始传输路由,传输完毕后,并不拆除该TCP连接,而是继续保持为后来使用,并不停的周期性的相互发送HELLO报文来确保对方存活。这些过程跟前面介绍的相同。但上面介绍的一个问题出来了,就是AS-PATH属性(正是这个属性的存在才使得自环得以从根本上避免)的改写问题。
按照我们的假设,路由器在把路由通告给其他邻居的时候,需要把自己所在的AS系统号追加在通告的路由后边,但在ISP内部(AS内部),所有路由器都属于同样的AS,假如通告的时候再把自己所在的AS号加上,则当接收路由器接收到该路由后,会发现自己的AS号已经出现在AS-PATH属性里面,于是丢弃该路由。所以我们在通告路由给AS系统内部的邻居的时候,必须不修改AS-PATH属性。
而假如不修改AS-PATH属性,自环又可能发生了。为了解决这个矛盾,我们再研究一下自环产生的原因,如下所示:
假设RT1的一条路由通告给RT3,RT3又通告给RT2,而RT2重新通告给RT1,这样往返通告就轻易产生自环。假如 我们引入这样一条规则:
路由器从AS内部邻居接收的路由永远不通告给AS内部邻居路由器。
这样当RT3接收到RT1的路由后,就把这些路由保存下来供自己使用,而不会再通告给其他设备,假如RT2想获得RT1的路由,唯一的办法就是跟RT1建立TCP连接来获得。这样做路由自环就避免了。
还可以看出,在这条规则的约束下,假如AS内部路由器想获得任何其它一台路由器的路由,唯一的办法就是跟其他路由器建立邻居关系来获得路由。因此,要达到路由的同步,在AS内部运行RIP协议扩展的路由器必须两两之间建立TCP连接,反映在整个网络上就是运行扩展RIP协议的路由器之间建立全网状连接。
引入这个约束后,即使不携带AS-PATH属性,路由在AS内部的自环也解决了。但引入了这样一条规则后,又出现了一个概念:内部对等体。
所谓内部对等体,就是AS内部运行扩展RIP协议并建立TCP连接的路由器两两之间的一种关系。而前面介绍的外部对等体,却是AS之间运行扩展RIP协议并建立TCP连接的路由器两两之间的一种关系。
在这条规则的约束下,要求AS内部扩展RIP协议对等体之间必须建立全网状的TCP连接。
& 本部分有下列要点:
1、在AS内部,我们的扩展RIP在通告路由的时候并不修改AS-PATH属性,这样为了避免自环,我们严格限制AS内部路由器从内部对等体获得的路由不向任何内部对等体通告(但可以向外部对等体通告),这样为了达到整个AS内路由的同步,要求AS内所有运行扩展RIP协议的路由器建立全网状连接。
到此为止,我们已经介绍了外部对等体和内部对等体,下一跳属性,AS-PATH属性等概念,在以后的介绍中我们将直接引用这些概念,希望没弄明白这些概念的读者再回过头去看一下这些概念的含义和产生的背景。在没弄明白这些概念的情况下,看后面的内容将很困难。
2.5 需求之五—出口流量控制(一)
在某些情况下,一个ISP可能通过两条高速链路连接两个大的ISP作为自己到INTERNET的出口,如下图所示:
在这种情况下,ISP0怎样把流量均衡的分布在到ISP1和ISP2的链路上就是一个问题。假设INTERNET上有这样两条路由:210.52.83.0/24(在后面的介绍中以83代表)和210.52.82.0/24(在后面的介绍中以82代表),我们的目标是使到网络83的流量分布在到ISP1的链路上,而到网络82的流量分布在到ISP2的链路上。
分析ISP0内部网络结构,RT3,RT4和RT5之间分别两两建立TCP连接来构成扩展RIP内部对等体关系,而RT3和RT4分别和位于ISP1和ISP2的路由器建立扩展RIP外部对等体关系。这样路由器RT3和RT4都会从自己的外部对等体连接中接收到82和83这两条路由,而且RT3和RT4也会通过内部对等体关系从对方获得82和83这两条路由。由此可以看出,RT3和RT4分别有两个来源获得82和83路由,这样我们要达到上述要求,只需要在RT3和RT4上忽略适当的来源即可。
假设我们在RT3路由器上只安装从外部对等体获得的82路由,而忽略83路由,只安装从内部对等体RT4获得的83路由,而忽略82路由,同样的道理,在RT4上我们只安装从外部对等体获得的83路由,忽略从外部对等体获得的82路由,只安装从内部对等体RT3获得的83路由,而忽略82路由,这样就可以达到要求了。
那么我们怎样做到这一点呢?答案还是给路由附加适当的属性。在这里,我们给路由附加一种称为本地优先(LOCAL-PREF)的属性,增加了这种属性后,假如路由器接收到了同样的一条路由,则根据本地优先属性来选择安装哪条路由(所谓安装,就是选择合适的路由并加入路由表,作为转发数据之用)。
引入这个属性后,在RT3上,当从ISP2获得路由82和83的时候,给83赋予本地优先属性100,而给82赋予本地优先属性50,同样的道理,在RT4上,当从ISP2获得路由82和83的时候,给82赋予本地优先属性100而给82赋予本地优先属性50。这样本地优先属性会跟其它属性(比如下一跳,AS-PATH)一起传输给其他内部对等体,这样当其他内部对等体假如从两个地方接收到了同一条路由,则首先选择本地优先数值高的安装。
由此可见,引入本地优先属性后,上面的问题解决了,但读者可能还有一个疑点,那就是从外部对等体来的路由其本地优先属性怎么设置。在这里我们需要注重的是,本地优先属性只对AS内部有效(即仅仅对内部对等体有效),假如跨越了AS,则本地优先属性一律设置为0,由此可以看出,在路由器通过外部对等体连接把路由通告出去的时候,首先把本地优先属性清空。
& 本部分有下列要点:
1、在多出口的情况下,为了控制流量通过哪条出口链路出去,我们引入了本地优先的概念,仔细体会本地优先的含义,它是在AS内部控制路由选择的,而当把路由通过外部对等体连接通告的时候,本地优先清空。
2.6 需求之五—出口流量控制(二)
前面介绍的本地优先属性用于控制数据流怎样出AS,有些情况下,AS需要控制数据流怎样进入本AS,举一个例子:
在这个网络中,ISP1通过两条上行链路连接ISP2的两个不同的路由器,假设在ISP2中有这样两个网络: 210.52.83.0/24(在后面的介绍中以83代表)和210.52.82.0/24(在后面的介绍中以82代表),这两个网络都通过我们引入的扩展RIP协议通告给了ISP1的边界路由器RT3。这时候,ISP2的治理者想达到这样一个目的:从ISP1来的到82的数据流通过RT2路由器到达,而从ISP1来的到83的数据流通过RT1到达。可以看出,跟前面在AS内部控制数据流的出口不同的是,我们需要在AS内部控制数据流怎样流入该ISP。
跟前面的思路相同,我们还是给通告的路由一种标记,这种当对端接收到同一条路由的时候,根据该标记决定选择哪条路由。按照这个思想,我们这样解决:
1、在ISP2的边界路由器RT1上,当向外发布路由82和83的时候,给83打上标记100,而给82打上标记50;
2、在ISP2的边界路由器RT2上,当向外发布路由82和83的时候,给82打上标记100而给83打上标记50;
3、当ISP1路由器RT3通过外部对等体连接分别从RT1和RT2获得同样的路由时,会选择RT1作为83的下一跳而选择RT2作为82的下一跳。
这种标记我们也以属性的方式实现,在实现中这个标记是一个整数,数值越大,在选择中越有优势,我们称这种标记为MED(外部度量)。可以看出,跟本地优先不同的是,MED控制流量怎样进入AS,而本地优先则控制流量怎样流出AS。请认真体会这两个属性的差异。
在这里我们对本地优先属性和MED属性做一个对比:
1、本地优先是在AS内部控制流量怎样流出AS,而MED属性则是控制流量怎样进入AS;
2、本地优先只在AS内部有效,在通过外部对等体通告路由的时候,本地优先被过滤掉,而MED属性则只在外部对等体关系中有效,在内部对等体之间通告路由的时候,MED属性被忽略掉。
& 本部分有下列要点:
1、引入MED属性来控制数据流从哪个入口流入AS,注重跟本地优先属性进行比较。
2.7 路由选择分析
细心的读者一定有一个问题:在路由器通过不同的连接接收到同一条路由的时候,该怎样选择呢?按照上面我们介绍的本地优先和MED属性的概念,这两个因素是选择的时候需要考虑的,但却不是唯一要考虑的。实际上,在进行路由选择的时候,是按照下列顺序进行的:
2.7.1 下一跳可达与路由选择
在这里,我们首先引入一个重要规则:
路由器通过内部对等体连接向外通告路由的时候,是不修改下一跳信息的,但可以通过命令强行使路由器更改下一跳为自己。而通过外部对等体连接向外通告路由的时候,默认情况下是修改下一跳信息,除非通过命令更改了这种默认的行为(这在上面的小节中曾经讲过)。引入这样的规则后,问题就产生了,如下图所示:
在这个网络中,两个ISP的边界路由器通过我们扩展的RIP协议连接起来,并互相发布路由。在RT1上,也同RT2路由器建立了内部对等体连接。这样,根据前面我们给出的规则,RT1在接收到从RT3来的路由后,会直接传送给RT2而不对下一跳进行修改。这样假如RT2上没有到RT1和RT3之间网络的路由,也就是说,假如RT2不知道怎么到达RT3,问题就产生了:RT2收到了一条下一跳不可达的路由。这时候RT2就会把它丢弃。
所以我们在使用扩展RIP协议进行网络互连并传播路由的时候,一定要确保接收路由的下一跳是可达的。在本例中,我们可以这样解决:在RT2上增加到RT1和RT3之间网络的静态路由(或干脆通过动态路由协议把这个网络分发到RT1所在ISP中),这样RT2在从RT1获得RT3的路由后,会发现下一跳是可达的,于是会接收该路由。
因此,扩展RIP在进行路由选择的时候,下一跳可达是第一个要判定的条件,假如下一跳不可达,则直接丢弃,否则继续看下面的条件。
2.7.2 本地优先与路由选择
运行扩展RIP协议的路由器假如接收到了同样的路由,它会首先判定这些路由的下一跳是否可达,首先丢弃不可达的路由,假如还有多条相同的路由,则选择本地优先最大的路由,丢弃其他路由。
2.7.3 AS-PATH属性与路由选择
在上面的小节中,我们介绍了AS-PATH属性,这个属性是用来避免路由自环的,但这个属性也从侧面反映了路由经过的AS数目,可以看出,假如路由经过的AS数目越多,则说明到达该路由代表的网络距离越远,因此,我们可以把AS-PATH属性也作为一种路由选择的参考依据。在选择路由的时候,假如有两条以上相同的路由,则AS-PATH属性也是打破僵局的参考依据,AS-PATH向量元素越少(经过的AS数目越少)的路由优先选中。
2.7.4 MED属性与路由选择
在上面我们介绍了MED属性,该属性是控制外部流量按照怎样的路径流入AS的。在这里,这个属性也成为路由选择的标志。假如两条同样的路由,一条路由的MED属性值大而另外一条的MED属性值小,则属性值小的路由优先选中。
总之,路由选择是在发生路由冲突的时候发生的,所谓路由冲突,就是一台路由器从两个以上的路由器接收到了同一条路由。这个时候路由器必须决定选择哪条路由安装在自己的路由表中。以上介绍的选择依据仅仅是一部分,还有其他一些,读者可以参考其他资料。
& 在外部网关路由协议中,路由的选择是依据属性进行的,下面是选择的依据以及其顺序:
1、首先丢弃下一跳不可达的路由;
2、选择本地优先属性值最高的路由;
3、选择本地路由始发的路由;
4、选择AS-PATH向量元素数目最小的路由;
5、选择起点类型最低的路由;
6、选择MED值最低的路由;
7、选择从外部对等体获得的路由;
8、选择到路由下一跳最近的路由(以IGP度量为标准);
9、选择ROUTER ID最低的路由器通告的路由。
这些属性本文仅仅介绍了一部分,其他属性请参考相关书籍。
2.8 总结
在上面的部分中,我们结合实际中的一些需求对RIP协议进行了一些扩展,主要集中在下列方面:
1、引入增量路由更新,去除RIP的周期更新;
2、改用TCP来代替RIP原来的传输协议,并引入邻居维护机制;
3、引入下一跳属性来解决下一跳问题;
4、引入AS-PATH属性来解决路由环路问题;
5、为了适应AS内部和AS之间的不同情况,引入内部对等体和外部对等体的概念;
6、引入本地优先属性来解决AS内外出流量分布问题;
7、引入MED属性解决AS外进入流量分布问题;
8、以属性为依据来解决路由选择问题。
其实,这些对RIP的扩展正是BGP协议所具有的精髓部分,尤其是通过增加属性来解决问题。到此为止,我们扩展的RIP协议就是传统的BGP路由协议,只要读者把握了上面介绍的这些内容,尤其是属性的本质,那么,恭喜您,您已经从根本上把握BGP了。
第三章 BGP协议高级特性及MBGP
在本章里,我们在前面讨论的基础上,来看一些BGP协议的高级特性,包括团体属性(COMMUNITY),扩展团体属性(EXTEND COMMUNITY),BGP的多协议扩展,以及多协议扩展在MPLS-VPN中的应用。这些高级特性是建立在前面介绍的概念的基础上的,在没有把握前面概念的情况下,看这部分内容将是很艰难的,所以假如读者觉得还没有把握前面的概念,建议把第二章内容再复习一遍。
3.1 BGP团体属性和扩展团体属性
在前面我们介绍了BGP协议的下一跳,AS-PATH,本地优先和MED等属性,这些属性都有一个特定的目的,比如本地优先属性用于在AS内部控制流量怎样流出AS,而MED属性则是在AS内部控制数据流量怎样进入AS,这两个属性都是在AS有多条出口链路或多条入口链路的情况下使用的。有关这两个属性,还有一个缺点就是,他们在跨越多个AS的时候是不起作用的,比如本地优先属性,当通过外部对等体连接向外发布的时候,该属性被清空,而MED属性也仅仅发生在两个AS之间的路由 传播上。
但在有些情况下,我们希望实现跨越多个AS的路由策略,举一个例子,如下图所示:
三个AS(ISP)联合起来,共同提供INTERNET和专线租用服务。这三个AS都提供这样三种服务:金牌服务,银牌服务和普通服务。所谓金牌服务,就是提供最高的质量保证,但费用最高,银牌服务的服务质量次之,普通的服务就是通常的无服务质量要求的IP服务,即所谓的BEST EFFORT。假设一个客户接入AS100,申请了金牌服务,这时候ISP会分给该客户一个IP地址网段。现在的问题是,怎样在这三个AS内部对这个客户发出的数据流量进行调度,使之达到规定的服务质量。
我们可以这样做:
1、这三个AS通过外EBGP(外部BGP对等体连接)连接起来,如上面的图中所示;
2、客户接入的AS(假设为AS10)在向AS20通告客户的路由时,把该路由上附加一种非凡的标记,这种标记是三个AS事先约定好的;
3、AS20在接收到从AS10发送过来的路由后,会查看该路由携带什么样的标记,假如携带的标记表示该路由需要金牌服务,则该AS内部路由器会对这些路由进行非凡处理;
4、AS20在完成自己的处理后,重新把这些带标记的路由分发给AS30,AS30内的路由器也会进行跟AS20一样的处理。
在BGP中,这种标记也以属性的方式实现,在这里,这种标记就是团体属性。所谓团体属性,也是跟随路由一起发送出去的一种非凡的数据,一般情况下,路由携带一个团体属性列表,列表中包含许多个团体属性值,每个团体属性值是一个四字节的整数。
有了团体属性,就相当于给路由打上了标记(需要注重的是,可能不止一个标记,因为团体属性是一个四字节整数组成的数组),接收到该路由的路由器就可以根据该标记对路由作出适当的处理。
为了加深对团体属性的理解,我们再举一个例子,还是上面的网络结构,AS20通告给AS10的路由分为两部分:一部分是AS20自己产生的,另外一部分AS30传播给AS20的,这时候,AS20的治理者想实现这样的功能:在把这两部分路由通告给AS10的时候,只想让AS10把AS30的路由再向另外的AS通告,而AS20自己本身的路由则不想让AS10再向外通告,而保留在AS10内部。这样,AS20就可以这样实现(实际上,这种实现方式已经成了一种标准,并由此而约定了一个非凡的团体属性NO_EXPORT):
1、在向AS10通告路由的时候,把自己产生的路由附加上一种非凡的团体属性,而从AS30接收的路由则不加任何团体属性;
2、AS10接收到从AS20来的路由后,根据AS20附加上的团体属性就可以正确的区分出这两部分路由,这样在向外通告的时候,就仅仅通告AS30传播给AS20的路由,而AS20自己产生的路由则进行过滤。
需要注重的是,通常的团体属性都是四个字节的整数,这在某些情况下不能适应实际情况,于是人们根据实际的需要,对团体属性进行了扩展,即所谓的扩展团体属性。扩展团体属性跟普通团体属性不同的是,扩展团体属性是8字节长度的,而普通团体属性则只有四个字节。
到这里,团体属性就介绍完了,读者一定要领会团体属性的本质,它是一种分组路由的方式。
& 注重:
1、团体属性是网络治理员根据特定的目的附加在路由上面的,团体属性的数值完全由治理员决定,但也有一些广泛应用的团体属性,这些属性的值都已经约定好了,主要有:
NO_EXPORT
NO_ADVERTISE
NO_EXPORT_SUBCONFED
至于这些团体属性的不同含义,请参考相应的文档。
3.2 BGP多协议扩展(MBGP)
目前的BGP协议已经发展到了第四版,即所谓的BGP-4。BGP-4现在已经能很好的适应基于IPV4的INTERNET,而且也得到了最广泛的使用。但BGP-4一个最大的缺点就是不能适应非IPV4协议,比如IPX,IPV6等,而这些协议的应用也因为IPV4的固有缺点而越来越广泛。所以我们必须扩展BGP-4协议来适应这些协议传播和控制的要求。
我们的目标是向下兼容性,也就是说,我们的扩展必须对仅能支持BGP-4协议的路由器来说是透明的,更进一步说,就是仅仅支持BGP-4的路由器能够和支持扩展BGP-4协议的路由器 正常通信。 我们把扩展的BGP-4协议就叫做MBGP(Multi-protocol BGP)。
要做到这种透明性,我们可以通过分析BGP-4路由传播的数据报格式来寻找解决方案。一般情况下,BGP-4在向外通告路由的时候,是按照下列格式的:
{属性值一,属性值二,属性值三,。。。,IP地前缀1,IP地址掩码位
数1,IP地址前缀2,IP地址掩码2,。。。}
其中的IP地址前缀1,2,。。。等都必须有共同的属性,否则必须分开传播。可以看出,IP地址前缀和掩码位数都是针对IPV4的,所以不能改变,而属性则是可变化的,所以我们考虑引入新的属性来解决这个问题。
我们引入一个非凡的属性:MP_REACH_NLRI(网络层可达信息),来传输非IPV4路由,这个属性按照下列格式组织:
{地址家族,地址子家族,下一跳长度,下一跳,地址前缀长度1,地址
前缀1,地址前缀长度2,地址前缀2,。。。。}
可以看出,跟普通的BGP-4协议不同的是,MBGP协议把其他协议的路由信息完全封装在MP_REACH_NLRI属性里边,这样假如对方不支持多协议扩展,即不熟悉属性MP_REACH_NLRI,则仅仅把该属性忽略掉即可。
在上面的组织格式中,地址家族和地址子家族结合起来代表了某种非IPV4协议,比如MPLS-VPN,IPV6等,而在这些非IPV4协议中,下一跳的长度不象IPV4那样固定为4字节,所以必须给出下一跳长度,并紧跟着下一跳。接下来便是路由信息了,跟普通的IPV4路由一样,只要给出地址前缀长度和地址前缀的值就可以确定一条路由了,比如,我们要通告路由192.168.0.0,这时候只要把地址前缀长度写为16,而地址前缀写为192.168即可。
完成这样的扩展之后,我们就可以使用MBGP通告各种各样的非IPV4路由了。最典型的就是目前比较流行的MPLS-VPN,在这种技术中,各个VPN可能使用相同的IP地址,这样为了区分这些不同的VPN中的IP地址,我们给每个IP地址增加了一个8字节路由区分符,这样VPN路由就可以组成这样的形式:
RD(路由区分符) + IP地址前缀
这样只要保证RD是唯一的,不管IP地址前缀是否唯一,都可以做到VPN路由的唯一。很显然,这种VPN路由跟传统的IPV4路由不一致,我们要在骨干网中传播这种VPN路由,必须使用MBGP协议。传播的过程很简单,只要把VPN路由封装在MP_REACH_NLRI通告给对方即可。至于对方接收到该路由后怎样处理,请参考MPLS-VPN的有关书籍。
第四章 总结
在本文中,我们具体介绍了BGP的一些基础概念,在介绍的时候,并没有直接从BGP入手,而是根据实际情况的需要对RIP协议进行扩展,使之逐渐完美化,最后完全把RIP改成了BGP,读者只要了解了这些扩展的需求和扩展的结果,就了解了相应的BGP的一个特性。读者假如完全把第二章搞明白了,相信对BGP的一些基础概念就已经明了了。
第三章介绍了一些BGP的高级概念,包含BGP的团体属性和扩展团体属性,以及MBGP等。这些特性在目前的网络中应用比较广泛,比如MPLS-VPN中,就大量应用了BGP多协议扩展和扩展团体属性,而在实现服务质量的时候,为了在不同的AS之间传播服务质量策略,BGP的团体属性也得到了广泛的使用。
当然,作为INTERNET中的一个核心协议,BGP有其高度的灵活性和可伸缩性,本文仅仅介绍了一些基础的概念和基本应用。实际上,在INTERNET中,BGP可以用来实施任何路由策略,精确的控制路由的传播和路由的选择。但这些都是建立在BGP基础概念之上的,相信读者假如把握了BGP的基础概念,并实际接触一些使用BGP来控制和传播路由的网络,把握BGP也不是困难的。
建议读物:
1、TCP/IP Routing,第二卷
该书介绍BGP协议相当彻底深刻,可以做为一本经典参考读物
2、数据通信培训光盘上的BGP协议讲解
该套由北京分部制作的培训光盘完整具体的介绍了各种路由协议,当然,
作为路由协议中的重中之重,专门由权威专家讲课,不论是BGP协议的
初学者还是专家都会从中获益
3、RFC1771
BGP4协议的标准,在把握基础概念的情况下阅读本文,会从根本上理解
BGP协议
4、RFC2283
BGP多协议扩展(MBPG)标准,该文介绍了针对不同网络协议的BGP扩
展,是了解MBGP的权威文章
5、RFC2547
MPLS-VPN体系结构,重点介绍了VPN路由通过MBGP的传播过程,非
常经典透彻