跳到主要内容

8.2.2. 有限状态机

8.2.2. 有限状态机 (Finite State Machine)​

Idle 状态:

初始时, BGP 对等体 FSM 处于 Idle 状态. 下文中, BGP 对等体 FSM 简称为 BGP FSM.

在此 状态 中, BGP FSM 拒绝此 对等体 的所有 传入 BGP 连接. 不为该 对等体 分配 资源. 响应手动启动 (ManualStart) 事件 (Event 1) 或自动启动 (AutomaticStart) 事件 (Event 3) 时, 本地系统:

  • 初始化 对等连接 的所有 BGP 资源,
  • 将 ConnectRetryCounter 设置为 零,
  • 使用 初始值 启动 ConnectRetryTimer,
  • 发起到另一个 BGP 对等体 的 TCP 连接,
  • 侦听 可能由 远端 BGP 对等体 发起的 连接, 并且
  • 将其 状态 改为 Connect.

ManualStop 事件 (Event 2) 和 AutomaticStop 事件 (Event 8) 在 Idle 状态 中被忽略.

响应 ManualStart_with_PassiveTcpEstablishment 事件 (Event 4) 或 AutomaticStart_with_PassiveTcpEstablishment 事件 (Event 5) 时, 本地系统:

  • 初始化所有 BGP 资源,
  • 将 ConnectRetryCounter 设置为 零,
  • 使用 初始值 启动 ConnectRetryTimer,
  • 侦听 可能由 远端对等体 发起的 连接, 并且
  • 将其 状态 改为 Active.

ConnectRetryTimer 的确切值是本地问题 (local matter), 但它 SHOULD 足够大, 以允许 TCP 初始化 (initialization).

如果 DampPeerOscillations 属性 设置为 TRUE, 则空闲状态内可能出现以下三个附加 (additional) 事件:

  • AutomaticStart_with_DampPeerOscillations (Event 6),
  • AutomaticStart_with_DampPeerOscillations_and_PassiveTcpEstablishment (Event 7),
  • IdleHoldTimer_Expires (Event 13).

收到这 3 个 事件 后, 本地系统 会使用这些事件 防止 对等体振荡 (oscillation). 防止持续 (persistent) 对等体振荡的方法不在本文档范围内.

在 Idle 状态 中收到任何其他 事件 (Event 9-12, 15-28) 不会导致 本地系统 的 状态 改变.

Connect 状态:

在此 状态 中, BGP FSM 等待 TCP 连接 完成.

启动事件 (Event 1, 3-7) 在 Connect 状态 中被忽略.

响应 ManualStop 事件 (Event 2) 时, 本地系统:

  • 丢弃 TCP 连接,
  • 释放所有 BGP 资源,
  • 将 ConnectRetryCounter 设置为 零,
  • 停止 ConnectRetryTimer 并将 ConnectRetryTimer 设置为 零, 并且
  • 将其 状态 改为 Idle.

响应 ConnectRetryTimer_Expires 事件 (Event 9) 时, 本地系统:

  • 丢弃 TCP 连接,
  • 重启 ConnectRetryTimer,
  • 停止 DelayOpenTimer 并将 定时器 重置为 零,
  • 发起到另一个 BGP 对等体 的 TCP 连接,
  • 继续 侦听 可能由 远端 BGP 对等体 发起的 连接, 并且
  • 保持在 Connect 状态.

如果 DelayOpenTimer_Expires 事件 (Event 12) 在 Connect 状态 中发生, 本地系统:

  • 向其 对等体 发送 OPEN 消息,
  • 将 HoldTimer 设置为一个 较大值, 并且
  • 将其 状态 改为 OpenSent.

如果 BGP FSM 收到 TcpConnection_Valid 事件 (Event 14), 则处理 TCP 连接, 并且 连接 保持在 Connect 状态.

如果 BGP FSM 收到 Tcp_CR_Invalid 事件 (Event 15), 本地系统 拒绝 TCP 连接, 并且 连接 保持在 Connect 状态.

如果 TCP 连接 成功 (Event 16 或 Event 17), 本地系统 在处理前检查 DelayOpen 属性. 如果 DelayOpen 属性 设置为 TRUE, 本地系统:

  • 停止 ConnectRetryTimer (如果正在运行) 并将 ConnectRetryTimer 设置为 零,
  • 将 DelayOpenTimer 设置为 初始值, 并且
  • 保持在 Connect 状态.

