《重识云原生系列》专题索引:
- 第一章——不谋全局不足以谋一域
- 第二章计算第1节——计算虚拟化技术总述
- 第三章云存储第1节——分布式云存储总述
- 第四章云网络第一节——云网络技术发展简述
- 第四章云网络4.2节——相关基础知识准备
- 第四章云网络4.3节——重要网络协议
- 第四章云网络4.3.1节——路由技术简述
- 第四章云网络4.3.2节——VLAN技术
- 第四章云网络4.3.3节——RIP协议
- 第四章云网络4.3.4节——OSPF协议
- 第四章云网络4.3.4.3节——OSPF协议工作原理
- 第四章云网络4.3.4.4节——[转载]OSPF域内路由
- 第四章云网络4.3.4.5节——[转载]OSPF外部路由
- 第四章云网络4.3.4.6节——[转载]OSPF特殊区域之Stub和Totally Stub区域详解及配置
- 第四章云网络4.3.4.7节——[转载]OSPF特殊区域之NSSA和Totally NSSA详解及配置
- 第四章云网络4.3.5节——EIGRP协议
- 第四章云网络4.3.6节——IS-IS协议
- 第四章云网络4.3.7节——BGP协议
- 第四章云网络4.3.7.2节——BGP协议概述
- 第四章云网络4.3.7.3节——BGP协议实现原理
- 第四章云网络4.3.7.4节——高级特性
- 第四章云网络4.3.7.5节——实操
- 第四章云网络4.3.7.6节——MP-BGP协议
- 第四章云网络4.3.8节——策略路由
- 第四章云网络4.3.9节——Graceful Restart(平滑重启)技术
3 BGP实现原理
3.1 状态机
BGP状态描述的是BGP邻居的建立过程,BGP状态共有六种,分别是Idle(空闲)、Connect(连接)、Active(活动)、OpenSent(打开发送)、OpenConfirm(打开确认)和Established(建立成功)。
- Idle状态是BGP初始状态,在Idle状态下,BGP拒绝邻居发送的连接请求。只有在收到本设备的Start事件后,BGP才开始尝试和其它BGP对等体进行TCP连接,并转至Connect状态。
- 说明:Start事件是由一个操作者配置一个BGP过程,或者重置一个已经存在的过程或者路由器软件重置BGP过程引起的。任何状态中收到Notification报文或TCP拆除链路通知等Error事件后,BGP都会转至Idle状态。
- 在Connect状态下,BGP启动连接重传定时器(Connect Retry,缺省为32秒),等待TCP完成连接。
- 如果TCP连接成功,那么BGP向对等体发送Open报文,并转至OpenSent状态;
- 如果TCP连接失败,那么BGP转至Active状态;
- 如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP继续尝试和其它BGP对等体进行TCP连接,停留在Connect状态。
- 如果发生其他事件(由系统或者操作人员启动的),则退回到Idle状态。
- 在Active状态下,BGP总是在试图建立TCP连接。
- 如果TCP连接成功,那么BGP向对等体发送Open报文,关闭连接重传定时器,并转至OpenSent状态;
- 如果TCP连接失败,那么BGP停留在Active状态;
- 如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP转至Connect状态。
- 在OpenSent状态下,BGP等待对等体的Open报文,并对收到的Open报文中的AS号、版本号、认证码等进行检查。
- 如果收到的Open报文正确,那么BGP发送Keepalive报文,并转至OpenConfirm状态;
- 如果发现收到的Open报文有错误,那么BGP发送Notification报文给对等体,并转至Idle状态。
- 在OpenConfirm状态下,BGP等待Keepalive或Notification报文。如果收到Keepalive报文,则转至Established状态,如果收到Notification报文,则转至Idle状态。
- 在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对等体建立的过程中,通常可见的三种状态是Idle、Active、Established。BGP对等体双方的状态必须都为Established,BGP邻居关系才能成立,双方通过Update报文交换路由信息。
3.2 BGP对等体之间交互原则
BGP 设备将最优路由加入 BGP 路由表,形成 BGP 路由。BGP 设备与对等体建立邻居关系后,采取以下交互原则:
- 从 IBGP 对等体获得的 BGP 路由, BGP 设备只发布给它的 EBGP 对等体。(这样的水平分割是为了防止IBGP内部环路)
- 从 EBGP 对等体获得的 BGP 路由, BGP 设备发布给它所有 EBGP 和 IBGP 对等体。(即发给所有BGP对等体)
- 当存在多条到达同一目的地址的有效路由时, BGP 设备只将最优路由发布给对等体,,即用来发给邻居,同时上送给路由表
- 路由更新时, BGP 设备只发送更新的 BGP 路由。
- 所有对等体发送的路由, BGP 设备都会接收。
3.3 BGP与IGP交互
BGP 与 IGP 在设备中使用不同的路由表,为了实现不同 AS 间相互通讯, BGP 需要与 IGP 进行交互,即 BGP 路由表和 IGP 路由表相互引入。
BGP的主要任务之一就是向其它自治系统发布该自治系统的网络可达信息。如图所示,RTB会把去往10.1.1.0/24 的路由信息封装在BGP报文中,通过由RTB、RTE建立的TCP连接通告给RTE,如果RTE不考虑同步问题,直接接受了这条路由信息并通告给RTF。那么,如果RTF或RTE有去往10.1.1.0/24 的数据报文要发送,这个数据报文要想到达目的地必须经过RTD和RTC。但是,由于先前没有考虑同步问题,RTD和RTC的路由表中没有去往10.1.1.0/24的路由信息,数据报文到了RTD就会被丢弃。因此,BGP必须与IGP(如RIP、OSPF等)同步。也就是说,当一个路由器从IBGP对等体收到一条路由更新信息,在把它通告给它的EBGP对等体之前,要试图验证该目的地能否通过自治系统内部到达(即验证该目的地是否存在于IGP发现的路由表内,非BGP路由器是否可以传递报文到该目的地)。若能通过IGP知道这个目的地,才会把这样一条路由信息通告给EBGP对等体,否则认为BGP与IGP不同步,不进行通告。
3.3.1 BGP引入IGP路由
BGP 协议本身不发现路由,因此需要将其他路由引入到 BGP 路由表,实现 AS 间的路由互通。当一个 AS 需要将路由发布给其他 AS 时, AS 边缘路由器会在 BGP 路由表中引入 IGP 的路由。为了更好的规划网络, BGP 在引入 IGP 的路由时,可以使用路由策略进行路由过滤和路由属性设置,也可以设置 MED 值指导 EBGP 对等体判断流量进入 AS 时选路。
BGP 引入路由时支持 Import 和 Network 两种方式:
- Import 方式是按协议类型,将 RIP 路由、 OSPF 路由、 ISIS 路由等协议的路由引入到 BGP 路由表中。为了保证引入的 IGP 路由的有效性, Import 方式还可以引入静态路由和直连路由。
- Network 方式是逐条将 IP 路由表中已经存在的路由引入到 BGP 路由表中,比 Import 方式更精确。
3.3.2 IGP引入BGP路由
当一个 AS 需要引入其他 AS 的路由时, AS 边缘路由器会在 IGP 路由表中引入 BGP 的路由。为了避免大量 BGP 路由对 AS 内设备造成影响,当 IGP 引入 BGP 路由时,可以使用路由策略,进行路由过滤和路由属性设置。
应用场景举例:
如图所示,某公司海外市场部所在区域 AS100 部署 OSPF 网络,国内研发部所在区域 AS200 部署 ISIS 网络, AS100 与 AS200 通过部署 BGP 实现互通。公司希望海外市场部可以向研发部发送文件,而国内研发部不能向海外市场部发送文件。
IGP引入BGP示意图
为了实现公司的要求,必须让 AS100 中设备知道 AS200 的路由,而 AS200 中设备不知道 AS100的路由。先在 RouterC 上部署 BGP 引入 ISIS 路由,使 RouterC 的 BGP 路由表中存在 AS200 的路由,并把路由发布给 RouterB。再在 RouterB 上部署 OSPF 引入 BGP 路由,实现 AS100 内设备知道 AS200 的路由,而 AS200 的设备不知道 AS100 的路由。
3.4 BGP 的路由优选规则和负载分担
在 BGP 路由表中,到达同一目的地可能存在多条路由。此时 BGP 会选择其中一条路由作为最佳路由,并只把此路由发送给其对等体。BGP 为了选出最佳路由,会根据 BGP 的路由优选规则依次比较这些路由的 BGP 属性。
3.4.1 BGP属性
路由属性是对路由的特定描述,所有的 BGP 路由属性都可以分为以下 4 类:
- 公认必须遵循(Well-known mandatory):所有 BGP 设备都可以识别此类属性,且必须存在于 Update 报文中。如果缺少这类属性,路由信息就会出错。
- 公认任意(Well-known discretionary):所有 BGP 设备都可以识别此类属性,但不要求必须存在于 Update 报文中,即就算缺少这类属性,路由信息也不会出错。
- 可选过渡(Optional transitive):BGP 设备可以不识别此类属性,如果 BGP 设备不识别此类属性,但它仍然会接收这类属性,并通告给其他对等体。
- 可选非过渡(Optional non-transitive):BGP 设备可以不识别此类属性,如果 BGP 设备不识别此类属性,则会被忽略该属性,且不会通告给其他对等体。
下面介绍几种常用的 BGP 路由属性:
3.4.1.1 Origin 属性
Origin 属性用来定义路径信息的来源,标记一条路由是怎么成为 BGP 路由的。它有以下 3 种类型:
- IGP:具有最高的优先级。通过 network 命令注入到 BGP 路由表的路由,其 Origin 属性为 IGP。
- EGP:优先级次之。通过 EGP 得到的路由信息,其 Origin 属性为 EGP。
- Incomplete:优先级最低。通过其他方式学习到的路由信息。比如 BGP 通过 import-route命令引入的路由,其 Origin 属性为 Incomplete。
3.4.1.2 AS_Path 属性
AS_Path 属性按矢量顺序记录了某条路由从本地到目的地址所要经过的所有 AS 编号。在接收路由时,设备如果发现 AS_Path 列表中有本 AS 号,则不接收该路由,从而避免了 AS 间的路由环路。
- 当 BGP Speaker 传播自身引入的路由时:
- 当 BGP Speaker 将这条路由通告到 EBGP 对等体时,便会在 Update 报文中创建一个携带本地 AS 号的 AS_Path 列表。
- 当 BGP Speaker 将这条路由通告给 IBGP 对等体时,便会在 Update 报文中创建一个空的AS_Path 列表。
- 当 BGP Speaker 传播从其他 BGP Speaker 的 Update 报文中学习到的路由时:
- 当 BGP Speaker 将这条路由通告给 EBGP 对等体时,便会把本地 AS 编号添加在 AS_Path列表的最前面(最左面)。收到此路由的 BGP 设备根据 AS_Path 属性就可以知道去目的地址所要经过的 AS。离本地 AS 最近的相邻 AS 号排在前面,其他 AS 号按顺序依次排列。
- 当 BGP Speaker 将这条路由通告给 IBGP 对等体时,不会改变这条路由相关的 AS_Path属性。
3.4.1.3 Next_Hop 属性
Next_Hop 属性记录了路由的下一跳信息。BGP 的下一跳属性和 IGP 的有所不同,不一定就是邻居设备的 IP 地址。通常情况下, Next_Hop 属性遵循下面的规则:
- BGP Speaker 在向 EBGP 对等体发布某条路由时,会把该路由信息的下一跳属性设置为本地与对端建立 BGP 邻居关系的接口地址。
- BGP Speaker 将本地始发路由发布给 IBGP 对等体时,会把该路由信息的下一跳属性设置为本地与对端建立 BGP 邻居关系的接口地址。
- BGP Speaker 在向 IBGP 对等体发布从 EBGP 对等体学来的路由时,并不改变该路由信息的下一跳属性。
3.4.1.4 Local_Pref 属性
Local_Pref 属性表明路由器的 BGP 优先级,用于判断流量离开 AS 时的最佳路由。当 BGP 的设备通过不同的 IBGP 对等体得到目的地址相同但下一跳不同的多条路由时,将优先选择Local_Pref 属性值较高的路由。Local_Pref 属性仅在 IBGP 对等体之间有效,不通告给其他AS。Local_Pref 属性可以手动配置,如果路由没有配置 Local_Pref 属性, BGP 选路时将该路由的 Local_Pref 值按缺省值 100 来处理。
3.4.1.5 MED 属性
MED(Multi-Exit-Discriminator)属性用于判断流量进入 AS 时的最佳路由,当一个运行 BGP的设备通过不同的 EBGP 对等体得到目的地址相同但下一跳不同的多条路由时,在其它条件相同的情况下,将优先选择 MED 值较小者作为最佳路由。
MED 属性仅在相邻两个 AS 之间传递,收到此属性的 AS 一方不会再将其通告给任何其他第三方 AS。MED 属性可以手动配置,如果路由没有配置 MED 属性, BGP 选路时将该路由的MED 值按缺省值 0 来处理。
3.4.1.6 团体属性
团体属性(Community)用于标识具有相同特征的 BGP 路由,使路由策略的应用更加灵活,同时降低了维护管理的难度。
团体属性分为自定义团体属性和公认团体属性。公认团体属性如表所示。
3.4.1.7 Originator_ID 属性和 Cluster_List 属性
Originator_ID 属性和 Cluster_List 属性用于解决路由反射器场景中的环路问题,详细描述请参见路由反射器。
BGP选择路由的策略
当到达同一目的地存在多条路由时, BGP 依次对比下列属性来选择路由:
- 优选协议首选值(PrefVal)最高的路由。协议首选值(PrefVal)是华为设备的特有属性,该属性仅在本地有效。
- 优选本地优先级(Local_Pref)最高的路由。如果路由没有本地优先级, BGP 选路时将该路由按缺省的本地优先级 100 来处理。
- 依次优选手动聚合路由、自动聚合路由、 network 命令引入的路由、 import-route 命令引入的路由、从对等体学习的路由。
- 优选 AS 路径(AS_Path)最短的路由。
- 依次优选 Origin 类型为 IGP、 EGP、 Incomplete 的路由。
- 对于来自同一 AS 的路由,优选 MED(Multi Exit Discriminator)值最低的路由。
- 依次优选 EBGP 路由、 IBGP 路由、 LocalCross 路由、 RemoteCross 路由。
- PE上某个 VPN实例的 VPNv4路由的 ERT匹配其他 VPN实例的IRT后复制到该 VPN实例,称为 LocalCross;从远端 PE 学习到的 VPNv4 路由的 ERT 匹配某个 VPN 实例的 IRT 后复制到该 VPN 实例,称为 RemoteCross。
- 优选到 BGP 下一跳 IGP 度量值(metric)最小的路由。
- 说明:在IGP中,对到达同一目的地址的不同路由, IGP根据本身的路由算法计算路由的度量值。
- 优选 Cluster_List 最短的路由。
- 优选 Router ID 最小的设备发布的路由。
- 说明:如果路由携带Originator_ID属性,选路过程中将比较Originator_ID的大小(不再比较RouterID),并优选Originator_ID最小的路由。
- 优选从具有最小 IP Address 的对等体学来的路由。
3.4.2 BGP负载分担
当到达同一目的地址存在多条等价路由时,可以通过 BGP 等价负载分担实现均衡流量的目的。形成 BGP 等价负载分担的条件是“BGP 选择路由的策略”的 1 至 8 条规则中需要比较的属性完全相同。
参考链接
BGP协议原理(一)BGP协议基本概念:BGP作用与特点、BGP邻居关系建立与配置_Skye_Zheng的博客-CSDN博客_bgp协议作用
BGP协议总结(比较详细,好理解)_Looo~ye的博客-CSDN博客_bgp协议
BGP协议详解(一)_liboyang990814的博客-CSDN博客_bgp协议