跳到主要内容

6. BGP 错误处理

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

本节描述在处理 BGP message 时检测到 error 后必须采取的 action.

当检测到此处描述的任一 condition 时, 会发送带有所指示 Error Code, Error Subcode 和 Data field 的 NOTIFICATION message, 并关闭 BGP connection (除非明确说明不得发送 NOTIFICATION message 且不得关闭 BGP connection). 如果未指定 Error Subcode, 则 MUST 使用零.

短语 "the BGP connection is closed" 表示 TCP connection 已关闭, 关联的 Adj-RIB-In 已清空, 且该 BGP connection 的所有 resource 都已释放. Loc-RIB 中与 remote peer 关联的 entry 被标记为 invalid. local system 会为被标记为 invalid 的 route 的 destination 重新计算 best route. 在从系统中删除 invalid route 之前, 它会向 peer 通告对这些 invalid route 的 withdraw, 或者通告新的 best route.

除非明确指定, 为指示 error 而发送的 NOTIFICATION message 的 Data field 为空.

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

处理 Message Header 时检测到的所有 error MUST 通过发送 Error Code 为 Message Header Error 的 NOTIFICATION message 来指示. Error Subcode 会进一步说明 error 的具体性质.

message header 的 Marker field 的期望值为全 1. 如果 message header 的 Marker field 不符合预期, 则发生了 synchronization error, Error Subcode MUST 设置为 Connection Not Synchronized.

如果以下至少一项为真:

  • message header 的 Length field 小于 19 或大于 4096, 或
  • OPEN message 的 Length field 小于 OPEN message 的最小长度, 或
  • UPDATE message 的 Length field 小于 UPDATE message 的最小长度, 或
  • KEEPALIVE message 的 Length field 不等于 19, 或
  • NOTIFICATION message 的 Length field 小于 NOTIFICATION message 的最小长度,

则 Error Subcode MUST 设置为 Bad Message Length. Data field MUST 包含错误的 Length field.

如果 message header 的 Type field 无法识别, 则 Error Subcode MUST 设置为 Bad Message Type. Data field MUST 包含错误的 Type field.

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

处理 OPEN message 时检测到的所有 error MUST 通过发送 Error Code 为 OPEN Message Error 的 NOTIFICATION message 来指示. Error Subcode 会进一步说明 error 的具体性质.

如果收到的 OPEN message 中 Version field 的 version number 不受支持, 则 Error Subcode MUST 设置为 Unsupported Version Number. Data field 是一个 2-octet unsigned integer, 指示小于 remote BGP peer 所出价 version (如收到的 OPEN message 中所示) 的最大本地支持 version number; 或者如果最小的本地支持 version number 大于 remote BGP peer 所出价 version, 则指示这个最小的本地支持 version number.

如果 OPEN message 的 Autonomous System field 不可接受, 则 Error Subcode MUST 设置为 Bad Peer AS. 可接受 Autonomous System number 的判定不在本 protocol 的范围内.

如果 OPEN message 的 Hold Time field 不可接受, 则 Error Subcode MUST 设置为 Unacceptable Hold Time. implementation MUST 拒绝一秒或两秒的 Hold Time value. implementation MAY 拒绝任何提议的 Hold Time. 接受某个 Hold Time 的 implementation MUST 使用协商出的 Hold Time 值.

如果 OPEN message 的 BGP Identifier field 在语法上不正确, 则 Error Subcode MUST 设置为 Bad BGP Identifier. 语法正确性意味着 BGP Identifier field 表示一个有效的 unicast IP host address.

如果 OPEN message 中的某个 Optional Parameter 无法识别, 则 Error Subcode MUST 设置为 Unsupported Optional Parameters.

如果 OPEN message 中的某个 Optional Parameter 可以识别但格式错误, 则 Error Subcode MUST 设置为 0 (Unspecific).

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

处理 UPDATE message 时检测到的所有 error MUST 通过发送 Error Code 为 UPDATE Message Error 的 NOTIFICATION message 来指示. Error Subcode 会进一步说明 error 的具体性质.

