您现在的位置是:首页 >技术教程 >网络协议 — BGP 边界网关协议网站首页技术教程

网络协议 — BGP 边界网关协议

范桂飓 2024-06-04 00:00:03
简介网络协议 — BGP 边界网关协议

目录

BGP 和 AS

BGP(Border Gateway Protocol,边界网关协议)是一种被广泛应用到 Internet 中的距离矢量(Distance Vector)动态路由协议,能够在不同的 AS(Autonomous System,自治系统,互联网路由选择的基本单元)间交换 Route Informations(路由信息)。

BGP 协议起源于 1989 年 1 月举行的第 12 次 IETF 会议。在那时,由于互联网的快速发展和规模的不断扩大,互联网中存在的 AS 数量不断增加。传统的距离矢量路由协议(e.g. RIP)已经无法满足互联网中不同 AS 之间的路由选择(控制 Routes 的传播)需求。因此,会议上讨论的主题就是需要一种新的路由协议。

所谓 AS 的含义是指一个单一的逻辑系统,具体表现为一个(或多个)组织所拥有的 IP Networks 和 Routers 的全体集合,它们对外执行共同的路由策略(Routes 发布和接收的策略)。

Internet 中的 AS Number 由 IANA(Internet Assigned Numbers Authority,互联网分配号码管理局)统一管理和分配,全球共有 1-65535 多个,本质是一个长度为 16bit 的数字。其中:

  • 1~64511:是全球唯一的 Internet 编号。
  • 64512~65535:是自用的编号,类似于私网网段。

如下图所示,每个在 Internet 上提供网络服务的自治网络(各种组织、大学、政企网络等)都需要拥有自己的 AS Number。

在这里插入图片描述

在 BGP 协议出现之前,这些 AS 就像是一座座孤岛,所以才会在第 12 次 IETF 会议中讨论这个问题。会议结束后,由 Len Bosack、Kirk Lougheed 和 Yakov Rekhter 三人在餐巾纸上完成了 BGP 协议的设计草稿,并在 1989 年 6 月发布了 RFC1105 BGPv1 标准。

BGPv1 的设计初衷是为了解决 2 个 AS 之间的互联互通问题,最初的想法也比较简单:

  1. 第一个想法,为了连接不同的 AS,应该在 2 个 AS 中分别部署 Border Gateway Router(边界网关路由器),由它们专门负责在不同的 AS 之间交换 Routes。
  2. 第二个想法,为了避免在多个 AS 之间形成路由环路,应该在 Routes 中包含相应的 Path Attribute(路径属性),以此来确定 AS 之间的最优路径。
  3. 第三个想法,为了在 WAN(广域网)中可靠的同步 Routes,应该使用 TCP 作为传输层协议。
  4. 第四个想法,为了减少 Border Gateway Router 之间需要交换的 “大量的“ Routes 的大小,应该采用增量更新的方式。
  5. 最后一个想法,使用 TLV(Type-Length-Value)数据编码方式来定义 BGP Message 的数据结构,使其拥有更好的可扩展性。

在这里插入图片描述

可见,BGP 最初定位于 EGP( Exterior Gateway Protocol,外部网关/路由协议)应用场景,即:E-BPG,将 AS 作为计量单位,支持通过路由策略、路由过滤等手段,控制 Routes 在 AS 之间的交换和选择最佳路径。

后面,随着 BGP 的发展也逐渐完善了在 IGP(Interior Gateway Protocol,内部网关/路由协议)场景中的应用,即:I-BGP,将 Local Router 作为计量单位,支持在一个大规模的 AS 内的所有 Router 之间发现、计算和宣发 Routes。

区别于 OSPF、ISIS 等链路状态(Link State)路由协议,BGP 作为距离矢量路由协议,在 IGP 场景中的路由策略控制、路由宣告收敛的网络稳定性更好。举例来说,在大规模组网中,任何节点发生故障时,OSPF、ISIS 会引发全网状态信息的泛洪和数据库信息更新,然后在此基础上收敛路由;而 BGP 则只会在节点间通告路由,通过增量更新的方式刷新路由信息,同时还具有分区路由域独立,故障域可控等优势。但在中小规模场景中,三者间的性能差别不大,特性也各异。

