有人可以解释 BGP 路由器优雅重启流程吗?

网络工程 BGP
2022-02-03 05:18:32

有人可以解释一下 BGP 路由器的优雅重启流程,在 BGP 路由器与其对等方之间在重启之前和重新建立会话之后如何交换消息。

1个回答

考虑以下拓扑R1---R2---R3

线 R1---R2 和 R2---R3 代表物理连接和 EBGP 会话。

我们将研究从 R1 流向 R3 的 BGP 更新,以及从 R3 流向 R1 的数据平面流量。

在此示例中,R2 将重新启动。

R1 ----> R2

OPEN
  Graceful restart capability => "I support graceful restart"
    Restart flags
      R = 0 => "I have not restarted"
      Restart Time = 30 => "If I restart in the future, I expect to be done in 30 seconds"
    AFI SAFI = IPv4 Unicast => "I support GR for IPv4-Unicast"
      AFI SAFI Flags
        F = 0 => "This is only relevant after a restart, so 0 for now"

R2 ----> R1

OPEN (similar to above)

R2 ----> R3

OPEN (similar to above)

R3 ----> R2

OPEN (similar to above)

路由器 R1 产生一些前缀1.1.0.0/162.2.0.0/16

R1 ----> R2

UPDATE
  AFI-SAFI = IPv4-Unicast
  Prefix = 1.1.0.0/16, 2.2.0.0/16
  Attributes
    Next Hop = R1
    AS Path = 100
    etc.

路由器 R2 在 R2 FIB 中安装条目以将流量转发到路由器 R11.1.0.0/162.2.0.0/16通过路由器 R1。

路由器 R2 将从 R1 接收到的 BGP 更新传播到 R3:

R2 ----> R3

UPDATE
  AFI-SAFI = IPv4-Unicast
  Prefix = 1.1.0.0/16, 2.2.0.0/16
  Attributes
    Next Hop = R2
    AS Path = 200 100
    etc.

路由器 R3 在 R3 FIB 中安装条目,以将流量转发到路由器 R21.1.0.0/162.2.0.0/16通过路由器 R2。

*** 路由器 R2 上的控制平面由于某种原因(崩溃、升级)出现故障 ***

路由器 R2 上转发平面:

  1. 使用当前安装在 FIB 中的路由继续转发数据包:流量到1.1.0.0/162.2.0.0/16继续转发到路由器 R1。
  2. 将 FIB 中的路由标记为陈旧(规范说 RIB 中的路由被标记为陈旧,但这很难实现,因为控制平面刚刚被吹走)。

路由器 R3 注意到与 R2 的 BGP 会话中断(例如,因为 BFD 超时或 BGP KEEPALIVE 超时或链路中断)。

通常,路由器 R3将从其 RIB 和 FIB中删除从 R2 接收到的 BGP 路由(即1.1.0.0/16and )。2.2.0.0/16

但是,由于路由器 R2 宣布它支持优雅重启,路由器 R3 将

  1. 将来自 R2 的路由保留在其 RIB 中
  2. 将 RIB 中的所有路由标记为“陈旧”
  3. 将来自 R2 的路由保留在其 FIB 中
  4. 继续为 FIB 中的这些路由转发流量

*** 拓扑变化***

当路由器 R2 关闭时,网络拓扑发生了一些变化。

假设发生了一些变化,导致路由器 R1 停止通告前缀 1.1.0.0/16

路由器 R1 将从其 RIB 和 FIB 中撤回路由 1.1.0.0/16,并向其所有邻居发送 BGP WITHDRAW。

但是,R1 无法向 R2 发送 WITHDRAW 消息,因为此时 R1-R2 BGP 会话已关闭。

稍后我们将从这个“不同步”问题中恢复过来。

*** 路由器 R2 上的控制平面恢复 ***

我们假设控制平面恢复的时间少于 30 秒(路由器 R2 在开始时发送的 OPEN 消息中的 Restart Time 字段的值)。如果花费更长的时间,路由器 R3 将“放弃”并刷新从 R2 从其 RIB 和 FIB 中学习到的路由。

BGP 会话恢复:

R1 ----> R2

OPEN
  Graceful restart capability => "I support graceful restart"
    Restart flags
      R = 0 => "I have not restarted"
      Restart Time = 30 => "If I restart in the future, I expect to be done in 30 seconds"
    AFI SAFI = IPv4 Unicast => "I support GR for IPv4-Unicast"
      AFI SAFI Flags
        F = 0 => "This is only relevant after a restart, so 0 for now"

R2 ----> R1

