8. BGP Finite State Machine (FSM) (BGP 有限状态机)
8. BGP Finite State Machine (FSM) (BGP 有限状态机)
本文档中描述的数据结构和有限状态机 (FSM) 是概念性的, 不必完全按照此处描述的方式实现, 只要实现支持所描述的功能并表现出相同的外部可见行为即可。
本节以有限状态机 (Finite State Machine, FSM) 的形式指定 BGP 操作。本节分为两部分:
- 状态机事件描述 (8.1 节)
- FSM 描述 (8.2 节)
每个连接所需的会话属性 (强制) 有:
- State (状态)
- ConnectRetryCounter (连接重试计数器)
- ConnectRetryTimer (连接重试定时器)
- ConnectRetryTime (连接重试时间)
- HoldTimer (保持定时器)
- HoldTime (保持时间)
- KeepaliveTimer (保活定时器)
- KeepaliveTime (保活时间)
状态会话属性指示 BGP FSM 的当前状态。ConnectRetryCounter 指示 BGP 对等体尝试建立对等会话的次数。
与定时器相关的强制属性在第 10 节中描述。每个定时器都有一个 "定时器" 和一个 "时间" (初始值)。
可选的会话属性列举如下。这些可选属性可以受支持, 可以按连接或按本地系统:
- AcceptConnectionsUnconfiguredPeers (接受未配置对等体的连接)
- AllowAutomaticStart (允许自动启动)
- AllowAutomaticStop (允许自动停止)
- CollisionDetectEstablishedState (在已建立状态下检测冲突)
- DampPeerOscillations (抑制对等体振荡)
- DelayOpen (延迟 OPEN)
- DelayOpenTime (延迟 OPEN 时间)
- DelayOpenTimer (延迟 OPEN 定时器)
- IdleHoldTime (空闲保持时间)
- IdleHoldTimer (空闲保持定时器)
- PassiveTcpEstablishment (被动 TCP 建立)
- SendNOTIFICATIONwithoutOPEN (在没有 OPEN 的情况下发送 NOTIFICATION)
- TrackTcpState (跟踪 TCP 状态)
可选会话属性支持 BGP 功能的不同特性, 这些特性对 BGP FSM 状态转换有影响。与定时器相关的两组属性是:
- group 1 (组 1): DelayOpen, DelayOpenTime, DelayOpenTimer
- group 2 (组 2): DampPeerOscillations, IdleHoldTime, IdleHoldTimer
第一个参数 (DelayOpen, DampPeerOscillations) 是一个可选属性, 指示定时器功能是否处于活动状态。"Time" 值指定 "Timer" (DelayOpenTime, IdleHoldTime) 的初始值。"Timer" 指定实际的定时器。
请参阅 8.1.1 节以了解这些可选属性与向状态机发出信号的事件之间的交互。8.2.1.3 节还提供了不同类型可选属性 (标志或定时器) 的简短概述。
8.1. Events for the BGP FSM (BGP FSM 事件)
8.1.1. Optional Events Linked to Optional Session Attributes (与可选会话属性关联的可选事件)
BGP FSM 的输入是事件。事件可以是强制的或可选的。一些可选事件与可选会话属性相关联。可选会话属性启用了几组 FSM 功能。
下面描述了 FSM 功能、事件和可选会话属性之间的关联。
Group 1 (组 1): Automatic Administrative Events (Start/Stop) (自动管理事件 (启动/停止))
可选会话属性: AllowAutomaticStart, AllowAutomaticStop, DampPeerOscillations, IdleHoldTime, IdleHoldTimer
Option 1 (选项 1): AllowAutomaticStart
描述: BGP 对等体连接可以通过管理控制启动和停止。此管理控制可以是基于操作员干预的手动控制, 也可以是在特定于 BGP 实现的逻辑控制下的自动控制。术语 "自动" 是指当此类逻辑确定应重新启动 BGP 对等体连接时, 向 BGP 对等体连接 FSM 发出启动命令。
AllowAutomaticStart 属性指定此 BGP 连接支持自动启动 BGP 连接。
如果 BGP 实现支持 AllowAutomaticStart, 则对等体可能会被重复重新启动。其他三个选项控制自动重启发生的速率: DampPeerOscillations, IdleHoldTime 和 IdleHoldTimer。
DampPeerOscillations 选项指定实现使用附加逻辑来抑制面对自动启动和自动停止序列时 BGP 对等体的振荡。IdleHoldTime 指定在允许下一次自动重启之前 BGP 对等体在空闲状态下保持的时间长度。IdleHoldTimer 是将对等体保持在空闲状态的定时器。
DampPeerOscillations 逻辑的一个示例是, 如果 BGP 对等体在一段时间内重复振荡连接 (已连接/已断开连接), 则增加 IdleHoldTime 值。要启用此逻辑, 对等体可以在 5 分钟内连接和断开 10 次。IdleHoldTime 值将从 0 重置为 120 秒。
值: TRUE 或 FALSE
Option 2 (选项 2): AllowAutomaticStop
描述: 此 BGP 对等会话可选属性指示 BGP 连接允许 "自动" 停止 BGP 连接。"自动" 停止定义为在特定于实现的逻辑控制下的停止。特定于实现的逻辑超出了本规范的范围。
值: TRUE 或 FALSE
Option 3 (选项 3): DampPeerOscillations
描述: DampPeerOscillations 可选会话属性指示 BGP 连接正在使用逻辑来抑制空闲状态下的 BGP 对等体振荡。
值: TRUE 或 FALSE
Option 4 (选项 4): IdleHoldTime
描述: IdleHoldTime 是在 IdleHoldTimer 中设置的值。
值: 以秒为单位的时间
Option 5 (选项 5): IdleHoldTimer
描述: IdleHoldTimer 有助于控制 BGP 对等体振荡。IdleHoldTimer 用于将 BGP 对等体保持在空闲状态特定的持续时间。IdleHoldTimer_Expires 事件在 8.1.3 节中描述。
值: 以秒为单位的时间
Group 2 (组 2): Unconfigured Peers (未配置对等体)
可选会话属性: AcceptConnectionsUnconfiguredPeers
Option 1 (选项 1): AcceptConnectionsUnconfiguredPeers
描述: BGP FSM 可选地允许接受来自未预配置的邻居的 BGP 对等体连接。"AcceptConnectionsUnconfiguredPeers" 可选会话属性允许 FSM 支持允许实现接受或拒绝这些未配置对等体的状态转换。
AcceptConnectionsUnconfiguredPeers 具有安全隐患。请参阅 BGP 漏洞文档 [RFC4272] 以了解详细信息。
值: True 或 False
Group 3 (组 3): TCP processing (TCP 处理)
可选会话属性: PassiveTcpEstablishment, TrackTcpState
Option 1 (选项 1): PassiveTcpEstablishment
描述: 此选项指示 BGP FSM 将被动等待远程 BGP 对等体建立 BGP TCP 连接。
值: TRUE 或 FALSE
Option 2 (选项 2): TrackTcpState
描述: BGP FSM 通常跟踪 TCP 连接尝试的最终结果, 而不是单独的 TCP 消息。可选地, BGP FSM 可以支持与 TCP 连接协商的额外交互。与 TCP 事件的交互可能会增加 BGP 对等体连接所需的日志记录量和 BGP FSM 更改次数。
值: TRUE 或 FALSE
Group 4 (组 4): BGP Message Processing (BGP 消息处理)
可选会话属性: DelayOpen, DelayOpenTime, DelayOpenTimer, SendNOTIFICATIONwithoutOPEN, CollisionDetectEstablishedState
Option 1 (选项 1): DelayOpen
描述: DelayOpen 可选会话属性允许实现配置为延迟发送 OPEN 消息特定的时间段 (DelayOpenTime)。延迟允许远程 BGP 对等体有时间发送第一个 OPEN 消息。
值: TRUE 或 FALSE
Option 2 (选项 2): DelayOpenTime
描述: DelayOpenTime 是在 DelayOpenTimer 中设置的初始值。
值: 以秒为单位的时间
Option 3 (选项 3): DelayOpenTimer
描述: DelayOpenTimer 可选会话属性用于延迟在连接上发送 OPEN 消息。DelayOpenTimer_Expires 事件 (Event 12) 在 8.1.3 节中描述。
值: 以秒为单位的时间
Option 4 (选项 4): SendNOTIFICATIONwithoutOPEN
描述: SendNOTIFICATIONwithoutOPEN 允许对等体在不首先发送 OPEN 消息的情况下发送 NOTIFICATION。没有此可选会话属性, BGP 连接假定对等体在发送 NOTIFICATION 消息之前必须发送 OPEN 消息。
值: True 或 False
Option 5 (选项 5): CollisionDetectEstablishedState
描述: 通常, 检测冲突 (Detect Collision) (参见 6.8 节) 在已建立状态下将被忽略。此可选会话属性指示此 BGP 连接在已建立状态下处理冲突。
值: True 或 False
注意: 可选会话属性澄清了 BGP 实现现有功能的 BGP FSM 描述。可选会话属性可能对实现进行了预定义, 并且对于现有的正确实现, 无法通过管理接口读取。随着支持更新的 BGP MIB (版本 2 及更高版本), 这些字段将可以通过管理接口访问。
8.1.2. Administrative Events (管理事件)
管理事件是一个事件, 其中操作员接口和 BGP 策略引擎向 BGP 有限状态机发出信号以启动或停止 BGP 状态机。基本的启动和停止指示由可选连接属性增强, 这些属性向 BGP FSM 发出特定类型的启动或停止机制的信号。这种组合的一个示例是 Event 5, AutomaticStart_with_PassiveTcpEstablishment。通过此事件, BGP 实现向 BGP FSM 发出信号, 表明实现正在使用自动启动, 并具有使用被动 TCP 建立的选项。被动 TCP 建立表示此 BGP FSM 将等待远程端启动 TCP 建立。
请注意, 只有 Event 1 (ManualStart) 和 Event 2 (ManualStop) 是强制性的管理事件。所有其他管理事件都是可选的 (Events 3-8)。下面的每个事件都有一个名称、定义、状态 (强制或可选) 以及在每个阶段应设置的可选会话属性。在为 BGP FSM 生成 Event 1 到 Event 8 时, 将验证 "可选属性状态" 部分中指定的条件。如果不满足这些条件中的任何一个, 则本地系统应记录 FSM 错误。
可选会话属性的设置在某些实现中可能是隐式的, 因此可能不会由外部操作员操作显式设置。8.2.1.5 节描述了这些可选会话属性的隐式设置。下面描述的管理状态在某些实现中也可能是隐式的, 并且不能由外部操作员直接配置。
Event 1: ManualStart (手动启动)
定义: 本地系统管理员手动启动对等体连接。
状态: 强制
可选属性状态: PassiveTcpEstablishment 属性应设置为 FALSE。
Event 2: ManualStop (手动停止)
定义: 本地系统管理员手动停止对等体连接。
状态: 强制
可选属性状态: 不与任何可选属性交互。
Event 3: AutomaticStart (自动启动)
定义: 本地系统自动启动 BGP 连接。
状态: 可选, 取决于本地系统
可选属性状态:
- 如果发生此事件, AllowAutomaticStart 属性应设置为 TRUE。
- 如果支持 PassiveTcpEstablishment 可选会话属性, 则应将其设置为 FALSE。
- 如果支持 DampPeerOscillations, 则在发生此事件时应将其设置为 FALSE。
Event 4: ManualStart_with_PassiveTcpEstablishment (启用被动 TCP 建立的手动启动)
定义: 本地系统管理员手动启动对等体连接, 但已启用 PassiveTcpEstablishment。PassiveTcpEstablishment 可选属性指示对等体将在建立连接之前侦听。
状态: 可选, 取决于本地系统
可选属性状态:
- 如果发生此事件, PassiveTcpEstablishment 属性应设置为 TRUE。
- 发生此事件时, DampPeerOscillations 属性应设置为 FALSE。
Event 5: AutomaticStart_with_PassiveTcpEstablishment (启用被动 TCP 建立的自动启动)
定义: 本地系统在启用 PassiveTcpEstablishment 的情况下自动启动 BGP 连接。PassiveTcpEstablishment 可选属性指示对等体将在建立连接之前侦听。
状态: 可选, 取决于本地系统
可选属性状态:
- AllowAutomaticStart 属性应设置为 TRUE。
- PassiveTcpEstablishment 属性应设置为 TRUE。
- 如果支持 DampPeerOscillations 属性, 则 DampPeerOscillations 应设置为 FALSE。
Event 6: AutomaticStart_with_DampPeerOscillations (启用对等体振荡抑制的自动启动)
定义: 本地系统在启用对等体振荡抑制的情况下自动启动 BGP 对等体连接。抑制持续对等体振荡的确切方法由实现确定, 并且超出了本文档的范围。
状态: 可选, 取决于本地系统。
可选属性状态:
- AllowAutomaticStart 属性应设置为 TRUE。
- DampPeerOscillations 属性应设置为 TRUE。
- PassiveTcpEstablishment 属性应设置为 FALSE。
Event 7: AutomaticStart_with_DampPeerOscillations_and_PassiveTcpEstablishment (启用对等体振荡抑制和被动 TCP 建立的自动启动)
定义: 本地系统在启用对等体振荡抑制和启用 PassiveTcpEstablishment 的情况下自动启动 BGP 对等体连接。抑制持续对等体振荡的确切方法由实现确定, 并且超出了本文档的范围。
状态: 可选, 取决于本地系统
可选属性状态:
- AllowAutomaticStart 属性应设置为 TRUE。
- DampPeerOscillations 属性应设置为 TRUE。
- PassiveTcpEstablishment 属性应设置为 TRUE。
Event 8: AutomaticStop (自动停止)
定义: 本地系统自动停止 BGP 连接。
自动停止事件的一个示例是超过给定对等体的前缀数量, 并且本地系统自动断开对等体连接。
状态: 可选, 取决于本地系统
可选属性状态:
- AllowAutomaticStop 属性应为 TRUE。
8.1.3. Timer Events (定时器事件)
Event 9: ConnectRetryTimer_Expires (连接重试定时器过期)
定义: ConnectRetryTimer 过期时生成的事件。
状态: 强制
Event 10: HoldTimer_Expires (保持定时器过期)
定义: HoldTimer 过期时生成的事件。
状态: 强制
Event 11: KeepaliveTimer_Expires (保活定时器过期)
定义: KeepaliveTimer 过期时生成的事件。
状态: 强制
Event 12: DelayOpenTimer_Expires (延迟 OPEN 定时器过期)
定义: DelayOpenTimer 过期时生成的事件。
状态: 可选
可选属性状态: 如果发生此事件,
- DelayOpen 属性应设置为 TRUE,
- DelayOpenTime 属性应受支持,
- DelayOpenTimer 应受支持。
Event 13: IdleHoldTimer_Expires (空闲保持定时器过期)
定义: IdleHoldTimer 过期时生成的事件, 指示 BGP 连接已完成等待回退期以防止 BGP 对等体振荡。
IdleHoldTimer 仅在通过将 DampPeerOscillations 可选属性设置为 TRUE 来启用持续对等体振荡抑制功能时使用。
未实现持续对等体振荡抑制功能的实现可能没有 IdleHoldTimer。
状态: 可选
可选属性状态: 如果发生此事件:
- DampPeerOscillations 属性应设置为 TRUE。
- IdleHoldTimer 应刚刚过期。
8.1.4. TCP Connection-Based Events (基于 TCP 连接的事件)
Event 14: TcpConnection_Valid (TCP 连接有效)
定义: 指示本地系统接收到具有有效源 IP 地址、TCP 端口、目标 IP 地址和 TCP 端口的 TCP 连接请求的事件。无效源和无效目标 IP 地址的定义由实现确定。
BGP 的目标端口应为端口 179, 如 IANA 定义。
TCP 连接请求由本地系统接收 TCP SYN 表示。
状态: 可选
可选属性状态:
- 如果发生此事件, TrackTcpState 属性应设置为 TRUE。
Event 15: Tcp_CR_Invalid (TCP 连接请求无效)
定义: 指示本地系统接收到具有无效源地址或端口号, 或无效目标地址或端口号的 TCP 连接请求的事件。
BGP 目标端口号应为 179, 如 IANA 定义。
当本地系统收到 TCP SYN 时发生 TCP 连接请求。
状态: 可选
可选属性状态:
- 如果发生此事件, TrackTcpState 属性应设置为 TRUE。
Event 16: Tcp_CR_Acked (TCP 连接请求已确认)
定义: 指示本地系统请求建立到远程对等体的 TCP 连接的事件。
本地系统的 TCP 连接发送了 TCP SYN, 接收了 TCP SYN/ACK 消息, 并发送了 TCP ACK。
状态: 强制
Event 17: TcpConnectionConfirmed (TCP 连接已确认)
定义: 指示本地系统已收到远程站点已建立 TCP 连接的确认的事件。
远程对等体的 TCP 引擎发送了 TCP SYN。本地对等体的 TCP 引擎发送了 SYN, ACK 消息, 现在已收到最终的 ACK。
状态: 强制
Event 18: TcpConnectionFails (TCP 连接失败)
定义: 指示本地系统已收到 TCP 连接失败通知的事件。
远程 BGP 对等体的 TCP 机器可能已发送 FIN。本地对等体将使用 FIN-ACK 响应。另一种可能性是本地对等体指示 TCP 连接超时并关闭连接。
状态: 强制
8.1.5. BGP Message-Based Events (基于 BGP 消息的事件)
Event 19: BGPOpen (BGP OPEN 消息)
定义: 收到有效的 OPEN 消息时生成的事件。
状态: 强制
可选属性状态:
- DelayOpen 可选属性应设置为 FALSE。
- DelayOpenTimer 不应运行。
Event 20: BGPOpen with DelayOpenTimer running (DelayOpenTimer 运行时的 BGP OPEN)
定义: 为已成功建立传输连接且当前正在延迟发送 BGP OPEN 消息的对等体收到有效 OPEN 消息时生成的事件。
状态: 可选
可选属性状态:
- DelayOpen 属性应设置为 TRUE。
- DelayOpenTimer 应正在运行。
Event 21: BGPHeaderErr (BGP 头部错误)
定义: 收到的 BGP 消息头部无效时生成的事件。
状态: 强制
Event 22: BGPOpenMsgErr (BGP OPEN 消息错误)
定义: 收到带有错误的 OPEN 消息时生成的事件。
状态: 强制
Event 23: OpenCollisionDump (OPEN 冲突转储)
定义: 在处理传入的 OPEN 消息时检测到连接冲突并且此连接已被选择断开时以管理方式生成的事件。有关冲突检测的更多信息, 请参见 6.8 节。
Event 23 是由实现逻辑生成的管理操作, 该逻辑根据 6.8 节中的规则确定是否需要断开此连接。如果 FSM 作为两个链接的状态机实现, 则可能会发生此事件。
状态: 可选
可选属性状态: 如果状态机要在已建立状态下处理此事件,
- CollisionDetectEstablishedState 可选属性应设置为 TRUE。
请注意: OpenCollisionDump 事件可以在 Idle, Connect, Active, OpenSent 和 OpenConfirm 中发生, 而无需设置任何可选属性。
Event 24: NotifMsgVerErr (NOTIFICATION 消息版本错误)
定义: 收到带有 "版本错误" 的 NOTIFICATION 消息时生成的事件。
状态: 强制
Event 25: NotifMsg (NOTIFICATION 消息)
定义: 收到 NOTIFICATION 消息且错误代码不是 "版本错误" 时生成的事件。
状态: 强制
Event 26: KeepAliveMsg (KEEPALIVE 消息)
定义: 收到 KEEPALIVE 消息时生成的事件。
状态: 强制
Event 27: UpdateMsg (UPDATE 消息)
定义: 收到有效的 UPDATE 消息时生成的事件。
状态: 强制
Event 28: UpdateMsgErr (UPDATE 消息错误)
定义: 收到无效的 UPDATE 消息时生成的事件。
状态: 强制
8.2. Description of FSM (FSM 描述)
8.2.1. FSM Definition (FSM 定义)
BGP 必须为每个配置的对等体维护一个单独的 FSM。每个配对在潜在连接中的 BGP 对等体将尝试连接到另一个, 除非配置为保持空闲状态或配置为保持被动。出于本讨论的目的, TCP 连接的主动或连接方 (发送第一个 TCP SYN 数据包的 TCP 连接方) 称为出站连接。被动或监听方 (第一个 SYN/ACK 的发送者) 称为入站连接。(有关下面使用的术语 active 和 passive 的信息, 请参见 8.2.1.1 节。)
BGP 实现必须连接到 TCP 端口 179 并侦听 TCP 端口 179 以接收传入连接, 同时尝试连接到对等体。对于每个传入连接, 必须实例化一个状态机。存在一段时期, 在此期间已知传入连接另一端的对等体的身份, 但不知道 BGP 标识符。在此期间, 对于相同的配置对等, 可能同时存在传入和传出连接。这称为连接冲突 (参见 6.8 节)。
BGP 实现对于每个配置的对等最多有一个 FSM, 加上对于尚未识别对等体的每个传入 TCP 连接有一个 FSM。每个 FSM 恰好对应于一个 TCP 连接。
如果连接配置为使用不同的 IP 地址对, 则一对对等体之间可能有多个连接。这称为对同一对等体的多个 "配置对等"。
8.2.1.1. Terms "active" and "passive" ("主动" 和 "被动" 术语)
术语 active 和 passive 在互联网运营商的词汇表中已经存在了近十年, 并且已被证明是有用的。当应用于 TCP 连接或对等体时, 单词 active 和 passive 的含义略有不同。根据上述定义和下面的状态机, 任何一个 TCP 连接都只有一个 active 端和一个 passive 端。当 BGP 说话系统配置为 active 时, 它最终可能在最终建立的连接的 active 端或 passive 端。一旦 TCP 连接完成, 哪一端是 active 的和哪一端是 passive 的就无关紧要了。唯一的区别是 TCP 连接的哪一端具有端口号 179。
8.2.1.2. FSM and Collision Detection (FSM 与冲突检测)
每个 BGP 连接有一个 FSM。当连接冲突发生在确定连接与哪个对等体关联之前时, 一个对等体可能有两个连接。解决连接冲突后 (参见 6.8 节), 应处理关闭的连接的 FSM。
8.2.1.3. FSM and Optional Session Attributes (FSM 与可选会话属性)
可选会话属性指定作为标志 (TRUE 或 FALSE) 的属性或可选定时器。对于作为标志的可选属性, 如果可以在系统上将可选会话属性设置为 TRUE, 则必须支持相应的 BGP FSM 操作。例如, 如果可以在 BGP 实现中设置以下选项: AutoStart 和 PassiveTcpEstablishment, 则必须支持 Events 3, 4 和 5。如果无法将可选会话属性设置为 TRUE, 则不必支持支持该选项集的事件。
每个可选定时器 (DelayOpenTimer 和 IdleHoldTimer) 都有一组属性:
- 指示支持的标志,
- 在定时器中设置的时间
- 定时器。
两个可选定时器显示此格式:
- DelayOpenTimer: DelayOpen, DelayOpenTime, DelayOpenTimer
- IdleHoldTimer: DampPeerOscillations, IdleHoldTime, IdleHoldTimer
如果可以将可选定时器指示符标志 (DelayOpen, DampPeerOscillations) 设置为 TRUE, 则必须支持关联的 FSM 操作。如果可选定时器属性无法设置为 TRUE, 则不必支持支持该选项集的事件。
8.2.1.4. FSM Event Numbers (FSM 事件编号)
下表列出了 BGP FSM 事件编号 (Events 1-28), 这些编号在状态机、事件描述和事件表中被引用。
事件编号 事件名称
1 ManualStart
2 ManualStop
3 AutomaticStart
4 ManualStart_with_PassiveTcpEstablishment
5 AutomaticStart_with_PassiveTcpEstablishment
6 AutomaticStart_with_DampPeerOscillations
7 AutomaticStart_with_DampPeerOscillations_and_
PassiveTcpEstablishment
8 AutomaticStop
9 ConnectRetryTimer_Expires
10 HoldTimer_Expires
11 KeepaliveTimer_Expires
12 DelayOpenTimer_Expires
13 IdleHoldTimer_Expires
14 TcpConnection_Valid
15 Tcp_CR_Invalid
16 Tcp_CR_Acked
17 TcpConnectionConfirmed
18 TcpConnectionFails
19 BGPOpen
20 BGPOpen with DelayOpenTimer running
21 BGPHeaderErr
22 BGPOpenMsgErr
23 OpenCollisionDump
24 NotifMsgVerErr
25 NotifMsg
26 KeepAliveMsg
27 UpdateMsg
28 UpdateMsgErr
8.2.1.5. FSM Actions that are Implementation Dependent (依赖于实现的 FSM 操作)
某些 FSM 操作不直接影响 BGP 协议交换, 可能具有实现依赖性。示例可能是发送 BGP 消息, 在此期间需要记录消息。另一个示例可能是跟踪连接重试。
以下 FSM 操作在实现特定逻辑控制下执行:
- 初始化资源
- 释放资源
- 增加 ConnectRetryCounter
- 重置 ConnectRetryCounter
- 初始化所有 BGP 资源
- 解除分配所有 BGP 资源
实现应在此处添加任何实现特定的日志记录操作:
- 发送 BGP OPEN 消息
- 发送 BGP UPDATE 消息
- 发送 BGP NOTIFICATION 消息
- 发送 BGP KEEPALIVE 消息
- 处理 BGP OPEN 消息
- 处理 BGP UPDATE 消息
- 处理 BGP NOTIFICATION 消息
- 处理 BGP KEEPALIVE 消息
8.2.2. Finite State Machine (有限状态机)
BGP FSM 由六个状态组成:
- Idle (空闲)
- Connect (连接)
- Active (主动)
- OpenSent (已发送 OPEN)
- OpenConfirm (已确认 OPEN)
- Established (已建立)
BGP 对等体连接在 Idle 状态下启动。通常, 事件 1 (ManualStart) 或事件 3 (AutomaticStart) 将启动连接到远程对等体的尝试, 并导致到 Connect 状态的转换。在 Connect 状态下, BGP FSM 初始化 ConnectRetryTimer, 等待 TCP 连接完成, 并侦听来自对等体的连接。当 TCP 连接成功建立时, BGP FSM 发送 OPEN 消息并转换到 OpenSent 状态。收到 OPEN 消息后, BGP FSM 检查消息的正确性。如果存在错误, 则系统发送 NOTIFICATION 消息并转换回 Idle 状态。如果没有错误, BGP FSM 发送 KEEPALIVE 消息, 将 KeepaliveTimer 设置为其初始值, 并转换到 OpenConfirm 状态。在 OpenConfirm 状态下, BGP FSM 等待 KEEPALIVE 或 NOTIFICATION 消息。如果收到 KEEPALIVE 消息, 则 BGP FSM 转换到 Established 状态。在 Established 状态下, BGP FSM 可以发送/接收: UPDATE, NOTIFICATION 和 KEEPALIVE 消息到/从其对等体。
以下是 BGP FSM 的详细状态描述:
Idle 状态 (空闲状态):
在此状态下, BGP FSM 拒绝所有传入的 BGP 连接。在收到 Start 事件 (由操作员手动或由系统自动) 后, BGP FSM:
- 初始化所有 BGP 资源,
- 初始化 BGP 路由表,
- 将 ConnectRetryCounter 设置为零,
- 启动 ConnectRetryTimer 并将其设置为 ConnectRetryTime,
- 发起到远程对等体的 TCP 连接,
- 侦听来自远程对等体的连接, 并
- 转换到 Connect 状态。
Idle 状态下处理的具体事件在下面的完整状态转换表中提供。
Connect 状态 (连接状态):
在此状态下, BGP FSM 正在等待 TCP 连接完成。
启动事件 (Events 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 初始化
- 向其对等体发送 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 初始化,
- 停止并清除 DelayOpenTimer (将值设置为零),
- 发送 OPEN 消息,
- 发送 KEEPALIVE 消息,
- 如果 HoldTimer 初始值非零,
- 用初始值启动 KeepaliveTimer 并
- 将 HoldTimer 重置为协商值,
- 否则, 如果 HoldTimer 初始值为零,
- 重置 KeepaliveTimer 并
- 将 HoldTimer 值重置为零,
- 并转换其状态到 OpenConfirm。
如果自治系统字段的值与本地自治系统号相同, 则将连接状态设置为内部连接; 否则将是 "外部"。
如果 BGP 消息头部检查 (Event 21) 或 OPEN 消息检查检测到错误 (Event 22) (参见 6.2 节), 本地系统:
- (可选) 如果 SendNOTIFICATIONwithoutOPEN 属性设置为 TRUE, 则本地系统首先发送带有适当错误代码的 NOTIFICATION 消息, 然后
- 停止 ConnectRetryTimer (如果正在运行) 并将 ConnectRetryTimer 设置为零,
- 释放所有 BGP 资源,
- 丢弃 TCP 连接,
- 将 ConnectRetryCounter 递增 1,
- (可选) 如果 DampPeerOscillations 属性设置为 TRUE, 则执行对等体振荡抑制, 并
- 转换其状态到 Idle。
如果收到带有版本错误的 NOTIFICATION 消息 (Event 24), 本地系统检查 DelayOpenTimer。如果 DelayOpenTimer 正在运行, 本地系统:
- 停止 ConnectRetryTimer (如果正在运行) 并将 ConnectRetryTimer 设置为零,
- 停止并重置 DelayOpenTimer (设置为零),
- 释放所有 BGP 资源,
- 丢弃 TCP 连接, 并
- 转换其状态到 Idle。
如果 DelayOpenTimer 未运行, 本地系统:
- 停止 ConnectRetryTimer 并将 ConnectRetryTimer 设置为零,
- 释放所有 BGP 资源,
- 丢弃 TCP 连接,
- 将 ConnectRetryCounter 递增 1,
- 如果 DampPeerOscillations 属性设置为 True, 则执行对等体振荡抑制, 并
- 转换其状态到 Idle。
响应任何其他事件 (Events 8, 10-11, 13, 19, 23, 25-28), 本地系统:
- 如果 ConnectRetryTimer 正在运行, 停止并重置 ConnectRetryTimer (设置为零),
- 如果 DelayOpenTimer 正在运行, 停止并重置 DelayOpenTimer (设置为零),
- 释放所有 BGP 资源,
- 丢弃 TCP 连接,
- 将 ConnectRetryCounter 递增 1,
- 如果 DampPeerOscillations 属性设置为 True, 则执行对等体振荡抑制, 并
- 转换其状态到 Idle。
Active 状态 (主动状态):
在此状态下, BGP FSM 正在尝试通过侦听并接受 TCP 连接来获取对等体。
启动事件 (Events 1, 3-7) 在 Active 状态下被忽略。
响应 ManualStop 事件 (Event 2), 本地系统:
- 如果 DelayOpenTimer 正在运行且 SendNOTIFICATIONwithoutOPEN 会话属性已设置, 本地系统发送带有 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 初始化,
- 向其远程对等体发送 OPEN 消息,
- 将其保持定时器设置为大值, 并
- 转换其状态到 OpenSent。
对于此状态转换, 也建议 HoldTimer 值为 4 分钟。
如果本地系统收到 TcpConnection_Valid 事件 (Event 14), 本地系统处理 TCP 连接标志并保持在 Active 状态。
如果本地系统收到 Tcp_CR_Invalid 事件 (Event 15), 本地系统拒绝 TCP 连接并保持在 Active 状态。
响应 TCP 连接的成功 (Event 16 或 Event 17), 本地系统在处理之前检查 DelayOpen 可选属性。
如果 DelayOpen 属性设置为 TRUE, 本地系统:
- 停止 ConnectRetryTimer 并将 ConnectRetryTimer 设置为零,
- 将 DelayOpenTimer 设置为初始值 (DelayOpenTime), 并
- 保持在 Active 状态。
如果 DelayOpen 属性设置为 FALSE, 本地系统:
- 将 ConnectRetryTimer 设置为零,
- 完成 BGP 初始化,
- 向其对等体发送 OPEN 消息,
- 将其 HoldTimer 设置为大值, 并
- 转换其状态到 OpenSent。
建议将 HoldTimer 值 4 分钟作为 HoldTimer 的 "大值"。
如果本地系统收到 TcpConnectionFails 事件 (Event 18), 本地系统:
- 重新启动 ConnectRetryTimer (使用初始值),
- 停止并清除 DelayOpenTimer (将值设置为零),
- 释放所有 BGP 资源,
- 将 ConnectRetryCounter 递增 1,
- 可选地如果 DampPeerOscillations 属性设置为 TRUE, 则执行对等体振荡抑制, 并
- 转换其状态到 Idle。
如果收到 OPEN 消息且 DelayOpenTimer 正在运行 (Event 20), 本地系统:
- 停止 ConnectRetryTimer (如果正在运行) 并将 ConnectRetryTimer 设置为零,
- 停止并清除 DelayOpenTimer (设置为零),
- 完成 BGP 初始化,
- 发送 OPEN 消息,
- 发送 KEEPALIVE 消息,
- 如果 HoldTimer 值非零,
- 将 KeepaliveTimer 启动到初始值,
- 将 HoldTimer 重置为协商值,
- 否则如果 HoldTimer 为零
- 重置 KeepaliveTimer (设置为零),
- 将 HoldTimer 重置为零, 并
- 转换其状态到 OpenConfirm。
如果自治系统字段的值与本地自治系统号相同, 则将连接状态设置为内部连接; 否则将是外部连接。
如果 BGP 消息头部检查 (Event 21) 或 OPEN 消息检查检测到错误 (Event 22) (参见 6.2 节), 本地系统:
- (可选) 如果 SendNOTIFICATIONwithoutOPEN 属性设置为 TRUE, 则发送带有适当错误代码的 NOTIFICATION 消息,
- 将 ConnectRetryTimer 设置为零,
- 释放所有 BGP 资源,
- 丢弃 TCP 连接,
- 将 ConnectRetryCounter 递增 1,
- (可选) 如果 DampPeerOscillations 属性设置为 TRUE, 则执行对等体振荡抑制, 并
- 转换其状态到 Idle。
如果收到带有版本错误的 NOTIFICATION 消息 (Event 24), 本地系统检查 DelayOpenTimer。如果 DelayOpenTimer 正在运行, 本地系统:
- 停止 ConnectRetryTimer (如果正在运行) 并将 ConnectRetryTimer 设置为零,
- 停止并重置 DelayOpenTimer (设置为零),
- 释放所有 BGP 资源,
- 丢弃 TCP 连接, 并
- 转换其状态到 Idle。
如果 DelayOpenTimer 未运行, 本地系统:
- 将 ConnectRetryTimer 设置为零,
- 释放所有 BGP 资源,
- 丢弃 TCP 连接,
- 将 ConnectRetryCounter 递增 1,
- (可选) 如果 DampPeerOscillations 属性设置为 TRUE, 则执行对等体振荡抑制, 并
- 转换其状态到 Idle。
响应任何其他事件 (Events 8, 10-11, 13, 19, 23, 25-28), 本地系统:
- 将 ConnectRetryTimer 设置为零,
- 释放所有 BGP 资源,
- 丢弃 TCP 连接,
- 将 ConnectRetryCounter 递增 1,
- (可选) 执行对等体振荡抑制 (如果 DampPeerOscillations 属性设置为 TRUE), 并
- 转换其状态到 Idle。
OpenSent 状态 (已发送 OPEN 状态):
在此状态下, BGP FSM 等待来自其对等体的 OPEN 消息。当收到 OPEN 消息时, 将检查所有字段。如果有错误, 系统发送 NOTIFICATION 消息并转换到 Idle 状态。
启动事件 (Events 1, 3-7) 在 OpenSent 状态下被忽略。
响应 ManualStop 事件 (Event 2), 本地系统:
- 向远程对等体发送 NOTIFICATION 消息 (错误代码 Cease),
- 将 ConnectRetryTimer 设置为零,
- 释放所有 BGP 资源,
- 丢弃 TCP 连接,
- 将 ConnectRetryCounter 设置为零, 并
- 转换其状态到 Idle。
响应 AutomaticStop 事件 (Event 8), 本地系统:
- 向远程对等体发送 NOTIFICATION 消息 (错误代码 Cease),
- 将 ConnectRetryTimer 设置为零
- 释放所有 BGP 资源
- 丢弃 TCP 连接,
- 将 ConnectRetryCounter 递增 1,
- (可选) 执行对等体振荡抑制 (如果 DampPeerOscillations 属性设置为 TRUE), 并
- 转换其状态到 Idle。
响应 HoldTimer_Expires 事件 (Event 10), 本地系统:
- 向远程对等体发送 NOTIFICATION 消息 (错误代码 Hold Timer Expired),
- 将 ConnectRetryTimer 设置为零,
- 释放所有 BGP 资源,
- 丢弃 TCP 连接,
- 将 ConnectRetryCounter 递增 1,
- (可选) 执行对等体振荡抑制 (如果 DampPeerOscillations 属性设置为 TRUE), 并
- 转换其状态到 Idle。
响应 TcpConnection_Valid 事件 (Event 14), 如果收到的第二个 TCP 连接的本地和远程 IP 地址与现有连接不同, 则本地系统:
- 发送 NOTIFICATION (错误代码 Cease),
- 将 ConnectRetryTimer 设置为零,
- 释放 BGP 资源 (用于第二个连接),
- 丢弃第二个 TCP 连接 (保持第一个), 并
- 保持在 OpenSent 状态。
如果收到的第二个 TCP 连接的本地和远程 IP 地址与现有连接相同, 本地系统:
- 发送 NOTIFICATION (错误代码 Cease),
- 丢弃第二个 TCP 连接, 并
- 保持在 OpenSent 状态。
如果本地系统收到 Tcp_CR_Invalid 事件 (Event 15), 本地系统拒绝第二个 TCP 连接并保持在 OpenSent 状态。
如果收到有效的 OPEN 消息 (Event 19), 并且协商的保持时间值非零, 本地系统:
- 重新启动 HoldTimer 并将其设置为协商的保持时间值,
- 将 KeepaliveTimer 设置为协商的保持时间值除以 3,
- 如果 HoldTimer 值为零, 则本地系统:
- 重置 KeepaliveTimer (停止, 如果正在运行),
- 重置 HoldTimer 并将其设置为零,
- 发送 KEEPALIVE 消息, 并
- 转换其状态到 OpenConfirm。
如果收到的 OPEN 消息中的 AS 号与本地自治系统号匹配, 则将连接标记为 "内部" 连接; 否则标记为 "外部" 连接。
如果检测到 BGP 头部错误 (Event 21), 或者 OPEN 消息错误 (Event 22), 或者 NOTIFICATION 消息版本错误 (Event 24), 本地系统:
- 停止 ConnectRetryTimer 并将其设置为零,
- 向远程对等体发送 NOTIFICATION 消息,
- 释放所有 BGP 资源,
- 丢弃 TCP 连接,
- 将 ConnectRetryCounter 递增 1,
- (可选) 执行对等体振荡抑制 (如果 DampPeerOscillations 属性设置为 TRUE), 并
- 转换其状态到 Idle。
如果收到 NotifMsg (Event 25), 本地系统:
- 停止 ConnectRetryTimer 并将其设置为零,
- 释放所有 BGP 资源,
- 丢弃 TCP 连接,
- 将 ConnectRetryCounter 递增 1, 并
- 转换其状态到 Idle。
如果 TcpConnectionFails (Event 18), 或检测到 OpenCollisionDump (Event 23), 本地系统:
- 关闭 BGP 连接,
- 将 ConnectRetryTimer 设置为零,
- 释放所有 BGP 资源,
- 将 ConnectRetryCounter 递增 1,
- (可选) 执行对等体振荡抑制 (如果 DampPeerOscillations 属性设置为 TRUE), 并
- 转换其状态到 Idle。
OpenConfirm 状态 (已确认 OPEN 状态):
在此状态下, BGP 等待 KEEPALIVE 或 NOTIFICATION 消息。
启动事件 (Events 1, 3-7) 在 OpenConfirm 状态下被忽略。
响应 ManualStop 事件 (Event 2), 本地系统:
- 向对等体发送 NOTIFICATION 消息 (错误代码 Cease),
- 释放所有 BGP 资源,
- 丢弃 TCP 连接,
- 将 ConnectRetryTimer 设置为零,
- 将 ConnectRetryCounter 设置为零, 并
- 转换其状态到 Idle。
响应 AutomaticStop 事件 (Event 8), 本地系统:
- 向远程对等体发送 NOTIFICATION 消息 (错误代码 Cease),
- 将 ConnectRetryTimer 设置为零,
- 释放所有 BGP 资源,
- 丢弃 TCP 连接,
- 将 ConnectRetryCounter 递增 1,
- (可选) 执行对等体振荡抑制 (如果 DampPeerOscillations 属性设置为 TRUE), 并
- 转换其状态到 Idle。
响应 HoldTimer_Expires 事件 (Event 10), 本地系统:
- 向远程对等体发送 NOTIFICATION 消息 (错误代码 Hold Timer Expired),
- 将 ConnectRetryTimer 设置为零,
- 释放所有 BGP 资源,
- 丢弃 TCP 连接,
- 将 ConnectRetryCounter 递增 1,
- (可选) 执行对等体振荡抑制 (如果 DampPeerOscillations 属性设置为 TRUE), 并
- 转换其状态到 Idle。
响应 KeepaliveTimer_Expires 事件 (Event 11), 本地系统:
- 向其对等体发送 KEEPALIVE 消息,
- 如果 HoldTimer 值非零, 重新启动 KeepaliveTimer, 或者
- 如果 HoldTimer 值为零, 重置 KeepaliveTimer (停止定时器或将定时器设置为零), 并
- 保持在 OpenConfirm 状态。
响应 TcpConnection_Valid (Event 14), 如果本地系统接收到基于配对的对等体和本地 IP 地址的第二个有效 TCP 连接, 本地系统使用第二个 TCP 连接执行冲突解析算法:
- 如果第二个 TCP 连接被选中, 本地系统:
- 向远程对等体发送 NOTIFICATION (错误代码 Cease),
- 将 ConnectRetryTimer 设置为零,
- 释放第一个 TCP 连接的 BGP 资源,
- 丢弃第一个 TCP 连接,
- 将第二个 TCP 连接作为新的 BGP 连接,
- 初始化所有 BGP 资源,
- 发送 OPEN 消息,
- 将 HoldTimer 设置为大值, 并
- 转换其状态到 OpenSent。
- 如果第一个 TCP 连接被选中, 本地系统:
- 忽略第二个 TCP 连接, 并
- 保持在 OpenConfirm 状态。
如果本地系统收到 Tcp_CR_Invalid 事件 (Event 15), 本地系统拒绝第二个 TCP 连接并保持在 OpenConfirm 状态。
响应 KeepAliveMsg 事件 (Event 26), 本地系统:
- 如果 HoldTimer 值非零, 重新启动 HoldTimer, 或者
- 如果 HoldTimer 值为零, 保持当前的 HoldTimer 值,
- 转换其状态到 Established。
响应检测到 BGP 头部错误 (BGPHeaderErr, Event 21), OPEN 消息错误 (BGPOpenMsgErr, Event 22), 或 NOTIFICATION 消息版本错误 (NotifMsgVerErr, Event 24), 本地系统:
- 向远程对等体发送 NOTIFICATION 消息 (相应的错误代码),
- 将 ConnectRetryTimer 设置为零,
- 释放所有 BGP 资源,
- 丢弃 TCP 连接,
- 将 ConnectRetryCounter 递增 1,
- (可选) 执行对等体振荡抑制 (如果 DampPeerOscillations 属性设置为 TRUE), 并
- 转换其状态到 Idle。
响应 NotifMsg 事件 (Event 25), 本地系统:
- 将 ConnectRetryTimer 设置为零,
- 释放所有 BGP 资源,
- 丢弃 TCP 连接,
- 将 ConnectRetryCounter 递增 1, 并
- 转换其状态到 Idle。
响应 TcpConnectionFails (Event 18), OpenCollisionDump (Event 23), 或任何其他事件 (Events 9, 12-13, 19-20, 27-28), 本地系统:
- 向远程对等体发送 NOTIFICATION 消息 (错误代码 Finite State Machine Error),
- 将 ConnectRetryTimer 设置为零,
- 释放所有 BGP 资源,
- 丢弃 TCP 连接,
- 将 ConnectRetryCounter 递增 1,
- (可选) 执行对等体振荡抑制 (如果 DampPeerOscillations 属性设置为 TRUE), 并
- 转换其状态到 Idle。
Established 状态 (已建立状态):
在 Established 状态下, BGP FSM 可以与其对等体交换 UPDATE, NOTIFICATION 和 KEEPALIVE 消息。
启动事件 (Events 1, 3-7) 在 Established 状态下被忽略。
响应 ManualStop 事件 (Event 2), 本地系统:
- 向远程对等体发送 NOTIFICATION 消息 (错误代码 Cease),
- 将 ConnectRetryTimer 设置为零,
- 删除所有通过此连接通告的路由,
- 释放所有 BGP 资源,
- 丢弃 TCP 连接,
- 将 ConnectRetryCounter 设置为零, 并
- 转换其状态到 Idle。
响应 AutomaticStop 事件 (Event 8), 本地系统:
- 向远程对等体发送 NOTIFICATION 消息 (错误代码 Cease),
- 将 ConnectRetryTimer 设置为零
- 删除所有通过此连接通告的路由,
- 释放所有 BGP 资源,
- 丢弃 TCP 连接,
- 将 ConnectRetryCounter 递增 1,
- (可选) 执行对等体振荡抑制 (如果 DampPeerOscillations 属性设置为 TRUE), 并
- 转换其状态到 Idle。
响应 HoldTimer_Expires 事件 (Event 10), 本地系统:
- 向远程对等体发送 NOTIFICATION 消息 (错误代码 Hold Timer Expired),
- 将 ConnectRetryTimer 设置为零,
- 释放所有 BGP 资源,
- 丢弃 TCP 连接,
- 将 ConnectRetryCounter 递增 1,
- (可选) 执行对等体振荡抑制 (如果 DampPeerOscillations 属性设置为 TRUE), 并
- 转换其状态到 Idle。
响应 KeepaliveTimer_Expires 事件 (Event 11), 本地系统:
- 向其对等体发送 KEEPALIVE 消息, 并
- 如果 HoldTimer 值非零, 重新启动 KeepaliveTimer, 或者
- 如果 HoldTimer 值为零, 重置 KeepaliveTimer, 并
- 保持在 Established 状态。
响应 TcpConnection_Valid (Event 14), 第二个 TCP 连接可能会被处理。如果此连接允许, 则将根据 6.8 节中的描述处理连接。
如果收到第二个 TCP 连接 (Event 14) 且此连接被选择 (见 6.8 节), 本地系统:
- 向远程对等体发送 NOTIFICATION (错误代码 Cease),
- 将 ConnectRetryTimer 设置为零,
- 删除所有通过此连接通告的路由,
- 释放第一个连接的所有 BGP 资源,
- 丢弃第一个 TCP 连接,
- 将第二个 TCP 连接作为新的 BGP 连接,
- 初始化所有 BGP 资源,
- 发送 OPEN 消息,
- 将 HoldTimer 设置为大值, 并
- 转换其状态到 OpenSent。
请注意, 不应将收到第二个有效连接视为本地系统错误, 并且 ConnectRetryCounter 不应递增。
如果第二个 TCP 连接未被选择 (参见 6.8 节), 本地系统:
- 忽略第二个 TCP 连接, 并
- 保持在 Established 状态。
如果本地系统收到 Tcp_CR_Invalid 事件 (Event 15), 本地系统拒绝第二个 TCP 连接并保持在 Established 状态。
响应 UpdateMsg 事件 (Event 27), 本地系统:
- 处理 UPDATE 消息,
- 如果 HoldTimer 值非零, 重新启动 HoldTimer, 或者
- 如果 HoldTimer 值为零, 保持当前的 HoldTimer 值, 并
- 保持在 Established 状态。
响应 KeepAliveMsg 事件 (Event 26), 本地系统:
- 如果 HoldTimer 值非零, 重新启动 HoldTimer, 或者
- 如果 HoldTimer 值为零, 保持当前的 HoldTimer 值, 并
- 保持在 Established 状态。
响应检测到 UpdateMsgErr (Event 28), 本地系统:
- 向远程对等体发送 NOTIFICATION 消息 (Update error),
- 将 ConnectRetryTimer 设置为零,
- 删除所有通过此连接通告的路由,
- 释放所有 BGP 资源,
- 丢弃 TCP 连接,
- 将 ConnectRetryCounter 递增 1,
- (可选) 执行对等体振荡抑制 (如果 DampPeerOscillations 属性设置为 TRUE), 并
- 转换其状态到 Idle。
响应检测到 BGP 头部错误 (BGPHeaderErr, Event 21), OPEN 消息错误 (BGPOpenMsgErr, Event 22), NOTIFICATION 消息版本错误 (NotifMsgVerErr, Event 24), 本地系统:
- 向远程对等体发送 NOTIFICATION 消息 (相应的错误代码),
- 将 ConnectRetryTimer 设置为零,
- 删除所有通过此连接通告的路由,
- 释放所有 BGP 资源,
- 丢弃 TCP 连接,
- 将 ConnectRetryCounter 递增 1,
- (可选) 执行对等体振荡抑制 (如果 DampPeerOscillations 属性设置为 TRUE), 并
- 转换其状态到 Idle。
响应 NotifMsg (Event 25), 本地系统:
- 将 ConnectRetryTimer 设置为零,
- 删除所有通过此连接通告的路由,
- 释放所有 BGP 资源,
- 丢弃 TCP 连接,
- 将 ConnectRetryCounter 递增 1, 并
- 转换其状态到 Idle。
响应 TcpConnectionFails 事件 (Event 18), 本地系统:
- 将 ConnectRetryTimer 设置为零,
- 删除所有通过此连接通告的路由,
- 释放所有 BGP 资源,
- 丢弃 TCP 连接,
- 将 ConnectRetryCounter 递增 1,
- 转换其状态到 Idle。
响应 OpenCollisionDump 事件 (Event 23), 如果 CollisionDetectEstablishedState 可选会话属性设置为 TRUE, 本地系统:
- 向远程对等体发送 NOTIFICATION (错误代码 Cease),
- 将 ConnectRetryTimer 设置为零,
- 删除所有通过此连接通告的路由,
- 释放所有 BGP 资源,
- 丢弃 TCP 连接 (第一个),
- 接受第二个 TCP 连接,
- 初始化所有 BGP 资源,
- 发送 OPEN 消息,
- 将 HoldTimer 设置为大值, 并
- 转换其状态到 OpenSent。
如果 CollisionDetectEstablishedState 可选会话属性设置为 FALSE, 则忽略 Event 23。
响应任何其他事件 (Events 9, 12-13, 19-20), 本地系统:
- 向远程对等体发送 NOTIFICATION 消息 (错误代码 Finite State Machine Error),
- 删除所有通过此连接通告的路由,
- 将 ConnectRetryTimer 设置为零,
- 释放所有 BGP 资源,
- 丢弃 TCP 连接,
- 将 ConnectRetryCounter 递增 1,
- (可选) 执行对等体振荡抑制 (如果 DampPeerOscillations 属性设置为 TRUE), 并
- 转换其状态到 Idle。