在这里插入图片描述

经过过年的发展后,现如今被广泛应用的是 BGPv4 版本,具有以下完备的功能特性:

  1. 支持 IPv4 和 IPv6;
  2. 支持 CIDR(Classless Inter-Domain Routing);
  3. 支持 Multi-Path(多路径),提高网络的可用性和容错能力;
  4. 支持 BGP Confederations(联盟);
  5. 支持 BGP Route-Reflectors(路由反射器);
  6. 支持 BGP Community(团体属性);
  7. 支持 BGP Route Dampening(路由惩罚);
  8. 支持 BGP MP(Multi-protocols Extensions,多协议扩展);
  9. 支持 Capability Advertisement(能力通告);
  10. 支持 BGPSEC 安全协议;
  11. 等等。

BGP Router 和 Routes

BGP 组网的核心就是 BGP Router,实现了 BGP 协议标准。能够对外 Advertise(发布)BGP Msg 的 BGP Router,称为 BGP Speaker(宣告者)。建立了 BGP Connection/Session 并互相交换 BGP Msg 的 Speaker 之间互称为 BGP Peers(对等体),根据应用场景的不同,又可以细分为 I-BGP Peer 和 E-BGP Peer,同时若干相关的 Peer 还可以构成一个 Peer Group(对等体组)。

而 BGP Routes 就被包含了专门的 BGP Update Msg 类型中。所以,BGP 协议实际上是一种承载在 TCP 协议之上的应用层协议。

在这里插入图片描述

一个 Router 最基本的组成部分就是 RIBs(Routing Information Base)和 FIB(Forwarding Information Base)Table,前者负责 Control Plane 的路由选择,后者负责 Data Plane 的报文转发。

更具体的,BGP Router 的 RIB 由以下部分构成:

  1. Adj-RIBs-In:用于存储从 BGP Peers 接收到的 Update Msg 中所携带的 Routes。或者根据 Update Msg 中的 WITHDAWN Route 在 Adj-RIBs-In 中删除相关条目。并在此后交由 Input Policy 处理。

  2. Input Policy:当 Adj-RIBs-In 存储了从 BGP Peer 传递过来的 Routes 时,会根据本地的 Input Policy 并结合 Local RIB 中的内容来判断是否接受,只有满足路由策略的 Routes 才会被写入到 Router 的 RIB。例如:如果 BGP Router 收到 2 条 Routes,它们的目的网络一样,但是路径不一样,一个是 AS1=>AS3=>AS5,另一个是 AS1=>AS2。那么,通常情况下,Router 会优先选用路径短的 AS1=>AS2 这条 Route。

  3. BGP Selection Process(路径决策进程):再将 Routes 写入 Local RIB 之前,还需要经过 BGP Selection Process 进行处理。例如:将自己的 AS Number 注入到 Route 中,将 Next hop 改为自己,并将自己加入到 Path Attribute 中,形成一条新的可达信息。在这之后,这条信息会继续向其他 Peers 宣告,使得其他 Peers 知道可以通过 Next hop 到当前 Router,并最终到达目的网络。

  4. Local RIB:用于存储 BGP Selection Process 的处理结果,同时某些本地路径也可以注入到 Local RIB 中。这些结果将用于生成 Local Route Table。

  5. Output Policy:BGP Router 通过 Output Policy 来控制那些 Routes 是需要且允许对外进行宣告的。Local RIB 存储的结果在进行了一些 Output Policy 处理后,再把允许输出的 Routes 存储到 Adj-RIB-Out 中。

  6. Adj-RIB-Out:最终 BGP Router 根据 Adj-RIB-Out 的结果向其它 Peers 发送 Update Msg。

