动态路由协议BGP介绍
文章目录
-
BGP介绍
-
- BGP相关术语
- BGP报文介绍
-
- BGP五种报文
- BGP报文结构
-
路由属性分类:
-
BGP常见的路由特性包括以下几类:
-
源地址信息(Origin attribute)
-
下一条 hop 的信息(Next_Hop attribute)
-
AS路径信息(AS_Path attribute)
-
本地前缀信息(Local_Pre attribute)
-
社区信息(Community attribute)
-
最短路径经济性(MED)信息(MED attribute)
-
BGP路由黑洞产生原因
-
BGP路由反射器以及联盟
-
- BGP路由反射器
- BGP联盟
-
BGP原理
-
BGP介绍
BGP (Border Gataway Protocol, 边界网关协议) 是一种专门针对无法在超大规模或跨自治系统中应用的 Distance Vector 协议(OSPF 不适用的情况)。它通过实现 选择优化路径 (path optimization)、防止 routing loops (循环) 和 快速传播 routing information (信息) 的特性,在自身并不生成 routing entries(路由条目)的情况下(仅负责转发已存在的通告),能够有效管理网络中的众多 routing entries(路由条目)。
主要内容包括:BGP相关术语及其核心概念、BGP数据包构成信息载体、BGP路由配置参数及其影响因素、导致网络中出现路由黑洞的原因分析、基于路径选择机制的B GP路由反射器与合作伙伴网络连接、基于状态机模型的网络管理框架构建以及整体工作原理解析
BGP相关术语
IBGP :位于同一AS区域内运行的BGP路由器之间的关系;从IBGP设备上学到的路由不会发送至其他IBGP设备(IBGP防环);