如果 DelayOpen 属性 设置为 FALSE, 本地系统:

  • 停止 ConnectRetryTimer (如果正在运行) 并将 ConnectRetryTimer 设置为 零,
  • 完成 BGP initialization,
  • 向其 对等体 发送 OPEN 消息,
  • 将 HoldTimer 设置为一个 较大值, 并且
  • 将其 状态 改为 OpenSent.

建议 HoldTimer 值 为 4 分钟.

如果 TCP 连接 失败 (Event 18), 本地系统 检查 DelayOpenTimer. 如果 DelayOpenTimer 正在运行, 本地系统:

  • 使用 初始值 重启 ConnectRetryTimer,
  • 停止 DelayOpenTimer 并将其 值 重置为 零,
  • 继续 侦听 可能由 远端 BGP 对等体 发起的 连接, 并且
  • 将其 状态 改为 Active.

如果 DelayOpenTimer 未运行, 本地系统:

  • 将 ConnectRetryTimer 停止为 零,
  • 丢弃 TCP 连接,
  • 释放所有 BGP 资源, 并且
  • 将其 状态 改为 Idle.

如果在 DelayOpenTimer 正在运行时收到 OPEN 消息 (Event 20), 本地系统:

  • 停止 ConnectRetryTimer (如果正在运行) 并将 ConnectRetryTimer 设置为 零,
  • 完成 BGP initialization,
  • 停止并清除 DelayOpenTimer (将 值 设置为 零),
  • 发送 OPEN 消息,
  • 发送 KEEPALIVE 消息,
  • 如果 HoldTimer 初始值 非零:
    • 使用 初始值 启动 KeepaliveTimer, 并且
    • 将 HoldTimer 重置为 协商值,
  • 否则, 如果 HoldTimer 初始值 为 零:
    • 重置 KeepaliveTimer, 并且
    • 将 HoldTimer 值 重置为 零,
  • 并将其 状态 改为 OpenConfirm.

如果自治系统 (Autonomous System) 字段的值与本地自治系统编号相同, 则将连接状态 (connection status) 设置为内部连接 (internal connection); 否则设置为外部连接 (external).

如果 BGP 消息报头检查 (Event 21) 或 OPEN 消息检查检测到错误 (Event 22) (见 6.2 节), 本地系统:

  • (可选) 如果 SendNOTIFICATIONwithoutOPEN 属性 设置为 TRUE, 则 本地系统 首先发送带有 适当的错误代码 的 NOTIFICATION 消息, 然后
  • 停止 ConnectRetryTimer (如果正在运行) 并将 ConnectRetryTimer 设置为 零,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 增加 1,
  • (可选) 如果 DampPeerOscillations 属性 设置为 TRUE, 则执行 对等体振荡抑制, 并且
  • 将其 状态 改为 Idle.

如果收到带有 version error 的 NOTIFICATION 消息 (Event 24), 本地系统 检查 DelayOpenTimer. 如果 DelayOpenTimer 正在运行, 本地系统:

  • 停止 ConnectRetryTimer (如果正在运行) 并将 ConnectRetryTimer 设置为 零,
  • 停止并重置 DelayOpenTimer (设置为 零),
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接, 并且
  • 将其 状态 改为 Idle.

如果 DelayOpenTimer 未运行, 本地系统:

  • 停止 ConnectRetryTimer 并将 ConnectRetryTimer 设置为 零,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 增加 1,
  • 如果 DampPeerOscillations 属性 设置为 TRUE, 则执行 对等体振荡抑制, 并且
  • 将其 状态 改为 Idle.

响应任何其他 事件 (Event 8, 10-11, 13, 19, 23, 25-28) 时, 本地系统:

  • 如果 ConnectRetryTimer 正在运行, 则停止并重置 ConnectRetryTimer (设置为 零),
  • 如果 DelayOpenTimer 正在运行, 则停止并重置 DelayOpenTimer (设置为 零),
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 增加 1,
  • 如果 DampPeerOscillations 属性 设置为 TRUE, 则执行 对等体振荡抑制, 并且
  • 将其 状态 改为 Idle.

Active 状态:

