2.3 BGP 基础

与EGP一样,BGP也为每个BGP对等体建立一条惟一的、基于单播的连接。为了提高对等连接的可靠性,BGP使用TCP(端口179)作为底层传送机制,由于将确认、重传和序列化等工作交由TCP层处理,因而BGP的更新机制也得到了大大简化。由于BGP建立在 TCP之上,因而需要为每个对等体建立一个独立的点到点连接。

BGP是一种距离矢量协议,每个BGP节点都依赖下游邻居从其路由表中传递路由;BGP节点基于它们所宣告的路由来进行路由计算,并将计算结果传递给上游邻居。但是,其他距离矢量协议都是以单一数值来量化距离,用来表示跳数或IGRP和RIGRP中所表示的全部接口时延之和及最低带宽,而BGP却使用数据包到达特定目的地所要经过的一个AS号列表(如图2-18所示)。由于该列表完全描述了数据包所要经过的路径,因而为了与其他传统距离矢量协议相区别,也将BGP称为路径矢量(path vector)路由协议。与BGP路由相关联的AS号列表被称为AS_PATH,他属于与每条路由相关联的多个路径属性之一。有关路径属性的内容将在随后章节详细阐述。

img85

图2-18 BGP根据被称为AS_PATH属性的AS号列表来确定最短无环路AS间路径

第1章中曾经说过,由于EGP并没有一个完整的算法来计算最短路径,而且也无法检测路由环路,因而EGP并不是一个真正的路由协议。与此相反,AS_PATH属性使得BGP在这两方面都同时满足了作为路由协议的要求。首先,可以通过最小AS号来确定最短的AS间路径。在图2-18中,AS7收到两条去往207. 126. 0. 0/16的路由,其中一条路由的AS跳数为4,另一条路由的AS跳数为3,因而AS7将选择最短路径(4,2,1)。

利用AS_PATH属性可以非常容易地检测出路由环路。路由器在接收到路由更新后,如果发现在AS_PATH中包含了自己的本地AS号,那么该路由器就知道出现了路由环路。如图2-19所示,AS7向AS8宣告了一条路由,AS8将该路由宣告给了AS9, AS9又将该路由宣告回了AS7, AS7发现自己的AS号在AS_PATH中,因而拒绝接受该更新,从而避免了潜在的路由环路问题。

img86a

图2-19 如果BGP路由器发现自己的AS号位于其他AS路由器发送来的路由的AS_PATH中,则拒绝该更新

BGP并不显示每个AS中的详细拓扑信息。由于BGP看到的仅仅是一个自治系统树,而 IGP看到的是AS内部的拓扑情况,因而也可以说BGP比IGP看到是更高层次的Internet视图。由于该更高层次的视图与IGP看到的视图并不兼容,因而Cisco路由器维护了一个独立的路由表以承载BGP路由。例2-13给出了一个利用命令show ip bgp看到的典型BGP路由表。

例2-13:命令show ip bgp显示的BGP路由表。

img86b

虽然例2-13中显示的BGP路由表与利用命令show ip route显示的AS内部路由表有些不同,但其中的元素仍然一致。BGP路由表中显示了目的网络、下一跳路由器以及用于选择最短路径的度量值。Metric、LocPrfWeight列的内容将在本节后面的内容中进行详细阐述,现在关注的主要是Path列的内容,该列列出了每个网络的AS_PATH属性。需要注意的是,每个AS_PATH都以一个i作为结尾,表示该路径终结在由Origin codes所指示的IGP。

请注意,路由表中列出了每个目的网络的多个下一跳。与AS内部路由表仅列出当前在用路由不同的是,BGP路由表列出了所有已知路径。最左列的*(有效)后紧跟一个>,表示该路径是路由器当前使用的路由,该最佳路径是拥有最短AS_PATH的路径。在存在多条拥有等价路径的路由时(如例2-13所示),路由器必须有某种确定最佳路径的准则,有关路径确定的过程将在本节后续内容中进行阐述。

如例2-13所示,如果去往某特定目的地时存在多条并行等价路径,Cisco的默认EBGP实现是仅选择一条路径——这一点与其他IP路由协议不同,其他IP路由协议在默认情况下是通过这4条等价路径做负载均衡。与其他IP路由协议一样,命令maximum-paths用于更改并行路径的默认最大值,其取值范围是1~6。需要注意的是,负载均衡仅能用于EBGP, IBGP只能使用一条链路。

与BGP发言方对等的邻居既可以在不同AS中,也可以在同一AS中。如果邻居位于不同AS中,则该邻居为外部对等体(external peer),此时的BGP被称为EBGP(external BGP,外部BGP)。如果邻居位于同一AS中,则该邻居为内部对等体(internal peer),此时的BGP被称为IBGP(internal BGP,内部BGP)。在配置IBGP时会遇到很多问题,这些问题将在2. 4节中进行详细讨论。

两个邻居在首次建立BGP对等连接时,会交换各自的全部BGP路由表,之后则仅交换增量的部分路由更新。也就是说,仅当网络出现变动时才相互交换路由信息,并且仅交换变动信息。由于BGP并不使用周期性的路由更新机制,因而对等体之间必须交换保持激活(keepalive)消息,以维护该对等连接。Cisco的默认Keepalive消息间隔是60秒(RFC 1771并没有指定标准的保持激活间隔时间),如果在3个间隔时间内对等体未收到Keepalive消息,那么该对等体将宣告其邻居停用(down)。也可以通过命令timers bgp来修改间隔时间。

2.3.1 BGP 消息类型

