目录
文章目录
- 目录
- BGP 和 AS
- BGP Router 和 Routes
- BGP Message 类型和格式
- BGP Msg Header
- BGP Msg Data
- Open Msg
- Keepalive Msg
- Notification Msg
- Route-refresh Msg
- Update Msg
- BGP Msg 状态机
- BGP RR(Route-Reflectors,路由反射器)
- BGP MP(Multi-protocols Extensions,多协议扩展)
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 之间的互联互通问题,最初的想法也比较简单:
- 第一个想法,为了连接不同的 AS,应该在 2 个 AS 中分别部署 Border Gateway Router(边界网关路由器),由它们专门负责在不同的 AS 之间交换 Routes。
- 第二个想法,为了避免在多个 AS 之间形成路由环路,应该在 Routes 中包含相应的 Path Attribute(路径属性),以此来确定 AS 之间的最优路径。
- 第三个想法,为了在 WAN(广域网)中可靠的同步 Routes,应该使用 TCP 作为传输层协议。
- 第四个想法,为了减少 Border Gateway Router 之间需要交换的 “大量的“ Routes 的大小,应该采用增量更新的方式。
- 最后一个想法,使用 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 版本,具有以下完备的功能特性:
- 支持 IPv4 和 IPv6;
- 支持 CIDR(Classless Inter-Domain Routing);
- 支持 Multi-Path(多路径),提高网络的可用性和容错能力;
- 支持 BGP Confederations(联盟);
- 支持 BGP Route-Reflectors(路由反射器);
- 支持 BGP Community(团体属性);
- 支持 BGP Route Dampening(路由惩罚);
- 支持 BGP MP(Multi-protocols Extensions,多协议扩展);
- 支持 Capability Advertisement(能力通告);
- 支持 BGPSEC 安全协议;
- 等等。
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 由以下部分构成:
-
Adj-RIBs-In:用于存储从 BGP Peers 接收到的 Update Msg 中所携带的 Routes。或者根据 Update Msg 中的 WITHDAWN Route 在 Adj-RIBs-In 中删除相关条目。并在此后交由 Input Policy 处理。
-
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。
-
BGP Selection Process(路径决策进程):再将 Routes 写入 Local RIB 之前,还需要经过 BGP Selection Process 进行处理。例如:将自己的 AS Number 注入到 Route 中,将 Next hop 改为自己,并将自己加入到 Path Attribute 中,形成一条新的可达信息。在这之后,这条信息会继续向其他 Peers 宣告,使得其他 Peers 知道可以通过 Next hop 到当前 Router,并最终到达目的网络。
-
Local RIB:用于存储 BGP Selection Process 的处理结果,同时某些本地路径也可以注入到 Local RIB 中。这些结果将用于生成 Local Route Table。
-
Output Policy:BGP Router 通过 Output Policy 来控制那些 Routes 是需要且允许对外进行宣告的。Local RIB 存储的结果在进行了一些 Output Policy 处理后,再把允许输出的 Routes 存储到 Adj-RIB-Out 中。
-
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 类。
-
公认必遵属性:所有的 BGP Router 都能够识别该属性,并且必须出现在所有 Update Msg 中。包括:
- Origin(源头):指出了 BGP Routes 的来源,用于判断 Routes 的可信度,Router 会根据 Origin 属性作为路由决策的参考。
- AS-path(AS 路径):它通过一种 Record-Route(记录路由)的方式,记录了一个 IP Prefix(路由前缀)在传递过程中所经过了的 AS。
- Next-hop(下一跳):表示目的网络所使用的下一跳路由器的地址。
-
公认可选属性:所有的 BGP Router 都能够识别该属性,但可以不出现在 Update Msg 中。包括:
- local-preference(本地优先级):Update Msg 可以携带这个属性并将其发给 I-BGP 邻居,用于 AS 内部的 BGP Router 作为参考,具有较高的 local-preference 值的 Routes 将在路由选择过程中被优先考虑。
- Atomic-aggregate(原子聚合):当 BGP Router 进行路由聚合时,由于会产生一条新的聚合路由,因此精细路由所携带的 AS-path 属性将会在聚合时被丢失。
-
可选传递属性:不要求所有 BGP Router 都能识别,但即使不能识别也会传递该属性。包括:
- Aggregator(聚合站点):可以包含在产生聚合路由的 Update Msg 中,通过携带发送 Update Msg 的 Router 的 BGP-ID,以此来告知进行了路由聚合通告的 Router 的标识。
- Community(共同体):在 RFC1997 和 RFC1998 中定义,用于对 Routes 进行分组管理。通常在制定路由策略时会对一系列的 IP Prefix 进行控制,例如:对从某个 AS 来的 Routes 进行特殊处理等。基于这样的原因,可以通过在 Update Msg 中携带 Community 属性来进行相关的路由策略管理。例如:ISP 可以为某个特定的用户分配一个 Community 属性值,此后该 ISP 就可以基于 Community 值来设置专门的 local-preference 或者 MED 等属性来完成路由策略的控制。
-
可选非传递属性:不要求所有 BGP Router 都能识别,不识别该属性就会丢弃该 Msg。包括:
- MED(Multi-exit-discriminator,多出口鉴别器):用于在具有多个出口的 AS 之间选择最优路径,MED 值越小,路径的开销就越小,该路径将被优先选择。
基于 Path Attribute 的影响,BGP Router 进行具体的路由选择时,通常遵守下述规则:
- 首选 Weight 值最高的。
- 如果 Weight 相同,选择 local-preference 最高的。
- 如果 local-preference 相同,选择 Next-hop=0.0.0.0 的(当前路由器通告的路由)。
- 如果没有当前路由器通告的路由,选择 AS-path 最短的。
- 如果 AS-path 相同,选择 Origin 最优的(IGP > EGP > 不完全)。
- 如果 Origin 相同,选择 MED 最低的。
- 如果 MED 相同,则 E-BGP 优于 I-BGP。
- 若都是 E-BGP,选择优先到达的。
- 若都是 I-BGP,选择下一跳最近的。
- 首选 BGP 邻居的 Router-id 最小的。
- 如果 Router-id 相同,选择邻居 IP 地址最小的。
BGP Msg 状态机
-
Idle(空闲状态):为初始状态,该状态下,BGP Router 拒绝邻居发送的连接请求。只有在收到本设备的 Start 事件后,BGP Router 才开始尝试和其它 BGP Peers 进行 TCP Connection,并转至 Connect 状态。
-
Connect(连接状态):BGP Router 启动 Connect Retry(连接重传定时器),等待 TCP Connection 完成。如果 TCP 连接成功,那么 BGP Router 向 Peer 发送 Open Msg,并转至 OpenSent 状态;如果 TCP 连接失败,那么 BGP Router 转至 Active 状态。
-
Active(行动状态):BGP Router 总是在试图与邻居建立 TCP Connection。如果 TCP 连接成功,那么 BGP Router 向 Peer 发送 Open Msg,并关闭 Connect Retry,然后转至 OpenSent 状态。如果 TCP 连接失败,那么 BGP Router 停留在 Active 状态。
-
OpenSent(发送状态):BGP Router 等待 Peer 的 Open Msg,并对收到的 Open Msg 中携带的 AS Numer、Version、认证码等字段进行检查。如果收到的 Open Msg 正确,那么 BGP Router 发送 Keepalive Msg,并转至 OpenConfirm 状态。
-
OpenConfirm(确认状态):BGP Router 等待 Keepalive 或 Notification Msg。如果收到 Keepalive Msg,则转至 Established 状态;如果收到 Notification Msg,则转至 Idle 状态。
-
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 类:
- Client Peer
- Non-Client Peer
并且在宣告路由时遵循以下规则:
- 当收到一个来自 Non-Client Peer 的 I-BGP Update Msg 后,该 Route 将会反射到所有的 Client Peer。
- 当收到一个来自 Client Peer 的 I-BGP Update Msg 后,该 Route 将会反射到所有的 Client Peer 和 Non-Client Peer。
- 当收到一个来自 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 示例。