BGPv4特性探究-4@GR-RFC4724
个人认为,理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议。

- 关于BGP version4相关内容,可参考2006年发布的RFC4271-A Border Gateway Protocol 4;
- 关于BGP Route-Reflect相关内容,可参考2006年发布的RFC4456-BGP Route Reflection:An Alternative to Full Mesh Internal BGP;
- 关于BGP Confederations相关内容,可参考2007年发布的RFC5065-Autonomous System Confederations for BGP;
- 关于BGP可通告Capability相关内容,可参考2009年发布的RFC5492-Capabilities Advertisement with BGP-4;
- 关于4字节AS Number相关内容,可参考2012年发布的RFC6793-BGP Support for Four-Octet Autonomous System Number Space;
自动换行
其他相关资料:
- 关于BGP的Capability Codes详细参数,可参考IANA发布的Capability Codes;
- 关于BGP的其他参数字段的详细内容,可参考IANA发布的Border Gateway Protocol (BGP) Parameters;
- 关于BGP的AFI相关参数,可参考IANA发布的Address Family Numbers;
- 关于BGP的SAFI相关参数,可参考IANA发布的Subsequent Address Family Identifiers (SAFI) Parameters;
- 关于BGP Extended Community Sub-Types,可参考IANA发布的Border Gateway Protocol Extended Communities;
- 关于常用TCP/UDP知名端口的定义,可参考IANA发布的Service Name and Transport Protocol Port Number Registry。
......
Border Gateway Protocol自1989年定义以来已经历过4个版本:1989年RFC1105的Version1,1990年RFC1163的Version2,1991年RFC1267的Version3,1994年RFC1654的Version4。而V4又历经了几次迭代,到目前比较全面完整的是2006年发布的RFC4271。
本文档旨在介绍相关原理,对于不同设备及厂家的实现上不做深究。有意者建议阅读相关资料。个人能力有限,如有疑问欢迎留言指导~
目录
1.相关术语和概念
BGP(Border Gateway Protocol,边界网关协议) 是一个 AS(Autonomous System,自治系统) 间的路由协议。BGP 的主要功能是与其他 BGP 系统交换网络可达性信息。
为便于介绍,在此先介绍一些关于BGP的相关术语:
Autonomous System自治系统
单个路由协议管理下的一组路由器,使用内部网关协议(IGP)和通用度量来确定如何在AS内路由数据包。如果一个AS内运行了多个IGP协议,对于其他AS来说也认为其执行了内部一致的路由规则。
三张处理表/库
1@--Adj-RIB-In:邻居入方向的路由信息表/库。用于描述对等体向自己传输的完整路由信息。该路由表未进行入方向的路由策略。
2@--Adj-RIB-Out:邻居出方向的路由信息表/库。用于描述自己向对等体描述的路由信息,或者放置于Update消息报文中的路由信息。该路由表已进行出方向的路由策略。
3@--Loc-RIB:放置已被本地BGP以便进行选择的路由。该路由表已进行入方向的路由策略。
因此有如下的路由处理过程:
简单来说Adj-RIB-In和Adj-RIB-Out是放置于Update报文中的路由信息。
NLRI
Network Layer Reachability Information,网络层可达信息。放置于Update报文中,主要描述了路由信息或路由的相关属性。
IBGP/EBGP
Internal和External BGP,简单来说为相同AS的对等体关系为IBGP邻居,相反为EBGP。
相关概念:
1@:BGP 使用 TCP 的 179 端口进行相关协议报文的发送和监听。
2@:在建立了完整的 BGP 对等体关系后,BGP 只发送增量更新。而非周期性泛洪或刷新路由表。
因此 BGP 为了使路由有正确的结果需要 TCP 周期保活或使用Route-Refrsh路由刷新。
BGP 提供了如下三种机制进行路由更改:
1@:发送withdraw类型的Update报文,将该路由进行撤销
2@:发送具有相同NLRI的Update报文,进行更新。通过此种方式可以更改路由的属性。
3@:中断BGP连接。
关于 BGP 基本原理的相关内容,可参考博客-BGPv4-原理介绍+报文分析+配置示例。
2.Graceful Restart-RFC4724
通常,当路由器上的 BGP 重新启动时,所有 BGP peer 都会检测到 session 的关闭启动。这种 down/up 会导致 BGP 路由重新计算、生成 BGP 路由更新以及转发表出现不必要的改动,最终造成瞬时转发黑洞和或瞬时转发环路。
在《RFC4724-Graceful Restart Mechanism for BGP》中介绍了一种 BGP Graceful Restart 机制,通过 BGP peer 之间协商新的 Capability Codes 64 = Graceful Restart Capability 该功能将允许 BGP 指示其在 BGP 重启期间可以保留转发状态。
2.1.Graceful Restart基本原理
1@BGP 的 End-of-RIB:
1@:当 BGP session 建立完成后,BGP 可以向其 peer 发送一个不携带 NLRI 或者空 withdrawn NLRI 的 Update 消息用于表明完成了路由更新的初始化。也即达到 End-of-RIB 状态。End-of-RIB 标记是为了 BGP Graceful Restart 机制而定义的。
对于 BGP 的 IPv4 Unicast 地址族而言,End-of-RIB 标记是发送一个具有最小长度的 Update 消息。在《RFC4271-A Border Gateway Protocol 4》中定义最小长度的 Update 消息为 23 字节,仅包含 16 字节的固定 Marker 字段,2 字节的 Length,1 字节的 BGP Type,2 字节的 withdrawn_routes.length(值为 0),2 字节的 path_attributes.length(值为 0)。
对于其他地址族而言,End-of-RIB 标记是一个仅包含没有 withdrawn 路由 MP_UNREACH_NLRI attribute 的 Update 消息。
自动换行
End-of-RIB marker 示例。
2@:通常如果 BGP Speaker 可以在 BGP 重启时保留其转发状态则可以向其 peer 通告 Graceful Restart Capability。然而即使不能保留转发状态,也建议其向其 peer 通告 Graceful Restart Capability。
这样首先可以通过 BGP 的 End-of-RIB marker 来标识自己完成了路由更新前的初始化。其次是表示它对希望执行正常重启的 peer 的支持。
自动换行
2@Procedures for the Restarting Speaker:
1@:当 Restarting Speaker 重新启动时,如果可能,其必须保留 Loc-RIB 中 BGP 路由的转发状态,并且必须将这些路由标记为过时。流量在转发过程中,Restarting Speaker 不得区分路由是否过时。
2@:在 BGP session 重新建立的过程中,Restarting Speaker 必须将 OPEN 消息 Graceful Restart Capability 中的 R-bit(Restart State bit) 置位。除非通过配置允许,否则只有在重启期间确实保留了转发状态时,才能设置该功能中的 R-bit(Restart State bit)。
3@:在 BGP session 重新建立完成后,Restarting Speaker 必须延迟路由选择直到如下情况之一发生。
- Restarting Speaker 从其所有的 peer 收到 End-of-RIB marker,但应排除不具有 graceful restart capability 的 peer,也应排除具有graceful restart capability 但 R-bit(Restart State bit) 置位的 peer。
- Selection_Deferral_Timer 定时器触发。路由器延迟路由选择的时间上限称为 Selection_Deferral_Timer 定时器。该值应足够大,以便 Restarting Speaker 接收来自的所有 peer 的所有路由。
peer graceful-restart timer wait-for-rib 用来配置等待指定对等体组 End-Of-RIB 标记的最大等待时间。当本端与对端重新建立 BGP session 之后,应在此时间内收到对端的 End-Of-RIB 标记。否则退出GR过程,从现有路由中选取最佳路由。
4@:BGP Speaker 完成路由选择后必须更新转发状态并删除路由先前的过时标记。此时可以执行 Adj-RIB-Out 动作并必须发送 End-of-RIB marker。
5@:可以在计划重启时应用 graceful restart 功能。
自动换行
3@Procedures for the Receiving Speaker:
1@:当 Restarting Speaker 重新启动时,Receiving Speaker 可能无法检测到对应 TCP session 的变化。此时可以以 TCP 的再次建链作为旧 TCP session 终止的指示。Receiving Speaker 将直接关闭旧 TCP session 而不发送 NOTIFICATION 消息。
2@:当 Restarting Speaker 检测到具有用 graceful restart 功能的 peer 重启后,必须保留先前从 peer 接收的路由,并且必须将其标记为过时路由。
3@:为了处理可能的连续重启,先前来自 peer 已标记为过时的路由必须被删除。
4@:BGP session 重建的过程中,除非 Receiving Speaker 重启,否则 Receiving Speaker 不得将 OPEN 消息 Graceful Restart Capability 中的 R-bit(Restart State bit) 置位。
5@:Receiving Speaker 在完成地址族的初始更新后,必须向 peer 发送 End-of-RIB marker。
5@:Receiving Speaker 收到 peer 的 End-of-RIB marker 后,它必须立即从 peer 中删除仍标记为过时的任何路由。
6@:Receiving Speaker 可以支持配置要对路由器保留过时路由的时间量上限。
自动换行
4@其他需要注意的内容:
1@:对于 Receiving Speaker 而言,为了满足上述要求还需修改 BGP 的协议状态机。
在《RFC4727-Graceful Restart Mechanism for BGP的4.Operation》中提到,当 BGP TCP session 的关闭是由于 NOTIFICATION 消息的发送和接收导致时,正常的 BGP 过程必须被遵守。并在《RFC4727-Graceful Restart Mechanism for BGP的5.Changes to BGP Finite State Machine》中介绍了修改后的 BGP 协议状态机。
其中定义修改了三部分内容。
自动换行
1@:当本地收到 NOTIFICATION 消息或者触发 TcpConnectionFails 事件但与该事件关联的地址族未使能 Graceful Restart capability 而导致 BGP session down 时,将删除与 BGP session 关联的资源不执行 GR 过程。
2@:如果触发 TcpConnectionFails 事件且与该事件关联的地址族使能 Graceful Restart capability,则保留相关的路由但删除与 BGP session 关联的资源其他资源。也即 Receiving Speaker 可以执行 GR 过程。
自动换行
关于《RFC4727-Graceful Restart Mechanism for BGP》针对协议状态机修改的其他部分内容,可查看相关资料。
2@:尽管上述介绍的 graceful restart 功能可能有助于减少路由波动,但是如果路由器无法记录先前的转发状态情况下则可能产生潜在的环路和路由黑洞。
3@:由于 graceful restart 功能需要在 BGP 交互 Open 消息时协商,开启 graceful restart 功能会导致 BGP session 的重新建立。
由于 graceful restart 功能需要在 BGP 交互 Open 消息时协商,但 HW 也可以允许在不进行协商的情况下为 peer 执行 GR 过程。
peer local-graceful-restart timer restart 可以用来配置本端等待对端对等体BGP邻居重建成功的最大等待时间。默认最大等待时间是 150s。此时当本端发现对端处于 Down 状态时进入 GR 过程,本端应在此时间内与对端成功建连,否则从现有路由中选取最佳路由。
自动换行
graceful-restart peer-reset 可以配置设备以 GR(Graceful Restart) 方式复位 BGP 连接。如果配置此命令,则在原有地址族基础上创建其他地址族的 BGP 邻居关系时,BGP 将进入 GR 重新进行能力协商。在这个过程中原有地址族的路由表项不会删除。
也即此时不仅仅在设备重启过程中,新创建其他地址族的 BGP 邻居关系时也可以执行 GR 功能。
2.2.Graceful Restart Capability编码
Graceful Restart Capability:为了实现上述机制 IANA 定义了一种新的 Capability Codes = 64 用于 BGP peer 协商这一功能。BGP Speaker 可使用它来指示其在 BGP 重启期间保持其转发状态的能力,也可以向其 peer 传达其在完成初始路由更新后生成 End-of-RIB 标记的意图。
协议要求
1@:BGP Speaker 不得在 Open 消息中包含多个 Graceful Restart Capability 实例。如果包含,则仅识别最后一个 Graceful Restart Capability。
2@:Graceful Restart Capability 的 <AFI = IPv4,SAFI = unicast> 并不意味着 IPv4 单播路由信息应使用 BGP 多协议扩展 [BGP-MP] 进行传输,它可以在 BGP UPDATE 消息的 NLRI 字段中传输。
Graceful Restart Capability编码:
Graceful Restart Capability 主要分为三部分,1 字节的 Capability Codes 固定为 64;1 字节的 Capability length,因携带地址族类型而不定长;不定长的 Capability value。