在建立BGP对等连接之前,两个邻居必须执行标准的TCP三向握手进程,并在端口179打开TCP连接。TCP为一条可靠连接提供了分段、重传、确认以及排序等功能,从而将BGP从这些功能中解放出来。所有的BGP消息都采取单播方式经TCP连接传递给邻居。

BGP使用以下4种消息类型。

• Open(打开)消息

• Keepalive(保持激活)消息

• Update(更新)消息

• Notification(通告)消息

本小节将解释如何使用这些消息。有关这些消息的格式及每个消息字段的变量情况请参见2.6节。

1.Open(打开)消息

TCP会话建立之后,两个邻居都要发送Open消息,每个邻居都利用该消息标识自己并指定其BGP操作参数。Open消息包括以下信息。

• BGP版本号(BGP version number):该字段指定发起方正在运行的BGP版本号(2、 3或4)。除非使用命令neighbour version来强制要求路由器运行早期版本,否则默认值为BGP-4。如果邻居运行的是早期版本的BGP,则该邻居将拒绝指定了版本4的Open消息;此时,BGP-4路由器将更改到BGP-3并再次发送一条指定该版本号的Open消息。该协商过程将持续到邻居双方都同意的相同版本时为止。

• 自治系统号(Autonomous system number):该字段表示会话发起路由器的AS号,该消息可以确定该BGP会话是EBGP(与邻居的AS号不同)或IBGP(邻居的AS号相同)。

• 保持时间(Hold time):该字段表示路由器在收到Keepalive消息或Update消息之前可以等待的最长时间(以秒为单位)。保持时间必须是0秒(此时必须不发送Keepalive消息)或至少3秒,Cisco的默认保持时间为180秒。如果邻居双方的保持时间不一致,那么将以较短的时间作为双方接受的保持时间。

• BGP标识符(BGP identifier):该字段标识邻居的IP地址。Cisco IOS确定BGP标识符的过程与确定OSPF路由器ID的过程完全一致——使用数值最大的环回(loopback)地址;如果环回接口没有配置IP地址,则使用数值最大的物理接口上的IP地址。

• 可选参数(Optional parameters):该字段用来宣告支持验证、多协议支持和路由刷新等可选能力。

2.Keepalive(保持激活)消息

如果路由器接受其邻居发送来的Open消息中指定的参数,则响应一条Keepalive消息。此后,Cisco在默认情况下每60秒发送一条Keepalive消息,或者以已协商一致的保持时间的1/3为周期发送Keepalive消息。

3.Update(更新)消息

Update消息用于宣告可行路由、已撤销路由或两者。Update消息包括以下信息。

• NLRI(Network Layer Reachability Information,网络层可达性信息):该字段是一个或多个宣告IP地址前缀及其长度的(长度,前缀)二元组。例如,如果宣告的是206.193.160.0/19,那么其长度部分为/19,前缀部分为206.193.160。

• 路径属性(Path Attributes):将在2. 3. 3节详细描述的路径属性是所宣告NLRI的特性,该属性提供了允许BGP选择最短路径、检测路由环路、确定路由策略的相关信息。

• 已撤销路由(Withdrawn Routes):描述那些已变为不可达且退出服务的目的地的(长度,前缀)二元组。

请注意,虽然NLRI字段中可能会包含多个前缀,但是每条Update消息仅描述单条BGP路由(这是因为路径属性仅描述单条路径,不过该路径可能会通往多个目的地)。这里再次强调一下,BGP比IGP看到是更高层次的互联网络视图,IGP路由总是指向单个目的IP地址。

4.Notification(通告)消息

路由器只要检测到差错,就会发送Notification消息并关闭BGP连接。2.6节详细列出了会导致发送Notification消息的各种差错情况。

使用Notification消息的一个例子就是在邻居之间协商BGP版本号。建立了TCP连接之后,如果BGP-3发言者接收到一个指定版本号为4的Open消息,则会响应一条申明不支持该版本的Notification消息。

2.3.2 BGP 有限状态机

可以利用有限状态机来描述BGP连接的建立和维护阶段,图2-20和表2-4给出了完整的BGP有限状态机以及触发状态迁移的输入事件。

img89a

图2-20 BGP有限状态机

表2-4 图2-20的输入事件(IE)

img89b

下面将逐一简要介绍图2-20中出现的6种状态。

1.Idle(空闲)状态

BGP总是以Idle状态为起始点,该状态拒绝所有入站连接。启动事件(IE 1)发生后,BGP进程会初始化所有BGP资源,启动连接重试定时器,初始化去往邻居的TCP连接,侦听来自邻居的TCP初始化并将状态更改为连接状态。启动事件由配置BGP进程或重置现有进程的操作员发起,或者由重置BGP进程的路由器软件发起。

如果发生差错,BGP进程将迁移到空闲状态。此时,路由器可能会自动尝试发起另一个启动事件,但应对路由器的这种行为做一定的限制——这是因为在持续性地差错条件下,经常性地重启会导致波动。因而,在第一次迁移到空闲状态之后,路由器会设置连接重试定时器,在定时器到期时才会重新再启BGP。Cisco的初始连接重试时间为60秒,以后每次连接重试时间都是之前的两倍,也就是说,连续等待时间呈指数关系递增。

2. Connect(连接)状态

该状态下,BGP进程一直等待TCP连接的完成。如果TCP连接建立成功,BGP进程将会向邻居发送Open消息并进入OpenSent(打开发送)状态。如果TCP连接建立不成功,BGP进程将继续侦听由邻居初始化的连接,重置连接重试定时器,并迁移到Active(激活)状态。