另外,如果 BGP Router 收到的一条 Route 的 Path Attribute 中包含了自己的 AS Number,那么 Router 就会判定为这是一条自己发出的 Route,就会将这条 Route 丢弃掉。

在这里插入图片描述

BGP Message 类型和格式

BGP Message(消息),由 Header 和 Data 这两部分组成,最大长度为 4096Bytes。BGP Message 类型和格式的细节有很多,具体建议浏览相应的 RFC 文档,下面只作概括性的介绍。

在这里插入图片描述

BGP Msg Header

在这里插入图片描述

所有 BGP Msg Header 的格式都一样,共有 19Bytes。

  • Marker(16Bytes):记录着同步信息和加密信息。
  • Length(2Bytes):记录 BGP Msg 的总长度。
  • Type(1Byte):表示当前 BGP Msg 的类型。

BGP Msg Data

Open Msg

是 TCP connection 建立后发送的第一个 BGP Msg 类型,用于建立 BGP Peers 之间的 Session 关系。

在这里插入图片描述

Keepalive Msg

用于检测和维护 BGP Session 的健康状况,BGP Peers 之间会周期性地发出 Keepalive Msg,用来保持 Session 的有效性。

在这里插入图片描述

Notification Msg

用于 BGP Router 运维信息的通知,例如:当 BGP Router 检测到错误状态时,就会向 Peer 发出 Notification Msg,并中断 BGP Session。

在这里插入图片描述

Route-refresh Msg

用于实现路由刷新。通常的,在 BGP Router 改变了自身的路由策略(Input/Output Policy)后就会请求 BGP Peers 重新发送 Routes。以此来实现 Peers 之间动态的交换路由刷新请求,并在后续的过程中使相关的 Adj-RIB-Out 重新通告路由。

在这里插入图片描述

Update Msg

用于在 BGP Peers 之间交换 Routes,它既可以用于发布 Routes,也可以用于撤销不可达的 Routes。

在这里插入图片描述

Update Msg 是最关键的 BGP Msg 类型之一,BGP Routers 的 NLRI(Network Layer Reachability Information,网络层可达性信息)和 Path Attribute(路径属性)都被包含在里面。

  • Path Attribute:BGP Router 使用 Path Attribute 来确定前往目的地的最佳路径。
  • NLRI:BGP Router 使用 NLRI 中的 IP Prefixes(网络前缀)信息来完成路由分发。

下面稍作展开 BGP Path Attribute,可以分为以下 4 类。

  1. 公认必遵属性:所有的 BGP Router 都能够识别该属性,并且必须出现在所有 Update Msg 中。包括:

    1. Origin(源头):指出了 BGP Routes 的来源,用于判断 Routes 的可信度,Router 会根据 Origin 属性作为路由决策的参考。
    2. AS-path(AS 路径):它通过一种 Record-Route(记录路由)的方式,记录了一个 IP Prefix(路由前缀)在传递过程中所经过了的 AS。
    3. Next-hop(下一跳):表示目的网络所使用的下一跳路由器的地址。
  2. 公认可选属性:所有的 BGP Router 都能够识别该属性,但可以不出现在 Update Msg 中。包括:

    1. local-preference(本地优先级):Update Msg 可以携带这个属性并将其发给 I-BGP 邻居,用于 AS 内部的 BGP Router 作为参考,具有较高的 local-preference 值的 Routes 将在路由选择过程中被优先考虑。
    2. Atomic-aggregate(原子聚合):当 BGP Router 进行路由聚合时,由于会产生一条新的聚合路由,因此精细路由所携带的 AS-path 属性将会在聚合时被丢失。
  3. 可选传递属性:不要求所有 BGP Router 都能识别,但即使不能识别也会传递该属性。包括:

    1. Aggregator(聚合站点):可以包含在产生聚合路由的 Update Msg 中,通过携带发送 Update Msg 的 Router 的 BGP-ID,以此来告知进行了路由聚合通告的 Router 的标识。
    2. Community(共同体):在 RFC1997 和 RFC1998 中定义,用于对 Routes 进行分组管理。通常在制定路由策略时会对一系列的 IP Prefix 进行控制,例如:对从某个 AS 来的 Routes 进行特殊处理等。基于这样的原因,可以通过在 Update Msg 中携带 Community 属性来进行相关的路由策略管理。例如:ISP 可以为某个特定的用户分配一个 Community 属性值,此后该 ISP 就可以基于 Community 值来设置专门的 local-preference 或者 MED 等属性来完成路由策略的控制。
  4. 可选非传递属性:不要求所有 BGP Router 都能识别,不识别该属性就会丢弃该 Msg。包括:

    1. MED(Multi-exit-discriminator,多出口鉴别器):用于在具有多个出口的 AS 之间选择最优路径,MED 值越小,路径的开销就越小,该路径将被优先选择。

