概述:

BGP (Border Gateway Protocol) 边界网关协议,是一种在自治系统AS (Autonomous System)之间传递并选择最佳路由的高级矢量路由协议。早期发布的三个版本分别是BGP-1 (RFC1105)、 BGP-2 (RFC1163)和BGP-3 ( RFC1267),1994 年开始使用BGP-4(RFC1771),2006年之后单播IPv4网络使用的版本是BGP-4 (RFC4271), BGP的当前版本是BGP-4 (RFC4271)。

BGP能够进行路由优选,避免路由环路,能更高效率地传递路由和维护大量的路由信息。

虽然BGP用于在AS之间传递路由信息,但并不是所有AS之间传递路由信息都需要运行BGP。比如在数据中心上行连入Internet的出口上,为了避免Internet海量路由对数据中心内部网络的影响,设备采用静态路由代替BGP与外部网络通信。

BGP的优势:

  1. BGP从多方面保证了网络的安全性、灵活性、稳定性、可靠性和高效性。
  2. BGP采用认证和GTSM的方式,保证了网络的安全性。
  3. BGP提供了丰富的路由策略,能够灵活地进行路由选路,并且能指导邻居按策略发布路由。
  4. BGP提供了路由聚合和路由衰减功能,用于防止路由振荡,有效提高了网络的稳定性。
  5. BGP使用TCP作为其传输层协议(端口号为179),并支持BGP与BFD联动、BGP Tracking和BGP GR,提高了网络的可靠性。
  6. 在邻居数目多、路由量大且大部分邻居具有相同出口策略的场景下,BGP使用按组打包技术极大地提高了BGP打包发包性能。

路径矢量路由协议:

BGP是一种路径矢量协议,和IGP中的距离矢量协议不同(如RIP),是将AS作为一个节点来计算,因此每一个节点都依靠下游邻居来将它的路由表中的路由传递下去,节点在路由的基.上进行路由计算并且将结果传递给上游邻居。BGP到它每一个运行BGP的对等体都形成一个独特的、 基于单播的连接,为了提供对等体连接的可靠性,BGP使用TCP (端口号179)作为底层的传输机制。不同的是IGP协议以一个路由器作为一个节点,而BGP协议以一个AS作为节点,BGP使用的是一个AS的列表,数据包经过这些AS才能够到达目的,因为这些列表中记录了数据包所经过的路径,因此将BGP称为路径向量路由协议。

与BGP路由相关的AS号列表被称为AS_ PATH(这也是路径矢量的精髓)。EGP协议无法解决环路问题,而BGP可以通过AS_ PATH属性来检测环路,如果路由器中收到一个更新消息中存在本地的AS号,就说明存在环路,具体防环内容在后面笔记中分析。。