如果连接重试定时器到期时仍处于连接状态,则重置定时器,并再次尝试与邻居建立TCP连接,进程也将继续维持在连接状态,其他输入事件将会让BGP进程迁移到空闲状态。

3.Active(激活)状态

该状态下,BGP进程会尝试与其邻居初始化TCP连接。如果TCP连接建立成功,BGP进程会清除连接重试定时器,完成初始化过程,向其邻居发送Open消息,并迁移到打开发送状态。保持定时器被设置为4分钟。

如果连接重试定时器到期时BGP进程仍处于激活状态,则进程将返回到连接状态并重置连接重试定时器,而且还要与对等体进行TCP连接的初始化并继续侦听来自对等体的连接。如果邻居试图以非期望的IP地址建立TCP会话,则重置连接重试定时器,拒绝该连接且继续维持在激活状态。其他输入事件(启动事件除外,因为激活状态会忽略该事件)将会让BGP进程迁移到空闲状态。

4.OpenSent(打开发送)状态

该状态下,已经发送了Open消息,BGP会一直等待直至侦听到来自邻居的Open消息。接收到Open消息后,会检查该消息的每个字段,如果存在差错,则会发送Notification消息并迁移到空闲状态。

如果接收到的Open消息没有差错,则发送Keepalive消息并设置Keepalive定时器。此外,还要协商保持时间,以便确定一个较小的保持时间值。如果协商后的保持时间为0,则不启动保持定时器和Keepalive定时器。根据对等体的AS号,可以确定对等连接是内部连接还是外部连接,并迁移到OpenConfirm(打开确认)状态。

如果收到断开TCP连接的请求,则本地进程将关闭BGP连接,重置连接重试定时器,开始侦听由邻居发起的新连接,并迁移到激活状态。其他输入事件(启动事件除外,因为该状态会忽略该事件)将会让BGP进程迁移到空闲状态。

5.OpenConfirm(打开确认)状态

该状态下,BGP进程将等待Keepalive消息或Notification消息。如果接收到的是Keepalive消息,则迁移到Established(建立)状态;如果接收到的是Notification消息或断开TCP连接请求,则迁移到空闲状态。

如果保持定时器到期、检测到差错或者发生了终止事件,则向邻居发送一条Notification消息,关闭BGP连接并将状态更改为空闲状态。

6.Established(建立)状态

该状态下,BGP对等连接已完全建立,对等体之间可以相互交换Update、Keepalive和Notification消息。如果接收到的是Update或Keepalive消息,则重新启动保持定时器(如果协商好的保持时间不为0);如果接收到的是Notification消息,则迁移到空闲状态。其他事件(启动事件除外,因为该状态会忽略该事件)将会让BGP进程发送一条Notification消息并迁移到空闲状态。

2.3.3 路径属性

路径属性是所宣告BGP路由的特性。读者对某些路径属性可能非常熟悉(如目的IP地址和下一跳路由器),因为它们是所有路由的公共特性,而某些属性(如ATOMIC_AGGREGATE)则是BGP的特有属性。比较常见的路径属性如表2-5所示。除了为基本的路由选择功能提供必要的信息,路径属性还允许BGP设置并沟通路由策略。

所有的路径属性都可以归入以下4类。

• 周知强制属性;

• 周知自选属性;

• 可选传递性属性;

• 可选非传递性属性。

顾名思义,上述4类属性可以归类为两个子类,而每个子类又包括自己的子类。首先是周知属性,也就是说,所有BGP实现都必须能识别这些属性;其次是可选属性,也就是说,并不要求BGP实现支持这些属性。

周知属性包括强制属性(即必须包含在所有BGP Update消息中)或自选属性(即可以包含在特定Update消息中,也可以不包含在特定Update消息中)。

如果可选属性是传递性的,那么BGP进程应该接受该属性中包含的路径(即使不支持该属性),并将该路径传递给对等体。

如果可选属性是非传递性的,那么无法识别该属性的BGP进程可以忽略Update消息中包括的该属性,并且不将该路径传递给对等体。

表2-5 路径属性*

img91

*实际上,除了上面列出的之外,BGP还有很多路径属性。不过,要么这些路径属性未在RFC 1771中加以规定,要么就是Cisco不支持,因而都超出了本书写作范围。

1.ORIGIN属性

ORIGIN是周知强制属性,指定了路由更新的来源。当BGP存在多条路由时,ORIGIN属性就是BGP用来确定优选路由的因素之一。ORIGIN属性指定的路由来源有如下几种。

• IGP: NLRI是从源AS的协议中学到的。IGP源拥有ORIGIN值的最高优先级。如果路由是通过network语句从IGP路由表中学习到的(详见第3章),那么该BGP路由的源就是IGP。

• EGP: NLRI是从外部网关协议中学到的。EGP的优先级次于IGP。

• 不完全的(Incomplete):NLRI是从其他渠道学习到的。路由来源不完全的路由拥有最低优先级的ORIGIN值。不完全路由并不是说该路由有何缺陷,只是确定该路由来源的信息不完全而已。BGP通过重分发机制学习到的路由将携带不完全路由来源属性,这是因为没有办法确定该路由的来源。

2.AS_PATH属性

AS_PATH属性为周知强制属性,该属性利用一串AS号来描述去往由NLRI指定的目的地的AS间路径或路由。当BGP发言者发起一条路由(在其AS内宣告目的地的NLRI)时,将在AS_PATH中增加自己的AS号。同样,后续的BGP发言者在将路由宣告给外部对等体时,都会将自己的AS号加入到AS_PATH中(如图2-21所示)。其结果就是,AS_PATH描述了该路由所经过的全部自治系统,从最近到达的AS开始,到发起该路由的源AS结束。

