5.3.2 BGP工作原理及实验
BGP采用传输控制协议(Transmission Control Protocol,TCP)进行路由信息的传输。它使用TCP协议的179端口来建立连接。TCP协议是一种可靠传输协议,因此BGP协议不再需要组装、重传、确认和排序等功能。
BGP路由算法较为复杂,其路由度量不仅要考虑延迟、网络拥塞等技术因素,还必须考虑政治、安全、经济等方面的因素。
BGP基本上属于距离矢量协议,但与RIP那种通常的距离矢量协议有显著的区别。BGP路由器维护到每个目标地址的开销值和到达该目标地址的路径,可以避免路径中出现循环,解决距离矢量协议的循环路径问题,因此BGP有时也被称为路径矢量协议。
1.BGP术语
下面介绍BGP中的一些常用术语。
自治系统(Autonomous System):一个自治系统指在相同管理控制下(使用一个或多个IGP控制域内路由,使用一个EGP控制域间路由)的一组设备。即使一个自治系统中同时运行了多个IGP,从其他自治系统的角度看,此自治系统仍然具有一致的内部路由规划。
BGP发言人:运行BGP协议的路由设备称为BGP发言人。
对等体(Peer):当两个BGP发言人间建立了TCP连接,则称它们为对等体。
外部边界网关协议(External Border Gateway Protocol,EBGP)是用于在不同自治系统之间交换路由信息的路由协议。
内部边界网关协议(Internal Border Gateway Protocol,IBGP)是用于在同一个自治系统内的BGP对等体之间交换路由信息的路由协议。
自治系统域间路由(Inter-AS Routing):是在不同自治系统之间的路由。
自治系统域内路由(Intra-AS Routing):是在同一自治系统内部的路由。
2.BGP消息
两个邻居路由器在建立一个BGP对等连接之前必须执行标准的TCP三次握手,通过179端口建立一条TCP连接。TCP提供一个可靠连接所需要的分段、重传、确认以及排序等功能,将BGP从这些任务中解脱出来。所有的BGP消息都通过TCP连接采用单播方式发送给一个邻居路由器。
BGP协议中规定消息尺寸最小为19个字节,最大到4 096个字节。如图5-20所示,BGP消息报头包括3个字段。
·标记(Marker)字段:长度为16字节,用于检测一组对等体之间同步信号是否丢失,并对进入的BGP消息进行认证。本字段的值由消息类型决定,例如当Open型消息不包含认证信息,标记字段必须设置为全1。
·长度(Length)字段:长度为2字节,指示整个消息(包括标记字段)的长度。长度字段的值至少为19,不超过4 096。
·类型(Type)字段:长度为1字节,指示消息的代码类型。这个字段可以有四种取值,代表四种BGP消息类型,如表5-2所示。

图5-20 BGP消息报头格式
表5-2 类型字段的取值

(1)Open消息
TCP会话建立起来以后,邻居双方都要发送一个Open消息。每个邻居用该消息来标识自己、并指出自己的BGP运行参数。Open消息包括固定大小的BGP报头和下列字段,其消息格式如图5-21所示。
BGP版本号:表示正在运行的BGP版本(2、3或者4),默认版本是BGP-4。如果一个邻居运行的是较早的BGP版本,它会拒绝版本4的Open消息,这时路由器会将版本4改为版本3,并且再发送一个该版本的Open消息。这个协商过程一直持续到邻居双方对版本号达成一致。
AS号:指示发起会话路由器的AS号。通过此字段可以判断该BGP会话是EBGP(邻居双方的AS号不同),还是IEGP(邻居双方的AS号相同)。
Hold time:表示路由器收到一个Keepalive或是更新消息之前所允许经过的最大秒数。保持时间必须是0s(在这种情况下没有发送Keepalive)或者至少3s。如果邻居双方的保持时间不同,会选择其中较短的时间作为双方的保持时间。
BGP标识符:本字段采用IP地址来在邻居中标识自己。
可选参数:用于公布对一些可选功能的支持,如鉴别、多协议支持以及路由刷新等。
(2)Update消息
Update消息指示可用的路由和撤销的路由。Update消息中包含固定长度的BGP报头和下列字段,其消息格式如图5-22所示。

图5-21 Open消息格式

