NP笔记——07 BGP概述和工作原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/x503809622/article/details/82629474

动态路由协议可以按照工作范围分为IGP和EGP。IGP工作在同一AS内,主要用来发现和计算路由,为AS内提供路由信息的交换;而EGP工作在AS与AS之间,在AS间提供无环路的路由信息交换,BGP在是EGP的一种

        

自治系统的典型定义是指由同一个技术管理机构管理,使用统一选路策略的一些路由器的集合。

每个自治系统都有唯一的自治系统编号,这个编号是由IANA分配的。

我们通过不同的编号来区分不同的自治系统。当网络管理员不期望自己的数据通过某个自治系统时,比如由于该自治系统可能是由竞争对手在管理,或是缺乏足够的安全机制,因此需要回避它。这种情况下,网络管理员就可以通过路由协议、策略和自治系统编号控制数据转发的路径。

自治系统的编号范围是从1到65535,其中1到64511是注册的因特网编号,64512到65535是私有网络编号。

自制系统内部的路由协议——IGP:着重于发现和计算路由

自制系统之间的路由协议——EGP:通常指的就是BGP,着重控制路由的传播和选择最优的路由

 

BGP——(border gateway protocol)是外部路由协议(边界网关路由协议),用来在AS之间传递路由信息是一种增强的距离矢量路由协议(应用场景),基本功能是在自治系统间自动交换无环路的路由信息,通过交换带有自治系统号序列属性的路径可达信息,来构造自治系统的拓扑图,从而消除路由环路并实施用户配置的路由策略。与OSPF和RIP等在自治系统内部运行的协议相比,BGP是一种EGP(Exterior Gateway Protocol),而OSPF、RIP、ISIS等为IGP(Interior Gateway Protocol)。BGP协议经常用于ISP之间

         可靠的路由更新机制(TCP建立连接)

         丰富的metric度量方法

         从设计上避免了环路的发生(AS-PATH)

为路由附带属性信息

支持CIDR(无类域间路由)

丰富的路由过滤和路由策略

增量更新计算

(边界网关协议(BGP),提供自治系统之间无环路的路由信息交换(无环路保证主要通过其AS-PATH实现),BGP是基于策略的路由协议,其策略通过丰富的路径属性(attributes)进行控制。BGP工作在应用层,在传输层采用可靠的TCP作为传输协议(BGP传输路由的邻居关系建立在可靠的TCP会话的基础之上)。在路径传输方式上,BGP类似于距离矢量路由协议。而BGP路由的好坏不是基于距离(多数路由协议选路都是基于带宽的),它的选路基于丰富的路径属性,而这些属性在路由传输时携带,所以我们可以把BGP称为路径矢量路由协议。如果把自治系统浓缩成一个路由器来看待,BGP作为路径矢量路由协议这一特征便不难理解了。除此以外,BGP又具备很多链路状态(LS)路由协议的特征,比如触发式的增量更新机制,宣告路由时携带掩码等。)

 

BGP路由传递:

         需要手工创建TCP连接:

                  知道两端的IP地址,可以通过直连接口、静态路由或者IGP学习到

         传输协议:TCP,目的端口号179,源端口号随机

         无需周期性更新

         路由更新:只发送增量路由(增加、修改、删除的路由信息)

         周期性发送keepAlive报文检测TCP的联通性

如果TCP连接建立起来,两端的设备必须交换某些数据以确认对方的能力或确定自己下一步的行动,即所谓的能力交互。这个过程是必须的,因为任何支持IP协议栈的设备都支持TCP连接的建立,但不是每个支持IP协议栈的设备都支持BGP,所以必须在该TCP连接上进行确认

确认对方支持BGP协议后,就进行路由表的同步。两端路由表同步完成之后,并不是立即拆除这个连接。如果把这个TCP连接给拆除了,以后路由表发生改变,同步的时候就必须重新建立,这样需要消耗很多资源。如果利用保持的TCP连接,就可以不用重新建立连接而马上进行数据的传输。