在此 状态 中, BGP FSM 通过 侦听 并接受 TCP 连接 来尝试获得 对等体.

启动事件 (Event 1, 3-7) 在 Active 状态 中被忽略.

响应 ManualStop 事件 (Event 2) 时, 本地系统:

  • 如果 DelayOpenTimer 正在运行且 SendNOTIFICATIONwithoutOPEN session 属性 已设置, 本地系统 会发送带有 Cease 的 NOTIFICATION,
  • 释放所有 BGP 资源, 包括停止 DelayOpenTimer,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 设置为 零,
  • 停止 ConnectRetryTimer 并将 ConnectRetryTimer 设置为 零, 并且
  • 将其 状态 改为 Idle.

响应 ConnectRetryTimer_Expires 事件 (Event 9) 时, 本地系统:

  • 重启 ConnectRetryTimer (使用 初始值),
  • 发起到另一个 BGP 对等体 的 TCP 连接,
  • 继续 侦听 可能由 远端 BGP 对等体 发起的 TCP 连接, 并且
  • 将其 状态 改为 Connect.

如果 本地系统 收到 DelayOpenTimer_Expires 事件 (Event 12), 本地系统:

  • 将 ConnectRetryTimer 设置为 零,
  • 停止并清除 DelayOpenTimer (设置为 零),
  • 完成 BGP initialization,
  • 向其 远端对等体 发送 OPEN 消息,
  • 将其 hold 定时器 设置为一个 较大值, 并且
  • 将其 状态 改为 OpenSent.

对于此 状态 transition, 也建议 HoldTimer 值 为 4 分钟.

如果 本地系统 收到 TcpConnection_Valid 事件 (Event 14), 本地系统 处理 TCP 连接 flag 并保持在 Active 状态.

如果 本地系统 收到 Tcp_CR_Invalid 事件 (Event 15), 本地系统 拒绝 TCP 连接 并保持在 Active State.

响应 TCP 连接 成功 (Event 16 或 Event 17) 时, 本地系统 在处理前检查 DelayOpen optional 属性.

如果 DelayOpen 属性 设置为 TRUE, 本地系统:

  • 停止 ConnectRetryTimer 并将 ConnectRetryTimer 设置为 零,
  • 将 DelayOpenTimer 设置为 初始值 (DelayOpenTime), 并且
  • 保持在 Active 状态.

如果 DelayOpen 属性 设置为 FALSE, 本地系统:

  • 将 ConnectRetryTimer 设置为 零,
  • 完成 BGP initialization,
  • 向其 对等体 发送 OPEN 消息,
  • 将其 HoldTimer 设置为一个 较大值, 并且
  • 将其 状态 改为 OpenSent.

建议将 4 分钟作为 HoldTimer 的 "较大值".

如果 本地系统 收到 TcpConnectionFails 事件 (Event 18), 本地系统:

  • 重启 ConnectRetryTimer (使用 初始值),
  • 停止并清除 DelayOpenTimer (将 值 设置为 零),
  • 释放所有 BGP 资源,
  • 将 ConnectRetryCounter 增加 1,
  • 如果 DampPeerOscillations 属性 设置为 TRUE, 则可选地执行 对等体振荡抑制, 并且
  • 将其 状态 改为 Idle.

如果收到 OPEN 消息 且 DelayOpenTimer 正在运行 (Event 20), 本地系统:

  • 停止 ConnectRetryTimer (如果正在运行) 并将 ConnectRetryTimer 设置为 零,
  • 停止并清除 DelayOpenTimer (设置为 零),
  • 完成 BGP initialization,
  • 发送 OPEN 消息,
  • 发送 KEEPALIVE 消息,
  • 如果 HoldTimer 值 非零:
    • 将 KeepaliveTimer 启动为 初始值,
    • 将 HoldTimer 重置为 协商值,
  • 否则, 如果 HoldTimer 为 零:
    • 重置 KeepaliveTimer (设置为 零),
    • 将 HoldTimer 重置为 零, 并且
  • 将其 状态 改为 OpenConfirm.

如果 autonomous system field 的值与 local Autonomous System number 相同, 则将 连接 status 设置为 internal 连接; 否则为 external.