IGP和BGP的区别:

  1. 功能上的区别:BGP的功能主要是在不同AS间传递路由表,而IGP主要却是在一个AS中发现和计算路由。
  2. AS号的区别:在BGP中,AS号用于标识路由器属于那个组织,决定两个对等体建立邻居关系是IBGP还是EBGP。在IGP中,比如OSPF,只是一个进程标识,本地有意义;EIGRP中AS的作用也用于标识路由器属于哪个AS,属于不同AS的路由器不能建立邻居关系。
  3. 转发表的区别:BGP没有给出每个AS域内的拓扑结构,因此BGP只能看到AS树,而IGP只能看到AS域内拓扑结构。
  4. network的区别: BGP中:network将路由宣告给BGP邻居,也可做为汇总的手段。无论是宣告还是汇总,都必需在IGP表中存在精确路由。因此,用作汇总时,须写一条指向null 0的静态路由。 IGP中:network的作用是告诉路由器哪些接口启用该协议。
  5. next-hop的区别: BGP的下一跳与IGP有所不同,它可以是通告此路由的对等体的地址,如EBGP,这同 IGP是相同的。而在其它情况下,BGP使用第三方的下一跳,如 IBGP对从 EBGP对等体获得的下一跳不加改变的在自治系统内传递;在多路访问媒体上,BGP以路由的实际来源为下一跳,即使它不是BGP对等体。
  6. 通告路由的区别: BGP采用发送路由增量(Incremental)的方法,完成全部路由信息的通告和维护:初始化时发送所有的路由给BGP对等体(BGP Peer),同时在本地保存了已经发送给 BGP对等体的路由信息。当本地的 BGP收到了一条新路由时(如通过 IGP 注入了新路由或加入了新的静态路由),与保存的已发送信息进行比较,如未发送过,则发送,如已发送过则与已经发送的路由进行比较,如新路由花费更小,则发送此新路由,同时更新已发送信息,反之则不发送。当本地BGP发现一条路由失效时(如对应端口失效),如此路由已发送过,则向BGP对等体发送一个撤消路由消息。 对于IGP,虽也存在增量更新,但更新方式不太一样。当感知网络拓扑发生变化时,本地路由协议只将更新的路由发送出去;当收到新路由时,和已存在的路由表 比较选出最优的放进路由表,若比较结果路由表发生改变,将变化部分发送给邻居。这两种情况都不保存任何已发送信息,路由选择的工作由对端来完成;而 BGP必须为每个 BGP对端保存已经发送的路由信息(在BGP表中),以便发送一条新路由前确认其是否真的应该发送。
  7. 传输层协议的区别:BGP采用的是TCP进行传递路由,需要手动指定邻居,不能自己发现邻居,所以可以是多跳,保证了路由传递的可靠性,而在IGP中都是通过UDP+组播的情况进行传输的。
  8. 路由更新时的区别:BGP只采用增量更新,并且只有新的路由条目的时候触发,不会进行周期性更新,并且只发送更新的路由条目。在IGP中都是采用的周期更新加触发更新。BGP不采用周期性更新的原因是避免条目太多,更新时网络拥塞或崩溃。(BGP虽然只发送路由条目,但是有很多选路属性,更新的时候字节数比较大)

BGP接入:

事实上并不是所有的网络都需要使用BGP,在一个单一的企业网内,通常使用IGP协议做路由策略就足够了,因为IGP具有收敛速度快,部署简单的特点。但是如果需要跨运营商在不同的自治系统之间传递路由时,就必须用到BGP了。使用BGP大部分都设计Internet的连接,在用户与ISP之间或者在ISP与ISP之间,但即使是自治系统之间,BGP也不是必须要使用的。例如以下几种场景无需使用BGP:

  1. 单宿主自治系统。用户和ISP之间只有一条线连接,在这种场景下面,BGP或者IGP都是没有必要的,当链路出现故障时,不需要路由协议来选路,只需要一条缺省路由就可以,并把缺省路由通告到AS内其他路由器,如左图所示。
  2. 多宿主到单一的自治系统。用户和ISP之间有多条链路,多宿主到一个ISP典型的做法是使用一条链路作为主用链路,另外一条链路作为备用链路。此时也不需要运行BGP,只需要将备份链路的路由优先级设置较高,只有当主链路失效以后才使用备份链路,如右图所示。
    在这里插入图片描述

BGP基本概念:

自治系统(AS):
在这里插入图片描述
AS是指在一个实体管辖下的拥有相同选路策略的IP网络:

  1. 自治系统的典型定义是指由同一个技术管理机构管理,使用统一选路策略的一些路由器的集合。
  2. 每个自治系统都有唯一的自治系统编号,这个编号是由IANA分配的(全局进行分配)。
  3. 自治系统的编号范围是从1到65535,其中1到64511是注册的因特网编号,64512到65535是私有网络编号。
  4. BGP网络中的每个AS都被分配一个唯一的AS号,用于区分不同的AS。AS号分为2字节AS号和4字节AS号,其中2字节AS号的范围为1 至65535,4字节AS号的范围为1至4294967295。支持4字节AS号的设备能够与支持2字节AS号的设备兼容。(注意AS号为0是不能使用的)(私网AS号:64512-65535,一共1024个)(一个设备上的BGP只能存在于一个AS号中(AS没有多个进程)。)

