一 BGP简介

BGP(Border Gateway Protocol)是一种自治系统间的动态路由发现协议。当前使用的版本是BGP-4。主要用来在自治系统之间路由IPV4流量的域间路由协议。

AS是遵循相同的策略,在统一的管理控制下的一些路由域。

BGP会话有两种类型,一种是内部BGP(IBGP),一种是外部BGP(EBGP)。内部BGP主要用于在自治系统内部路由流量,所有自治系统内部的流量必须遵循相同的路由策略,对外部BGP网络表现出本自治系统的一致性。外部BGP在自治系统的边界路由流量,每个自治体系统维持自己的路由策略,同时利用边界路由器来增强路由策略的控制,每个参与公共因特网路由的自治系统都需要唯一的自治系统号码,自治系统号范围从1~65535,私有自治系统号64512~65535。BGP 特性:
1. BGP 是一种外部路由协议,与OSPF、RIP 等内部路由协议不同,其着眼点不在于发现和计算路由,而在于控制路由的传播和选择最好的路由。
2. 通过在BGP 路由中携带AS 路径信息,可以彻底解决路由循环问题。
3. 使用TCP 作为其传输层协议,提高了协议的可靠性。
4. BGP-4 支持无类域间路由CIDR。
5. 路由更新时,BGP 只发送更新的路由.
6. BGP-4 提供了丰富的路由策略,能够对路由实现灵活的过滤和选择,
并且易于扩展以支持网络新的发展。

二 BGP路由表

运行BGP协议的路由器为了不同的目的使用不同的路由表,主IP路由表包含了通过RIP或是开放最短路径优先(OSPF)等内部网夫协议获得的路由、静态路由和直连网段。除此之外还有3个概念性的BGP表,通常被称为路由信息表(RIB),它们一般只包含和BGP相关的路由信息。BGP表被用来保存BGP路径的信息,这些信息包括到每一个目的网段的最佳路径(用于本地路由),发送给其他BGP对等体的信息以及从其他BGP对等体收到的信息。当BGP选定了到某个网段的最佳路径后,该路径会被加入到主IP路由表中。

BGP使用两个不同的路由表来分别存放接收到的和发出的网段通告:Adj-RIB-in和Adj-RIB-out。这些路由表存放从其他SPEAKER那里接收到的信息和发送给其他BGP对等体的信息。

三 BGP的邻居关系

1、EBGP:

外部BGP被用来在属于不同的自治系统(AS)的路由器之间交换路由信息,每个自治系统都有自己的路由策略并且被不同的部门或是组织的人员独立地管理。由于EBGP对等体分别属于不同的网络,每个EBGP对等体必须配置相关的策略来控制内部路由向外部网络的广播,过滤掉不应该对外通告的内部网段,在需要的时候聚合路由和提供稳定的会话。除非特别指定,EBGP对等体路由器必须互相直连。

2、IBGP:

IBGP被用在同一自治系统内部的BGP对等体之间。和EBGP— 样,每个IBGP的SPEAKER都必须被配置以便和相邻的BGP路由器建立对等的关系。BGP不支持邻居关系的自动识别,为了给通过IBGP连接的路由器提供对网络的一致埋解,这些路由器必须配置为全网状连接的体系结构。每个有IBGP对等关系的路由器都必须通过本地的BGP配置和其他所有的IBGP对等体建立连接。每个IBGP也必须在不同的BGP状态之问转换,给每一个相邻的对等体发送同样的BGP消息和建立BGP连接以交换路由信息。与EBGP对等路由器不同的是,IBGP路由器不需要直接相连。

 

四、BGP报文

OPEN报文格式

1、版本(version):1字节,BGP协议版本号。邻居协商期间,对等路由器就使用BGP版本号达成一致。通常使用两个路由器都支持的最高版本。

2、本自治系统(my autonomous system):2字节,标明发送路由器的AS号。

3、保持时间(hold time):2字节,指明在相邻的keepalive和update报文间可等待的最大时间,单位为秒。协商为最小值。