如果 BGP 消息报头检查 (Event 21) 或 OPEN 消息检查检测到错误 (Event 22) (见 6.2 节), 本地系统:

  • 如果 SendNOTIFICATIONwithoutOPEN 属性 设置为 TRUE, 则 (可选) 发送带有 适当的错误代码 的 NOTIFICATION 消息,
  • 将 ConnectRetryTimer 设置为 零,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 增加 1,
  • 如果 DampPeerOscillations 属性 设置为 TRUE, 则 (可选) 执行 对等体振荡抑制, 并且
  • 将其 状态 改为 Idle.

如果收到带有 version error 的 NOTIFICATION 消息 (Event 24), 本地系统 检查 DelayOpenTimer. 如果 DelayOpenTimer 正在运行, 本地系统:

  • 停止 ConnectRetryTimer (如果正在运行) 并将 ConnectRetryTimer 设置为 零,
  • 停止并重置 DelayOpenTimer (设置为 零),
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接, 并且
  • 将其 状态 改为 Idle.

如果 DelayOpenTimer 未运行, 本地系统:

  • 将 ConnectRetryTimer 设置为 零,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 增加 1,
  • 如果 DampPeerOscillations 属性 设置为 TRUE, 则 (可选) 执行 对等体振荡抑制, 并且
  • 将其 状态 改为 Idle.

响应任何其他 事件 (Event 8, 10-11, 13, 19, 23, 25-28) 时, 本地系统:

  • 将 ConnectRetryTimer 设置为 零,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 增加 1,
  • 如果 DampPeerOscillations 属性 设置为 TRUE, 则 (可选) 执行 对等体振荡抑制, 并且
  • 将其 状态 改为 Idle.

OpenSent:

在此 状态 中, BGP FSM 等待来自其 对等体 的 OPEN 消息.

启动事件 (Event 1, 3-7) 在 OpenSent 状态 中被忽略.

如果 ManualStop 事件 (Event 2) 在 OpenSent 状态 中发出, 本地系统:

  • 发送带有 Cease 的 NOTIFICATION,
  • 将 ConnectRetryTimer 设置为 零,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 设置为 零, 并且
  • 将其 状态 改为 Idle.

如果 AutomaticStop 事件 (Event 8) 在 OpenSent 状态 中发出, 本地系统:

  • 发送带有 Cease 的 NOTIFICATION,
  • 将 ConnectRetryTimer 设置为 零,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 增加 1,
  • 如果 DampPeerOscillations 属性 设置为 TRUE, 则 (可选) 执行 对等体振荡抑制, 并且
  • 将其 状态 改为 Idle.

如果 HoldTimer_Expires (Event 10), 本地系统:

  • 发送错误代码 (Error Code) 为 Hold Timer Expired 的 NOTIFICATION 消息,
  • 将 ConnectRetryTimer 设置为 零,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接,
  • 增加 ConnectRetryCounter,
  • 如果 DampPeerOscillations 属性 设置为 TRUE, 则 (可选) 执行 对等体振荡抑制, 并且
  • 将其 状态 改为 Idle.

如果收到 TcpConnection_Valid (Event 14), Tcp_CR_Acked (Event 16) 或 TcpConnectionConfirmed 事件 (Event 17), 第二条 TCP 连接 可能正在进行. 这条第二 TCP 连接 按 Connection Collision processing (Section 6.8) 跟踪, 直到收到 OPEN 消息.

对无效端口 (invalid port) 的 TCP 连接请求 (TCP Connection Request, Tcp_CR_Invalid (Event 15)) 会被忽略.

如果收到 TcpConnectionFails 事件 (Event 18), 本地系统:

  • 关闭 BGP 连接,
  • 重启 ConnectRetryTimer,
  • 继续 侦听 可能由 远端 BGP 对等体 发起的 连接, 并且
  • 将其 状态 改为 Active.

收到 OPEN 消息 时, 会检查所有 field 的 correctness. 如果 OPEN 消息 中没有 error (Event 19), 本地系统:

  • 将 DelayOpenTimer 重置为 零,
  • 将 BGP ConnectRetryTimer 设置为 零,
  • 发送 KEEPALIVE 消息,
  • 设置 KeepaliveTimer (通过下文文本),
  • 按 协商值 设置 HoldTimer (见 Section 4.2),
  • 将其 状态 改为 OpenConfirm.