对等体:
在这里插入图片描述
IBGP:运行于同一AS内部的BGP称为IBGP。为了防止AS内产生环路,从IBGP对等体学到的路由不能转发给其他IBGP对等体;所以IBGP对等体相互之间需要建立全连接。

EBGP:运行于不同AS之间的BGP称为EBGP。为了防止AS间产生环路,当BGP路由器从EBGP对等体接收到路由时,会将带有本地AS号的路由丢弃。

BGP报文交互中的角色:

  1. Speaker:发送BGP消息的路由器称为BGP发言者,它接收或产生新的路由信息,并发布给其它BGP Speaker。
  2. Peer:相互交换消息的BGP Speaker之间互称对等体(Peer),若干相关的对等体可以构成对等体组(Peer Group)。

IBGP与EBGP之间的不同点:

  1. AS号,IBGP邻居关系之间的AS号相同,EBGP邻居间的AS号必须不同。
  2. IBGP常使用回环口进行邻居建立,而EBGP常使用物理接口进行邻居建立。为什么IBGP建立邻居关系经常使用回环口,而EBGP使用的是物理接口:
    一般EBGP建立关系直接用直连的接口建立即可,因为一般EBGP传递只有一跳,并且用回环口建立邻居关系是为了保证一个冗余环境,但是大多是EBGP邻居间只有一条链路,也就是无论用物理接口或者回环口建立当链路一断开,连接始终会断开的,不存在一个冗余环境,只用物理接口建立即可,回环口配置过于麻烦;当然,如果有多条链路,还是建议用回环口和静态路由进行建立的。而对于IBGP来说,在一个AS中一般是有多条链路互通的,当一条链路断开后,IGP路由重新收敛,保证建立BGP邻居关系的回环口依然能够传递条目,保证了一个链路的冗余,并且回环口一般除了路由性能Down了,是不会down掉的,除非自己undo掉,很稳定。
  3. 下一跳是否修改,IBGP不会修改条目下一跳,EBGP传递时会修改下一跳为自己。
  4. TTL值不同,IBGP为255,EBGP为1。
  5. 条目转发机制,从IBGP对等体获得的BGP路由,只发给它的EBGP对等体,从EBGP对等体获得的BGP路由,发给他的EBGP和IBGP对等体。
  6. AS是否会添加,EBGP传递时需要添加自己的AS号,而IBGP之间传不会。
  7. 是否会过滤对应的属性,因为属性传递的范围不同。

相同点:

  1. 当存在多条到达同一目的地址的有效路由时,BGP设备只将最优路由发布给对等体。
  2. 路由更新时,BGP路由设备只发送要更新的BGP路由,而不是发送整个路由表。
  3. 所有对等体发送的路由,BGP设备都会接收。

BGP的报文种类:

在这里插入图片描述
BGP的运行是通过消息驱动的,共有Open、Update、Notification、Keepalive和Route-Refresh等5种消息类型。

  1. Open消息:是TCP连接建立后发送的第一个消息,用于建立BGP对等体之间的连接关系。对等体在接收到Open消息并协商成功后,将发送Keepalive消息确认并保持连接的有效性。确认后,对等体间可以进行Update、Notification、Keepalive和Route-Refresh消息的交换。
  2. Update消息:用于在对等体之间交换路由信息。一条Update消息可以发布多条属性相同的可达路由信息,也可以撤销多条不可达路由信息。
    • 一条Update消息可以发布多条具有相同路由属性的可达路由,这些路由可共享一组路由属性。所有包含在一个给定的Update消息里的路由属性适用于该Update消息中的NLRI(Network Layer Reachability Information)字段里的所有目的地(用IP前缀表示)。
    • 一条Update消息可以撤销多条不可达路由。每一个路由通过目的地(用IP前缀表示),清楚的定义了BGP Speaker之间先前通告过的路由。
    • 一条Update消息可以只用于撤销路由,这样就不需要包括路径属性或者NLRI。相反,也可以只用于通告可达路由,就不需要携带撤销路由信息了。
  3. Keepalive消息:BGP会周期性的向对等体发出Keepalive消息,用来保持连接的有效性。
  4. Notification消息:当BGP检测到错误状态时,就向对等体发出Notification消息,之后BGP连接会立即中断。
  5. Route-Refresh消息:通过OPEN消息告知BGP peer本地支持路由刷新能力(Route-Refresh capability)。在所有BGP路由器使能Route-Refresh能力的情况下,如果BGP的入口路由策略发生了变化,本地BGP路由器会向对等体发布Route-Refresh消息,收到此消息的对等体会将其路由信息重新发给本地BGP路由器。这样,可以在不中断BGP连接的情况下,对BGP路由表进行动态刷新,并应用新的路由策略。

