Skip to main content

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

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

本节描述在处理 BGP 消息时检测到错误时要采取的操作。

当检测到此处描述的任何条件时, 将发送带有指示的错误代码、错误子代码和数据字段的 NOTIFICATION 消息, 并关闭 BGP 连接 (除非明确说明不发送 NOTIFICATION 消息并且不关闭 BGP 连接)。如果未指定错误子代码, 则必须使用零。

短语"BGP 连接已关闭"表示 TCP 连接已关闭, 关联的 Adj-RIB-In 已清除, 并且该 BGP 连接的所有资源已释放。Loc-RIB 中与远程对等体关联的条目被标记为无效。本地系统重新计算被标记为无效的路由的目标的最佳路由。在从系统中删除无效路由之前, 它向其对等体通告被标记为无效的路由的撤回, 或在从系统中删除无效路由之前通告新的最佳路由。

除非明确指定, 否则发送以指示错误的 NOTIFICATION 消息的 Data 字段为空。

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

在处理消息头时检测到的所有错误都必须通过发送错误代码为 Message Header Error 的 NOTIFICATION 消息来指示。错误子代码详细说明了错误的具体性质。

消息头的 Marker 字段的预期值为全 1。如果消息头的 Marker 字段不符合预期, 则发生了同步错误, 错误子代码必须设置为 Connection Not Synchronized。

如果以下至少一项为真:

  • 如果消息头的 Length 字段小于 19 或大于 4096, 或

  • 如果 OPEN 消息的 Length 字段小于 OPEN 消息的最小长度, 或

  • 如果 UPDATE 消息的 Length 字段小于 UPDATE 消息的最小长度, 或

  • 如果 KEEPALIVE 消息的 Length 字段不等于 19, 或

  • 如果 NOTIFICATION 消息的 Length 字段小于 NOTIFICATION 消息的最小长度,

则错误子代码必须设置为 Bad Message Length。Data 字段必须包含错误的 Length 字段。

如果消息头的 Type 字段无法识别, 则错误子代码必须设置为 Bad Message Type。Data 字段必须包含错误的 Type 字段。

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

在处理 OPEN 消息时检测到的所有错误都必须通过发送错误代码为 OPEN Message Error 的 NOTIFICATION 消息来指示。错误子代码详细说明了错误的具体性质。

如果接收到的 OPEN 消息的 Version 字段中的版本号不受支持, 则错误子代码必须设置为 Unsupported Version Number。Data 字段是一个 2 字节无符号整数, 指示小于远程 BGP 对等体出价的版本 (如接收到的 OPEN 消息中所指示) 的最大本地支持版本号, 或者如果最小的本地支持版本号大于远程 BGP 对等体出价的版本, 则为最小的本地支持版本号。

如果 OPEN 消息的 Autonomous System 字段不可接受, 则错误子代码必须设置为 Bad Peer AS。可接受的自治系统编号的确定不在本协议范围内。

如果 OPEN 消息的 Hold Time 字段不可接受, 则错误子代码必须设置为 Unacceptable Hold Time。实现必须拒绝一秒或两秒的 Hold Time 值。实现可以拒绝任何建议的 Hold Time。接受 Hold Time 的实现必须使用协商的值作为 Hold Time。

如果 OPEN 消息的 BGP Identifier 字段在语法上不正确, 则错误子代码必须设置为 Bad BGP Identifier。语法正确性意味着 BGP Identifier 字段表示有效的单播 IP 主机地址。

如果 OPEN 消息中的一个可选参数无法识别, 则错误子代码必须设置为 Unsupported Optional Parameters。

如果 OPEN 消息中的一个可选参数被识别但格式不正确, 则错误子代码必须设置为 0 (Unspecific)。

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

在处理 UPDATE 消息时检测到的所有错误都必须通过发送错误代码为 UPDATE Message Error 的 NOTIFICATION 消息来指示。错误子代码详细说明了错误的具体性质。

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

如果任何已识别的属性具有与 Attribute Type Code 冲突的 Attribute Flags, 则错误子代码必须设置为 Attribute Flags Error。Data 字段必须包含错误的属性 (类型、长度和值)。

如果任何已识别的属性具有与预期长度 (基于属性类型代码) 冲突的 Attribute Length, 则错误子代码必须设置为 Attribute Length Error。Data 字段必须包含错误的属性 (类型、长度和值)。

