• 文章搜索:
  • 目录

        • 分享到...

        • 新浪微博
        • 腾讯微博
        • 推荐到豆瓣 豆瓣空间
        • 分享到搜狐微博 搜狐微博
        • 分享到QQ空间 QQ空间
        • 分享到腾讯朋友 腾讯朋友
        • 网易微博分享 网易微博
        • 添加到百度搜藏 百度搜藏
        • 转贴到开心网 开心网
        • 转发好友 告诉聊友
    • 推荐
    • 打印
    • 收藏

    BGP综述

    作者:  |  上传时间:2010-10-12  |  关键字:网络大爬虫,第三期,BGP专题

    /朱皓

    1         BGP的出现

    要全面了解BGP,首先我们要回答以下看上去很简单的问题:为什么需要BGP,也就是说BGP是如何产生的,它解决了什么问题。带着以上问题,我们先简单的回顾一个路由协议发展的轨迹。

    首先路由的实质是描述一个网络结构的表达方式,路由表其实是一个结果的集合。在早期的ARPANet网络时代,网络规模有限,路由数量也不大,因此所有的路由器可以维护整个网络拓扑,那时候使用的路由协议叫GGPGateway-to-Gateway Protocol)。GGP自然成为第一个内部网关协议(IGP)。在1980年左右。当时的网络管理者遇到了与今天类似的问题:网络规模扩大导致的路由数量不断增长。为了解决这种网络规模的增长问题,提出了自治系统的概念(AS),也可以叫做路由管理域。在AS内部使用一种路由协议,然后在AS之间使用另一种路由协议。这样做的好处显而易见,不同的网络可以自己选择IGP协议,然后再通过一个统一的AS间协议进行互连就可以了。

    IGP的发展领域中,先是RIP成为IP路由的主流,之后出现了更高级的IGP协议包括OSPISIS,这些协议自动化程度更高、更智能更可靠。同一个AS的路由器间是有相互信任关系的,而且这些路由器往往由同样的管理人员维护,因此IGP的自动发现和路由计算信息泛洪处于完全开放的状态,人工干预的行为是比较少的。

    不同AS互相连接的需求,推动产生了外部网关协议(EGP),EGP的主要目的是在不同的AS之间传递路由协议。而不同的AS之间往往是直接相连,大多数AS互联行为只涉及少量的边界路由器(ASBR),所以EGP的设计也非常简单。EGPRFC827发布于1982年,看上去似乎早于RIP的第一个标准FRC1058,但其实在RFC1058之前,RIP已经被广泛的使用。在当时,RIP+EGP成为一种标准的路由组合。

    EGP被设计的如此简单,以至于很快就不能满足网络管理的要求。EGP单纯的发布网络可达信息,不做任何优选,也没有考虑环路避免。有人甚至认为EGP算不上是一个路由协议,EGP的众多缺陷,最终导致被BGP所取代。BGP的第一个FRC11051989年发布的,和EGP相比,BGP更像是一个路由协议,具有很多路由协议的特征,比如解决环路问题、收敛问题、触发更新等等。

    就像是不同的企业有各自的企业文化和标准,但是企业间的交往却要遵循统一的行为规范和标准一样。对于AS间的路由交互,也必须有一个统一的标准。BGP相比EGP的众多优势,使BGP成为唯一的外部网关协议,并广泛的使用在互连网上。

    综上所述,BGP是为了替代EGP而出现的一个外部网关协议,它必须能够进行路由优选、路由环路的避免、能够更高效率的传递路由和维护大量的路由。因为BGP部署在不具有完全信任关系的AS之间,因此需要BGP有丰富的路由控制能力,并且可以通过一些简单统一的方法对BGP进行扩展。

    2         BGP的发展

    BGPv1RFC1105)定义了BGP最基础的一些协议特征。BGPAS间传递路由,因此它非常重要。为了保证BGP的可靠传输,使用了TCP作为传输层协议。使用TCP的好处是显而易见的,BGP可以利用TCP现成的可靠性传输机制、重传、排序等机制来保证协议报文交互的可靠性。对于TCP扩展带来的好处也可以被继承,比如TCPMD5认证就可以为BGP所用。

    BGP是建立在两个不同的AS间,存在信任问题,所以BGP不能通过自动发现,而是需要手动配置邻居,使用指定地址建立TCP关系。与AS外部节点建立的BGP关系叫做EBGP关系,与AS内部节点建立的BGP关系是IBGP关系。

    BGP最重要的一个概念就是使用AS号来解决AS间的环路问题,如果收到某个路由信息携带了自己的AS号,那么说明这个路由是已知路由,就不再处理它。如果AS号重复,那么说明出现了路由环路。在BGPv1中并没有AS-path的概念,这个概念在BGPv2中被明确下来。BGPv1v2v3、到现在的v4,也是不断的进行改良。BGP4+则主要是进行了多协议BGP的扩展,也叫MP-BGP。关于MP-BGP的概念本文暂不作讨论。

    AS内部,因为没有AS号的变化,防止环路需要采用其它的方式。BGP规定从IBGP邻居学习到的路由不会传递给另一个IBGP邻居,简单的说就是IBGP间路由只传一跳,路由只传递一次当然就不存在成环的问题。同时就要求AS内部的所有路由器都要两两建立IBGP关系,这就是BGP技术中的BGP全连接。全连接在大型网络中是不可想象的,因此后来衍生出路由反射器和BGP联盟两种技术(RFC1966RFC1965)。路由反射器是在AS中指定一个节点作为反射器,所有的其它节点都与反射器建立IBGP关系,反射器作为一个中间节点,在其它任何两个IBGP间传递路由。所以反射器从理论上讲,在传递路由的时候,不应该改变路径属性信息,否则就破坏了BGPAS内部避免环路的原则。但是基于实际应用的角度,不同的厂商对反射器的功能做了很多特性,需要BGP的部署者谨慎使用。BGP联盟则是在AS内部做了重新规划,把一个扁平化的AS又分为多个私有的AS,这样做的好处一方面可以分层的管理一个庞大的AS,另一方面通过层次的划分,自然减少了全连接的需求。

    BGP报文采用了TLV的结构,这种结构是非常利于扩展和向下兼容的。所以,随着网络的发展,产生了大量关于BGP扩展的RFC,这更使得BGP成为永葆青春的外部网关协议。

    从最初的BGPv1BGPv4,协议报文的种类和格式都做过调整,但是BGP的设计一直以简单明了作为原则。从BGPv2开始,消息种类确定为4种。建立TCP连接后,使用OPEN消息触发BGP关系建立过程,使用UPDATE消息进行路由的发布和撤销,使用NOTIFICATION消息通告出现错误,使用KEEPALIVE消息对BGP关系进行保活。可见BGP的路由通告是触发更新模式的,只有更新的时候才发送UPDATE,所以,需要KEEPALIVE消息对BGP关系进行保活。BGP状态机也是在BGPv2开始被确定为6种。

    1990年出现的BGPv2RFC1163)是一个重要的分水岭。首次出现了BGP路径属性的概念,而且其中对属性的分类方法沿用至今,成为BGP路由策略的主要手段,为各种对路由的过滤、标识、选择提供了多种多样的方法。

    路径属性分为4种,最基本的就是公认必遵属性。顾名思义这类属性必须在发布路由的时候携带,描述了所发布路由的一些基本信息,包括:下一跳、AS_PATHORIGIN。下一跳用于路由计算,AS_PATH用于环路避免,而ORIGIN则用于路由选择。在BGP中,路由信息通过网络前缀的方式进行描述,被叫做网络层可达信息(NLRI,本文后面有些地方使用了‘BGP路由’这个通俗的叫法,以方便理解)。这个描述更贴切一些,实际上BGP只传递了一些信息,用于计算出路由。NLRI存在于UPDATE消息中,同时NLRI会附加公认必遵的3种属性,这样比较简单的做法就是一个UPDATE只传递一条NLRI信息。唯一的缺点是,当存在巨量路由时,收敛的速度较慢。

    公认必遵属性相对应的就是公认可选,也就是说这些属性必须被所有的BGP路由器所识别,携带与否是可以选择的。

    另外的两个路径属性是可选可传递属性和可选不传递属性,很显然,两种属性考虑到了协议的扩展性,对于设备不识别的属性,是可以透传或者忽略的。

    各种各样的属性,一方面用于路由选择,另一方面相当于给路由做了标志,在不同的节点,根据这些标志对路由做相应的过滤、修改等操作。也可以根据属性来实现一些BGP的扩展特性。正是因为BGP使用在不完全可信的路由管理域之间,所以需要BGP具有对路由信息灵活的控制手段,这是BGP最重要的特点之一。

    网络设备根据NLRI中的网络前缀和对应的路径属性,进行路由计算,计算有可能需要依赖IGP来完成。因为BGP关系可以建立在非直连的网络节点,只要建立TCP连接的地址通过IGP可达,就可以建立BGP关系并交互NLRI信息。另外,NLRI对应的路径属性中携带了下一跳的信息,下一跳也要通过IGP进行查找,如果找不到到达下一跳的路由,那么就说明无法到达发布NLRIBGP节点,因此该BGP路由处于inactive状态。很显然,inactive的路由信息是不应该发送给其它任何一个对等体的。所以有必要在全局路由表之外,保留一个BGP路由表,通过这个表,可以看到BGP路由决策的部分结果。

    BGP实际的使用中,还有一个同步的概念,也就是IGP路由必须与BGP路由同步。前面已经提到BGP关系是可以在非直连邻居间建立的,路由信息可以在BGP对等体之间传递,但是没有配置BGP的中间链路节点,并没有这些BGP路由信息。路由归根结底是为转发报文而服务的,当报文转发到这些中间链路节点时,会因为没有路由而被丢弃。这个现象很形象的被称为BGP黑洞。解决BGP黑洞其实很简单,就是保证如果某个节点没有配置BGP的话,必须可以通过IGP获得这些BGP路由信息,这就叫IGP路由与BGP路由同步。在真实的网络设计中BGP黑洞是很少出现的,因为如果AS是一个边缘AS,那么BGP多数只部署在AS连接其它AS的边界上。如果AS是位于多个AS中间的区域,那么这个AS是一个核心区域,其中所有的路由器都会部署BGP并且配置了FULL-MASHIBGP关系。所以BGP黑洞是很少出现的特例,因此当前大多数厂商的实现都是默认关闭了这种同步的检查。

    1991RFC1267定义了BGPv3,一个重要的补充是增加了连接的冲突处理机制,当两个节点同时发起连接时,BGP ID大的一方发起的连接会被保留。

    BGPv4RFC1771)最重要的改变是BGP终于由有类的路由协议成为一个无类的路由协议。这个改变源于有类地址的枯竭,为解决这个问题,1993发布的RFC1520定义了CIDRClassless Inter-Domain Routing)。而BGP作为唯一的AS间路由协议,支持CIDR是必然的。

    BGP一直处于发展和完善中,最新的RFC4271,它对于一些细节进行了进一步的说明,比如对NEXT-HOP属性的处理原则、事件和状态机以及BGP的路由决策流程等等,相比RFC1771的变化还是比较多的。

    BGP协议基本概念并不复杂,如果从BGP的使用场景和使用特点来看,理解起来很容易。BGP的困难主要在于部署时如何适应网络拓扑的要求和对路由进行控制,因为BGP控制路由的手段非常多,这些控制都是需要管理员定义和部署,同时还要考虑各种特性和控制手段组合在一起使用时的互相影响。

    3         BGP的扩展

    前面提到了BGP的一些基本概念:基于TCP的可靠连接、触发更新、AS内和AS间防止环路的技术,通过各种属性实现的路由优选和路由控制策略、消息的类型等等。可以看出BGP的各种特征,都是来源于BGP使用的场合,需求决定了最终的实现,协议不过是统一了实现的方法而已。

    关于BGP扩展的RFC非常多,多数都是实现了不同的特性,也有一些是对BGP的分析,甚至是BGP部署方面的建议和经验。下面列出的只是关于BGP的小部分RFC而已。

    前面提到的BGP联盟出现在RFC1965(最新版为RFC5065),路由反射出现在RFC1966(最新版为RFC4456)。

    BGP路由扩展团体属性出现在RFC1997(最新版本为RFC4360)。

    路由刷新功能出现在RFC2918,路由刷新定义了一种新的BGP消息Route-REFRESH,使用这个消息可以要求对等体更新某个地址族的路由信息。

    RFC2439定义BGP路由惩罚机制解决了路由不稳定对网络造成的影响。惩罚机制是通过两个定时器来实现的,每次振荡会导致一个惩罚值的累加。如果超过某一个固定值,该路由就不计算不发布,处于抑制状态。

    RFC2842定义了BGP携带能力集的方式(最新版为RFC3392),通过在OPEN消息中的能力集字段,可以在BGP建链阶段完成双方能力的通告,并决定是否建立BGP关系和后续协议报文的处理。

    RFC2858(最新版为RFC4760)定义了多协议的BGP,扩展以支持非IPv4的网络层可达信息。目前最重要的MPLS VPN技术就是通过BGP的多协议扩展,实现了路由交互。

    RFC2385定义了使用TCPMD5保护BGP连接的方法,而为了加强key的处理,由RFC3562又做了进一步的分析。

    RFC4724定义了BGP GR,在双主控和控制转发分离的设备上实现协议的平滑重启,可以保证转发不中断。RFC4781进一步定义了MPLS环境中的BGP GR

    RFC1772描述了BGP4Internet上的使用方法,包括给出了关于拓扑的建议和一些路由处理的过程。

    RFC4272是研究BGP安全性的一个分析文档。

    RFC4451甚至对MED属性进行了详细的分析,给出一些实现的建议。

    ………

    BGP的诸多扩展是为了适应不断发展的网络结构,包括网络攻击的可能性。由这些RFC支撑着的BGP毫无疑问已经成为Internet上无法替代的一个路由协议,而且有越来越复杂的趋势。对于BGP的理解,最佳的途径是基于应用。从上面的一些RFC就可以看出来,BGP的协议文档中很多是来源于应用的实践。

    在今天的BGP技术中,在NLRI上附加了很多增量的信息,用于实现各种差异化的需求。好在BGP的协议基本构架决定了BGP是一个拥有良好扩展性和兼容性的路由协议。而且BGP技术可以说是一种模块化的技术,在一个基本的协议构架上,可以通过各种扩展增加模块以支持各种新的应用,而且有可能允许不同组件的共存。在最新的草案中,有一个是关于BGP能力集的动态发布。允许在一个已经建立的BGP关系上通过OPEN消息宣称自己支持新的能力集,并且如果不支持该能力集,可以忽略这个消息。并不会影响原有的BGP关系或路由通告。

    BGP的理解过程是一个渐进的过程,BGP的发展也是如此。还是《阿甘正传》中的一句台词做结尾:

    Routing is like a box of chocolateyoud never know what you are going to get……