M000 0003 BGP协议原理详解版中文版10Word格式.docx
《M000 0003 BGP协议原理详解版中文版10Word格式.docx》由会员分享,可在线阅读,更多相关《M000 0003 BGP协议原理详解版中文版10Word格式.docx(27页珍藏版)》请在冰豆网上搜索。
而在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对等体(BGPPeer),同时在本地保存了已经发送给BGP对等体的路由信息。
当本地的BGP收到了一条新路由时(如通过IGP注入了新路由或加入了新的静态路由),与保存的已发送信息进行比较,如未发送过,则发送,如已发送过则与已经发送的路由进行比较,如新路由花费更小,则发送此新路由,同时更新已发送信息,反之则不发送。
当本地BGP发现一条路由失效时(如对应端口失效),如此路由已发送过,则向BGP对等体发送一个撤消路由消息。
总之,BGP不是每次都广播所有的路由信息,而是在初始化全部路由信息后只发送路由的变化量(增量)。
这样保证了BGP和对端的最小通信量,但同时也增加了BGP的复杂程度。
因为对于IGP,本地路由协议只需发送发送时刻所知的全部路由,而不保存任何已发送信息,路由选择的工作由对端来完成;
而BGP必须为每个BGP对端保存已经发送的路由信息,以便发送一条新路由前确认其是否真的应该发送。
为了减小路由表的体积和发送路由的通信量,BGP还支持CIDR(ClasslessInterDomainRouting)。
它使用带有较短的掩码(相对于自然掩码)的路由来在一条路由中表达更多的路由信息。
如从202.112.1.0/24-202.112.254.0/24可以使用202.112.0.0/16表示,从而减小了路由表的体积和发送路由信息时的网络流量。
同时,作为AS自治区域间的路由协议,由于政治的、经济的等原因,BGP需要按照不同的路由的属性控制路由的发送和引入。
因此,BGP有丰富的路由策略控制手段。
1.1.2
自治系统
自治系统指的是:
由同一个技术管理机构管理、使用统一选路策略的一些路由器的集合。
每个自治系统都有唯一的自治系统编号,这个编号是由因特网授权的管理机构分配的。
引入自治系统的基本思想:
就是通过不同的编号来区分不同的自治系统。
这样,当网络管理员不期望自己的通信数据通过某个自治系统时,这种编号方式就十分有用了。
或许,该网络管理员的网络完全可以访问这个自治系统,但由于它可能是由竞争对手在管理,或是缺乏足够的安全机制,因此,可能要回避它。
通过采用路由协议和自治系统编号,路由器就可以确定彼此间的路径和路由信息的交换方法。
自治系统的编号范围是1到65535,其中1到65411是注册的因特网编号,65412到65535是专用网络编号。
1.1.3
BGP的工作机制
BGP系统作为应用层协议运行在一个特定的路由器上。
系统初启时通过发送整个BGP路由表交换路由信息,之后为了更新路由表只交换更新消息(updatemessage)。
系统在运行过程中,是通过接收和发送keep-alive消息来检测相互之间的连接是否正常。
发送BGP消息的路由器称为BGP发言人(speaker),它不断的接收或产生新路由信息,并将它广告(advertise)给其它的BGP发言人。
当BGP发言人收到来自其他自治系统的新路由广告时,如果该路由比当前已知路由好、或者当前还没有可接受路由,它就把这个路由广告给自治系统内所有其它的BGP发言人。
一个BGP发言人也将同它交换消息的其它的BGP发言人称为同伴(peer),若干相关的同伴可以构成同伴组(group)。
一般情况下一条路由是从自治系统内部产生的,它由某种内部路由协议发现和计算,传递到自治系统的边界,由自治系统边界路由器(ASBR)通过EBGP连接传播到其它自治系统中。
路由在传播过程中可能会经过若干个自治系统,这些自治系统称为过渡自治系统。
如:
AS5。
若这个自治系统有多个边界路由器,这些路由器之间运行IBGP来交换路由信息。
这时内部的路由器并不需要知道这些外部路由,它们只需要在边界路由器之间维护IP连通性。
AS2、AS3、AS4。
路由到达自治系统边界后,若内部路由器需要知道这些外部路由,ASBR可以将路由引入内部路由协议。
外部路由的数量是很大的,通常会超出内部路由器的处理能力,因此引入外部路由时一般需要过滤或聚合,以减少路由的数量,极端的情况是使用默认路由。
还有一种自治系统称为StubAS,如:
AS1、AS6、AS7。
其内部只有一个ASBR通过EBGP连接外部,同外部其他AS的通信要靠过渡自治系统来转接。
对一个具体的ASBR来说,其路由的来源有两种:
从对等体接收的或者从IGP引入的。
对于接收的路由,根据其属性(如AS路径、团体属性等)进行过滤,并设置某些属性(如本地优先、MED值等),之后若需要的话,将具体的路由聚合为超网路由。
BGP可能从多个对等体收到目的地相同的路由,根据规则选择最好的路由并加入IP路由表。
对于IGP路由,则要经过引入策略的过滤和设置。
BGP发送优选的BGP路由和引入的IGP路由给对等体。
1.1.4
BGP的两种邻居
BGP在路由器上以下列两种方式运行:
IBGP(InternalBGP)
EBGP(ExternalBGP)
如果两个交换BGP报文的对等体属于同一个自治系统,那么这两个对等体就是IBGP对等体(InternalBGP),如RTB和RTD。
如果两个交换BGP报文的对等体属于不同的自治系统,那么这两个对等体就是EBGP对等体(ExternalBGP),如RTA和RTB。
虽然BGP是运行于自治系统之间的路由协议,但是一个AS的不同边界路由器之间也要建立BGP连接,只有这样才能实现路由信息在全网的传递,如RTB和RTD,为了建立AS100和AS300之间的通信,我们要在它们之间建立IBGP连接。
IBGP对等体之间不一定是物理上直连的,但必须保证逻辑上全连接。
(TCP连接能够建立即可)。
一般的路由器(包括Quidway系列路由器)都默认要求EBGP对等体之间是有物理上的直连链路,同时他们一般也提供改变这个缺省设置的配置命令。
1.1.5
BGP路由通告原则
BGP的路由通告原则:
多条路径时,BGPSpeaker只选最优的给自己使用;
BGPSpeaker只把自己使用的路由通告给相邻体;
BGPSpeaker从EBGP获得的路由会向它所有BGP相邻体通告(包括EBGP和IBGP);
BGPSpeaker从IBGP获得的路由不向它的IBGP相邻体通告;
BGPSpeaker从IBGP获得的路由是否通告给它的EBGP相邻体要依IGP和BGP同步的情况来决定;
连接一建立,BGPSpeaker将把自己所有BGP路由通告给新相邻体。
这些通告原则都是BGP的设计者在设计BGP路由协议时硬性规定的,这里我们不深究其原因。
1.1.6
BGP同步
BGP协议规定:
一个BGP路由器不将从内部BGP对等体得知的路由信息通告给外部对等体,除非该路由信息也能通过IGP得知。
若一个路由器能通过IGP得知该路由信息,则可认为路由能在AS中传播,内部通达已有了保证。
BGP的主要任务之一就是向其它自治系统发布该自治系统的网络可达信息。
如胶片所示,RTB会把去往10.1.1.1/24的路由信息封装在UPDATE报文中,通过由RTC、RTD建立的TCP连接通告给RTE,如果RTE不考虑同步问题,直接接受了这样一条路由信息并通告给RTF。
那么,如果RTF或RTE有去往10.1.1.1/24的数据报文要发送,这个数据报文要想到达目的地必须径过RTD和RTC,由于先前没有考虑同步问题,RTD和RTC的路由表中没有去往10.1.1.1/24的路由信息,数据报文到了RTD就会被丢弃。
因此,BGP必须与IGP(如RIP、OSPF等)同步。
同步是指BGP必须等待直到IGP在其所在自治系统中成功传播该选路信息,才向其它自治系统通告过渡信息。
也就是说,当一个路由器从IBGP对等体收到一个目的地的更新信息,在把它通告给其它EBGP对等体之前,要试图验证该目的地通过自治系统内部能否到达(即验证该目的地是否存在于IGP,非BGP路由器是否可传递业务量到该目的地。
若IGP认识这个目的地,才接受这样一条路由信息并通告给EBGP对等体,否则将把这个路由当作与IGP不同步,不进行通告。
如胶片所示,RTE通过IBGP邻居关系获得去往AS100内网络10.1.1.1/24的路由,RTE不会马上将其添加到自己的路由表中,也不会向RTF通告。
RTE看OSPF是否也能获得去往10.1.1.1/24路由。
如果OSPF能就说明IGP和BGP是同步的,RTE就把该路由添加到路由表中,并通告给RTF。
如OSPF没能获得去往10.1.1.1/24路由,则IGP和BGP不同步,RTE不会把去往10.1.1.1/24的路由添加到路由表中,也不会向RTF通告该路由。
解决的方法有很多,最简单的办法是RTB把BGP路由信息引入到OSPF路由表中,再由OSPF通告到RTE,这样就同步了。
但是一般不建议这样做,因为BGP路由表很大,引入到OSPF中来会给系统带来很大负担。
其它的解决办法如:
可以在RTB上配置一条去往10.1.1.1/24的静态路由,再把该静态路由引入到OSPF中,这样也可以达到同步。
实际上,同步和不同步是可以配置的。
Quidway系列路由器缺省情况下BGP与IGP是同步的。
虽然同步是可以取消的,但取消同步是有条件的。
当AS中所有的BGP路由器能组成IBGP全闭合网时,可以取消同步,在同步被取消以后,有一个新的问题需要考虑:
RTB去往10.1.1.1/24的下一跳是s0:
1.1.1.1/24,RTB在把该路由信息通告给RTE时,保持路由的下一跳不变,因为它们之间是IBGP。
这样对于RTE来说,去往10.1.1.1/24的下一跳是s0:
1.1.1.1/24。
下一跳s0:
1.1.1.1/24是否可达成为关键问题。
对于RTE来说,如果下一跳s0:
1.1.1.1/24可达,RTE就接受去往10.1.1.1/24的路由,如果下一跳s0:
1.1.1.1/24不可达,RTE就不接受去往10.1.1.1/24的路由。
怎样才能让下一跳可达呢?
方法同样很多,通常可以通过配置强制改变下一跳来解决问题。
因为AS中所有的BGP路由器是IBGP全闭合连接,路由器在向IBGP邻居通告路由时强制下一跳为自己本身的接口,这样对于IBGP邻居来说,下一跳就是直连网段地址,可达性也就解决了。
胶片中讨论的情况是:
建立IBGP邻居关系的两台路由器之间是TCP连接的,在这种情况下,一般不能取消同步,因为在TCP连接的情况下下一跳可达很难满足。
如胶片所示,可以在RTB上配置RTB在向RTE通告路由信息时会强制改变下一跳为它本身接口2.1.1.2。
对于RTE来说2.1.1.2是直连的、可达的。
当然,也可以通过配置IGP路由协议和静态路由来解决下一跳可达的问题。
1.1.7
如何成为BGP路由
BGP路由协议是运行在自治系统之间的路由协议,它的主要工作是在自治系统之间传递路由信息,而不是去发现和计算路由信息。
发现和计算路由信息的任务由IGP(如:
RIP、OSPF)路由协议来完成。
BGP的路由信息需要通过配置命令的方式注入到BGP中。
按照注入的方式可分为三类:
纯动态注入、半动态注入、静态注入。
纯动态注入是指:
路由器将通过IGP路由协议动态获得的路由信息直接注入到BGP中去。
纯动态注入方式没有对路由信息做任何过滤和选择,它会把路由器获得的所有IGP路由信息都引入到BGP系统中。
从另一角度来说,这样一种路由注入方式配置简单,一次性引入了所有的路由信息。
当然,在实际工程中可以根据需要选择。
半动态注入是指:
路由器有选择性的将IGP发现的动态路由信息注入到BGP系统中去。
它和纯动态注入的区别在于不是将IGP发现的所有路由信息注入到BGP中去。
如胶片所示,路由器B通过OSPF协议动态地发现去往网络18.0.0.0/8的路由,再通过配置命令静态将其引入到BGP中,我们称这样一种路由注入方式为半动态注入。
静态注入是指:
路由器将静态配置的某条路由注入到BGP系统中。
如胶片所示,路由器B首先,建立一条去往网络18.0.0.0/8的静态路由,再通过配置命令将其静态引入到BGP中,我们称这样一种路由注入方式为静态注入。
1.2
BGP的报文和状态机
1.2.1报文种类
BGP有4种类型的报文,分别为OPEN、UPDATE、NOTIFICATION和KEEPALIVE。
BGP对等体间通过发送OPEN报文来交换各自的版本、自治系统号、保持时间、BGP标识符等信息,进行协商。
UPDATE报文携带的是路由更新信息。
其中包括撤销路由信息和可达路由信息及其路径属性。
当BGP检测到差错(连接中断、协商出错、报文差错等)时,发送NOTIFICATION报文,关闭同对等体的连接。
KEEPALIVE报文在BGP对等体间周期地发送,以确保连接保持有效。
OPEN报文主要用于建立邻居(BGP对等体)关系,它是BGP路由器之间的初始握手消息,应该发生在任何通告消息之前。
其他在收到OPEN消息之后,即以KEEPALIVE消息作为响应。
一旦握手成功,则这些BGP邻居就可以进行UPDATE(更新)、KEEPALIVE(保持激活)以及NOTIFICATION(通知)等消息的交换操作。
1.2.2
报文内容及格式
BGP报文头的格式如图所示,每行的宽度为4个字节。
Marker鉴权信息:
16字节,全1。
这个标记的作用主要是用来检测BGP对等体之间的同步是否丢失,并对进来的BGP消息进行验证。
Length消息的长度:
2字节,指示整个消息的长度,包括头标长度,最小的BGP消息长度是19字节(Keepalive报文),最大的长度是4096字节。
Type消息的类型:
1字节,指示报文类型,如OPEN、UPDATE报文等。
1:
OPEN
2:
UPDATE
3:
NOTIFICATION
4:
KEEPALIVE
Version:
(1字节)发端BGP版本号
MyAutonomousSystem:
(2字节无符号整数)本地AS号
HoldTime:
(2字节无符号整数)发端建议的保持时间BGPIdentifier:
(4字节)发端的路由器标识符
OptionalparmetersLen:
(1字节)可选的参数的长度
OptionalParameters:
(变长)可选的参数
消息的开始部分包括BGP的版本号和发送方的自治系统编号。
接下来是保持时间(HOLDTIME)字段,这是发送方提供建议的保持定时器的设定秒数。
保持定时器规定了BGP邻居认为发送方信息有效的时间长度。
再下一个字段是BGP标识(BGPID),也就是BGP发送方的标识。
该值是在BGP对等体之间进行握手操作的过程中确定的,并且在每个本地接口及每个BGP对等体之间是保持不变的。
KeepAlive报文主要用于对等体路由器间的运行状态以及链路的可用性确认。
KeepAlive报文的组成只包括一个BGP数据报头。
KeepAlive消息在对等路由器间的交换频度以保证对方保持定时器不超时为限。
当一台路由器与其邻居建立BGP连接之后,将以Keepalive-interval设定的时间间隔周期性地向对等体发送Keepalive报文,表明该连接是否还可保持。
缺省情况下,发送Keepalive的时间间隔为60秒。
UnfeasibleRoutesLen:
(2字节无符号整数)不可达路由长度
WithdrawnRoutes:
(变长)撤消路由
PathAttributeLen:
(2字节无符号整数)路径属性长
PathAttributes:
(变长)路径属性(以下详细说明)
NetworkLayerReachabilityInformation:
(变长)网络可达信息(目标)
其中撤消路由和目标地址的表示方法为一<
length,prefix>
的二元组。
length一个字节,指示地址前缀的长度。
prefix为地址前缀,长度1至4字节。
UPDATE报文是BGP系统中最重要的信息,用于在同伴之间交换路由信息,它最多由三部分构成:
不可达路由(unreachable)、路径属性(pathattributes)、网络可达性信息(NLRI,networklayerreachabilityinformation)。
UPDATE消息可以向BGP对等体通告一条路由,也可以撤消多条“行不通”的路由。
不可达路由字段包括一个所撤消路由的IP地址前缀列表。
路径属性字段是一个路径属性的列表,包括:
属性类型、属性长度和属性值等。
网络可达字段包括了BGP路由器所知道的且可到达的IP地址前缀列表。
一个UPDATE消息一次只能通告一个路由,但它可以携带多个路径属性。
一个UPDATE消息一次也可通告多条路由,但它的路径属性必须相同。
一个UPDATE消息可以同时列出多个被撤消的路由。
Notification报文主要在发生错误或对等体连接被关闭的情况下使用,该消息携带各种错误代码(如定时器超时等),包括错误代码、辅助错误代码及错误信息。
Errorcode:
(1字节)错误代码:
错误代码
错误类型
1
消息头错
2
OPEN消息错
3
UPDATE消息错
4
保持时间超时
5
状态机错
6
退出
Errsubcode:
(1字节)辅助错误代码,略。
Data:
(变长)依赖于不同的错误代码和辅助错误代码。
用于诊断错误原因。
1.2.3
BGP协议的状态机
BGP协议有限状态机有六个状态,它们之间的转换过程示意了BGP邻居关系建立的过程。
首先是Idle状态,BGP协议一旦Start,状态机就进入Connect状态,在Connect状态,如果Connect-Retry定时器超时,BGP状态机会停留在Connect状态,同时,BGP试图建立TCP连接,如果TCP连接建立失败,BGP状态机进入Active状态。
如果TCP连接建立成功,BGP状态机就直接进入OpenSent状态。
在Active状态,如果TCP连接依然不能建立起来,那么BGP状态机就会一直停留在Active状态,直到TCP连接建立成功,才会进入OpenSent状态。
在OpenSent状态,BGP一旦收到了一个正确的Open报文,就会进入OpenConfirm状态。
在OpenConfirm状态,如果KeepAlive定时器超时,BGP状态机就会停留在OpenConfirm状态。
直到BGP收到KeepAlive报文,BGP状态机才会进入Established状态。
这时BGP连接才算建立起来。
另外,在除Idle状态以外的其它五个状态出现任何Error的时候,BGP状态机就会退回到Idle状态。
Idle(空闲):
Idle是BGP连接的第一个状态,在空闲状态,BGP在等待一个启动事件,启动事件出现以后,BGP初始化资源,复位连接重试计时器(Connect-Retry),发起一条TCP连接,同时转入Connect(连接)状态。
Connect(连接):
在Connect状态,BGP发起第一个TCP连接,如果连接重试计时器(Connect-Retry)超时,就重新发起TCP连接,并继续保持在Connect状态,如果TCP连接成功,就转入OpenSent状态,如果