建立连接的两台设备互为对等体(PEER。为了确保两边设备的BGP进程都正在运行,要求两端的设备通过该TCP连接周期性的发送KeepAlive消息,以向对端确认自己还存活。

如果一端设备在一个存活超时的时间内没有接收到对方的KeepAlive消息,则认为对方已经停止运行BGP进程,于是拆除该TCP连接,并把从对方接收到的路由全部删除。

        

BGP的报文种类:

  1. open:负责和对等体建立邻居关系,包括BGP版本,AS号等信息,建立TCP连接后才会交互open信息已确认是否能成为邻居
  2. keepalive:该消息在对等体(建立bgp邻居之后的路由器)之间周期性的发送,以维护连接,用于判断对等体之间的可达性
  3. updata:该消息被用来在BGP对等体之间传递路由信息(包括可达和不可达的,以及各种的路由属性)
  4. notification:当BGP speaker检测到错误的时候,就发送该消息给对等体
  5. route-refresh:用来通知对等体自己支持路由的刷新能力

配置BGP:

         要求IP的联通性:(一个路由器只能在一个AS内)

         bgp AS-NUMBER

         router-id x.x.x.x

         peer 邻居IP as-number AS-ID

BGP报头

marker(标记):16字节,固定为1

length(长度):两字节无符号整数。指定了消息的全长,包括头部

type(类型):1字节,指定报文的类型:

                   1 – open报文

                   2 – update报文

                   3 – notification报文

                   4 – keepalive报文

主要字段的解释如下:

Version:BGP的版本号。对于BGPv4来说,其值为4。

My Autonomous System:本地AS编号。通过比较两端的AS编号可以确定是EBGP连接还是IBGP连接。

Hold Time:在建立对等体关系时两端要协商Hold time,并保持一致。如果两端所配置的Hold time时间不同,则BGP会选择较小的值作为协商的结果。如果在这个时间内未收到对端发来的Keepalive消息,则认为BGP连接中断。

BGP Identifier:BGP路由器的Router ID,以IP地址的形式表示,用来识别BGP路由器。在VRP5.30系统中,如果没有通过命令router id进行配置,则按照如下规则进行选择:优选Loopback接口地址中最大的地址作为Router ID,如果没有Loopback接口配置了IP地址,则从其它配置了IP地址的物理接口中选择一个最大IP地址的作为Router ID。

Opt Parm Len(Optional Parameters Length):可选参数的长度。如果为0则没有可选参数。

Optional Parameters:是一个可选参数用于BGP验证或多协议扩展(Multiprotocol Extensions)等功能。每一个参数为一个(Parameter Type-Parameter Length-Parameter Value)三元组。

对等体在接收到Open消息后,将发送Keepalive消息确认并保持连接的有效性。确认后,对等体间可以进行Update、Notification、Keepalive和Route-refresh消息的交换。

KeepAlive报文主要用于对等体路由器间的运行状态以及链路的可用性确认。KeepAlive 报文的组成只包括一个BGP数据报头。 KeepAlive 消息在对等体之间的交换频率以保证对方保持定时器不超时为限。

当一台路由器与其邻居建立BGP连接之后,将以Keepalive-interval设定的时间间隔周期性地向对等体发送KeepAlive 报文,表明该连接是否还可保持。

缺省情况下,发送KeepAlive 的时间间隔为 60 秒,Hold Time是180秒。每次从邻居处接收到KeepAlive 报文将重置Hold Time定时器,如果Hold Time定时器超时,就认为对等体Down掉。

UPDATE消息被用作在BGP对等体之间传递路由信息。多条可达路由信息可以被通告到相应的对等体上,或者多条不可达路由信息被撤消。UPDATE消息由以下五个部分组成:

Withdrawn Routes Length :(2字节无符号整数) 不可达路由长度,表示Withdrawn Routes字段的数据长度。如果Withdrawn Routes Length字段数值为0,则表示Withdrawn Routes字段没有任何数据,在UPDATE消息中不会被显示。

Withdrawn Routes :(变长) 撤销路由。该字段包括一系列的IP地址前缀信息,以<length, prefix>的格式来表示,比如<19,198.18.160.0>表示一个198.18.160.0 255.255.224.0的网络。

Path Attribute Length :(2字节无符号整数) 路由属性长度,表示Path Attribute字段的数据长度。如果Path Attribute Length数值为0,则表示Path Attribute字段没有任何数据,在UPDATE消息中不会被显示。

Path Attributes :(变长) 路径属性。每个路径属性都是由三元组所组成:<attribute type, attribute length, attribute value>。

Network Layer Reachability Information :(变长) 网络可达信息。包括一系列的IP地址前缀。格式与撤消路由字段一样<length, prefix>。       

最小UPDATE消息的长度为23个字节(19字节的报文头+2字节的撤消路由长度+2字节的路径属性长度)。这样的UPDATE消息被称之为End-of-RIB,用于BGP GR。

一条UPDATE消息可以发布多条具有相同路由属性的可达路由,这些路由可共享一组路由属性。所有包含在一个给定的Update消息里的路由属性适用于该Update消息中的NLRI字段里的所有目的地(用IP前缀表示)。

一条UPDATE消息可以撤销多条不可达路由。每一个路由通过目的地(用IP前缀表示),清楚的定义了BGP Speaker之间先前通告过的路由。

一条UPDATE消息可以只用于撤销路由,这样就不需要包括路径属性或者网络可达信息。相反,也可以只用于通告可达路由,就不需要携带Withdrawn Routes了。

(AS号码错误)

Notification报文主要在发生错误或对等体连接被关闭的情况下使用,该消息携带各种错误码(如定时器超时等),以及错误子码和错误信息。

Errorcode:错误码。1字节长的字段。每个不同的错误都使用唯一的代码表示,而每一个错误码都可以拥有一个或多个错误子码,但如果某些错误码并不存在错误子码的话,则该错误子码字段以全0表示。

Errsubcode:错误子码。

         消息头错误子码:

                   1 – 连接非同步

                   2 – 错误的消息长度

                   3 – 错误的消息类型

         OPEN消息错误子码:

                   1 – 不支持的版本号

                   2 – 错误的对等体AS号

                   3 – 错误的BGP ID

                   4 – 不支持的可选参数

                   5 – RFC1771里被定义为认证失败,RFC4271里则对此表示反对。具体请参考RFC1771/RFC4271

                   6 – 不可接受的保持时间(Hold Time)

         UPDATE消息错误子码:

                   1 – 畸形的属性列表

                   2 – 无法识别的公认属性

                   3 – 缺少的公认属性

                   4 – 属性标志位错误

                   5 – 属性长度错误

                   6 – 无效的ORIGIN属性

                   7 – RFC1771里被定义为AS路由环路,RFC4271里对此表示反对。具体请参考RFC1771/RFC4271

                   8 – 无效的下一跳属性

                   9 – 可选属性错误

                   10 – 无效的网络字段

                   11 – 畸形的AS_PATH

Data:依赖于不同的错误码和错误子码,用于标识错误原因。是一个可变长的字段,被NOTIFICATION用作诊断错误的原因。注:Data字段的长度可以由以下公式来决定:消息长度=21+Data长度 (NOTIFICATION消息最小长度为21个字节,其中已经包括消息头。)

主要字段的解释如下:

AFI(Address Family Identifier):地址族标识符(2字节)。

Res.(Reserved field):保留区域(1字节),发送方应将其设置为0,接收方应当忽略该区域的信息。

SAFI(Subsequent Address Family Identifier):子地址族标识符(8字节)。

在所有BGP路由器使能Route-refresh能力的情况下,如果BGP的入口路由策略发生了变化,本地BGP路由器会向对等体发布Route-refresh消息,收到此消息的对等体会将其路由信息重新发给本地BGP路由器。这样,可以在不中断BGP连接的情况下,对BGP路由表进行动态刷新,并应用新的路由策略。

 

 

 

 

总结:

         BGP使用TCP建立连接,本地监听端口为179。和TCP连接建立相同,BGP连接的建立也要经过一系列的对话和握手。TCP通过握手协商通告其端口等参数,BGP的握手协商的参数有:BGP版本、BGP连接保持时间、本地的路由器标识(Router ID)、授权信息等。这些信息都在Open消息中携带。

BGP连接建立后,如果有路由需要发送则发送Update消息通告对端。Update消息发布路由时,还要携带此路由的路由属性,用以帮助对端BGP协议选择最优路由。

在本地BGP路由变化时,要通过Update消息来通知BGP对等体。

经过一段时间的路由信息交换后,本地BGP和对端BGP都无新路由通告,趋于稳定状态。此时要定时发送KEEPALIVE消息以保持BGP连接的有效性。对于本地BGP,如果在保持时间内,未收到任何对端发来的BGP消息,就认为此BGP连接已经中断,将断开此BGP连接,并删除所有从该对等体学来的BGP路由。

当本地BGP在运行中发现错误时,要发送NOTIFICATION消息通告BGP对等体。如对端BGP版本本地不支持、本地BGP收到了结构非法的Update消息等。本地BGP退出BGP连接时也要发送NOTIFICATION消息。

ROUTE-REFRESH消息用来通知对等体自己支持路由刷新。

 

BGP状态机;

Idle:BGP连接的第一个状态。在空闲状态,BGP在等待一个启动事件。启动事件出现以后,BGP初始化资源,复位连接重试计时器(Connect-Retry),发起一条TCP连接,同时转入Connect(连接)状态。

Connect:在此状态,BGP发起第一个TCP连接,如果连接重试计时器超时,就重新发起TCP连接,并继续保持在Connect状态,如果TCP连接成功,就转入OpenSent状态,如果TCP连接失败,就转入Active状态。

Active:在此状态,BGP总是在试图建立TCP连接,如果连接重试计时器(Connect-Retry)超时,就退回到Connect状态,如果TCP连接成功,就转入OpenSent状态,如果TCP连接失败,就继续保持在Active状态,并继续发起TCP连接。

OpenSent:在此状态,TCP连接已经建立,BGP也已经发送了第一个Open报文,剩下的工作,BGP就在等待其对等体发送Open报文。并对收到的Open报文进行正确性检查,如果有错误,系统就会发送一条出错通知消息并退回到Idle状态,如果没有错误,BGP就开始发送Keepalive报文,并复位Keepalive计时器,开始计时。同时转入OpenConfirm状态。

OpenConfirm:在OpenConfirm状态,BGP等待一个Keepalive报文,同时复位保持计时器,如果收到了一个Keepalive报文,就转入Established阶段,BGP邻居关系就建立起来了。

Established:在Established状态,BGP邻居关系已经建立,这时,BGP将和它的邻居们交换Update报文,同时复位保持计时器。

另外,在除Idle状态以外的其它五个状态出现任何Error的时候,BGP状态机就会退回到Idle状态。

在BGP对等体建立的过程中,通常可见的三个状态是:Idle、Active、Established。

Idle状态下,BGP拒绝任何进入的连接请求,是BGP初始状态。

Active状态下,BGP将尝试进行TCP连接的建立,是BGP的中间状态。

Established状态下,BGP对等体间可以交换Update报文、Route-refresh报文、Keepalive报文和Notification报文。

BGP对等体双方的状态必须都为Established,BGP邻居关系才能成立,双方通过Update报文交换路由信息。

 

BGP的数据库:

IP路由表 (IP-RIB):全局路由信息库,包括所有IP路由信息。

BGP路由表 (Loc-RIB):BGP路由信息库,包括本地BGP Speaker选择的路由信息。

邻居表:对等体邻居清单列表

Adj-RIB-In:对等体宣告给本地Speaker的未处理的路由信息库(试验无法看到)

Adj-RIB-Out:本地Speaker宣告给指定对等体的路由信息库(试验无法看到)

BGP路由信息处理:

当从对等体接收到更新数据包时,路由器会把这些更新数据包存储到路由选择信息库(Routing Information Base, RIB)中,并指明是来自哪个对等体的(Adj-RIB-In)。这些更新数据包被输入策略引擎过滤后,路由器将会执行路径选择算法,来为每一条前缀确定最佳路径。

得出的最佳路径被存储到本地BGP RIB (Loc-RIB)中,然后被提交给本地IP路由选择表(IP-RIB),以用作安装考虑。

如果启用了多路径特性,最佳路径和所有等值路径都将被提交给IP-RIB考虑。

除了从对等体接收来的最佳路径外,Loc-RIB也会包含当前路由器注入的(被称为本地发起的路由),并被选择为最佳路径的BGP前缀。Loc-RIB中的内容在被通告给其他对等体之前,必须通过输出策略引擎。只有那些成功通过输出策略引擎的路由,才会被安装到输出RIB (Adj-RIB-Out)中。

(思科可以查看到)

BGP优先级为255

 

工作原理:

BGP的邻居关系:

BGP邻居关系建立在TCP连接的基础上

         可以通过IGP或静态路由提供TCP连接的IP可达性

IBGP与EBGP

AS之内的路由器建立的bgp连接称之为IBGP(一般用环回口进行连接)

AS之间的路由器建立的BGP连接称之为EBGP

当使用环回口做连接的时候,指定邻居之后,同时指定使用自身的环回口进行连接

peer x.x.x.x as-number AS-NUM

peer x.x.x.x connect-interface interface-name

在EBGP使用环回口的时候建立邻居关系的时候需要修改TTL值,EBGPtcp建立邻居包的TTL值默认是1(IBGP不需要)

         peer { group-name | peer-address } ebgp-max-hop [ ttl ]   TTL若不敲,则为255

 

BGP更新原则: 

一、连接建立后,bgp speaker将把自己产生的所有BGP路由通过给新的对等体

多条路径时,BGP speaker只选最优的给自己使用

BGP Speaker只把自己使用的最优路由通过给对等体

一般情况下,如果BGP Speaker学到去往同一网段的路由多于一条时,只会选择一条最优的路由给自己使用,即用来发布给邻居,同时上送给IP路由表。但是,由于路由器也会选择最优的路由给自己使用,所以BGP Speaker本身选择的最优的路由也不一定被路由器使用。例如,一条去往相同网段的BGP优选路由与一条静态路由,这时,由于BGP路由优先级要低,所以路由器会把这条静态路由加到路由表中去,而不会选择BGP优选的路由。

BGP会根据选路原则选出最优路由(被打上“>”标记的路由),用来发布给邻居。同时加入IP路由表,在IP路由表中会检查是否存在一条比BGP最佳路由更好的路由条目,比如有一条静态路由(静态路由的优先级为60,而BGP的优先级为255,数值越低越好),则使用更优的路由条目,反之则把BGP最佳路由作为IP路由表的优选路由。

二、BGP speaker从EBGP获得的路由回向塔所有的BGP对等体通告(包括EBGP和IBGP)

EBGP学到的路由信息发送给IBGP内的路由器,下一跳会不可达,所以要保证下一跳可达:

  1. 引入直连(通常不用)
  2. 修改下一跳:

peer x.x.x.x next-hop-local   (将传递出去的路由信息的下一跳改为自己)

刷新命令:refresh bgp all import

三、BGP speaker从IBGP获得的路由不会通过给他的IBGP邻居

(防环,IBGP的水平分割)

IBGP全互连(FULL-MESH)关系。这是解决由于IBGP水平分割带来的路由传递的问题的方法之一。这种方法的缺陷是路由器要付出更多的开销去维护网络里的IBGP会话。

         (解决可以收到路由条目,但是无法到达目标网段,经过AS内的路由器会丢包)

但是会增加路由负担,解决方法:路由反射器,联盟

四、BGP speaker从IBGP获得的路由是否通过给他的EBGP对等体要依IGP和BGP同步的情况来决定(取消同步就要使用全互联)

BGP与IGP同步的概念:BGP Speaker不将从IBGP对等体获得的路由信息通告给它的EBGP对等体,除非该路由信息也能通过IGP获得,若直接通过会产生路由黑洞

 

路由通告:

         network命令:

         宣告的网段不需要在自身存在但是路由表里一定需要存在

通过Network命令:路由器将通过Network将IP路由表里的路由信息注入到BGP的路由表中,并通过BGP传递给其它对等体。通过Network命令注入到BGP路由表里的路由信息必须存在于IP路由表中

缺省情况下,BGP不发布任何本地的网络路由。

Import命令把其它协议的路由信息注入到BGP路由表中

 

猜你喜欢

转载自blog.csdn.net/x503809622/article/details/82629474