BGP路由协议
BGP路由协议初步
[url]http://network.51cto.com/art/200608/29682.htm[/url]
边界网关协议(Border Gateway Protocol,BGP)是Internet的路由协议。BGP本身并不太复杂,但初次涉足这一领域的人可能会对这个隐藏在基于自治系统路由背后的概念感到陌生。我们希望借助本文你能简要了解BGP的工作原理,以及它所产生和能够解决的问题。
通过上一期对Internet路由的讲座,你应该认识到Internet中的路由分为两部分:由内部网关协议(IGP)如OSPF所控制的自治系统内部路由,以及将各自治系统(AS)互相连接起来的边界路由(现在是使用BGP)。
Internet上每个ISP都至少拥有一个唯一的AS号,并且通过BGP向其对等互联伙伴广播其网络信息。BGP是一种路径向量协议,因为它所广播的是到达某一特定目的地所需的路径信息。BGP并不会告诉我们数据包是如何在自治区域内传送的,也不会象OSPF那样知道整个网络的情况。BGP也可以被称之为一种距离向量协议,因为除了几个不大的变化,其它都与距离向量协议类似。
BGP本身是一种第4层协议,运行在TCP协议之上。因为BGP无需关心TCP要处理的事情,所以要比OSPF简单得多。无论如何,BGP是以连接为导向的,它需要两个手动配置路由器的对等互联伙伴,而这两个伙伴分别配置自己的路由器,然后交换路由信息。通过BGP对等互联的两端(邻居)通常直接相连,不过也有一些受虐狂喜欢在多跳对等互联伙伴之间建立BGP会话,这也完全没有问题,因为BGP使用TCP端口179,并且不依赖广播或本地链路多点传送。
BGP-4(BGP-3不支持无类别域间路由CIDR)更新数据包中包含以下信息:一个网络、一个子网,还有一些属性。我们根据属性值(主要是AS-Path)做出路由决策,比如BGP更新数据包可能会说:“我可以经由号码为8、19、2000和5的AS到达地址为1.1.1.0/12的网络。” 关于BGP非常重要的一点是,AS-Path本身采用一种防止产品路由循环的机制,路由器不会导入任何已经在AS-Path属性中所包含的路由。
对路由器来说,如果你导入一条路由,然后想把它告诉对等互联关系中的一个伙伴,你就必须在宣布这条路由之前,首先把自己的AS号追加到这条AS-Path中。无疑,随着这条路由的信息被传播得越来越远离源AS,它就提供了一条可行的到达源AS的“路径”。路由器通常(而不是总是)会选择距离AS最短的路径。BGP仅仅是根据它所收到的更新信息知道这些路径的。与同为距离向量协议的RIP不同,BGP并不发布整个路由表。在引导之时,你的对等互联伙伴会移交其整个路由表,不过在此之后一切就要靠所收到的更新信息了。
路由更新信息储存在路由信息库(RIB)中。路由表只为每个目的地存储一条路由,而RIB通常包含通往一个目的地的多条路径信息。至于将哪条路由存储到路由表中,也就是实际会用到哪条路径,则取决于该路由器,当某条路由被撤消时,可以从RIB中取出另一条通往同一目的地的路由。RIB仅用于记录我们可能用到的路由,我们决不会把一条未被使用的路由告知对等互联的伙伴,因为那可能是条错误信息。我们只会发布路由表中存在的路由。如果RIB收到了某条路由被撤消的信息并且该路由仅存在于RIB中,那么我们就无需向对等互联的伙伴发送更新信息,而只需要把它从RIB中悄悄删除。RIB的路由条目永远不会过期,它会一直保留直到我们确定该路由已经无效。
在Internet上有大量路由是基于策略的。有时你会购买一条昂贵的链路,仅当必要时候才会使用;或者你会有一条只向特定对象发送数据的链路。BGP的“Community”属性很多时候被用于识别一组路由。如果你想让你的邻居知道关于某条路由的秘密信息,你可以在导出这些路由之前设置一个Community号,这些号码完全是随意的,所以不管你发送什么,都必须事先和伙伴商定好这个号码所具有某种特殊意义。
BGP另外一个重要属性是多出口标识(Multi-Exit Discriminator,MED)。该属性用于告知远程AS说,我们喜欢一个指定的出口点,尽管我们可能有很多出口点,这对iBGP非常重要。iBGP是BGP协议的内部网络协议版本,我们将在下一期知识讲座中介绍。
要想真正理解BGP的工作原理,我们要花点时间讲讲困扰着Internet的一些问题,这很重要。
首先,我们会遇到一个关于路由表快速增长的大问题。如果有人决定将一个原来的16位网络分解为许多更小的的网络,他们可能会先广播数百条新路由。这时Internet上每台路由器都会获得每条新路由。人们常常会迫于压力将多条路由汇总或合并一次发布出去。但汇总路由并不总是行得通的,特别是你想把一个19位网络分解成两个地理位置上分离的20位网络。目前路由表内的路由数将近200,000条,并且曾经一度以指数级速度增长。
其次,我们总会担心有人会“向Internet广播”。如果某个大型ISP客户突然决定把它所有信息都广播出去,并且ISP接收了这些路由,那么Internet上所有数据都会被发送到ISP客户的小型AS上。对此有一个简单的解决方案,称为路由过滤。设置路由器易如反掌,这样你的路由器就不会接收那些不请自来的路由了,但是很多大型ISP还是会接收来自对等互联伙伴的“缺省”路由,而这些伙伴似乎并不能提供通路互联服务。
最后,我们来谈谈路由翻动(flapping)。BGP有一种机制可以限制那些看起来不太正常的路由。翻动(即出现又消失)的路由通常不够可靠,如果路由翻动频繁,Internet上所有路由的负载就会增加,因为路由每次消失又重新出现时都要花时间更新。路由翻动抑制(Dampening)使BGP对等互联的伙伴忽略所有的来自于正处于翻动状态的对等互联路由器的更新信息。这个路由器被忽略时间随每一次翻动呈指数级增加。链路有缺陷是很恼人的,很多Internet站点有可能要花一个多小时才能进入,不过这非常必要。
这次我们非常扼要地阐述了BGP的原理,这些知识足够让你正确地理解该协议,不过还是根本不够全面。如果你的工作是操作BGP路由器,那就花点时间阅读RFC文档,你的同等互联伙伴会很感激你的。
小结
BGP是路径向量协议,在Internet上通过其AS-Path属性提供自治系统的路由信息。
对等互联伙伴通过手动配置路由器来交换路由信息,这将建立一个TCP连接并且采用BGP协议来对话。BGP没有什么秘密。
中型企业采用BGP通常是为了让其整个网络成为真正的多宿主(multi-homing)网络。
BGP协议分析---报文和状态机
[url]http://www.net130.com/CMS/Pub/Tech/tech_zh/2005_07_18_64150.htm[/url]
  BGP是一种自治系统间的动态路由发现协议,它的基本功能是在自治系统间自动交换无环路的路由信息。与OSPF和RIP等在自治区域内部运行的协议对应,BGP是一类EGP(Edge Gateway Protocol)协议,而OSPF和RIP等为IGP(Interior Gateway Protocol)协议。
  
  BGP是在EGP应用的基础上发展起来的。EGP在此以前已经作为自治区域间的路由发现协议,广泛应用于NFSNET等主干网络上。但是,EGP被路由环路问题所困扰。BGP通过在路由信息中增加自治区域(AS)路径的属性,来构造自治区域的拓扑图,从而消除路由环路并实施用户配置的策略。同时,随着INTERNET的飞速发展,路由表的体积也迅速增加,自治区域间路由信息的交换量越来越大,都影响了网络的性能。BGP支持无类型的区域间路由CIDR(Classless Interdomain Routing),可以有效的减少日益增大的路由表。
  
  BGP运行时刻分别与本自治区域外和区域内的BGP伙伴建立连接(使用Socket)。与区域内伙伴的连接称为IBGP(Internal BGP)连接,与自治区域外的BGP伙伴的连接称为EBGP(External BGP)连接。本地的BGP协议对IBGP和EBGP伙伴使用不同的机制处理。
  
  1、BGP协议的层次位置
  
 
  BGP使用Socket服务建立连接,端口号为179。
  
  2、BGP的消息结构
  BGP有4种类型的消息。分别为OPEN,UPDATE,KEEPALIVE和NOTIFY。它们有相同的消息头。
  
  ⑴消息头结构:
  
 
  Marker : (16字节) 鉴权信息
  
  Length : (2字节) 消息的长度
  
  Type : (1字节) 消息的类型
  
  0 :OPEN
  
  1 :UPDATE
  
  2 :NOTIFICATION
  
  3 :KEEPALIVE
  
  ⑵OPEN消息结构:
  
  消息头加如下结构 :
  
 
  Version :(1字节) 发端BGP版本号
  
  My Autonomous System :(2字节无符号整数) 本地AS号
  
  Hold Time :(2字节无符号整数) 发端建议的保持时间
  
  BGP Identifier :(4字节) 发端的路由器标识符
  
  OptParmLen :(1字节) 可选的参数的长度
  
  Optional Parameters :(变长) 可选的参数
  
  ⑶KEEPALIVE消息结构
  
  KEEPALIVE消息只有一个消息头。
  
  ⑷NOTIFY消息结构
  
  消息头加如下结构:
  Errsubcode :(1字节) 辅助错误代码,略。
  
  Data :(变长) 依赖于不同的错误代码和辅助错误代码。用于诊断错误原因。
  
  ⑸UPDATE消息结构
  
  消息头加如下结构:
  
 
  Unfeasible Routes Len :(2字节无符号整数) 不可达路由长度
  
  Withdrawn Routes :(变长) 退出路由
  
  Path Attribute Len :(2字节无符号整数) 路径属性长
  
  Path Attributes :(变长) 路径属性(以下详细说明)
  
  Network Layer Reachability Information :(变长) 网络可达信息(信宿)
  
  其中退出路由和信宿地址的表示方法为一 的二元组。length一个字节,指示地址前缀的长度。prefix为地址前缀,长度1至4字节。
  
  3、BGP路径的属性
  每个路径属性由1字节的属性标志位,1字节的属性类型,1或2字节路由属性长度和路径属性数据组成。
  
  属性标志位:
  
 
  位0:0 表示此属性必选,1 表示此属性可选。
  
  位1:0 表示此属性为非过渡属性,1表示此属性为过渡属性。
  
  位2:0 表示所有属性均为路由起始处生成,1 表示中间AS加入了新属性。
  
  位3:0 表示路由属性长度由1字节指示,1表示由2字节指示。
  
  位4至位7:未用置0
  
  位0和位1标识了BGP的4类路由属性:
  
  -(01) 公认必选:BGP的UPDATE报文中必须存在的属性。它必须能被所有的BGP工具识别。公认必选属性的丢失意味着UPDATE报文的差错。这是为了保证所有的BGP工具统一于一套标准属性。
  
  -(01) 公认自决:能被所有BGP识别的属性,但在UPDATE报文中可发可不发。
  
  -(11) 可选过渡:如果BGP工具不能识别可选属性,它就去找过渡属性位。如果此属性是过渡的,BGP工具就接受此属性,并把它向前传递给其它BGP路由器。
  
  -(10) 可选非过渡:当可选属性未被识别,且过渡属性也未被置位时,此属性被忽略,不传递给其它BGP路由器。
  
  路由属性类型:
  
  ⑴ORIGIN (Type Code = 1,公认必选属性)
  
  指示此路由起始类型:
  
 
  ⑵AS_PATH (Type Code = 2,公认必选属性)
  
  AS路径属性由一系列AS路径段(Segment)组成。每个AS路径段为一三元组<路径段类型,路径段长度,路径值>。
  
  路径类型有:
  
 
  路径段长度用1字节表示AS号的数量,即最长为255个AS号。
  
  路径值为若干AS号,每个AS号为2字节。
  
  ⑶NEXT_HOP (Type Code = 3,公认必选属性)
  
  此属性为UPDATE消息中的信宿地址所使用的下一跳。
  
  ⑷MULTI_EXIT_DISC (Type Code = 4,公认自决属性)
  
  简称MED属性。为一4字节无符合整数。它在AS区域间传播,用来帮助一个其它AS区域的BGP伙伴选择进入本AS区域的人口。
  
  ⑸LOCAL_PREF (Type Code = 5,公认自决属性)
  
  本地优先级属性。为一4字节无符合整数。它在AS区域内传播,用来帮助一个本AS区域内BGP伙伴选择进入其它AS区域的出口。
  
  ⑹ATOMIC_AGGREGATE (Type Code = 6,公认自决属性)
  
  元聚合属性。长度为零。它表示本地BGP在若干路由中选择了一个较抽象的(less specific)路由,而没有选择较具体(specific)的路由。
  
  ⑺AGGREGATOR (Type Code = 7,可选过渡属性)
  
  聚合者属性。长度为6字节,分别为最后进行路由聚合的路由器的AS号(2字节)和IP地址(4字节)。
  
  4、BGP协议的特点
  BGP是一种AS(自治区域)外部路由协议,主要负责本自治区域和外部的自治区域间的路由可达信息的交换。因此,它所关心的拓扑结构是AS(自治区域)的拓扑结构,BGP通过UPDATE消息中路由的AS属性来构造AS的拓扑结构图,进一步通过此结构图来选择路由。
  
  与OSPF,RIP等IGP协议相比,BGP的拓扑图要更抽象和粗略一些。因为IGP协议构造的是AS内部的路由器的拓扑结构图。IGP把路由器抽象成若干端点,把路由器之间的链路抽象成边,根据链路的状态等参数和一定的度量标准,每条边配以一定的权值,生成拓扑图。根据此拓扑图选择代价(两点间经过的边的权值和)最小的路由。这里有一个假设,即路由器(端点)转发数据包是没有的代价的。而在BGP中,拓扑图的端点是一个AS区域,边是AS之间的链路。此时,数据包经过一个端点(AS自治区域)时的代价就不能假设为0了,此代价要由IGP来负责计算。这体现了EGP和IGP是分层的关系。即IGP负责在AS内部选择花费最小的路由,EGP负责选择AS间花费最小的路由。
  
  BGP作为EGP的一种,选择路由时考虑的是AS间的链路花费,AS区域内的花费(由BGP路由器配置)等因素。
  
  如上所述,内部网关协议IGP需引入AS自治区域内部网络拓扑图其它各点的路由,同时向其它端点发送本端点(路由器)所知的路由,如直接路由、静态路由等。作为外部网关协议,BGP发送和引入路由的单位是整个AS自治区域,即BGP要发送本地路由器所在的AS内部的所有路由,引入其它AS自治区域的所有路由(假设不使用路由策略控制发送和引入)。其路由数量显然要远远大于IGP发送和引入的路由数量。因此,类似于IGP那样定时对外广播路由信息是不可取的。BGP采用发送路由增量(Incremental)的方法,完成全部路由信息的通告和维护:初始化时发送所有的路由给BGP对端(BGP Peer),同时在本地保存了已经发送给BGP对端的路由信息。当本地的BGP收到了一条新路由时(如通过IGP注入了新路由或加入了新的静态路由),与保存的已发送信息进行比较,如未发送过,则发送,如已发送过则与已经发送的路由进行比较,如新路由花费更小,则发送此新路由,同时更新已发送信息,反之则不发送。当本地BGP发现一条路由失效时(如对应端口失效),如此路由已发送过,则向BGP对端发送一个退出路由消息。
  
  总之,BGP不是每次都广播所有的路由信息,而是在初始化全部路由信息后只发送路由的变化量(增量)。这样保证了BGP和对端的最小通信量,但同时增加了BGP的复杂程度。因为对于IGP,本地路由协议只需发送发送时刻所知的全部路由,而不保存任何已发送信息,路由选择的工作由对端来完成;而BGP必须为每个BGP对端保存已经发送的路由信息,以便发送一条新路由前确认其是否真的应该发送。
  
  为了减小路由表的体积和发送路由的通信量,BGP还支持CIDR(Classless InterDomain Routing)。它使用带有较短的掩码(相对于自然掩码)的路由来在一条路由中表达更多的路由信息。如从202.112.1.0/24-202.112.254.0/24可以使用202.112.0.0/16表示,从而减小了路由表的体积和发送路由信息时的网络流量。
  
  同时,作为AS自治区域间的路由协议,由于政治的、经济的等原因,BGP需要按照不同的路由的属性控制路由的发送和引入。因此,BGP有丰富的路由策略控制手断。
  
  5、BGP协议中消息的应用
  BGP使用TCP建立连接,本地监听端口为179。和TCP建立相同,BGP连接的建立也要经过一系列的对话和握手。TCP通过握手协商通告其端口等参数,BGP的握手协商的参数有:BGP版本,BGP连接保持时间,本地的路由器标识(Router ID),授权信息等。这些信息都在OPEN消息中体现。
  
  BGP连接的具体过程参见BGP有限状态机。
  
  BGP连接建立后,如果有路由需要发送则发送UPDATE消息通告对端路由信息。UPDATE消息主要用来通告路由信息,包括失效(退出)路由。UPDATE消息发布路由时,还要指定此路由的路由属性,用以帮助对端BGP协议选择最佳的路由。需要注意的是,由UPDATE消息的格式可以看出每个UPDATE消息只可以发布一种路由属性,本地BGP如果有路由属性完全相同的路由(只有信宿地址不同),则可以由一条UPDATE消息发布,否则只能使用不同的UPDATE消息发布。关于路由属性在BGP选择路由时的应用,参见BGP协议路由属性的应用部分。
  
  在本地BGP路由变化时,也使用UPDATE消息修正对端BGP的路由表。
  
  经过一段时间的路由信息交换后,本地BGP和对端BGP都无新路由通告,趋于稳定了。此时要定时发送KEEPALIVE消息以保持BGP连接的有效性。对于本地BGP,如果在超过保持时间的时间内,还未收到任何对端BGP消息,就认为此BGP连接已经无效,将此BGP连接断开。
  
  当本地BGP在运行中发现错误时,要发送NOTIFY消息通告BGP对端。如对端BGP版本本地不支持,本地BGP收到了结构非法的UPDATE消息等。本地BGP退出BGP连接时也要发送NOTIFY消息。BGP收到NOTIFY消息后,要作相应处理。
  
  6、BGP伙伴的有限状态机(FSM)
  BGP有限状态机有6种状态:
  
  1-Idle
  
  2-Connect
  
  3-Active
  
  4-OpenSent
  
  5-OpenConfirm
  
  6-Established
  
  BGP事件:
  
  1-BGP Start
  
  2-BGP Stop
  
  3-BGP Transport connection open
  
  4-BGP Transport connection closed
  
  5-BGP Transport connection open failed
  
  6-BGP Transport fatal error
  
  7-ConnectRetry timer expired
  
  8-Hold Timer expired
  
  9-KeepAlive timer expired
  
  10-Receive OPEN message
  
  11-Receive KEEPALIVE message
  
  12-Receive UPDATE message
  
  13-Receive NOTIFICATION message
  

  一个典型的过程为:Idle(启动消息)->Connect(TCP连接成功,发OPEN)->OpenSent(收到OPEN消息,协商成功)->OpenConfirm(收到KEEPALIVE消息)->Established(TCP连接关闭,有错误,或处理UPDATE消息失败,或收到NOTIFICATION消息)->Idle