img92

图2-21 在AS_PATH中追加AS号(加在最前面)

请注意,仅当Update消息被发送到其他AS时,BGP路由器才会将其AS号追加在 AS_PATH中。也就是说,只有在EBGP对等体之间宣告路由时,才会在AS_PATH中追加 AS号。如果是在IBGP对等体(位于同一个AS中的对等体)之间宣告路由时,就不会追加 AS号。

通常情况下,在一个列表中存在多个同一AS号的多个实例是毫无意义的,而且还会破坏AS_PATH属性的作用。不过,在某个特定场合下,在AS_PATH属性中添加某特定AS号的多个实例也是非常有用的。请注意,出站路由宣告将直接影响入站流量。一般来说,在图2-21中,从NAP去往AS 100的路由将穿过AS 300,这是因为该路由的AS_PATH较短。但是,如果AS 100的入站流量的优选路径是到AS 200的链路时又该如何呢?举例来说,如果(500,200,100)路径上的链路均为DS3,而(300,100)路径上的链路为DS1,或者说,假设AS 200是主用提供商,而AS 300是备用提供商,则出站流量将被发送到AS 200,此时,同样也希望入站流量能走相同的路径。

AS 100可以通过更改其所宣告路由的AS_PATH属性来影响其入站流量(如图2-22所示)。通过在发送到AS 300的列表中增加其AS号的多个实例,AS 100可以让NAP中的路由器认为路径(500,200,100)是最短路径。这种在AS_PATH中增加额外的AS号的操作被称为AS路径预附加(path prepending)。

img93

图2-22 AS 100在宣告给AS 300的AS_PATH中增加其AS号的多个实例

如前所述,AS_PATH属性的另一个功能是预防环路,其实现机制非常简单:如果某台BGP路由器从其外部对等体接收到的某条路由的AS_PATH中包含有自己的AS号,那么该路由器就知道该路由出现了环路,因而丢弃该路由。

3.NEXT_HOP属性

顾名思义,该周知属性描述了下一跳路由器(位于所宣告目的地的路径之上)的IP地址。BGP NEXT_HOP属性所描述的IP地址并不总是邻居路由器的IP地址,规则如下。

• 如果宣告路由器与接收路由器位于不同的自治系统中(外部对等体),那么NEXT_HOP是宣告路由器的接口IP地址;

• 如果宣告路由器与接收路由器位于同一自治系统中(内部对等体),且Update消息的NLRI指向的是同一AS内的目的地,那么NEXT_HOP是宣告该路由的邻居的IP地址;

• 如果宣告路由器和接收路由器是内部对等体,且Update消息的NLRI指向的是不同AS内的目的地,那么NEXT_HOP是外部对等体(通过该对等体学习到该路由)的IP地址。

图2-23解释了第一条规则,图中的宣告路由器和接收路由器位于不同的自治系统中,此时,NEXT_HOP是外部对等体的接口地址。到目前为止,该操作行为仍然与任何路由协议的期望结果一致。

图2-24解释了第二条规则,图中的宣告路由器和接收路由器位于同一AS中,而且正被宣告的路由器也位于同一AS中。此时,与NLRI相关的NEXT_HOP是发起路由器的IP地址。

img94a

图2-23 如果BGP的Update消息通过EBGP进行宣告,那么NEXT_HOP属性将是外部对等体的IP地址

img94b

图2-24 如果BGP的Update消息通过IBGP进行宣告,且所宣告的目的地位于同一AS,那么NEXT_HOP属性将是发起路由器的IP地址

请注意,虽然宣告路由器和接收路由器并不共享相同的数据链路,但IBGP TCP连接是通过IGP发话(IGP-speaking)路由器进行传递的,这部分内容将在“内部BGP”一节进行详细阐述。目前最重要的关注点是,接收路由器必须执行递归路由查找(有关递归查找的相关知识请参阅《TCP/IP路由技术(第一卷)》),以便将数据包发送到所宣告的目的地。首先,接收路由器会查找目的地172.16.5.30,该路由指示的下一跳是172.16.83.2。由于该IP地址并不属于与该路由器直连的任何子网,因而路由器必须再查找去往172.16.83.2的路由,该路由(通过IGP学习到的)指示的下一跳是172.16.101.1,此时就可以转发数据包了。通过这个例子,可以很好地理解IBGP对IGP的依存关系。

图2-25解释了第三条规则,图中的路由是通过EBGP学习到的,且被传递给内部对等体。由于目的地在其他AS中,因而通过IBGP连接传递的该路由的NEXT_HOP是外部路由器(该路由是通过该路由器学习到的)的接口地址。

img94c

图2-25 如果BGP的Update消息通过IBGP进行宣告,且所宣告的目的地位于不同AS,那么NEXT_HOP属性将是外部对等体(通过该路由器学习该路由)的IP地址

在图2-25中,IBGP对等体必须执行递归路由查找,以便将数据包转发到207. 135. 64. 0/19。不过却存在一个潜在的问题,下一跳地址所归属的网络192.168.5.0并不是AS 509的一部分,除非AS边界路由器将该网络宣告到AS 509,否则IGP(甚而内部对等体)将无法知道该网络。此外,如果该网络不在路由表中,那么去往207.135.64.0/19的下一跳地址将不可达,去往该目的地的数据包也都将被丢弃。事实上,尽管去往207.135.64.0/19的路由已经安装在内部对等体的BGP路由表中了,但却没有安装到IGP路由表中,这是因为对该路由器来说,下一跳地址是无效的。