基于 Path Attribute 的影响,BGP Router 进行具体的路由选择时,通常遵守下述规则:

  1. 首选 Weight 值最高的。
  2. 如果 Weight 相同,选择 local-preference 最高的。
  3. 如果 local-preference 相同,选择 Next-hop=0.0.0.0 的(当前路由器通告的路由)。
  4. 如果没有当前路由器通告的路由,选择 AS-path 最短的。
  5. 如果 AS-path 相同,选择 Origin 最优的(IGP > EGP > 不完全)。
  6. 如果 Origin 相同,选择 MED 最低的。
  7. 如果 MED 相同,则 E-BGP 优于 I-BGP。
  8. 若都是 E-BGP,选择优先到达的。
  9. 若都是 I-BGP,选择下一跳最近的。
  10. 首选 BGP 邻居的 Router-id 最小的。
  11. 如果 Router-id 相同,选择邻居 IP 地址最小的。

BGP Msg 状态机

在这里插入图片描述

  1. Idle(空闲状态):为初始状态,该状态下,BGP Router 拒绝邻居发送的连接请求。只有在收到本设备的 Start 事件后,BGP Router 才开始尝试和其它 BGP Peers 进行 TCP Connection,并转至 Connect 状态。

  2. Connect(连接状态):BGP Router 启动 Connect Retry(连接重传定时器),等待 TCP Connection 完成。如果 TCP 连接成功,那么 BGP Router 向 Peer 发送 Open Msg,并转至 OpenSent 状态;如果 TCP 连接失败,那么 BGP Router 转至 Active 状态。

  3. Active(行动状态):BGP Router 总是在试图与邻居建立 TCP Connection。如果 TCP 连接成功,那么 BGP Router 向 Peer 发送 Open Msg,并关闭 Connect Retry,然后转至 OpenSent 状态。如果 TCP 连接失败,那么 BGP Router 停留在 Active 状态。

  4. OpenSent(发送状态):BGP Router 等待 Peer 的 Open Msg,并对收到的 Open Msg 中携带的 AS Numer、Version、认证码等字段进行检查。如果收到的 Open Msg 正确,那么 BGP Router 发送 Keepalive Msg,并转至 OpenConfirm 状态。

  5. OpenConfirm(确认状态):BGP Router 等待 Keepalive 或 Notification Msg。如果收到 Keepalive Msg,则转至 Established 状态;如果收到 Notification Msg,则转至 Idle 状态。

  6. Established(连接建立状态):BGP Router 建立了邻居关系后,就可以和 Peer 交换 Update、Keepalive、Route-refresh、Notification Msg 了。如果收到 Update 或 Keeplive Msg,则继续保持该状态;如果收到 Notification Msg,则迁移到 Idle 状态。

更具体的状态机流程如下图所示。

在这里插入图片描述

BGP RR(Route-Reflectors,路由反射器)

