BGP 状态机与报文类型详解
一、BGP 邻居关系状态机(6 种核心状态)
BGP 邻居从初始化到稳定交互路由,需按顺序经历以下 6 种状态,各状态功能与切换逻辑明确:
状态名称 | 核心作用 | 关键行为与状态切换 |
---|---|---|
Idle(空闲) | BGP 初始状态,等待启动邻居连接的指令 | - 收到 “启动邻居” 指令:初始化 TCP 连接(179 端口),切换至 Connect;- 无指令:持续保持 Idle。 |
Connect(连接) | 发起 TCP 连接,等待连接建立 | - TCP 连接成功:发送 Open 报文,切换至 OpenSent;- TCP 连接失败:重试后仍失败则退回 Idle。 |
OpenSent(发送 Open) | 已发送 Open 报文,等待邻居的 Open 报文,协商邻居参数 | - 收到合法 Open 报文:发送 Keepalive,切换至 OpenConfirm;- 收到非法报文 / 超时:断开 TCP,退回 Idle。 |
OpenConfirm(确认 Open) | 验证邻居 Keepalive,确认参数协商一致 | - 收到邻居 Keepalive:Hold Time 计时启动,切换至 Established;- 超时 / 收 Notification:断开 TCP,退回 Idle。 |
Established(已建立) | 邻居关系稳定,唯一可交互路由信息的状态 | - 定期发送 Keepalive(默认 60 秒)维持连接;- 通过 Update 报文交换路由(发布 / 撤销)。 |
Active(活跃) | Connect 状态重试失败后,主动重新发起 TCP 连接的过渡状态 | - 重新发起 TCP 成功:按 Connect→OpenSent 流程推进;- 重试失败:退回 Idle。 |
二、BGP 报文类型(5 种核心报文,均基于 TCP 传输)
BGP 通过 5 种特定报文完成邻居建立、路由交互与错误处理,每种报文功能唯一:
报文类型 | 核心功能 | 关键内容 | 发送时机 |
---|---|---|---|
Open 报文 | 协商邻居建立基础参数(如 AS 号、Router ID),触发邻居关系推进 | 包含:本地 AS 号、BGP 标识符(Router ID)、Hold Time(默认 180 秒)、可选认证参数 | TCP 连接建立后立即发送(仅 1 次 / 邻居);参数不匹配时触发邻居回复 Notification。 |
Keepalive 报文 | 维持 Established 状态的邻居连接,确认通信正常 | 仅含 BGP 报文头部(总长 19 字节,为 BGP 最小报文) | 1. Established 状态下,按 Keepalive Time(默认 60 秒)定期发送;2. 收到邻居 Open 报文后立即发送,确认参数一致。 |
Update 报文 | 交换路由信息(发布新路由 / 撤销旧路由),是 BGP 传递路由的核心报文 | 包含:1. 撤销路由列表(需删除的前缀);2. 新路由列表 + 路径属性(如 AS_Path、Next_Hop) | 1. 本地路由表变化时主动发送;2. 邻居请求路由更新时响应发送。 |
Notification 报文 | 报告 BGP 错误(如 AS 号不匹配、路由属性非法),触发邻居关系中断 | 包含:错误代码、错误子代码、错误描述信息 | 检测到 BGP 错误时立即发送;发送后断开 TCP 连接,邻居状态退回 Idle。 |
Route-Refresh 报文 | 触发邻居重新发送指定地址族(如 IPv4/IPv6)的全部路由,用于路由同步 | 包含:地址族信息(AFI)、子地址族信息(SAFI) | 本地路由策略变更后主动发送,无需断开邻居关系,仅同步路由。 |