当然,首先要解决的问题是要确保连接到两个自治系统上的外部网络要为内部路由器所知晓。尽管可以使用静态路由,但实用的方式是在外部接口上运行被动模式下的IGP,但在某些场合下,这种方式可能并不适用。第二种解决手段就是利用配置选项让AS 509中的AS边界路由器在NEXT_HOP属性中设置自己的IP地址,而不是外部对等体的IP地址。之后,内部对等体将拥有172.16.83.2的下一跳路由器地址(该地址为IGP所知晓),这种被称为next-hop-self的配置选项将在第3章中进行详细阐述。

4.LOCAL_PREF属性

LOCAL_PREF是本地优先级的缩写,该周知自选属性仅用于内部对等体之间的Update消息,而不会被传递给其他自治系统。该属性用来向BGP路由器通告某被宣告路由的优先等级。如果内部BGP发言者接收到多条去往同一目的地的路由,那么将比较这些路由的LOCAL_PREF属性,LOCAL_PREF最高的路由将被选中。

图2-26解释了LOCAL_PREF的使用方法。AS 2101可以从两个ISP获取路由,但ISP1为优选服务提供商。连接在ISP1上的路由器在宣告来自ISP1的路由时,设置LOCAL_PREF为200;而连接在ISP2上的路由器在宣告来自ISP2的路由时,设置LOCAL_PREF为100(为默认值)。因而,所有的内部对等体(包括连接在ISP2上的路由器)都将优选学习自ISP1的路由,而次选学习自ISP2的路由。

img95

图2-26 LOCAL_PREF属性用于向内部对等体说明路由的优先等级,值越大的优先级越高

5.MULTI_EXIT_DISC属性

LOCAL_PREF属性仅影响离开AS的流量,为了对入站流量施加影响,就需要用到MULTI_EXIT_DISC属性(通常简写为MED)。该可选非传递性属性承载在EBGP Update消息中,可以让某AS向其他AS说明其优选的入口点。在其他条件均相同的情况下,AS在接收到多条去往同一目的地的路由时,就会比较这些路由的MED,与LOCAL_PREF不同(优选LOCAL_PREF值最大的路由)的是,优选MED值最小的路由,这是因为MED被视为一种度量值,所以理所当然地就要优选度量值最低(也就是距离最短)的路由了。


注意: 在BGP-2和BGP-3中,MULTI_EXIT_DISC属性被称为INTER_AS度量值。


图2-27解释了MED的使用方法。如图所示,某用户双归属到单一ISP, AS 525希望其入站流量使用DS-3链路,而将DS-1链路作为备份链路。此时就可以将通过DS-3链路传递的Update消息中的MED值设为0(默认值),而将通过DS-1链路传递的Update消息中的MED值设为100。如果这两条路由的其他条件完全一致,那么ISP将优选MED值较小的DS-3链路。

img96

图2-27 通过DS-3链路传递的路由拥有较低的MED值,则ISP将优选该链路

请注意,ISP在两台路由器之间部署了IBGP, AS 525的MED在这些内部对等体之间进行传递,因而这两台路由器都知道哪条路由是优选路由,但MED并不会被传递到接收AS之外。例如,ISP在将206.25.160.0/19发布给其他AS的时候,并不会将由发起AS设置的MED也传递给其他AS。这就意味着MED仅用于影响两个直连自治系统之间的流量,如果要影响邻居AS之外的路由优先级,就需要使用前面所述的AS_PATH属性。

如果去往同一目的地的两条路由接收自两个不同的自治系统,那么将不会比较这两条路由的MED。例如,如果图2-27中的ISP接收到的206.25.160.0/19路由宣告来自AS 525及其他AS,那么将不会比较来自这两个自治系统的MED值。MED仅仅用于单个AS之内,它在某AS存在多个入口点时用于说明不同入口点的优先等级。

6.ATOMIC_AGGREGATE和AGGREGATOR属性

BGP发话路由器可以向其他BGP发言者发送重叠路由(overlapping route),重叠路由是指那些指向同一目的地的不同路由。例如,路由206.25.192.0/19和206.25.128.0/17就是重叠路由,可以看出,第一条路由包含在第二条路由之内,虽然第二条路由也可以指向除206.25.192.0/19之外的其他更精确的路由。

在确定最佳路径时,路由器总是选择更精确的路径。然而在宣告路由时,BGP发言者可以有多种方式来处理重叠路由,如下所示。

• 同时宣告较精确和较不精确路由;

• 仅宣告较精确路由;

• 聚合两条路由并宣告聚合路由;

• 仅宣告较不精确路由;

• 两条路由都不宣告。

本章在前面已经强调了在进行汇总(路由聚合)时,会丢失某些路由信息,而且路由选择也将变得不够精确。与此相似,在BGP发话路由器上执行路由聚合后会丢失路径的细节信息。图2-28解释了这种路径细节的丢失情况。

img97

图2-28 BGP路由聚合将导致路径信息的丢失

AS 3113正在宣告一个聚合地址,该聚合地址代表了多个自治系统中的地址。由于该AS是该聚合的发起方,因而仅在AS_PATH中包含了自己的AS号。这样一来,有关更精确前缀的路径信息都因为聚合而被丢失了。

ATOMIC_AGGREGATE是一种周知自选属性,用于向下游路由器告知已经出现了路径丢失情况。无论什么时候,BGP发言者在将精确路由汇总到一个较不精确的聚合路由(前面列表中的第5个选项)时,都将丢失路径信息。而且,BGP发言者还必须将ATOMIC_AGGREGATE属性附加到聚合路由上。任何接收到带有ATOMIC_AGGREGATE属性的路由的下游BGP发言者都无法获得该路由更精确的NLRI信息,而且在将该路由宣告给其他对等体时,必须将附加上ATOMIC_AGGREGATE属性。