UPDATE message 的 error checking 从检查 path attribute 开始. 如果 Withdrawn Routes Length 或 Total Attribute Length 过大 (即 Withdrawn Routes Length + Total Attribute Length + 23 超过 message Length), 则 Error Subcode MUST 设置为 Malformed Attribute List.

如果任何已识别 attribute 的 Attribute Flags 与 Attribute Type Code 冲突, 则 Error Subcode MUST 设置为 Attribute Flags Error. Data field MUST 包含错误的 attribute (type, length 和 value).

如果任何已识别 attribute 的 Attribute Length 与期望长度 (基于 attribute type code) 冲突, 则 Error Subcode MUST 设置为 Attribute Length Error. Data field MUST 包含错误的 attribute (type, length 和 value).

如果任何 well-known mandatory attribute 不存在, 则 Error Subcode MUST 设置为 Missing Well-known Attribute. Data field MUST 包含缺失的 well-known attribute 的 Attribute Type Code.

如果任何 well-known mandatory attribute 无法识别, 则 Error Subcode MUST 设置为 Unrecognized Well-known Attribute. Data field MUST 包含无法识别的 attribute (type, length 和 value).

如果 ORIGIN attribute 具有 undefined value, 则 Error Subcode MUST 设置为 Invalid Origin Attribute. Data field MUST 包含无法识别的 attribute (type, length 和 value).

如果 NEXT_HOP attribute field 在语法上不正确, 则 Error Subcode MUST 设置为 Invalid NEXT_HOP Attribute. Data field MUST 包含不正确的 attribute (type, length 和 value). 语法正确性意味着 NEXT_HOP attribute 表示一个有效的 IP host address.

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

a) 它 MUST NOT 是接收 speaker 的 IP address.

b) 对于 sender 和 receiver 彼此相距一个 IP hop 的 EBGP 情况, NEXT_HOP 中的 IP address MUST 是 sender 用于建立 BGP connection 的 IP address, 或者与 NEXT_HOP IP address 关联的 interface MUST 与接收 BGP speaker 共享一个 common subnet.

如果 NEXT_HOP attribute 在语义上不正确, 则 error SHOULD 被记录, route SHOULD 被忽略. 在这种情况下, SHOULD NOT 发送 NOTIFICATION message, 并且 SHOULD NOT 关闭 connection.

AS_PATH attribute 会被检查语法正确性. 如果 path 在语法上不正确, 则 Error Subcode MUST 设置为 Malformed AS_PATH.

如果 UPDATE message 是从 external peer 收到的, local system MAY 检查 AS_PATH attribute 中最左侧的 AS (相对于 protocol message 中 octet 的位置) 是否等于发送该 message 的 peer 的 autonomous system number. 如果检查确定并非如此, 则 Error Subcode MUST 设置为 Malformed AS_PATH.

如果识别出 optional attribute, 则该 attribute 的值 MUST 被检查. 如果检测到 error, 该 attribute MUST 被丢弃, Error Subcode MUST 设置为 Optional Attribute Error. Data field MUST 包含该 attribute (type, length 和 value).

如果某个 attribute 在 UPDATE message 中出现超过一次, 则 Error Subcode MUST 设置为 Malformed Attribute List.

UPDATE message 中的 NLRI field 会被检查语法有效性. 如果该 field 在语法上不正确, 则 Error Subcode MUST 设置为 Invalid Network Field.

如果 NLRI field 中的某个 prefix 在语义上不正确 (例如, 意外的 multicast IP address), 则 SHOULD 在本地记录 error, 并且 SHOULD 忽略该 prefix.

包含正确 path attribute 但没有 NLRI 的 UPDATE message SHALL 被视为有效的 UPDATE message.

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

如果 peer 发送 NOTIFICATION message, 且该 message 的接收方在此 message 中检测到 error, 则接收方无法使用 NOTIFICATION message 将此 error 报告回 peer. 任何此类 error (例如, 无法识别的 Error Code 或 Error Subcode) SHOULD 被注意到, 在本地记录, 并提交给 peer 的 administration 关注. 不过, 如何做到这一点不在本文档范围内.