OPEN
  Graceful restart capability => "I support graceful restart"
    Restart flags
      R = 1 => "*** I DID RESTART ***"
      Restart Time = 30 => "If I restart in the future, I expect to be done in 30 seconds"
    AFI SAFI = IPv4 Unicast => "I support GR for IPv4-Unicast"
      AFI SAFI Flags
        F = 1 => "*** I DID PRESERVE FORWARDING STATE IN THE FIB ***"

R3 ----> R2

Similar to R1->R2 OPEN

R2 ----> R3

Similar to R2->R1 OPEN

***重新同步***

路由器 R2 知道它已重新启动,因此它不会发送任何 UPDATE,直到它收到来自其邻居(R1 和 R3)的所有 UPDATE、选择最佳路由并更新其 RIB 和 FIB。

路由器 R1 知道它的邻居 R2 重新启动,因此它将重新发送所有路由到 R2,后跟一个 end-of-rib 标记,然后从它的 RIB/FIB 中清除从 R2 接收到的任何陈旧路由(没有任何在这个例子中)。

类似地,路由器 R3 知道它的邻居 R2 重新启动,因此它将重新发送所有路由到 R2(本示例中没有),然后是 end-of-rib 标记,然后刷新收到的所有陈旧路由来自 R2 的 RIB/FIB。

那么,让我们详细介绍一下:

路由器 R1 产生前缀 2.2.0.0/16(但由于上面提到的拓扑变化,不再是 1.1.0.0/16):

R1 ----> R2

UPDATE
  AFI-SAFI = IPv4-Unicast
  Prefix = 2.2.0.0/16
  Attributes
    Next Hop = R1
    AS Path = 100
    etc.

路由器 R2 在其 RIB 和 FIB 中安装 2.2.0.0/16。

路由器 R2 在其 FIB 中已经有一个 2.2.0.0/16 条目,该条目被标记为陈旧。这个陈旧的标记现在被删除了;它又新鲜了。

路由器 R2 没有收到来自 R1 的 1.1.0.0/16 UPDATE。因此,R2 在其 RIB 中没有 1.1.0.0/16 的条目。但是 R2在其 FIB仍然有一个 1.1.0.0/16 条目,该条目现在并且仍然标记为陈旧。

路由器 R1 已完成向 R2 发送所有路由,因此它向 R2 发送一个 end-of-rib 标记:

R1 ----> R2

UPDATE
  AFI-SAFI = IPv4-Unicast
  End-of-RIB marker

此时,路由器 R2 已从 R1 接收到肋骨末端标记,但尚未从 R3 接收到。所以,它还没有采取任何行动(它需要从所有邻居那里收到一个肋骨末端标记)。

现在,让我们看看路由器 R3。

在这个例子中,路由器 R3 没有任何前缀要发送到 R2,所以它立即发送一个 End-of-RIB 标记:

R3 ----> R2

UPDATE
  AFI-SAFI = IPv4-Unicast
  End-of-RIB marker

此时,路由器 R2 已从其所有邻居(R1 和 R3)接收到 End-of-RIB 标记,因此它将采取以下操作:

  1. R2 将为其 RIB 中的每个目标前缀运行最佳路由选择过程(在此示例中仅 2.2.0.0/16)
  2. R2 会将 RIB 中每个前缀的选定最佳路由安装到 FIB 中(仅 2.2.0.0/16)
  3. R2 将从 FIB 中清除所有剩余的陈旧路由(在本例中为 1.1.0.0/16)
  4. R2 将开始发送 UPDATE 以将其 RIB 中的路由通告(传播)给邻居:

路由器 R2 将从 R1 接收到的 BGP 更新传播到 R3:

R2 ----> R3

UPDATE
  AFI-SAFI = IPv4-Unicast
  Prefix = 2.2.0.0/16
  Attributes
    Next Hop = R2
    AS Path = 200 100
    etc.

此时路由器 R2 已完成向 R3 发送所有路由,因此它向 R3 发送一个 End-of-RIB 标记:

R2 ----> R3

UPDATE
  AFI-SAFI = IPv4-Unicast
  End-of-RIB marker

请注意,路由器 R2 没有要发送到 R1 的路由(具体来说,由于 AS 路径循环,它不会将 2.2.0.0/16 的路由发送回 R1)。因此,R2 也会立即向 R1 发送一个 End-of-RIB 标记:

R2 ----> R1

UPDATE
  AFI-SAFI = IPv4-Unicast
  End-of-RIB marker

当路由器 R3 从 R2 接收到 end-of-rib 标记时,它会从 R1 (在本例中为 1.1.0.0/16)从 RIB 和 FIB 中清除所有过时的路由。

路由器 R1 在从 R2 接收到肋骨结束标记时会执行相同的操作,但在此示例中,由于 R2 没有向 R1 通告任何路由,因此没有什么可刷新的。