当设置ATOMIC_AGGREGATE属性时,BGP发言者还可以附加AGGREGATOR属性。由于该可选传递性属性包含了AS号及发起路由聚合的路由器的IP地址,因而提供了路由聚合的相关信息(如图2-29所示)。Cisco的BGP实现将路由器ID作为IP地址插入在该属性中。

7.COMMUNITY属性

COMMUNITY也是一种可选传递性属性,用于简化路由策略的执行。COMMUNITY最初是Cisco专有属性,后来在RFC 1997中实现了标准化。COMMUNITY属性将目的地视为某些共享一个或多个公共特性的目的地的一个成员。例如,ISP可能会为其所有客户的路由都分配一个特定COMMUNITY属性,之后,该ISP就可以基于COMMUNITY值(而不是每条路由)来设置其LOCAL_PREF和MED属性了。

img98

图2-29 ATOMIC_AGGREGATE属性表示已经丢失了路径,而AGGREGATOR属性指示在何处出现路由聚合

COMMUNITY属性是一组4个8位组的数值。RFC 1997规定,前2个8位组表示自治系统,后2个8位组表示出于管理目的而定义的标识符,格式为AA:NN;而Cisco的默认格式为NN:AA,可以利用命令ip bgpcommunity new-format将Cisco的默认格式更改为RFC 1997的标准格式。

例如,假定来自AS 625的某条路由的COMMUNITY标识符为70,则以AA:NN格式表示的COMMUNITY属性为625:70;以十六进制方式表示时为两个连续的数字0x02710046,其中,625=0x0271, 70=0x0046。RFC利用十六进制格式表示COMMUNITY属性值,而Cisco路由器以十进制格式表示COMMUNITY属性值。例如,625:70是40960070(即与0x2710046相等的十进制数值)。

0(0x00000000)〜65535(0x0000FFFF)及4294901760(0xFFFF0000)〜4294967295(0xFFFFFFFF)是保留的团体(community)值,在保留取值范围之外,定义了以下周知团体。

• INTERNET: Internet团体无任何值,所有路由在默认情况下都属于该团体,如果接收到的路由属于该团体,则可以自由宣告该路由。

• NO_EXPORT(4294967041或0xFFFFFF01):如果接收到的路由携带该数值,则不能将该路由宣告为EBGP对等体;如果配置了BGP联盟(confede-ration),则不能将该路由宣告到联盟之外(有关联盟的信息将在2.5节中详细阐述)。

• NO_ADVERTISE(4294967042或0xFFFFFF02):如果接收到的路由携带该数值,则根本就不能宣告该路由,包括EBGP或IBGP对等体。

• LOCALAS(4294967043或0xFFFFFF03):RFC 1997将该属性称为NO EXPORT_SUBCONFED。如果接收到的路由携带该数值,那么将不能宣告给EBGP对等体,包括同一联盟内其他自治系统中的对等体。

第3章将给出一些利用团体属性来增强路由策略的例子。

8.ORIGINATOR_ID和CLUSTER_LIST属性

ORIGINATOR_ID和CLUSTER_LIST是由路由反射器使用的可选非传递性属性,有关路由反射器的信息将在2.5节中详细阐述。这两个属性都被用来阻止路由环路。ORIGINATOR_ID是一个由路由反射器创建的32bit数值,该数值是本地AS中路由发起方的路由器ID,如果发起方发现其RID在所接收到的路由的ORIGINATOR_ID中,那么就知道已经出现了路由环路,因而忽略该路由。

CLUSTER_LIST是一串路由传递所经过的路由反射簇(cluster)ID,如果路由反射器发现其本地簇ID在其所接收到的路由的CLUSTER_LIST中,那么就知道已经出现了路由环路,因而忽略该路由。

2.3.4 管理性权值

管理性权值(Administrative Weight)是Cisco的专有BGP参数,仅用于单个路由器内的路由,该数值不与其他路由器进行交换。权值是一种可以分配给路由的数值(取值范围为0〜65 535),权值越高,表示该路由越优。在所有路由特性中,该权值是BGP判定进程在选择最佳路径时最重要的判断要素(显式指定路由除外)。在默认情况下,所有从对等体学习到的路由的权值都为0,而所有由本地路由器生成的路由的权值都为 32 768。

可以为单个路由设置管理性权值,也可以为学习自特定邻居的多条路由设置管理性权值。例如,对等体A和B可能会向同一个BGP发言者宣告相同的路由,通过为接收自对等体A的路由分配较高的权值,BGP发言者就可以优选经过对等体A的路由。需要注意的是,这种优先级仅在本地对单台路由器有效,权值信息既不会被包含在BGP Update消息中,也不会以任何方式告诉BGP发言者的对等体。

2.3.5 AS_SET

如前所述,AS_PATH属性由一组描述去往特定目的地的有序AS号组成,实际上存在如下两种类型的AS_PATH。

• AS_SEQUENCE:一个有序的AS号列表(与前面描述的一样)。

• AS_SET:一个去往特定目的地所经路径上的无序AS号列表。

这两种类型是通过AS_PATH属性中的类型代码进行区分的,详细信息请参见2.6节。


注意: 事实上,一共有4种类型的AS_PATH, 2. 5. 4小节将详细阐述另外2种类型:AS_CONFED_SEQUENCE和AS_CONFED_SET。


