跳到主要内容

6. BGP 错误处理

6. BGP 错误处理 (BGP Error Handling)​

本节描述在处理 BGP 消息时检测到错误后必须采取的操作.

当检测到此处描述的任一条件时, 会发送带有所指示错误代码 (Error Code)、错误子码 (Error Subcode) 和数据 (Data) 字段的 NOTIFICATION 消息, 并关闭 BGP 连接 (除非明确说明不得发送 NOTIFICATION 消息且不得关闭 BGP 连接). 如果未指定错误子码, 则 MUST 使用零.

短语 "the BGP connection is closed" 表示 TCP 连接已关闭, 关联的 Adj-RIB-In 已清空, 且该 BGP 连接的所有资源 (resource) 都已释放. Loc-RIB 中与远端对等体 (remote peer) 关联的条目被标记为无效 (invalid). 本地系统 (local system) 会为被标记为无效的路由的目的地重新计算其最佳路由 (best route). 在从系统中删除无效路由之前, 它会向其对等体通告对这些无效路由的撤销 (withdraw), 或者通告新的最佳路由.

除非明确指定, 为指示错误而发送的 NOTIFICATION 消息的数据字段为空.

6.1. 消息头错误处理 (Message Header Error Handling)​

处理消息头 (Message Header) 时检测到的所有错误 MUST 通过发送错误代码为 Message Header Error 的 NOTIFICATION 消息来指示. 错误子码会进一步说明错误的具体性质.

消息头的 Marker 字段的期望值为全 1. 如果消息头的 Marker 字段不符合预期, 则发生了同步错误 (synchronization error), 错误子码 MUST 设置为 Connection Not Synchronized.

如果以下至少一项为真:

  • 消息头的 Length 字段小于 19 或大于 4096, 或
  • OPEN 消息的 Length 字段小于 OPEN 消息的最小长度, 或
  • UPDATE 消息的 Length 字段小于 UPDATE 消息的最小长度, 或
  • KEEPALIVE 消息的 Length 字段不等于 19, 或
  • NOTIFICATION 消息的 Length 字段小于 NOTIFICATION 消息的最小长度,

则错误子码 MUST 设置为 Bad Message Length. 数据字段 MUST 包含错误的 Length 字段.

如果消息头的 Type 字段无法识别, 则错误子码 MUST 设置为 Bad Message Type. 数据字段 MUST 包含错误的 Type 字段.

6.2. OPEN 消息错误处理 (OPEN Message Error Handling)​

处理 OPEN 消息时检测到的所有错误 MUST 通过发送错误代码为 OPEN Message Error 的 NOTIFICATION 消息来指示. 错误子码会进一步说明错误的具体性质.

如果收到的 OPEN 消息中 Version 字段的版本号 (version number) 不受支持, 则错误子码 MUST 设置为 Unsupported Version Number. 数据字段是一个 2 字节无符号整数 (2-octet unsigned integer), 指示小于远端 BGP 对等体所出价版本 (如收到的 OPEN 消息中所示) 的最大本地支持版本号; 或者, 如果最小的本地支持版本号大于远端 BGP 对等体所出价的版本, 则指示这个最小的本地支持版本号.

如果 OPEN 消息的 Autonomous System 字段不可接受, 则错误子码 MUST 设置为 Bad Peer AS. 可接受自治系统编号的判定不在本协议 (protocol) 的范围内.

如果 OPEN 消息的 Hold Time 字段不可接受, 则错误子码 MUST 设置为 Unacceptable Hold Time. 实现 (implementation) MUST 拒绝一秒或两秒的保持时间值. 实现 MAY 拒绝任何提议的保持时间. 接受某个保持时间的实现 MUST 使用协商出的保持时间值.

如果 OPEN 消息的 BGP Identifier 字段在语法上不正确, 则错误子码 MUST 设置为 Bad BGP Identifier. 语法正确性意味着 BGP Identifier 字段表示一个有效的单播 IP 主机地址 (unicast IP host address).

如果 OPEN 消息中的某个可选参数 (Optional Parameter) 无法识别, 则错误子码 MUST 设置为 Unsupported Optional Parameters.

如果 OPEN 消息中的某个可选参数可以识别但格式错误 (malformed), 则错误子码 MUST 设置为 0 (Unspecific).

6.3. UPDATE 消息错误处理 (UPDATE Message Error Handling)​

