关键词:BGP、状态机、Idle、Connect、Active、OpenSent、OpenConfirm、Established、故障排查
第83篇:BGP 状态机:Idle→Connect→Active→OpenSent→OpenConfirm→Established
一、引言
BGP 状态机定义了 BGP 邻居会话从初始到建立的完整过程。BGP 邻居关系经历六个状态的逐步迁移,最终达到 Established 状态后才能进行路由交换。
理解 BGP 状态机的每个状态及其迁移条件,是排查 BGP 邻居故障的核心技能。当 BGP 邻居卡在某个中间状态时,通过分析当前状态和进入该状态的条件,可以快速定位故障根因——"BGP 邻居卡在哪,故障就在哪"。
二、核心概念
2.1 BGP 六种状态
| 序号 | 状态名 | 简要说明 |
|---|---|---|
| 1 | Idle | 初始状态,等待启动事件 |
| 2 | Connect | 等待 TCP 连接建立 |
| 3 | Active | 主动尝试建立 TCP 连接 |
| 4 | OpenSent | TCP 已连接,已发送 Open,等待对端 Open |
| 5 | OpenConfirm | Open 协商完成,等待 Keepalive |
| 6 | Established | 会话建立,可以交换路由 |

2.2 各状态的核心特征
| 状态 | TCP连接 | Open报文 | Keepalive | Hold Timer | 说明 |
|---|---|---|---|---|---|
| Idle | 未建立 | 未发送 | 未发送 | 未启动 | 初始/重置状态 |
| Connect | 正在建立 | 未发送 | 未发送 | 未启动 | 等待TCP完成 |
| Active | 主动发起 | 未发送 | 未发送 | 未启动 | TCP失败后重试 |
| OpenSent | 已建立 | 已发送 | 未发送 | 已启动 | 等待对端Open |
| OpenConfirm | 已建立 | 已协商 | 已发送 | 运行中 | 等待对端Keepalive |
| Established | 已建立 | 已完成 | 正常交换 | 运行中 | 路由交换状态 |
三、技术细节
3.1 Idle 状态
Idle 是 BGP 会话的初始状态。在此状态下,BGP 等待启动事件:
- BGP Start 事件:手动启动 BGP 进程或配置 BGP 邻居后触发
- 进入 Idle 后,BGP 重置所有计数器,选择最佳 BGP Identifier(Router ID),准备进入 Connect 状态
常见卡点原因: - BGP 进程未启动或未配置 - 邻居配置被删除(undo peer) - 管理员手动重置 BGP 会话(reset bgp all) - 最大 BGP 邻居数限制达到
3.2 Connect 与 Active 状态
这两个状态都围绕 TCP 连接的建立,是 BGP 故障最常见的卡点区域:
| 状态 | 行为 | 迁移条件 |
|---|---|---|
| Connect | 等待 TCP 连接完成(监听对端连接或发起连接) | TCP 成功→OpenSent;Connect Retry Timer 超时→Active |
| Active | 主动发起 TCP 连接 | TCP 成功→OpenSent;TCP 超时→Connect |
Connect ↔ Active 循环: - 如果 TCP 连接持续失败,BGP 在 Connect 和 Active 状态之间循环 - Connect 状态等待 Connect Retry Timer(默认 60 秒),超时进入 Active - Active 状态尝试发起 TCP 连接,失败后返回 Connect - 每次循环等待的时间遵循 Back-off 机制(逐步增加重试间隔) - 最大重试间隔受 BGP 重试定时器(Retry Timer,默认 120 秒)控制
为什么设计两个状态: - Connect:本端被动等待(监听对端连接或等待之前发起的 TCP 连接完成) - Active:本端主动发起 TCP SYN - 两者交替确保即使在一端主动、另一端被动的情况下也能建立连接
3.3 OpenSent 状态
TCP 连接建立后,本端发送 Open 报文并进入 OpenSent 状态:
迁移条件: - 收到对端的 Open 报文且参数协商成功 → OpenConfirm - 收到 Notification 报文 → Idle - Hold Timer 超时(对端未发送 Open)→ Idle - TCP 连接断开 → Idle
常见卡点原因: - 对端未发送 Open 报文(对端 BGP 未启动或未配置本端为 Peer) - Open 报文参数不匹配(AS 号、Router ID、Hold Time、版本) - 中间防火墙过滤了 BGP Open 报文(但允许 TCP 连接) - 对端 Router ID 与本地冲突
3.4 OpenConfirm 状态
Open 协商成功后进入 OpenConfirm,发送 Keepalive 并等待对端 Keepalive:
迁移条件: - 收到对端 Keepalive → Established - 收到 Notification → Idle - Hold Timer 超时 → Idle
常见卡点原因: - 对端未发送 Keepalive(对端 Open 协商后失败) - Keepalive 报文被中间设备过滤 - Hold Time 配置不一致导致双方协商结果不同
3.5 Established 状态
BGP 会话完全建立,可以交换 Update 报文:
维持条件: - 持续在 Hold Time 内收到 Keepalive 或 Update 报文 - TCP 连接保持活跃 - 不收到 Notification 报文
退出条件: - Hold Timer 超时(Hold Time 内未收到任何 BGP 报文) - 收到 Notification 报文 - TCP 连接断开 - 管理员手动重置(reset bgp peer) - 对端配置变更导致 Cease 通知
四、实战配置/案例分析
4.1 BGP 状态查看与诊断
# 查看BGP邻居状态总览
display bgp peer
IPv4 Unicast Address PeerState Receives Sends
10.1.1.2 Idle 0 0
2.2.2.2 Established 1234 1567
# 查看单个Peer的详细状态
display bgp peer 10.1.1.2 verbose
Peer: 10.1.1.2
State: Idle
Description: BGP is idle
Connect retry timer : 60(s)
Keepalive timer : 60(s)
Hold timer : 180(s)
# 实时监视BGP状态变化
terminal monitoring
terminal debugging
debugging bgp events
debugging bgp packet all
4.2 案例分析:卡在 Connect/Active 状态(最常见故障)
故障现象:BGP 邻居 10.1.1.2 状态在 Connect 和 Active 之间循环,始终无法进入 OpenSent。
排查步骤:
-
理解当前状态的含义:Connect/Active 循环说明 TCP 连接无法建立。BGP 还没到报文协商阶段。
-
检查 TCP 179 端口连通性:
[R1] telnet 10.1.1.2 179
# 无法连接,TCP 179端口不可达
# 尝试普通ping: ping 10.1.1.2 → 通(说明IP层可达,但端口被阻挡)
- 检查 IP 路由:
[R1] display ip routing-table 10.1.1.2
# 有到达10.1.1.2的路由,说明不是路由问题
- 检查防火墙/ACL:
[R1] display acl all
# 发现ACL 3000拒绝了TCP 179端口的流量
rule deny tcp destination-port eq 179
-
根因:防火墙 ACL 阻断了 TCP 179 端口的通信。
-
修复:
[R1] acl 3000
[R1-acl-adv-3000] rule permit tcp destination-port eq 179
4.3 案例分析:卡在 OpenSent 状态
故障现象:BGP 邻居状态卡在 OpenSent,TCP 连接已建立但未进入 OpenConfirm。
排查:
-
TCP 连接已建立(否则不会进入 OpenSent),问题出在 Open 报文协商阶段。
-
检查调试信息:
debugging bgp packet open
terminal debugging
*Sep 01 10:00:01: R1/BGP/OPEN: Sent Open message to peer 10.1.1.2
# 本端已发送Open,但长时间未收到对端Open
# Hold Timer超时后回退到Idle
- 检查对端 BGP 配置:
# 在对端R3上检查
[R3] display bgp peer 10.1.1.1
# 对端未配置10.1.1.1为Peer!
- 常见根因:
- 对端未配置本端为 BGP 邻居
- 对端的 AS 号与本端配置的不一致
-
对端 Router ID 与本地冲突
-
修复(在对端添加邻居配置):
[R3] bgp 200
[R3-bgp] peer 10.1.1.1 as-number 100
[R3-bgp] peer 10.1.1.1 connect-interface GigabitEthernet 0/0/1
4.4 案例分析:Established 后频繁闪断
故障现象:BGP 邻居反复在 Established 和 Idle 之间切换,路由不断震荡。
排查:
- 查看日志:
display logbuffer | include BGP
*Sep 01 10:00:00: BGP%%: Peer 10.1.1.2 established.
*Sep 01 10:02:30: BGP%%: Hold timer expired for peer 10.1.1.2.
*Sep 01 10:03:00: BGP%%: Peer 10.1.1.2 established.
*Sep 01 10:05:30: BGP%%: Hold timer expired for peer 10.1.1.2.
-
现象规律:大约每 2.5 分钟断开一次,对应 Hold Timer(180 秒)超时。
-
检查报文统计:
display bgp peer 10.1.1.2
Keepalive: sent 1500, received 5 # 接收远少于发送
-
根因:链路存在严重的单向丢包,Keepalive 报文到达对端但对端的回包丢失。
-
解决方案:
# 方案1:排查并修复链路丢包问题(治本)
# 方案2:临时增大Hold Timer
[R1] bgp 100
[R1-bgp] timer keepalive 90 hold 270
# 方案3:启用BFD加速检测
[R1] bfd
[R1] bgp 100
[R1-bgp] peer 10.1.1.2 bfd enable
五、总结
| 卡点状态 | 核心排查方向 | 常用命令 |
|---|---|---|
| Idle | BGP进程、邻居配置、最大邻居数限制 | display bgp peer |
| Connect/Active | TCP不可达、IP路由缺失、防火墙/ACL拦截 | telnet |
| OpenSent | 对端BGP未启动、AS号不匹配、Router ID冲突、Open被过滤 | debugging bgp packet open |
| OpenConfirm | Keepalive未到达、Hold Time不匹配 | debugging bgp packet keepalive |
| Established→Idle | Hold Timer超时、Notification、链路闪断 | display logbuffer |
思考
- BGP 在 Connect 和 Active 状态之间循环时,为什么需要 Back-off 机制(逐步增加重试间隔)?如果不使用 Back-off 会发生什么?
- 如果 BGP 邻居状态从 Established 突然回退到 Idle,可能的原因有哪些?按概率从高到低排列。
- BGP 状态机中,从 OpenSent 到 OpenConfirm 的迁移需要满足什么条件?如果 Open 参数协商失败,BGP 会发送什么报文?随后回到哪个状态?
下篇预告:第84篇:BGP 路径属性:AS_PATH、Next_Hop、Origin