如前所述,AS_PATH最重要的作用是预防路由环路,如果BGP发言者发现自己的AS号位于接收自外部对等体的路由中,那么就知道出现了路由环路,从而忽略该路由。但是,如果执行了路由聚合(如图2-28所示),则将会丢失某些AS_PATH的细节信息,因而增加路由环路的潜在危险。

例如,假定图2-28中的AS 810有一条可选连接去往其他AS(如图2-30所示),那么来自AS 3113的聚合路由将被宣告给AS 6571,而该聚合路由又将通过AS 6571被宣告回AS810。

img100a

图2-30 路由聚合会丢失路径的细节信息,从而导致AS间出现路由环路

由于聚合点“之后”的AS号未能包含在AS_PATH中,因而AS 810无法检测到潜在的路由环路。进一步来说,假定AS 810中的某个网络(如206.25.225.0/24)出现故障,那么该AS中的路由器将匹配来自AS 6571的聚合路由,此时将会出现路由环路。

进一步思考后就可以发现,AS_PATH的环路预防功能并不需要AS号以特定顺序进行排列,所需要的仅仅是接收路由器能够识别出其自身的AS号是否位于AS_PATH中,这就是AS_SET的应用场合。

当BGP发言者从学习自其他自治系统的NLRI创建了一条聚合路由时,可以将AS_PATH中包含的AS号都作为AS_SET。例如,图2-31在图2-28中的聚合路由上增加了AS_SET。

img100b

图2-31 通过在聚合路由的AS_PATH中增加AS_SET,就可恢复路由聚合引起的环路预防功能

此时,汇聚路由器仍然以AS_SEQUENCE为起始,接收路由器同样可以沿路径回溯到汇聚路由器,但由于在聚合路由中包含了AS_SET,因而就可以预防路由环路了。通过这个例子还可以看出为什么AS_SET是一个无序的AS号列表,这是因为AS 3113中的汇聚路由器之后是去往各自治系统(位于聚合路由中)的多个分支路径,此时无法用有序的AS号列表来描述这些相互独立的路径。

如果AS_PATH中包含了AS_SET,那么就不需要在聚合路由中包含ATOMIC_AGGR- EGATE了。这是因为,AS_SET不但可以向下行路由器通告已经发生了路由聚合,而且还包含了比ATOMIC_AGGREGATE更多的信息。

与大多数配置选项一样,AS_SET也存在一定的功能妥协。众所周知,路由汇总的好处是可以提高路由的稳定性,也就是说,在某个属于聚合路由的网络出现故障后,该故障将不会跨越聚合点对外进行宣告。但是,如果在聚合路由的AS_PATH中包含了AS_SET,那么该路由的稳定性将会出现一定程度的降低。如图2-31所示,如果去往AS 255的链路出现了故障,那么AS_SET将会出现变化,而这种变化将会跨越聚合点对外进行宣告。

2.3.6 BGP 决策进程

BGP的RIB(Routing Information Base,路由信息库)包括以下3个部分。

• Adj-RIBs-In:存储了从对等体学习到的路由更新中未经处理的路由信息,这些包含在Adj-RIBs-In中的路由被认为是可行路由。

• Loc-RIB:包含了BGP发言者对Adj-RIBs-In中的路由应用本地路由策略之后选定的路由。

• Adj-RIBs-Out:包含了BGP发言者向对等体宣告的路由。

RIB中的这3个部分既可以是3个不同的数据库,也可以是利用指针来区分不同部分的单一数据库。

BGP决策进程通过对Adj-RIBs-In中的路由应用本地路由策略,且向Loc-RIB和Adj- RIBs-Out中输入选定或修改的路由来进行路由选择。BGP决策进程应包括以下3个阶段。

• 第1阶段计算每条可行路由的优先级。无论什么时候,只要路由器到从其邻接AS的对等体处接收到BGP Update消息(包含了新路由、发生变化的路由或撤销某路由),就会激活本决策阶段。该阶段会单独计算每条路由,并为每条路由生成一个用于指示该路由优先级的非负整数。

• 第2阶段从所有可用路由中为特定目的地选出最佳路由,并将其安装到Loc-RIB中。只有完成了第1阶段之后才会激活本决策阶段。

• 第3阶段将相应的路由加入到Adj-RIBs-Out中,以便向对等体进行宣告。只有当Loc-RIB发生变化且第2阶段已经完成之后才会激活本决策阶段。路由聚合就发生在本阶段(如果执行了路由聚合操作)。

除非指定了其他特殊的路由策略,否则第2阶段总是在所有可行路由中为特定目的地选择最精确路由。需要注意的是,如果路由的NEXT_HOP属性所指定的地址不可达,则不会选择该路由。不过这种情况对内部BGP来说存在特例,详细信息将在2.4节中描述。

迄今为止,已经介绍了可以为增强单台路由器、内部对等体、邻接自治系统及自治系统之外的路由策略而赋予BGP路由的多种属性。在对待这些路由属性时,需要注意一定的顺序和规则(特别是当路由器需要在多个属性中进行选择时,这尤为重要),从而公平地为相同的目的地选择特定路由。相应的规则如下。

(1)优选管理性权值最大的路由。由于BGP管理性权值是Cisco的专有参数,因而属于Cisco专有功能。

(2)如果管理性权值相等,则优选LOCAL_PREF值最大的路由。

(3)如果LOCAL_PREF值相等,则优选由该路由器在本地发起的路由。也就是说,优选学习自IGP(运行于该路由器上)的路由。

(4)如果LOCAL_PREF值相等,且没有该路由器在本地发起的路由,则优选AS_PATH最短的路由。