图5-22 Update消息格式
不可行路由长度:指示撤销路由字段的长度,本字段长度为2字节。值为0时表示Update消息中没有撤销路由字段。
撤销路由:用来描述已经变成无法到达,并且正从路由表中撤销的目的地址的字节组,由目的地址前缀和前缀长度组成。
路径属性总长度:本字段的长度为2字节,指示路径属性字段的长度。
路径属性:本字段长度可变,包含一条或多条路径属性,用于描述可用的路由信息,还用于决定路由和过滤路由。每条路径属性由<属性类型,属性长度,属性值>表示。
网络层可到达信息:可以是一个或者多个,用IP地址中网络号和网络号长度的字节组来表示可到达的网络。例如,59.64.0.0/19,其中网络号长度是/19,网络号就是59.64.0.0。
(3)Notification消息
当检测到差错时会发送Notification消息,通常导致BGP连接终止。Notification消息中包含了错误代码和错误子代码,可以让网络管理员更有效地排除问题。
(4)Keepalive消息
Keepalive消息用于保证对等体间的连接关系。Keepalive消息只由固定大小的BGP消息报头组成。收到Keepalive消息的路由器会重新启动Hold time计时器。每次Keepalive计时器超时都会发送Keepalive消息,Keepalive计时器的时间通常是Hold time计时器的三分之一。
3.BGP有限状态机
BGP连接的建立和工作过程可以用有限状态机来描述。图5-23和表5-3给出了完整的BGP状态机和引起状态改变的输入事件。

图5-23 BGP有限状态机
表5-3 输入事件(IE)