6.5. Hold Timer Expired 错误处理 (Hold Timer Expired Error Handling)

如果系统没有在 OPEN message 的 Hold Time field 指定期间内收到后续 KEEPALIVE, UPDATE 和/或 NOTIFICATION message, 则会发送带有 Hold Timer Expired Error Code 的 NOTIFICATION message, 并关闭 BGP connection.

6.6. Finite State Machine 错误处理 (Finite State Machine Error Handling)

BGP Finite State Machine 检测到的任何 error (例如, 收到 unexpected event) 都通过发送 Error Code 为 Finite State Machine Error 的 NOTIFICATION message 来指示.

6.7. Cease

在没有任何 fatal error (本节中指示的 error) 的情况下, BGP peer MAY 在任意给定时间选择通过发送 Error Code 为 Cease 的 NOTIFICATION message 来关闭其 BGP connection. 然而, 当存在本节指示的 fatal error 时, Cease NOTIFICATION message MUST NOT 被使用.

BGP speaker MAY 支持施加本地配置 upper bound 的能力, 用于限制该 speaker 愿意从某个 neighbor 接受的 address prefix 数量. 当达到 upper bound 时, speaker 在 local configuration 控制下要么 (a) 丢弃来自 neighbor 的新 address prefix (同时维持与 neighbor 的 BGP connection), 要么 (b) 终止与 neighbor 的 BGP connection. 如果 BGP speaker 因从 neighbor 收到的 address prefix 数量超过本地配置的 upper bound 而决定终止其与 neighbor 的 BGP connection, 则该 speaker MUST 向 neighbor 发送 Error Code 为 Cease 的 NOTIFICATION message. speaker MAY 也在本地记录此情况.

6.8. BGP Connection 碰撞检测 (BGP Connection Collision Detection)

如果一对 BGP speaker 试图同时彼此建立 BGP connection, 则会形成两条 parallel connection. 如果其中一条 connection 使用的 source IP address 与另一条 connection 使用的 destination IP address 相同, 且第一条 connection 使用的 destination IP address 与另一条 connection 使用的 source IP address 相同, 则发生 connection collision. 发生 connection collision 时, 其中一条 connection MUST 被关闭.

基于 BGP Identifier 的值, 本文建立了一个约定, 用于检测发生 collision 时应保留哪条 BGP connection. 该约定是比较参与 collision 的 peer 的 BGP Identifier, 并且只保留由具有较高 BGP Identifier 值的 BGP speaker 发起的 connection.

收到 OPEN message 后, local system MUST 检查其所有处于 OpenConfirm state 的 connection. 如果 BGP speaker 通过 protocol 外部方式知道 peer 的 BGP Identifier, 它 MAY 也检查处于 OpenSent state 的 connection. 如果在这些 connection 中存在一条到 remote BGP speaker 的 connection, 其 BGP Identifier 等于 OPEN message 中的 BGP Identifier, 并且该 connection 与接收 OPEN message 的 connection 发生 collision, 则 local system 执行以下 collision resolution procedure:

  1. local system 的 BGP Identifier 与 remote system 的 BGP Identifier (如 OPEN message 中指定) 进行比较. 比较 BGP Identifier 时, 先将其转换为 host byte order, 并作为 4-octet unsigned integer 处理.

  2. 如果 local BGP Identifier 的值小于 remote 的值, local system 会关闭已经存在的 BGP connection (已经处于 OpenConfirm state 的那条), 并接受 remote system 发起的 BGP connection.

  3. 否则, local system 会关闭新创建的 BGP connection (与新收到的 OPEN message 关联的那条), 并继续使用既有 connection (已经处于 OpenConfirm state 的那条).

除非通过 configuration 允许, 与处于 Established state 的 existing BGP connection 发生 connection collision 会导致关闭新创建的 connection.

注意, 无法对处于 Idle, Connect 或 Active state 的 connection 检测 connection collision.

关闭 BGP connection (由 collision resolution procedure 导致) 是通过发送 Error Code 为 Cease 的 NOTIFICATION message 完成的.