(5)如果AS_PATH长度相等,则优选路由来源编码最低的路径,IGP低于EGP,EGP低于Incomplete(不完全的)。

(6)如果路由来源编码相同,则优选MULTI_EXIT_DISC值最低的路由。仅当所有备选路由的AS号相同时才进行MULTI_EXIT_DISC值的比较。

(7)如果MED相同,则优选EBGP路由,次选联盟EBGP路由,最后选择IBGP路由。

(8)如果路由的上述属性仍相同,则优选到BGP NEXT_HOP最近的路由,该路由是去往下一跳路由器IGP度量值最小的路由。

(9)如果路由的上述属性仍相同,且这些路由均来自于同一个邻接AS,并利用命令maximum-paths启用了BGP多路径功能,则在Loc-RIB中安装所有等价路由。

(10)如果没有启用多路径功能,则优选BGP路由器ID最小的路由。

2.3.7 路由阻尼

路由翻动(route flaps)是Internet(也是所有互联网络)不稳定的首要因素。当有效路由被重复宣告为无效、有效时就会产生路由翻动现象。很显然,每次路由状态发生变化时,都要通过互联网络宣告该变化情况,进而每台路由器都要重新计算路由,从而消耗了大量的网络带宽和路由器的CPU资源。


注意: 经常可能将术语“路由振荡(route oscillation)”与路由翻动混为一谈,实际上,路由振荡属于周期性行为,而路由翻动则不是。


大多数人很快就会想到物理链路不稳定或路由器接口故障是路由翻动的罪魁祸首,这一点完全正确,不过还有其他常见原因(也可能是最常见的原因)会导致路由翻动,那就是人为因素。虽然工程人员在电信局中心机房或用户配线间内进行工程施工时,很有可能出现导致路由翻动的错误,但是不要忘记,缺乏经验的网络管理员可能会对路由器进行错误的配置或错误的故障排查,有可能会重复地增加和删除某条路由、更改接口的状态或拆除BGP会话,如果这些路由变动都被传播给了其ISP,那么该网管员的大意行为将会影响整个Internet。

这种路由不稳定性的影响到底有多坏?以单台有些过载或能力不足的BGP路由器为例,如果上行连接变得不稳定,那么将会使多条路由出现同时性的翻动现象,导致该路由器无法处理这些路由变化,从而出现故障。此时,下游路由器不但要处理原先的翻动路由,还要处理所有源自该故障路由器的不可达路由。如此一来,将在整个互联网络中产生滚雪球效应,从而可能会导致更多的路由器出现故障。因而,这种影响是非常严重的。

路由聚合可以隐藏这种路由的不稳定性,这是因为聚合路由中的某条成员路由失效后,并不会影响聚合路由本身。去往失效路由所指示目的地的数据包仍然会被转发到聚合地址,由于该聚合路由的发起者知道去往目的地的路由无效,因而会丢弃数据包。

不过,在实际情况中,并不总是能进行路由聚合。比方说,某个ISP的用户拥有一个与提供商相独立的IP地址,由于该地址不在提供商的地址块之内,因而就需要在提供商的聚合地址之外再对外宣告该用户的IP地址。另外,通过前面多归属的学习,当用户多归属到多个提供商时,也无法实施路由聚合。

即便ISP可以聚合其用户路由,为Internet提供一条稳定路由,但这种聚合对维护该ISP自己AS内部的稳定性来说仍然毫无用处,路由翻动仍然会影响聚合点之后的所有路由器。

路由阻尼(route dampening)是一种阻止不稳定路由传播到整个互联网络的方法。虽然路由阻尼并不能阻止路由器接收不稳定路由,但是能够阻止路由器继续转发不稳定路由。尽管路由阻尼技术已经出现了一段时间,但在直到最近的RFC 2439(www.isi.edu/in-notes/tr.rfc2439.txt)中才得到了正式规范。

开启路由阻尼机制的路由器会为每条路由分配一个动态的特征值,用以反映该路由的稳定程度。当某条路由出现翻动时,将会给该路由分配一个惩罚值,翻动次数越多,累加的惩罚值就越大。路由阻尼中引入了半衰期(half-life)的时间周期概念,惩罚值以一定的速率衰减到每个半衰期初值的一半,当惩罚值超出了预设的阈值(被称为抑制门限(suppress limit))之后,该路由就被抑制,即不再对外宣告该路由。直到该路由的惩罚值降低至另一个阈值(被称为重用门限(reuse limit))之后,才会再次对外宣告该路由。作为一种可选方式,也可以手工清除路由的惩罚值,这种方式对于矫正了网络中的不稳定性之后需要快速重用该路由时非常有用。

除非抑制门限被设置得非常低,否则单次路由翻动行为并不会抑制该路由。通过半衰期方式,惩罚值会最终减小到零。但是,如果路由翻动的次数足够多,以至于其惩罚值的增加速度大于半衰期的减小速度,那么将会超出抑制门限。尽管路由在被抑制期间,其惩罚值仍然会继续累加,但该路由在超出了最大抑制门限(maximum suppress limit)周期之后将无法被抑制。这样就可以确保某路由在非常短的时间内翻动十几次之后,不会将惩罚值累加到一个很高的、使路由始终保持被抑制状态的值。

Cisco默认的各种路由阻尼变量的情况如下。

• 惩罚值:1000/路由翻动。

• 抑制门限:2000。

• 重用门限:750。

• 半衰期:15分钟。

• 最大抑制时间:60分钟或半衰期的4倍。

有关在Cisco路由器上配置和使用路由阻尼机制的案例研究,参见3.3.11小节。