下面对图5-23中的6个状态和状态间的转移过程进行详细的描述:
(1)Idle状态
BGP过程通常以Idle状态开始。在该状态下,拒绝接收所有连接。当收到开始事件(IE l)时,BGP过程打开重试连接计时器、初始化到邻居的TCP连接、接听来自邻居的TCP初始化消息,并将状态转移到Connect状态。开始事件是由配置一个BGP过程,重置一个已经存在的过程,或者由路由器软件重置BGP过程引起的。
在任何状态上出现差错都会将BGP过程的状态转为Idle状态,这时路由器会自动试图发起另外一个开始事件。但是在具有持续差错的条件下,不断试图重新开始BGP过程会导致抖动,因此,在第一次转移到Idle状态时,路由器会启动重试连接(Connect Retry)计时器,当计时器超时后,路由器才能重新开始BGP过程。
(2)Connect状态
在Connect状态下,BGP过程会等待与邻居进行TCP连接的建立。如果TCP连接建立成功,BGP过程将Connect Retry清零,完成初始化过程,给邻居发送一个Open消息,并转移到Open Sent状态。如果TCP连接建立失败,BGP过程会继续监听邻居发起的连接、重置Connect Retry计时器并转移到Active状态。
如果在Connect状态下,Connect Retry计时器超时,将重置该计时器,并再次试图与邻居建立一个TCP连接,BGP过程继续保持在Connect状态。任何一个其他输入事件(除了开始事件)的出现都会导致BGP过程转移到Idle状态。
(3)Active状态
在Active状态下,BGP过程试图与邻居建立一个TCP连接。如果TCP连接建立成功,BGP过程将Connect Retry计时器清零,完成初始化工作,给邻居发送一个Open消息并转移到Open Sent状态。Hold time计时器被置成4分钟。
如果BGP过程在Active状态时,Connect Retry计时器超时,该过程会转移到Connect状态并且重置Connect Retry计时器。它同样也发起一个到对等体的TCP连接并且继续监听来自对等体的连接。如果邻居试图与一个未知的IP地址建立TCP会话,那么Connect Retry计时器会被重置,连接被拒绝,并且BGP过程保持在Active状态。任何一个其他输入事件(除了开始事件)都会导致状态转移到Idle。
(4)Open Sent状态
在Open Sent状态下,BGP过程发送Open消息,正在等待邻居的Open消息。当收到一个Open消息后,检查该消息所有的字段。如果发现了差错,会给邻居发送一个Notification消息并且将状态转移到Idle。
如果接收到的Open消息中没有差错,BGP过程给邻居发送—个Keepalive消息并将Keepalive计时器置位。邻居之间协商一个Hold time值,会选用较小的值。如果协商的Hold time是0,则不启动Hold time和Keepalive计时器。根据邻居的AS号,决定此连接是内部的还是外部的,并且将状态转移到Open Confirm状态。
如果收到了一个TCP断开消息,BGP过程断开TCP连接,重置Connect Retry计时器,开始监听由邻居发起的新连接,并将状态转移到Active。任何其他输入事件(除了开始事件)都会导致状态转移到Idle。
(5)Open Confirm状态
在Open Confirm状态下,BGP过程会等待Keepalive消息。如果收到Keepalive消息,则转移到Established状态。如果收到Notification消息或者TCP断开消息,将状态转移到Idle。
如果Hold time计时器超时,检测到一个差错或者出现了一个Stop事件,BGP过程会给邻居发送一个Notification消息并且断开BGP连接,将状态转到Idle。任何其他事件(除了开始事件)都会导致状态转移到Idle。
(6)Established状态
在Established状态下,BGP对等体之间的连接完全建立起来,对等体之间可以交换Update、Keepalive和Notification消息。如果收到Update或者Keepalive消息,重新启动Hold time计时器(如果协商的Hold time是非零)。如果收到Notification消息,状态会转移到Idle。任何其他的事件(除了开始事件)都会导致Notification消息的发送,并将状态转移到Idle。
4.BGP路由选择
BGP发言人接收路由信息后需要对其进行处理,还需要决定本地使用哪一条路由和向对等体通告哪些路由。BGP发言人通过路由信息库(RIB)获取路由。所有BGP发言人设备上都包含了RIB,RIB分为3部分:
(1)Adj-RIBs-In
每个BGP发言人都有Adj-RIBs-In,这部分RIB保存进入本设备的BGP路由。当BGP路由被放置到Adj-RIBs-In后,会经过输入策略引擎(Inbound Policy Engine)的处理。输入策略引擎根据路由器管理员预先设置的策略过滤路由或处理属性。如果BGP路由通过了输入策略引擎的过滤,就被发送到Loc-RIB。
(2)Loc-RIB
路由器使用Loc-RIB决定自己的BGP路由,然后将Loc-RIB中的所有BGP路由发送到输出策略引擎(Outbound Policy Engine)。输出策略引擎根据路由器管理员预先设置的策略在放入Adj-RIBs-Out之前过滤和处理BGP路由。
(3)Adj-RIBs-Out
如果BGP路由通过了输出策略引擎的过滤,将被放入Adj-RIBs-Out。每个BGP发言人都有Adj-RIBs-Out。放入Adj-RIBs-Out的路由将被通告给BGP发言人的对等体。
路由选择过程是决定BGP发言人接受哪些路由、本地使用哪些路由以及向对等体通告哪些路由的实际过程。选择过程分为3个阶段。
·阶段1:计算从邻居AS学习到的路由的优先程度。
·阶段2:决定到一个指定目的地址的最佳路由,然后将此路由保存到BGP发言人的Loc-RIB中,BGP发言人使用此阶段产生的路由做为BGP路由;
·阶段3:BGP发言人根据输出策略引擎中设置的策略决定向邻居自治系统通告哪些路由。此阶段还能执行路由汇聚。
BGP的路由过滤用于允许或拒绝某些被BGP发言人接收的路由或由发言人通告的路由,可以分为入口过滤和出口过滤。
入口过滤(Ingress Filtering):当BGP发言人接收路由并传输给输入策略引擎时,就发生了入口过滤。在输入策略引擎中,系统管理员可以创建策略,来允许或拒绝某些路由,也可以设置策略来操纵BGP路由属性。
出口过滤(Egress Filtering):当路由被传输到输出策略引擎时,就发生了出口过滤。出口过滤同入口过滤的方式基本相同,只是过滤的目的和位置不同。
最常见的BGP路由过滤方法有3种。
(1)路由映射。与其他过滤技术相比,路由映射为用户提供最大的路由决定能力。路由映射是一系列set和match语句的集合。match语句用于决定允许或拒绝哪些路由。如果允许某条路由,set语句可以用于操纵该路由的属性。
(2)分配列表。路由映射可以实际操纵路由属性,分配列表只能允许或拒绝路由。分配列表可以和前缀列表结合在一起。前缀列表实际说明允许或拒绝哪些特殊的路由。
(3)前缀列表。可以用于限制通告到路由器的信息或由路由器通告的信息。前缀列表的每一行都包含一个序号,这就允许添加、删除和修改前缀列表中的各行。
5.BGP同步
为了防止向其他AS通告本AS中不可达的虚假路由,需要进行BGP同步,BGP同步中要用到过渡AS和存根AS。
过渡AS(Transit AS)是连接多个自治系统的自治系统,允许一个自治系统将从其他自治系统学习到的路由传递给另外的自治系统,如图5-24所示。