如果 协商的保持时间值 为 零, 则不启动 HoldTimer 和 KeepaliveTimer. 如果 Autonomous System field 的值与 local Autonomous System number 相同, 则 连接 是 "internal" 连接; 否则是 "external" 连接. (这会影响如下所述的 UPDATE processing.)

如果 BGP 消息报头检查 (Event 21) 或 OPEN 消息检查检测到错误 (Event 22) (见 6.2 节), 本地系统:

  • 发送带有 适当的错误代码 的 NOTIFICATION 消息,
  • 将 ConnectRetryTimer 设置为 零,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 增加 1,
  • 如果 DampPeerOscillations 属性 为 TRUE, 则 (可选) 执行 对等体振荡抑制, 并且
  • 将其 状态 改为 Idle.

收到有效 BGP OPEN 消息 (Event 19 或 Event 20) 时, 需要应用 collision detection mechanism (Section 6.8). 具体比较细节请参考 Section 6.8. 当 BGP implementation 通过本文档范围外的方法确定发生 连接冲突 时, 会发生 CollisionDetectDump 事件.

如果 OpenSent 状态 中的某条 连接 被确定为必须关闭的 连接, 则向 状态机 发出 OpenCollisionDump (Event 23). 如果在 OpenSent 状态 中收到此类 事件, 本地系统:

  • 发送带有 Cease 的 NOTIFICATION,
  • 将 ConnectRetryTimer 设置为 零,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 增加 1,
  • 如果 DampPeerOscillations 属性 设置为 TRUE, 则 (可选) 执行 对等体振荡抑制, 并且
  • 将其 状态 改为 Idle.

如果收到带有 version error 的 NOTIFICATION 消息 (Event 24), 本地系统:

  • 将 ConnectRetryTimer 设置为 零,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接, 并且
  • 将其 状态 改为 Idle.

响应任何其他 事件 (Event 9, 11-13, 20, 25-28) 时, 本地系统:

  • 发送错误代码 (Error Code) 为 Finite State Machine Error 的 NOTIFICATION,
  • 将 ConnectRetryTimer 设置为 零,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 增加 1,
  • 如果 DampPeerOscillations 属性 设置为 TRUE, 则 (可选) 执行 对等体振荡抑制, 并且
  • 将其 状态 改为 Idle.

OpenConfirm 状态:

在此 状态 中, BGP 等待 KEEPALIVE 或 NOTIFICATION 消息.

任何 启动事件 (Event 1, 3-7) 在 OpenConfirm 状态 中被忽略.

响应由 operator 发起的 ManualStop 事件 (Event 2) 时, 本地系统:

  • 发送带有 Cease 的 NOTIFICATION 消息,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 设置为 零,
  • 将 ConnectRetryTimer 设置为 零, 并且
  • 将其 状态 改为 Idle.

响应由 system 发起的 AutomaticStop 事件 (Event 8) 时, 本地系统:

  • 发送带有 Cease 的 NOTIFICATION 消息,
  • 将 ConnectRetryTimer 设置为 零,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 增加 1,
  • 如果 DampPeerOscillations 属性 设置为 TRUE, 则 (可选) 执行 对等体振荡抑制, 并且
  • 将其 状态 改为 Idle.

如果 HoldTimer_Expires 事件 (Event 10) 在收到 KEEPALIVE 消息 之前发生, 本地系统:

  • 发送错误代码 (Error Code) 为 Hold Timer Expired 的 NOTIFICATION 消息,
  • 将 ConnectRetryTimer 设置为 零,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 增加 1,
  • 如果 DampPeerOscillations 属性 设置为 TRUE, 则 (可选) 执行 对等体振荡抑制, 并且
  • 将其 状态 改为 Idle.

如果 本地系统 收到 KeepaliveTimer_Expires 事件 (Event 11), 本地系统:

  • 发送 KEEPALIVE 消息,
  • 重启 KeepaliveTimer, 并且
  • 保持在 OpenConfirmed 状态.

在 OpenConfirm 中, 如果发生 TcpConnection_Valid 事件 (Event 14) 或 TCP 连接 成功 (Event 16 或 Event 17), 本地系统 需要跟踪第二条 连接.

如果使用 invalid port 尝试 TCP 连接 (Event 15), 本地系统 将忽略第二次 连接尝试.