BGP邻居关系建立:

BGP的路由器标识( Router_ ID ):
BGP的Router__ID是一个用于标识BGP设备的32位的值,通常是IPv4地址的形式,在BGP会话建立时发送的Open报文中携带。对等体之间建立BGP会话时,每个BGP设备都必须有唯一的Router_ID,否则对等体之间不能建立BGP连接。

BGP的Router_ ID 在BGP网络中必须是唯一的, 可以采用手动配置,也可以让BGP自己在设备上选取。缺省情况下,BGP选择设备上的Loopback接口的IPv4地址作为BGP的Router_ ID。如果设备.上没有配置Loopback接口,系统会选择接口中最大的IPv4地址作为BGP的Router_ID一旦选出Router_ID,除非发生进程重启或接口地址删除等事件,否则即使配置了更大的地址,也保持原来的Router_ ID。

BGP有限状态机:

BGP的有限状态机描述了BGP的邻居的建立和维护过程,状态机共分为6种,分别是Idle、Connect、 Active、 OpenSent、 OpenConfirm 和Established。如下图所示:
在这里插入图片描述

  1. Idle状态是BGP初始状态。在Idle状态下,BGP拒绝邻居发送的连接请求。只有在收到本设备的Start事件后(一般可以理解为有目标路由 ),重置连接重传定时器(Connect Retry,缺省为32秒,可以称为Idle定时器),超时后,BGP才开始尝试和其它BGP对等体进行TCP连接,并转至Connect状态。
    • Start事件是由一个操作者配置一个BGP过程,或者重置一个已经存在的过程或者路由器软件重置BGP过程引起的。
    • 任何状态中收到Notification报文或TCP拆除链路通知等Error事件后,BGP都会转至Idle状态。
    • 查看信息可以看到,在Idle状态保持了32s后,迅速建立了BGP邻居关系,到达establish状态。
    在这里插入图片描述

  2. 在Connect状态下,BGP启动连接重传定时器,等待TCP完成连接。
    • 如果TCP连接成功,那么BGP向对等体发送Open报文,并转至OpenSent状态。
    • 如果TCP连接失败(收到了RST报文),那么BGP转至Active状态。
    • 如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应(例如对端没有本端的路由),那么BGP继续尝试和其它BGP对等体进行TCP连接,停留在Connect状态。
    • 如果发生其他事件(由系统或者操作人员启动的,例如重置BGP进程),则退回到Idle状态。
    • 停留在Connect状态的时候,抓包情况如下:Connect状态端主动不断尝试连接,目的端口是对方的TCP179端口,源端口地址为随机端口。
    在这里插入图片描述
    TCP连接失败的主要原因是配置错误:例如BGP邻居指定错误、没有指定更新源。

  3. 在Active状态下,BGP总是在试图建立TCP连接。
    • 如果TCP连接成功,那么BGP向对等体发送Open报文,关闭连接重传定时器,并转至OpenSent状态。
    • 如果TCP连接失败,那么BGP停留在Active状态。
    • 如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP转至Connect状态。
    • 如果发生其他事件 (如BGP系统或操作人员重置BGP进程),则退回到Idle状态。
    • 处于在Active状态时,只有被动等待对方请求,如果连接请求无法通过,向对端发送RST报文,让对端重新发起,抓包情况如下:
    在这里插入图片描述