4、BGP标识(bgp identifier):4字节,指出发送路由器的BGP标识。此字段是路由器的ID号,也就是BGP会话启动时最高的回送(loopback)地址或路由器上的最高的IP地址。

5、可选参数长度(optional parameter length):1字节长,它指出可选参数字段的总长度(以字节为单位)。如果没有可选参数,此字段被设为0。

6、可选参数(optional parameter):此字段为变长的。它给出BGP邻居会话协商中的可选参数的列表。

UPDATE报文格式

当一个BGP说话者通告或撤消来自从对等路由器的一个路由时,UPDATE报文被使用。UPDATE报文包括定长的BGP头和:不可行路由长度(unfeasible routes length):包含撤消字段的长度、撤消的路由(withdrawn routes):包含了从服务中撤消的路由的IP地址前缀列表、路径属性总长度(total path attribute length)、路径属性(path attributes),此变长字段包含了与网络层可达性信息字段中的前缀相关联的BGP属性的列表。路径属性给出了正被通告的前缀的信息,如优先级,其中路径属性分为4类。

1、well-known mandatory:BGP更新报文中必须包含的,且必须被所有BGP协商所能识别的。ORIGIN、AS-PATH、NEXT-HOP就是三个这种属性的例子。

ORIGIN:路由更新的源AS。说明了源路由是怎样放到BGP表中的。一个中由可以从诸如OSPF的一个IGP得到,它被重分发布进BGP。本属性可由外部路由协议(EGP)或其他除IGP或EGP之外的东西(如静态路由)等得知。

有三个可能的源:IGP、EGP、INCOMPLETE。路由器在多个路由的处理中使用这个信息。路由器选择最有最低ORIGIN类型的路径。IGP比EGP低,EGP比INCOMPLETE低。

AS-PATH:指出包含在UPDATE报文中的路由信息所经过的自治系统。

NEXT-HOP:定义了被用来作为到达UPDATE报文中列出的目的地的下一跳的边界路由器的IP地址。

2、well-known discretionary:指必须被所有BGP实现所识别,但是在BGP更新(update)报文中可发不可发的属性。

LOCAL-PREFERENCE(本地优先级):用来区分到同一目的地的各个路由优先程度的。本地优先级越高,路由优先级就越高。本地优先级并不包含在发送到AS外的BGP邻居的更新报文中。如果这个属性包含在来自于不同AS中的BGP邻居的更新报文中,则该更新被忽略。

ATOMIC-AGGREGATE:指出已被丢失了的信息。当路由聚合时将会导致信息的丢失,因为聚合来自具有不同属性的不同源。如果一个路由器发送了导致路由信息丢失的聚合,路由器被要求将原子聚合属性附加到该路由上。

3、optional transitive:不要求所有的BGP都支持。如果该属性不能被BGP进程识别,它就会去看传递标志。如果此标志被设置了,BGP进程会接受这个属性并将它传给其他BGP speaker。

AGGREGATOR:标明了实施路由聚合的BGP SPEAKER(IP地址)和AS号。

4、optional nontransitive:不要求所有BGP实现都支持。如果此属性不能被BGP进程识别,它会去查看传递标志。如果未设置传递标志,此属性应该被忽略并不传送给其他BGP对等体。

MULTI-EXIT-DISC:MED被BGP SPEAKER用来区分到一个相邻AS的多个出口点。低MED表示高优先级。MED属性在自治系统间切换,但MED属性进入一AS后就不离开该AS(非传递的)。这与local pref的处理不同,在这里外部路由器能够影响到另一个AS中的路径选取。使用local pref仅能影响到自己AS内部的路由。

五 通知(NOTIFICATION)报文:

BGP通知报文用于表明一个错误,这个错误可能会导致BGP会话中断。通知报文通常在会话刚刚中断时就立即产生。当BGP连接中断后,在两个BGP对等体之间的TCP会话将关闭,所有资源被释放。“路由撤销”报文会向其他BGP对等体发送,所有BGP路由会从路由表中删除。BGP会话可能会出于多种原因被中断。