如果 本地系统 从 underlying TCP 收到 TcpConnectionFails 事件 (Event 18) 或收到 NOTIFICATION 消息 (Event 25), 本地系统:

  • 将 ConnectRetryTimer 设置为 零,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 增加 1,
  • 如果 DampPeerOscillations 属性 设置为 TRUE, 则 (可选) 执行 对等体振荡抑制, 并且
  • 将其 状态 改为 Idle.

如果 本地系统 收到带有 version error 的 NOTIFICATION 消息 (NotifMsgVerErr (Event 24)), 本地系统:

  • 将 ConnectRetryTimer 设置为 零,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接, 并且
  • 将其 状态 改为 Idle.

如果 本地系统 收到有效 OPEN 消息 (BGPOpen (Event 19)), collision detect function 按 Section 6.8 处理. 如果此 连接 因 连接冲突 而需要被 丢弃, 本地系统:

  • 发送带有 Cease 的 NOTIFICATION,
  • 将 ConnectRetryTimer 设置为 零,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接 (send TCP FIN),
  • 将 ConnectRetryCounter 增加 1,
  • 如果 DampPeerOscillations 属性 设置为 TRUE, 则 (可选) 执行 对等体振荡抑制, 并且
  • 将其 状态 改为 Idle.

收到 OPEN 消息 时, 会检查所有 field 的 correctness. 如果 BGP 消息报头 checking (BGPHeaderErr (Event 21)) 或 OPEN 消息 checking 检测到 error (见 Section 6.2) (BGPOpenMsgErr (Event 22)), 本地系统:

  • 发送带有 适当的错误代码 的 NOTIFICATION 消息,
  • 将 ConnectRetryTimer 设置为 零,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 增加 1,
  • 如果 DampPeerOscillations 属性 设置为 TRUE, 则 (可选) 执行 对等体振荡抑制, 并且
  • 将其 状态 改为 Idle.

如果在处理另一条 OPEN 消息 期间, BGP implementation 通过本文档范围外的方法确定发生了 连接冲突 且此 连接 将被关闭, 本地系统 将发出 OpenCollisionDump 事件 (Event 23). 当 本地系统 收到 OpenCollisionDump 事件 (Event 23) 时, 本地系统:

  • 发送带有 Cease 的 NOTIFICATION,
  • 将 ConnectRetryTimer 设置为 零,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 增加 1,
  • 如果 DampPeerOscillations 属性 设置为 TRUE, 则 (可选) 执行 对等体振荡抑制, 并且
  • 将其 状态 改为 Idle.

如果 本地系统 收到 KEEPALIVE 消息 (KeepAliveMsg (Event 26)), 本地系统:

  • 重启 HoldTimer, 并且
  • 将其 状态 改为 Established.

响应任何其他 事件 (Event 9, 12-13, 20, 27-28) 时, 本地系统:

  • 发送错误代码 (Error Code) 为 Finite State Machine Error 的 NOTIFICATION,
  • 将 ConnectRetryTimer 设置为 零,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 增加 1,
  • 如果 DampPeerOscillations 属性 设置为 TRUE, 则 (可选) 执行 对等体振荡抑制, 并且
  • 将其 状态 改为 Idle.

Established 状态:

在 Established 状态 中, BGP FSM 可以与其 对等体 交换 UPDATE, NOTIFICATION 和 KEEPALIVE 消息.

任何 启动事件 (Event 1, 3-7) 在 Established 状态 中被忽略.

响应 ManualStop 事件 (由 operator 发起) (Event 2) 时, 本地系统:

  • 发送带有 Cease 的 NOTIFICATION 消息,
  • 将 ConnectRetryTimer 设置为 零,
  • 删除与此 连接 关联的所有 路由,
  • 释放 BGP 资源,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 设置为 零, 并且
  • 将其 状态 改为 Idle.

响应 AutomaticStop 事件 (Event 8) 时, 本地系统:

  • 发送带有 Cease 的 NOTIFICATION,
  • 将 ConnectRetryTimer 设置为 零,
  • 删除与此 连接 关联的所有 路由,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 增加 1,
  • 如果 DampPeerOscillations 属性 设置为 TRUE, 则 (可选) 执行 对等体振荡抑制, 并且
  • 将其 状态 改为 Idle.