如果任何众所周知的强制属性不存在, 则错误子代码必须设置为 Missing Well-known Attribute。Data 字段必须包含缺失的众所周知属性的 Attribute Type Code。

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

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

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

NEXT_HOP 中的 IP 地址必须满足以下标准才能被认为在语义上是正确的:

a) 它不得是接收发言者的 IP 地址。

b) 在 EBGP 的情况下, 其中发送者和接收者彼此相距一个 IP 跳, NEXT_HOP 中的 IP 地址必须是用于建立 BGP 连接的发送者的 IP 地址, 或者与 NEXT_HOP IP 地址关联的接口必须与接收 BGP 发言者共享公共子网。

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

检查 AS_PATH 属性的语法正确性。如果路径在语法上不正确, 则错误子代码必须设置为 Malformed AS_PATH。

如果从外部对等体接收 UPDATE 消息, 则本地系统可以检查 AS_PATH 属性中最左边的 AS (相对于协议消息中字节的位置) 是否等于发送消息的对等体的自治系统编号。如果检查确定情况并非如此, 则错误子代码必须设置为 Malformed AS_PATH。

如果识别了可选属性, 则必须检查此属性的值。如果检测到错误, 则必须丢弃该属性, 并且错误子代码必须设置为 Optional Attribute Error。Data 字段必须包含该属性 (类型、长度和值)。

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

检查 UPDATE 消息中 NLRI 字段的语法有效性。如果字段在语法上不正确, 则错误子代码必须设置为 Invalid Network Field。

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

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

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

如果对等体发送 NOTIFICATION 消息, 并且消息的接收者在该消息中检测到错误, 则接收者无法使用 NOTIFICATION 消息将此错误报告回对等体。任何此类错误 (例如, 无法识别的错误代码或错误子代码) 都应该被注意到, 在本地记录, 并引起对等体管理的注意。然而, 这样做的方法不在本文档范围内。

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 Error 的 NOTIFICATION 消息来指示。

6.7. Cease (终止)

在不存在任何致命错误 (在本节中指示) 的情况下, BGP 对等体可以在任何给定时间选择通过发送错误代码为 Cease 的 NOTIFICATION 消息来关闭其 BGP 连接。但是, 当本节指示的致命错误确实存在时, 不得使用 Cease NOTIFICATION 消息。

BGP 发言者可以支持对发言者愿意从邻居接受的地址前缀数量施加本地配置的上限的能力。当达到上限时, 发言者在本地配置的控制下, 要么 (a) 丢弃来自邻居的新地址前缀 (同时与邻居保持 BGP 连接), 要么 (b) 终止与邻居的 BGP 连接。如果 BGP 发言者决定终止与邻居的 BGP 连接, 因为从邻居接收的地址前缀数量超过了本地配置的上限, 则发言者必须向邻居发送错误代码为 Cease 的 NOTIFICATION 消息。发言者也可以在本地记录此情况。

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

如果一对 BGP 发言者试图同时彼此建立 BGP 连接, 则将形成两个并行连接。如果其中一个连接使用的源 IP 地址与另一个连接使用的目标 IP 地址相同, 并且第一个连接使用的目标 IP 地址与另一个连接使用的源 IP 地址相同, 则发生了连接冲突。在连接冲突的情况下, 必须关闭其中一个连接。

基于 BGP 标识符的值, 建立了一个约定来检测当发生冲突时要保留哪个 BGP 连接。约定是比较冲突中涉及的对等体的 BGP 标识符, 并仅保留由具有较高值的 BGP 标识符的 BGP 发言者发起的连接。

在接收到 OPEN 消息后, 本地系统必须检查其所有处于 OpenConfirm 状态的连接。如果 BGP 发言者通过协议外的方式知道对等体的 BGP 标识符, 则它也可以检查处于 OpenSent 状态的连接。如果在这些连接中, 存在到远程 BGP 发言者的连接, 其 BGP 标识符等于 OPEN 消息中的标识符, 并且此连接与接收 OPEN 消息的连接冲突, 则本地系统执行以下冲突解决程序:

  1. 将本地系统的 BGP 标识符与远程系统的 BGP 标识符 (如 OPEN 消息中指定) 进行比较。比较 BGP 标识符是通过将它们转换为主机字节序并将它们视为 4 字节无符号整数来完成的。

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

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

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

请注意, 无法通过处于 Idle, Connect 或 Active 状态的连接检测连接冲突。

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