Capability value 主要包含上述字段:
1@Restart Flags:4 bits 长,目前仅定义了最高位的 Restart State bit。其余为保留 bit,发送时必须置 0, 接收时必须忽略。
R-bit:Restart State bit 可用于避免 BGP Speaker 重新启动时,因等待 End of-RIB 标记而可能导致的死锁。置位时表示 BGP Speaker 已重新启动,并且其 peer 在向 BGP Speaker 发送路由信息之前不得等待 BGP Speaker 的 End-of-RIB 标记。
2@Restart Time in seconds:12 bit 长,用于标识重新启动后重新建立 BGP Session 所需的估计时间 (以秒为单位),加快其对等体的路由收敛速度。
协议原文并未定义该时间所使用的值,但在《RFC4724-Graceful Restart Mechanism for BGP的4.Operation》中建议默认的 Restart Time 应小于或等于 Open 消息中携带的 HOLDTIME 值。
自动换行
graceful-restart timer restart 用于全局设置对端等待本端 BGP 邻居重建成功的最大等待时间。当对端发现本端处于Down状态时,对端应在此命令设置的时间内与本端成功建连,否则退出 GR 过程并从现有路由中选取最佳路由。
peer graceful-restart timer restart 用于针对 peer 设置对端等待本端 BGP 邻居重建成功的最大等待时间。
3@<AFI,SAFI>:共 3 字节,用于表示启动 GR 功能的地址族类型。
当收到的 BGP Open 消息的此 Capability 字段不包含 <AFI,SAFI>,这意味着该 peer 无法在 BGP 重新启动期间保留其转发状态但可以支持 BGP Speaker 自己所声明的 GR 过程。
在这种情况下, BGP Speaker 公布的 Restart Time 字段值没有意义。
4@Flags for Address Family:8 bit,目前仅定义了最高位的 Forwarding State bit。其余为保留 bit,发送时必须置 0, 接收时必须忽略。
F-bit:Forwarding State bit 可用于指示在上一次 BGP 重新启动期间是否确实保留了使用给定 AFI 和 SAFI 通告的路由的转发状态。置位时表示已保留转发状态。
自动换行
BGP Open 消息中携带 Graceful Restart Capability 的示例,其中既有 IPv4 Unicast 地址族又有 VPNv4 地址族。
自动换行
2.3.Graceful Restart配置示例
bgp 100
router-id 1.1.1.1
graceful-restart
graceful-restart timer wait-for-rib 100
graceful-restart timer restart 100
graceful-restart peer-reset
peer 10.1.1.2 as-number 100
#
ipv4-family unicast
undo synchronization
import-route direct
import-route static
peer 10.1.1.2 enable
#
自动换行
此处所提供的参考命令已在前文进行相关介绍,此处不在说明。
并且 Graceful Restart Capability 的开启可能会导致 BGP session 的重建,以及 NOTIFICATION 消息不会触发 GR 过程。相关原理已在前文进行详情介绍。
更新
本文来自博客园,作者:m风行者,转载请注明原文链接:https://www.cnblogs.com/FengXingZhe008/p/18913238
简单来说Adj-RIB-In和Adj-RIB-Out是放置于Update报文中的路由信息。
End-of-RIB marker 示例。
peer graceful-restart timer wait-for-rib 用来配置等待指定对等体组 End-Of-RIB 标记的最大等待时间。当本端与对端重新建立 BGP session 之后,应在此时间内收到对端的 End-Of-RIB 标记。否则退出GR过程,从现有路由中选取最佳路由。
peer local-graceful-restart timer restart 可以用来配置本端等待对端对等体BGP邻居重建成功的最大等待时间。默认最大等待时间是 150s。此时当本端发现对端处于 Down 状态时进入 GR 过程,本端应在此时间内与对端成功建连,否则从现有路由中选取最佳路由。
graceful-restart peer-reset 可以配置设备以 GR(Graceful Restart) 方式复位 BGP 连接。如果配置此命令,则在原有地址族基础上创建其他地址族的 BGP 邻居关系时,BGP 将进入 GR 重新进行能力协商。在这个过程中原有地址族的路由表项不会删除。
graceful-restart timer restart 用于全局设置对端等待本端 BGP 邻居重建成功的最大等待时间。当对端发现本端处于Down状态时,对端应在此命令设置的时间内与本端成功建连,否则退出 GR 过程并从现有路由中选取最佳路由。
peer graceful-restart timer restart 用于针对 peer 设置对端等待本端 BGP 邻居重建成功的最大等待时间。
BGP Open 消息中携带 Graceful Restart Capability 的示例,其中既有 IPv4 Unicast 地址族又有 VPNv4 地址族。
浙公网安备 33010602011771号