AutomaticStop 事件 的一个原因是: BGP 收到针对给定 对等体 的 UPDATE 消息, 其中 prefix 数量使收到的 prefix 总数超过已配置的 maximum number of prefixes. 本地系统 会自动断开该 对等体.

如果 HoldTimer_Expires 事件 发生 (Event 10), 本地系统:

  • 发送错误代码 (Error Code) 为 Hold Timer Expired 的 NOTIFICATION 消息,
  • 将 ConnectRetryTimer 设置为 零,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 增加 1,
  • 如果 DampPeerOscillations 属性 设置为 TRUE, 则 (可选) 执行 对等体振荡抑制, 并且
  • 将其 状态 改为 Idle.

如果 KeepaliveTimer_Expires 事件 发生 (Event 11), 本地系统:

  • 发送 KEEPALIVE 消息, 并且
  • 重启其 KeepaliveTimer, 除非 协商的保持时间值 为 零.

每次 本地系统 发送 KEEPALIVE 或 UPDATE 消息 时, 它都会重启其 KeepaliveTimer, 除非 协商的保持时间值 为 零.

在有效 port 上收到 TcpConnection_Valid (Event 14) 会导致第二条 连接 被跟踪.

无效的 TCP 连接 (invalid TCP connection, Tcp_CR_Invalid 事件 (Event 15)) 将被忽略.

响应 TCP 连接 成功建立的指示 (Event 16 或 Event 17) 时, 第二条 连接 SHALL 被跟踪, 直到它发送 OPEN 消息.

如果收到有效 OPEN 消息 (BGPOpen (Event 19)), 并且 CollisionDetectEstablishedState optional 属性 为 TRUE, 则会检查 OPEN 消息 是否与任何其他 连接 发生 collision (Section 6.8). 如果 BGP implementation 确定此 连接 需要终止, 它将处理 OpenCollisionDump 事件 (Event 23). 如果此 连接 需要终止, 本地系统:

  • 发送带有 Cease 的 NOTIFICATION,
  • 将 ConnectRetryTimer 设置为 零,
  • 删除与此 连接 关联的所有 路由,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 增加 1,
  • 如果 DampPeerOscillations 设置为 TRUE, 则 (可选) 执行 对等体振荡抑制, 并且
  • 将其 状态 改为 Idle.

如果 本地系统 从 underlying TCP 收到 NOTIFICATION 消息 (Event 24 或 Event 25) 或 TcpConnectionFails (Event 18), 本地系统:

  • 将 ConnectRetryTimer 设置为 零,
  • 删除与此 连接 关联的所有 路由,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 增加 1, 并且
  • 将其 状态 改为 Idle.

如果 本地系统 收到 KEEPALIVE 消息 (Event 26), 本地系统:

  • 如果 协商的保持时间值 非零, 则重启其 HoldTimer, 并且
  • 保持在 Established 状态.

如果 本地系统 收到 UPDATE 消息 (Event 27), 本地系统:

  • 处理该 消息,
  • 如果 协商的保持时间值 非零, 则重启其 HoldTimer, 并且
  • 保持在 Established 状态.

如果 本地系统 收到 UPDATE 消息, 且 UPDATE 消息 error handling procedure (见 Section 6.3) 检测到 error (Event 28), 本地系统:

  • 发送带有 Update error 的 NOTIFICATION 消息,
  • 将 ConnectRetryTimer 设置为 零,
  • 删除与此 连接 关联的所有 路由,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 增加 1,
  • 如果 DampPeerOscillations 属性 设置为 TRUE, 则 (可选) 执行 对等体振荡抑制, 并且
  • 将其 状态 改为 Idle.

响应任何其他 事件 (Event 9, 12-13, 20-22) 时, 本地系统:

  • 发送 Error Code 为 Finite State Machine Error 的 NOTIFICATION 消息,
  • 删除与此 连接 关联的所有 路由,
  • 将 ConnectRetryTimer 设置为 零,
  • 释放所有 BGP 资源,
  • 丢弃 TCP 连接,
  • 将 ConnectRetryCounter 增加 1,
  • 如果 DampPeerOscillations 属性 设置为 TRUE, 则 (可选) 执行 对等体振荡抑制, 并且
  • 将其 状态 改为 Idle.