注意:
• BGP认证失败,状态首先会停留在Connect状态。
• 一般情况下BGP不会一直停留在Connect和Active状态,而是会在connect和active 之间来回切换,有可能是TCP重传次数(connect状态TCP重传次数过多,下触发了TCP的报错,进入active状态,active状态连接超时,进入connect状态)过多或者IP地址不可达所造成的。
• 当Connect和Active切换次数到达了一个临界值,会重新转化为Idle状态,32s后重新进入connect状态进行连接,周而复始。

  1. 在OpenSent状态下,BGP等待对等体的Open报文,并对收到的Open报文中的AS号、版本号、认证码等进行检查。
    • 如果收到的Open报文正确,那么BGP发送Keepalive报文,并转至OpenConfirm状态。
    • 如果发现收到的Open报文有错误,那么BGP发送Notification报文给对等体,并转至Idle状态。

  2. 在OpenConfirm状态下,BGP等待Keepalive或Notification报文。
    • 如果收到Keepalive报文,则转至Established状态。
    • 如果收到Notification报文,则转至Idle状态。

  3. 在Established状态下,BGP可以和对等体交换Update、Keepalive、Route-refresh报文和Notification报文。
    • 如果收到正确的Update或Keepalive报文,那么BGP就认为对端处于正常运行状态,将保持BGP连接。
    • 如果收到错误的Update或Keepalive报文,那么BGP发送Notification报文通知对端,并转至Idle状态。
    • Route-refresh报文不会改变BGP状态。
    • 如果收到Notification报文,那么BGP转至Idle状态。
    • 如果收到TCP连接断开消息,那么BGP断开连接,转至Idle状态。

BGP邻居无法建立的原因:
BGP对等体之间无法建立邻居主要体现在邻居状态无法进入到Established状态,有可能处于Idle、 Connect、Active 状态,如果处于这三种状态,说明BGP会话没有建立成功,如果处于OpenSent、OpenConfirm 则说明邻居协商出现问题。以下总结了邻居无法建立的一些因素:

  1. 两边BGP peer地址不可达,一般是底层原因或者缺少可达的路由。
  2. 对等体AS配置错误。
  3. eBGP的跳数问题。
  4. 更新源问题。
  5. BGP的认证错误。
  6. Open 报文协商失败,Open报文需要协商BGP版本、Holdtime、 Router_ ID以及可选项参数(包括各种能力参数)等。
  7. BGP的Router_ ID冲突。
  8. 联盟与非联盟之间的BGP连接配置错误。
  9. 错误报文导致连接中断,比较少见的如BGP的Marker值出现错误。

BGP路由信息处理:

原则:

  1. 从IBGP对等体获得的BGP路由,BGP设备只发布给它的EBGP对等体。
  2. 从EBGP对等体获得的BGP路由,BGP设备发布给它所有EBGP和IBGP对等体。
  3. 当存在多条到达同一目的地址的有效路由时,BGP设备只将最优路由发布给对等体。
  4. 路由更新时,BGP设备只发送更新的BGP路由。
  5. 所有对等体发送的路由,BGP设备都会接收。

数据库:
在这里插入图片描述
路由信息处理:
在这里插入图片描述

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

  2. 得出的最佳路径被存储到本地BGP RIB (Loc-RIB)中,然后被提交给本地IP路由选择表(IP-RIB)。

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

BGP的属性:

在这里插入图片描述
常用的属性类别如下所示:

  1. Origin为公认必遵属性
  2. AS_Path为公认必遵属性
  3. Next_Hop为公认必遵属性
  4. Local_Pref为公认任意属性
  5. community为可选过渡属性
  6. MED为可选非过渡属性
  7. Originator_ID为可选非过渡属性
  8. Cluster_List为可选非过渡属性

具体解析在后续专门的笔记中分析。

参考资料:《HCIE路由交换学习指南》、HCIE培训文档

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