图5-24 过渡AS和存根AS
在图5-24中,AS 200是过渡AS。从AS 300学习到的路由将通过AS 200传递给AS 100。同样,AS 200可以从AS 100学习到路由,并传递给AS 300。
存根AS(Stub AS)是一种不允许信息经过它传递给另一个自治系统的自治系统。图5-24中的AS 100和AS 300都是存根AS。
单宿主AS是只有一个入口点和出口点的自治系统。所有单宿主自治系统都是存根AS。
BGP同步要求在通告任何路由信息前和IGP保持同步。所以在BGP发言人向EBGP对等体通告从IBGP学习到的路由之前,它的路由必须和IGP保持同步。
如图5-25所示,R1和R2是EBGP对等体,R2和R4是IBGP对等体,R4和R5是EBGP对等体,R3不运行BGP。当不实行BGP同步时会出现R2从R4获取到R5的路由,并将其发布给R1,由于R3不运行BGP,而BGP路由没有同步到IGP上,所以R3不知道如何到达R5。当R1发送一个目的地为R5的数据包时,这个数据包会被R2接收,然后传递给R3,R3将丢弃此数据包。

图5-25 BGP同步
当运行BGP同步时可以将BGP路由发布到IGP。这时R3就知道到达R5的路由,可以实现R1与R5的互通。但是,IGP路由器就需要承担大量的BGP路由信息,会带来巨大开销。
也可以在R3上运行IBGP,并不启动BGP同步。这样R3就知道为了到达R5必须将包传递给R4,并且R5的路由不需要发布到IGP中,可以减少开销。
6.BGP实验
本实验主要是学会在路由器上配置BGP协议,并查看BGP协议的执行结果。
(1)实验目的
掌握路由器上BGP协议的配置方法,能够在模拟环境中进行路由器上BGP协议的配置。
(2)实验环境
采用Dynamips仿真软件,Dynamips仿真软件的前端可以采用Dynagen进行文本拓扑设计,也可以使用GNS3进行图形拓扑设计。
(3)实验拓扑
在本实验中,采用的拓扑结构如图5-26所示。其中采用两台路由器RT1和RT2将两台主机PC1、PC2连接在一起,两台路由器之间采用串口进行连接,而两台主机与路由器之间都采用以太网进行连接。其中路由器RT1属于自治域AS1,路由器RT2属于自治域AS2。

图5-26 BGP实验拓扑图
(4)配置过程
首先PC1、PC2、RT1和RT2的配置与静态路由试验的配置完全一样,唯一不同的就是在RT1和RT2上将静态路由删除掉。
步骤1
在RT1的配置模式下配置BGP协议。
进入BGP配置模式,也就是启动BGP进程,最后一个参数表示路由器所处的AS:
RT1(config)#Router bgp 1
指定BGP的对等体,最后一个参数表示对等体所处的AS,如果与本路由器AS一样,表示建立的是IBGP对等体,如果不一样表示建立的是EBGP对等体:
RT1(config-bgp)#neigbor 1.1.1.2remote-as 2
宣告自己的网段:
RT1(config-bgp)#network 2.0.0.0 255.0.0.0
禁止同步:
RT1(config-bgp)#no sychronization
步骤2
在RT2上也进行类似的配置:
RT2(config)#Router bgp 2
RT2(config-bgp)#neigbor 1.1.1.1remote-as 1
RT2(config-bgp)#network 3.0.0.0 255.0.0.0
RT2(config-bgp)#no sychronization
步骤3
在RT1和RT2的特权执行模式下查看BGP信息:
RT1#show ip bgp summary
RT2#show ip bgp summary
查看路由表信息:
RT1#show ip route
RT2#show ip route