每个通知报文包含了3个字段:错误代码、错误子代码和数椐。错误代码字段指明了NOTIFICATION错误的类型,如果有的话错误子代码给出出错的详细解释,数据字段包含了和错误相关的诊断信息,不是所有的通知报文都有数据字段。

主要错误通知报文:

1、报文报头错误:

表明处理BGP报文的报头时发现错误,通过子代码可以表明出错的原因

2、OPEN报文错误:

表明一个0PEN报文中有错误,通过子代码可以表明出错的原因

3、UPDATE报文错误:

表明一个UPDATE报文中有错误,通过子代码可以表明出错的原因

4、保持计时器超时:

表明在协商好的时间间隔内没有收到KEEPALIVE或是UPDATE报文

5、有限状态机错误:

当发生不可预见的错误时发送给对端路由器来终结BGP会话

6、停止:

表示立刻终止BGP会话

保活(keepalive)报文:

当BGP会话成功地建立并且完成了BGP更新的发送和接收后,BGP对等体会周期性地互相发送保活报文。默认的情况下BGP路由器每隔60s发送保活报文,通知相邻的对等体BGP连接仍然处于激活状态,保活报文的间隔可以从默认值改为3-4294967295之间的任意数值,或是设为0表示不需要交换保活报文。

六 BGP状态机

1. 空闲(idle):不分配BGP资源,不允许传入BGP连接。
2. 连接(connect):BGP等待TCP连接完成,连接成功进入open sent状态,连接不成功进入active状态。
3. 活动(active):初始化一个TCP连接来建立BGP间的邻居关系,连接成功进入open sent状态,连接不成功仍处于active状态或退回idle状态。
4. 打开发送(open sent):发送open分组给对方,等侍对应的回应,有回应进入open confirm状态,无回应退回idle状态或active状态。
5. 打开确认(open confirm):等待对方的keepalive分组,接收到keepalive分组,进入established状态,没收到keepalive分组,退回idle状态。
6. 已建立(established):BGP对待体之间可以交换信息状态,交换的信息:update信息,keepalive信息,notification信息。

处于Idle状态的BGP进程不接受任何邻居发送过来的邻居建立的请求,除非触发了BGP start事件,这事件一般是由用户配置BGP触发的,一旦触发了BGP start事件,设备就会初始化一个connect-retry timer,并且向指定邻居发起建立TCP 连接的请求,然后就进入了connect状态。

处于connect状态的设备会试图完成与邻居的TCP连接,如果连接一旦建立,设备就会清除connect-retry timer,发送open message,然后进入open-sent状态。

如果连接建立失败,设备就会重置connect-retry timer,然后等待邻居发送过来的连接建立请求,这时就进入Active状态。

如果connect-retry timer超时,设备就会重置它,并试图与邻居建立TCP连接,BGP仍然保持在connect状态。

如果在connect状态中设备遇到错误,就会回到Idle状态。

状态三 Active

处于Active状态的设备仍然试图完成与邻居的TCP连接,如果连接一旦建立,设备就会清除connect-retry timer,发送open message,然后进入open-sent状态。

如果connect-retry timer超时,设备就会重置它,并试图与邻居建立TCP连接,BGP会回到connect状态。

如果邻居试图建立TCP连接的请求报文中的源地址与本地邻居表中的地址不符,设备就会陷入active状态。

如果在active状态中设备遇到错误,就会回到Idle状态。

状态四 Open-sent

在open-sent状态中,设备会等待邻居发送过来的open message,一旦接受到邻居发送过来的open message,设备就会检查open message中的所有字段,如果发现错误,设备就会发送Notification message通告这个错误,并且中断TCP连接,回到Idle状态。

如果所有的字段都匹配,设备就会发送第一个Keepalive message,初始化Holdtimer和Keepalive timer,进入open-confirm状态。

如果在open-sent状态中设备遇到错误,或是Holdtimer超时,设备就会发送Notification message通告错误,并回到Idle状态。

状态五 Open-confirm

设备在open-confirm状态会等待邻居发送过来的Keepalive message,一旦收到,就会进入Established状态。

如果在open-confirm状态中设备遇到错误,或是Holdtimer超时,设备就会发送Notification message通告错误,并回到Idle状态。