在 BGP RR(Route-Reflectors,路由反射器)标准被提出之前,采用的是 BGP Full Mesh 组网拓扑,即:每一个 BGP Speaker 都需要和其他 BGP Speaker 建立 BGP Session。这样全网中 BGP Session 的总数就是 N^2,如果 BGP Cluster 的规模超过了 100 台,就会对设备造成非常大的配置和处理压力。因此 Tony Bates 和 Ravi Chandra 在 1996 年 6 月提出了《RFC1966: Route Reflector》标准。

BGP RR 通过指定少量的(一个或多个)高性能 BGP Speaker 作为 RR,由它们与网络中其他 BGP Router 建立 BGP Session,并负责将 Routes 信息反射给所有建立连接的 Peers。每个 BGP Router 只要成为了 RR 的 Peer 之后,即可获得全网的 Routes 信息,以此来有效减轻 Cluster 的配置压力。目前 BGP RR 已经被广泛应用在 I-BGP 和 E-BGP 场景中,例如:Kubernetes Calico CNI 等。

在这里插入图片描述

为了保证 RR 方案的简洁性和支持平滑升级,RR 标准引入了一些新的概念。比如,当一个 BGP Speaker 被配置为 RR 后,它会将 BGP 邻居分为 2 类:

  1. Client Peer
  2. Non-Client Peer

并且在宣告路由时遵循以下规则:

  1. 当收到一个来自 Non-Client Peer 的 I-BGP Update Msg 后,该 Route 将会反射到所有的 Client Peer。
  2. 当收到一个来自 Client Peer 的 I-BGP Update Msg 后,该 Route 将会反射到所有的 Client Peer 和 Non-Client Peer。
  3. 当收到一个来自 E-BGP Update Msg 后,该 Route 将会反射到所有的 Client 和 Non-Client Peer。

BGP MP(Multi-protocols Extensions,多协议扩展)

最初的 BGPv1 只能管理 IPv4 协议和单播路由,后来为了让 BGP 支持更多的协议类型(e.g. IPv6)和路由类型(e.g. 多播),在《RFC 4760: Multiprotocol Extensions for BGP-4》中定义了 BGP MP 标准。支持 MP 的 BGP Router 又称为 MP-BGP Router(多协议 BGP 路由器)。

BGP MP 的实现思路是,在 Update Msg 的 TLV 编码格式的基础上,对 NLRI 字段进行扩展,添加了协议类型字段和子网前缀字段,用来描述不同协议类型和路由类型信息。同时,为了区分 NLRI 中的多种协议类型和路由类型,还分别引入了 AFI(Address Family Identifier,地址族标识)和 SAFI(Subsequent Address Family Identifier,子地址族标识)的概念。

在这里插入图片描述

通过这样的方式,BGP MP 的可扩展性得到了极大的增强,使得 BGP 已经不仅仅是一个单纯的动态路由协议,而是可以被设计用于支持一些新型的应用场景,例如:IPv6 单播地址族、MPLS VPN 地址族、EVPN VxLAN 地址族等等。

更具体的,MP-BGP 支持了以下多种协议类型:

  • IPv4 地址族:用于路由 IPv4 地址,是 BGP 的最原始地址族。
  • IPv6 地址族:用于路由 IPv6 地址。
  • VPNv4 地址族:用于 MPLS VPN 的 IPv4 路由。
  • VPNv6 地址族:用于 MPLS VPN 的 IPv6 路由。
  • L2VPN EVPN 地址族:用于 EVPN 的路由。
  • IPv4 Flow Label 地址族:用于标识 IPv4 Flow 的标签路由。
  • IPv6 Flow Label 地址族:用于标识 IPv6 Flow 的标签路由。

以及支持了下列多种路由类型:

  • Unicast(单播路由类型):表示路由信息的目的地址只有一个。
  • Multicast(多播路由类型):表示路由信息的目的地址有多个。
  • Flow(流路由类型):它是一种带有源地址和目的地址的路由类型,用于 MPLS 标签转发流量工程。

下图为一个 MPLS VPN 场景中的 BGP MP Update Msg 示例。

在这里插入图片描述

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。