处理 UPDATE 消息时检测到的所有错误 MUST 通过发送错误代码为 UPDATE Message Error 的 NOTIFICATION 消息来指示. 错误子码会进一步说明错误的具体性质.

对 UPDATE 消息的错误检查从检查路径属性 (path attribute) 开始. 如果 Withdrawn Routes Length 或 Total Attribute Length 过大 (即 Withdrawn Routes Length + Total Attribute Length + 23 超过消息 Length), 则错误子码 MUST 设置为 Malformed Attribute List.

如果任何已识别属性的 Attribute Flags 与 Attribute Type Code 冲突, 则错误子码 MUST 设置为 Attribute Flags Error. 数据字段 MUST 包含错误的属性 (类型、长度和值).

如果任何已识别属性的 Attribute Length 与期望长度 (基于属性类型代码) 冲突, 则错误子码 MUST 设置为 Attribute Length Error. 数据字段 MUST 包含错误的属性 (类型、长度和值).

如果任何众所周知的强制属性 (well-known mandatory attribute) 不存在, 则错误子码 MUST 设置为 Missing Well-known Attribute. 数据字段 MUST 包含缺失的众所周知属性的 Attribute Type Code.

如果任何众所周知的强制属性无法识别, 则错误子码 MUST 设置为 Unrecognized Well-known Attribute. 数据字段 MUST 包含无法识别的属性 (类型、长度和值).

如果 ORIGIN 属性具有未定义的值, 则错误子码 MUST 设置为 Invalid Origin Attribute. 数据字段 MUST 包含无法识别的属性 (类型、长度和值).

如果 NEXT_HOP 属性字段在语法上不正确, 则错误子码 MUST 设置为 Invalid NEXT_HOP Attribute. 数据字段 MUST 包含不正确的属性 (类型、长度和值). 语法正确性意味着 NEXT_HOP 属性表示一个有效的 IP 主机地址.

NEXT_HOP 中的 IP 地址 MUST 满足以下条件, 才能被视为语义上正确:

a) 它 MUST NOT 是接收系统 (receiving speaker) 的 IP 地址.

b) 对于发送方 (sender) 和接收方 (receiver) 彼此相距一个 IP 跳 (IP hop) 的 EBGP 情况, NEXT_HOP 中的 IP 地址 MUST 是发送方用于建立 BGP 连接的 IP 地址, 或者与 NEXT_HOP IP 地址关联的接口 (interface) MUST 与接收 BGP 系统共享一个公共子网 (common subnet).

如果 NEXT_HOP 属性在语义上不正确, 则错误 SHOULD 被记录, 路由 SHOULD 被忽略. 在这种情况下, SHOULD NOT 发送 NOTIFICATION 消息, 并且 SHOULD NOT 关闭连接.

AS_PATH 属性会被检查语法正确性. 如果路径在语法上不正确, 则错误子码 MUST 设置为 Malformed AS_PATH.

如果 UPDATE 消息是从外部对等体 (external peer) 收到的, 本地系统 MAY 检查 AS_PATH 属性中最左侧 (相对于协议消息中八位组的位序) 的 AS 是否等于发送该消息的对等体的自治系统编号. 如果检查确定并非如此, 则错误子码 MUST 设置为 Malformed AS_PATH.

如果某个可选属性 (optional attribute) 被识别, 则 MUST 检查该属性的值. 如果检测到错误, 则 MUST 丢弃该属性, 并且错误子码 MUST 设置为 Optional Attribute Error. 数据字段 MUST 包含该属性 (类型、长度和值).

如果任何属性在 UPDATE 消息中出现多次, 则错误子码 MUST 设置为 Malformed Attribute List.

UPDATE 消息中的 NLRI 字段会被检查语法有效性. 如果该字段在语法上不正确, 则错误子码 MUST 设置为 Invalid Network Field.

如果 NLRI 字段中的某个前缀在语义上不正确 (例如, 意外的组播 IP 地址), 则 SHOULD 在本地记录错误, 并且 SHOULD 忽略该前缀.

包含正确路径属性但没有 NLRI 的 UPDATE 消息 SHALL 被视为有效的 UPDATE 消息.

6.4. NOTIFICATION 消息错误处理 (NOTIFICATION Message Error Handling)​