EBGP 是指不同AS区域内BGP路由器之间的交互机制;每当一个EBGP设备从另一个EBGP设备接收路由信息时(RB),它会解析接收到的路由数据中的AS路径列表(RTE's AS Path List);如果检测到该列表中包含本机对应的AS编号,则会丢弃该报文(防止环路形成)

Speaking:能够发送BGP报文的设备;向其他Speaking设备发送BGP报文;该功能由其自身的特性决定;网络中每一台BGP设备都可以成为Speaking...
Peer :对等体,相互发送报文的Speaking设备之间称为对等体;
BGP路由器ID(Routers' ID in BGP network) 是用于在BGP网络中唯一标识相关设备的一个参数。其功能与OSPF路由器身份标识(RID)相一致,并采用相同的获取方式(包括手动配置、通过环回接口的IP地址或物理接口的IP地址)。一旦选择该路由器ID,在没有接口地址删除的情况下,默认情况下即使设置更大的IP地址也不会发生变化。
BGP报文介绍
BGP协议本身不会生成路由条目,而是负责传播通告型的路由信息;在路由信息传播过程中,BGP通过五种特定的报文来管理邻居关系的状态变化:分别是用于建立邻居关系的Open报文、用于更新邻居状态的Update报文、用于通知邻居某些信息的Notification报文、用于维持邻居活跃状态的Keepalive报文以及用于完成路由信息刷新的Route-refresh报文。
BGP五种报文
- 建立型BGP开销(Open):当TCP连接建立后发送的第一个BGP开销(开销),包含了本地路由器的Speaking信息以及后续与对等体达成BGP会话所需的必要信息;
- 路由更新型BGP开销(Update):用于交换对等体之间的路由信息;
- 错误通告型BGP开销(Notification):当检测到错误信息时发送此开销以通知对等体已处于初始状态;
- 保持连接型BGP开销(Keepalive):用于维持当前的BGP对等体连接;
- 动态路由更新型BGP开销(Route-Refresh):当支持该功能的路由器收到此开销时会请求对等体重新发送最新的路由信息;该类型开销仅需发送发生变更的部分路由表即可实现响应;
BGP报文结构
开销报文、更新报文、保持 alive 报文、通知报文和路由刷新报文中采用相同的方式遵循BGP协议的统一头部字段结构

| 报文字段 | 说明 |
|---|---|
| Marker | 标记字段,用于标记BGP边界报文,固定值为所有比特均为“1”; |
| Length | 长度字段,标识整个报文的字节大小; |
| Type | 报文类型字段,标识报文类型,数值为1-5,分别对应Open、Update、Notification、Keepalive和Router-Refresh报文; |
Open报文结构:

| 报文字段 | 说明 |
|---|---|
| Version | 版本字段,标识本地使用的BGP版本号; |
| My Autonomous System | 本地AS号字段,标识本地设备所在的AS号,比较两端的AS号可以知道是IBGP(AS号相同)或EBGP(AS号不同); |
| Hold Time | 标识BGP对等体间保持连接的时间,单位为秒,在建立对等体关系时两端会将Hold Time同步,在该定时器里没有收到Update或Keepalive报文就会断开连接; |
| BGP Identity | BGP路由器ID字段,用来唯一标识BGP设备,与OSPF的RID相同; |
| Opt Parm Len | 可选参数长度字段,标识可选参数的长度,有可选参数就为可选参数长度,没有就为“0”; |
| Optional Parameters | 可选参数字段,用于多协议扩展等功能,如:BGP认证; |
Update报文结构:

| 报文字段 | 说明 |
|---|---|
| Unfeasible Route Length | 不可达路由长度字段,标识不可达路由的长度,单位为字节,通知对等体需要撤销的不可达路由的长度,如果为0,就没有下列的Withdraw Routes字段(没有要撤销的路由条目); |
| Withdraw Routes | 撤销路由字段,长度可变,包含了要从对等体BGP路由表中要撤销的网络地址和前缀; |
| Total Path Attribute Length | 整个路径属性长度字段,包含了路由条目的相应路径属性的长度,如果为0,表示就没有下列Path Attribute字段; |
| Path Attribute | 路径属性字段,与NLRI相关的所有路径属性,每个路径属性都由TLV(Type-Length-Value)组成,用于避免环路、选路和协议扩展等; |
| NLRI(NetworkLayer Reachabinity Information) | 网络层可达路由字段,长度可变,包含了所有要向BGP对等体通告的可达路由条目和前缀; |
Notification报文结构:

| 报文字段 | 说明 |
|---|---|
| Error Code | 差错码字段,指定错误类型; |
| Error Subcode | 差错子码字段,描述错误类型的详细原因; |
| Data | 错误内容字段,用于辅助发现错误原因,内容依赖于差错码和差错子码,记录出错部分的数据 |
Keepalive报文结构:
Keepalive机制旨在维持BGP对等体之间的持续连接。由于其设计特性,在这种情况下无需携带额外的信息字段。其格式与标准的BGP报告(Report)消息一致,并且在这一机制中使用的Type字段值被定义为4(十进制)。这个值与保持存活信息的标准做法相一致。
Route-Refresh报文结构:

| 报文字段 | 说明 |
|---|---|
| AFI | 地址族标识字段,用于标识所采用的不同地址类型; |
| Res | 保留字段,必须为“0”; |
| SAFI | 子地址族标识字段,用于标识不同的地址类型; |
BGP的多扩展协议主要采用两种关键属性来定义相关参数值:一是可达NLRI(MP_REACH_NLRI),其数值设置为14;二是不可达NLRI(MP_UNREACH_NLRI),其数值设置为15。这些核心参数值均包含地址族(Address Family)与子地址族(Sub-Address Family)等基本构成要素。
地址族 即一种用于配置网络层协议的具体模块,在实际应用中 旨在实现对不同类型网络的分类配置 ,以确保各类别网络能够分别得到相应的配置处理 ,从而达到便于管理和维护的目的
地址族采用**地址族标识符(Address Family Identifier, AFI)的方式进行识别;而子地址族则采用子地址族标识符(Subsequent Address Family Identifier, SAIFI)**的方式进行识别。
| MP-BGP协议族 | AFI | SAFI |
|---|---|---|
| IPv4 Unicast(IPv4单播) | 1 | 1 |
| IPv4 Multicast(IPv4组播) | 1 | 2 |
| IPv4 Lable(IPv4 MPLS) | 1 | 4 |
| IPv4 VPNv4(IPv4 VPN) | 1 | 128 |
| IPv4 MDT(IPv4组播分部树) | 1 | 66 |
| IPv6 Unicast(IPv6单播) | 2 | 1 |
| IPv6 Multicast(IPv6组播) | 2 | 2 |
| L2VPN(二层VPN) | 192 | 128 |
| VPSL(虚拟专用局域网服务) | 25 | 65 |
路由属性分类:
- 公选必遵:所有BGP设备都能识别该属性(公选),该属性必须进入Update报文中(必须遵守);
- 公选任意:所有BGP设备都能识别该属性(公选),该属性可以选择不进入Update报文(任意);
- 可选过渡:BGP设备可以不识别该属性(可选),如果BGP设备未识别该属性,则会接收并通知其他BGP设备(过渡);
- 可选非过渡:BGP设备可以不识别该属性(可选),如果BGP设备未识别该属性,则会接收但不会通知其他BGP设备(非过度),仅用于本地用途;
BGP常见路由属性
| 属性名 | 属性类型 |
|---|
| Origin(源)
Next_Hop(下一跳)
AS_Path(AS路径)| 必须遵循 |
|Local_Pre(本地优先)| 可任选 |
| MED(多出口区分)
Cluster_ID(集群ID)
Originator_ID(始发者ID)| 可选非过渡 |
Origin属性
用于标识不同来源设备学到的路由信息,在BGP设备接收多条指向同一目的地址但来自不同源端口或网络段的信息时,则需评估其Origin属性间的优先级关系(i>e>?);
- IBGP(i):IBGP对等体网络中所获取的学习到的关键路径信息被标注为"i"标签,并赋予其最高优先级;
- EBGP(e):EBGP对等体网络中所获取的学习到的关键路径信息被标注为"e"标签,并赋予其较低优先级;
- 非B GP节点(?):网络中未参与B GP协议的学习过程而获得的关键路径信息被以"?"标签标识并赋予最低优先级;
Next_Hop属性
下一跳是指下一个AS区域而不涉及路由器;在IBGP设备间传递路由信息时不会修改下一跳。
从IBGP设备学习到的路由条目不会再发送给其他的IBGP设备(IBGP防环);
AS_Path属性
标识路由经过的AS区域时发现,在IBGP拓扑中各节点接收的路由信息均不带AS_PATH属性;而当EBGP端点接收到来自IBGP端点的路由信息时会检查其携带的相关信息:如果发现存在本地网络对应的Autonomous System(AS)编号,则会丢弃此数据包;反之则会在该节点处记录本地AS号,并通过相关机制防止产生环路。
Local_Pre属性
该数值越大,则其优先级更高。该值用于确定流量离开时的路径选择,在本区域内部进行通告与比较,并不发送至其他区域(特别是在IBGP对等体内)。

当R1试图将报文发送至网络设备R4时,系统识别到两条路由项:其中一条经由路由器R2传输,另一条则经由路由器R3传输。经过进一步比较各属性值后,在其余条件均相同的情况下(即其余属性均相同),系统确定应选择经由该路径(因为该路径所在的本地优先级属性值较高)。
Community属性
Community 属性是一组具备相同特征的 BGP 路由条目集合,并用于简化 routing 策略的应用并降低 maintenance 管理维度;
它不仅允许团体中的成员一次性设置相同的 parameters 和 routing configurations,
还可以根据 group 属性进行筛选;
Community属性可以分为基本团体属性和扩展团体属性 ;
该属性项其值定义为8,并采用32位二进制数值进行编码。其中该保留字段的范围包括:OX 从OX到OX以及OX到OX。前16位字段用于标识路由源自治系统(AS)号后16位字段则用于标识路由源AS号下的子AS号同时还可以用于区分不同IGP(基于协议)类型、本地优先级以及MED(Multiprot跳表)值等信息。
基本属性的常用属性取值有:
Internet:基于默认设置的所有路由都归于同一个团体属性,并会向所有BGP对等体发送信息;
NO_EXPORT(0xFFFFFF01):遵循此配置的所有路径信息都不会向本地AS以外发送数据;
NO_EXPORT_SUBCONFED(0xFFFFFF03):遵循此配置的所有路径信息也不会发送到与本地同属一个AS以外的部分;
NO_ADVERTISE(0xFFFFFF02):当路径信息被接收时... 也不会向外传播到其他BGP节点;
为了克服现有团体属性仅支持32位数值的表示范围而产生的局限性 ,本设计采用了将团体属性的‘Type Code’字段定义为16位、对应数值存储空间扩大至64位的方式,并新增了一个‘Type’字段以标识不同类型的团体数据;该字段允许路由系统直接引用团体属性中的类型信息来进行相关操作
MED属性
等同于COST值指标,在此情况下数值越小时表示优先级更高;该指标主要用于评估并决定流量如何进入AS区域内,在这种情况下仅涉及两个AS区域之间的路径交换

BGP路由黑洞产生原因

由于其配置关系**(注:此处应删除括号内的内容)**, IBGP 对等体 R4 与 R2 形成了邻居关系
当设备R5接入主网络子网2.b.b.b时(其中b代表任意三个连续二进制位),它会向另一个路由器(如设备)R4传输该数据包。随后,在完成此操作后(即经过时间间隔t后),设备端口会被重置以避免重复投递同一数据包;然而,在这段时间内(即t时间段内),目标端口接收到了来自设备的一份数据包(实际上应当来自另一台主机)。由于此时目标端口尚未完全断开连接(即处于空闲状态),它会尝试通过本地查询机制确定是否存在通往目标主机所在子网入口的信息。如果未发现存在通往该子网入口的信息,则会导致该数据包被丢弃;从而使得整个通信过程中断并最终形成一个无法被发现的通路。
BGP路由反射器以及联盟
为了解决这一问题而采取了多种解决方案以应对网络中的路由黑洞现象研究人员开发出了路由器反射器路由器联盟以及MPLS协议(具体内容将在后续讨论中介绍)
应对路由黑洞的一种有效措施是确保所有位于该Autonomous System(AS)范围内的路由均需参与IBGP的全连接。如前所述,在分析上述网络拓扑图时可知:为解决问题所提出的措施要求网络节点R2、R3以及R4之间都应与彼此建立IBGP邻居关系。值得注意的是,在该Autonomous System(AS)内网络节点数量不断增加的过程中会导致相关操作的工作量显著提升
BGP路由反射器
BGP路由反射器通过阻止来自已建立IBGP对等关系的学习而避免将这些路由信息传播给其他相关节点

- 路由反射器(Route Reflector, RR):该组件能够支持将从IBGP对等体中获取并传递相关的路由信息给其他相关联的IBGP对等体。
- 客户机(Client):与该类Reflectors建立IBGP邻居关系的一台B GP设备,在其与Reflectors建立完邻居关系后直接转变为_client_角色。
- 非客户机(None-Client):既不具备作为Reflectors的功能也不承担Client角色的B GP设备。
- 集群(Cluster):由一组Reflectors和客户的集合构成。
- 始发者(Originator) :在一个Autonomous System(AS)内最先发送出IB GP routing消息的一台B GP设备。
RR向邻居IBGP设备发布路由的原则:
- 非客户端设备学到的路由项信息将被通告给所有客户端设备;
- 客户端设备学到的路由项信息将被发布给所有其他网络中的设备(不包括发起该路由信息的客户端);
- 来自EBGP伙伴网络的学习结果将通过发布机制传递至所有客户端与非客户端设备;
在BGP网络中,在接收BGP路由信息时,在处理这些信息时会进行如下操作:首先,在处理来自客户端的更新请求后
Cluster_ID属性 防止集群间环路的机制 :
每次进入一个集群后都会将其ID追加至其所属的Cluster_ID字段列表中,并与其运行机制相仿:
当某条路由首次由RR发送时,则会将其所属的本地ID追加至该字段列表;
而当RR接收某条路由信息后,则会对该字段列表中的各项进行审查:
若发现已有对应项则舍弃这条信息;
反之则将其所属的本地ID追加至这一条目。
Originator_ID属性 防止集群内环路的机制 :
- 由 RR 生成基于始发者路由器的 ID(RID);
- 当一条路由首次通过 RR 发布时会将本地 Originator_ID 记录在 Originator_ID 属性列表中;
- 当 IBGP 设备接收到一个路由条目后在收到该信息后会比较本地 RID 与该路由条目的 Originator_ID;如果一致则丢弃此条目以避免环路产生;
BGP联盟
B GP联盟通过将单一 AS 区域划分为若干子 AS 区域来实现。各子 AS 区域之间的 B GP 设备间建立 EB GP 对等关系;而同一子 AS 区域内部的 B GP 设备间则建立 IB GP 对等关系。为了保持原有 IB GP 属性信息(例如 Local_Preference 和 Minimum Encountrance 等关键属性),采用原有 AS 号作为 BGP 联盟标识符。这有助于保持原有 IB GP 属性信息;同时,在 BGP 联盟向外传播时,默认会去除与该联盟相关联的属性。无需管理员进行额外的清理操作以去除非必要信息。

BGP原理
BGP包含六个状态机:空闲状态(IDLE)、建立连接状态(CONNECT)、活跃状态(ACTIVE)、已发送的OPEN报文(OPEN SENT)、确认中的OPEN报文(OPEN CONFIRMED),以及建立中的连接(ESTABLISHED)。
在BGP协议的Initial state下,在这种情况下(在这种Initial state下),BGP设备会主动拒绝来自邻居的所有TCP连接请求;然而,在neighbor发送了“Start” event之后(在neighbor发送了"Start"事件之后),该设备会接受这些连接请求并transition到Connect state。
注:start事件可以是配置一个BGP过程、重启BGP进程等;
B. 在Connect状态,BGP启动连接重传定时器,等待TCP连接成功
- a) 当TCP连接成功(BGP对等体设备未阻断),本地BGP设备将向其对等体设备发送Open报文,并进入OpenSent状态;
- b) 当TCP连接失败(BGP对等体设备未响应),本地BGP设备将切换至Active状态,并持续尝试建立TCP连接直至重传定时器超时后停留在Connect状态;
C. 在Active状态,BGP设备会不断的尝试TCP连接;
- a) 当TCP连接尝试建立成功后,本地BGP设备会发布开销数据包,并进入OpenSent工作模式;
- b) 当尝试重新发送过程中出现超时后仍未能建立通信联系,则会切换并停留在Connect状态;
在OpenSent状态下, 本地BGP设备等待接收来自其对等体设备的Open报文, 并对其收到的Open报文中包含的AS号码, 版本号以及认证码等信息进行验证
- a) 当Open报文正确时,本地BGP设备将向对等体设备发送Keepalive报文,并切换为OpenConfirm状态;
- b) 当Open报文信息存在错误时,本地BGP设备将向对等体设备发出Notification报文,并进入Idle状态;
E. 当本地BGP设备处于OpenConfirm状态时,在等待对等体设备传递Keepalive报文或Notification报文。
- a) 如果接收到Keepalive报文,则本地BGP设备将向对等体传输Update报文,并进入Establish状态;
- b) 如果接收到Notification报文,则本地BGP设备将进入Idle状态;
F. 在Establish状态下, 该本地BGP设备处于一直等待对应侧设备接收相应的Keepalive、Notification或Update报文的状态
- a) 当本地BGP设备接收到Keekeepalive报文或Update报文(其中Update报文内容准确),该设备就会判断其对等体上设备的状态处于正常水平,并持续维持BGP连接;
- b) 当本地BGP设备接收到Notification报文时,则会转为Idle工作状态;

注