如果某个对等体发送 NOTIFICATION 消息, 并且该消息的接收方检测到该消息中存在错误, 则接收方无法使用 NOTIFICATION 消息向该对等体报告此错误. 任何此类错误 (例如, 无法识别的错误代码或错误子码) SHOULD 被注意到并在本地记录, 并提请该对等体的管理机构注意. 然而, 实现这一目的的手段不在本文档的范围内.

6.5. 保持定时器超时错误处理 (Hold Timer Expired Error Handling)​

如果某个系统在 OPEN 消息的 Hold Time 字段规定的周期内没有收到连续的 KEEPALIVE、UPDATE 和/或 NOTIFICATION 消息, 则会发送错误代码为 Hold Timer Expired 的 NOTIFICATION 消息, 并关闭 BGP 连接.

6.6. 有限状态机错误处理 (Finite State Machine Error Handling)​

BGP 有限状态机 (Finite State Machine, FSM) 检测到的任何错误 (例如, 收到意外事件) 都会通过发送错误代码为 Finite State Machine Error 的 NOTIFICATION 消息来指示.

6.7. 终止 (Cease)​

在没有本节所指出的任何致命错误 (fatal error) 的情况下, BGP 对等体 MAY 在任何给定时间选择通过发送错误代码为 Cease 的 NOTIFICATION 消息来关闭其 BGP 连接. 然而, 当本节所指出的致命错误确实存在时, MUST NOT 使用 Cease NOTIFICATION 消息.

BGP 系统 MAY 支持对系统愿意从邻居接受的地址前缀数量施加本地配置的上限. 当达到上限时, 系统在本地配置的控制下, 要么 (a) 丢弃来自邻居的新地址前缀 (同时保持与该邻居的 BGP 连接), 要么 (b) 终止与该邻居的 BGP 连接. 如果 BGP 系统因为从邻居收到的地址前缀数量超过本地配置的上限而决定终止与该邻居的 BGP 连接, 则系统 MUST 向该邻居发送错误代码为 Cease 的 NOTIFICATION 消息. 系统 MAY 也在本地记录此事件.

6.8. BGP 连接冲突检测 (BGP Connection Collision Detection)​

如果一对 BGP 系统试图同时相互建立 BGP 连接, 则会形成两条并行连接. 如果这两条连接之一使用的源 IP 地址与另一条使用的目的 IP 地址相同, 并且第一条连接使用的目的 IP 地址与另一条使用的源 IP 地址相同, 则发生了连接冲突 (connection collision). 在发生连接冲突的情况下, MUST 关闭其中一条连接.

基于 BGP 标识符的值, 建立了一种约定, 用于检测发生冲突时应保留哪条 BGP 连接. 该约定是比较参与冲突的对等体的 BGP 标识符, 并且只保留由 BGP 标识符值较大的 BGP 系统发起的连接.

收到 OPEN 消息后, 本地系统 MUST 检查其所有处于 OpenConfirm 状态 (state) 的连接. BGP 系统 MAY 也检查处于 OpenSent 状态的连接, 前提是它通过协议之外的手段知道对等体的 BGP 标识符. 如果这些连接中存在一条到某个远端 BGP 系统的连接, 该远端 BGP 系统的 BGP 标识符等于 OPEN 消息中的标识符, 并且这条连接与接收该 OPEN 消息的连接发生冲突, 则本地系统执行以下冲突解决过程 (collision resolution procedure):

  1. 将本地系统的 BGP 标识符与远端系统的 BGP 标识符 (如 OPEN 消息中所指定) 进行比较. 比较 BGP 标识符时, 将它们转换为主机字节序 (host byte order), 并视为 4 字节无符号整数.

  2. 如果本地 BGP 标识符的值小于远端 BGP 标识符的值, 则本地系统关闭已经存在的 BGP 连接 (即已经处于 OpenConfirm 状态的那条), 并接受由远端系统发起的 BGP 连接.

  3. 否则, 本地系统关闭新创建的 BGP 连接 (与刚收到的 OPEN 消息关联的那条), 并继续使用现有的连接 (即已经处于 OpenConfirm 状态的那条).

除非通过配置允许, 与处于 Established 状态的现有 BGP 连接的连接冲突会导致关闭新创建的连接.

注意, 无法检测与处于 Idle、Connect 或 Active 状态的连接的连接冲突.

关闭 BGP 连接 (因冲突解决过程而产生的那条) 是通过发送错误代码为 Cease 的 NOTIFICATION 消息来完成的.