第83篇:BGP 状态机——Idle→Connect→Active→OpenSent→OpenConfirm→Established
关键词
BGP、状态机、FSM、Idle、Connect、Active、OpenSent、Established
一、BGP 的六种状态
BGP 使用有限状态机(FSM,Finite State Machine) 管理对等体连接,共有 6 种状态:
Idle → Connect → OpenSent → OpenConfirm → Established
↓ ↑
Active
| 状态 | 说明 |
|---|---|
| Idle | 初始状态,拒绝任何 BGP 连接 |
| Connect | 等待 TCP 连接建立 |
| Active | TCP 连接建立失败,尝试重连 |
| OpenSent | 已发送 Open 报文,等待回复 |
| OpenConfirm | 已收到 Open 报文,发送 Keepalive |
| Established | BGP 连接已建立,可交换 Update |
二、各状态详解
2.1 Idle(空闲)
原因:BGP 配置后,初始进入 Idle
动作:启动 ConnectRetry 定时器,发起 TCP 连接
↓
如果 TCP 连接成功 → 进入 Connect
如果失败 → 保持 Idle(某些情况下)
在 Idle 状态,BGP 会拒绝所有入站连接
卡在 Idle 的原因:
display bgp peer
Peer: 10.0.12.2, AS: 200
State: Idle ← 卡在 Idle
| 常见原因 | 说明 |
|---|---|
| 邻居 IP 不可达 | ping 不通对端 |
| AS 号配置错误 | 本端 AS 号和对端预期不匹配 |
| 没有配置 peer 命令 | 缺少 peer x.x.x.x as-number yyy |
| BGP 被 shutdown | peer x.x.x.x shutdown |
2.2 Connect(连接)
动作:TCP 连接已经发起,等待完成
↓
TCP 连接完成 → 发送 Open → 进入 OpenSent
TCP 连接失败 → 进入 Active
ConnectRetry 超时 → 重新尝试
Connect 状态正常运转的表现:很快(毫秒级)进入 OpenSent,用户几乎看不到这个状态。
2.3 Active(活跃)
动作:TCP 连接失败,正在主动重试
↓
TCP 连接成功 → 发送 Open → 进入 OpenSent
TCP 再次失败 → 保持 Active(重置 ConnectRetry)
卡在 Active 的原因:
display bgp peer
Peer: 10.0.12.2, AS: 200
State: Active ← 卡在 Active(反复尝试连接)
| 常见原因 | 说明 |
|---|---|
| TCP 端口 179 不通 | 对端未配置 BGP 或防火墙阻止 |
| 路由不可达 | 对端 IP 不在路由表中 |
| IP 地址配置错误 | peer 配置的 IP 写错 |
| AS 号不匹配 | 本端配置的 peer AS 号和对端实际 AS 不同 |
Active 的典型特征:状态在 Active 和 Connect 之间反复跳动。
2.4 OpenSent(已发送 Open)
动作:已发送 Open,等待接收对端的 Open
↓
收到正确的 Open → 发送 Keepalive → 进入 OpenConfirm
收到错误的 Open → 发送 Notification → 回到 Idle
卡在 OpenSent 的原因:
| 原因 | 说明 |
|---|---|
| 能力协商失败 | 双方支持的能力不匹配(如 4 字节 ASN) |
| Hold Time 协商异常 | 一方 Hold Time 为 0,另一方非 0(不兼容) |
| Router ID 冲突 | 两端 Router ID 相同 |
2.5 OpenConfirm(已确认 Open)
动作:收到对端的 Open,发送了 Keepalive
等待接收对端的 Keepalive
↓
收到 Keepalive → 进入 Established
收到 Notification → 回到 Idle
2.6 Established(已建立)
✅ BGP 连接已成功建立!
动作:开始交换 Update 报文
周期性发送 Keepalive
display bgp peer
Peer: 10.0.12.2, AS: 200
State: Established ← 成功建立
Up time: 2d10h30m ← 已稳定运行 2 天多
三、状态迁移图
┌──────────┐
配置BGP │ │
───────────────→│ Idle │
│ │
└────┬─────┘
│ TCP 连接发起
↓
| ┌──── └─────┬────┘ | Connect | ←────┐ | |
|---|---|---|---|
| TCP失败 TCP成功 ConnectRetry | |||
| ↓ ┌───┴───┐ ┌──────────┐ Active | 超时重新连接 → | OpenSent | |
| │ │ │ | |||
| │ 收到Open │ | |||
| │ │ │ | |||
| │ ↓ │ | |||
| │ ┌──────────┐ │ | |||
| └────│OpenConfirm│────┘ | |||
| └─────┬────┘ | |||
| │ | |||
| 收到Keepalive | |||
| │ | |||
| ↓ | |||
| ┌──────────────┐ | |||
| │ Established │ | |||
| │ ✅ 成功 │ | |||
| └──────────────┘ |
四、排查指南
4.1 根据状态判断问题
| 状态 | 问题类型 | 排查方向 |
|---|---|---|
| Idle | 配置/管理状态 | 检查 BGP 配置、AS 号、是否 shutdown |
| Active | TCP 连接问题 | 检查 IP 连通性、路由、防火墙、端口 179 |
| OpenSent | 参数协商 | 检查 Router ID、能力协商、Hold Time |
| OpenConfirm | Keepalive | 检查网络是否对称 |
| Established | ✅ 正常 | - |
4.2 常用排查命令
# 1. 查看 BGP 对等体状态
display bgp peer
# 2. 查看 BGP 对等体详细信息
display bgp peer verbose
# 3. 检查 TCP 连接
display tcp status | include 179
# 4. 查看 BGP 错误
display bgp error
# 5. 调试 BGP 事件
debugging bgp event
五、常用配置
# BGP 配置示例
bgp 100
router-id 1.1.1.1
peer 10.0.12.2 as-number 200
peer 10.0.12.2 timer hold 180 # Hold Time
peer 10.0.12.2 timer keepalive 60 # Keepalive 间隔
peer 10.0.12.2 connect-retry 120 # 重连间隔
#
ipv4-family unicast
peer 10.0.12.2 enable
六、总结
| 状态 | 含义 | 典型停留时间 |
|---|---|---|
| Idle | 初始/拒绝 | 秒级(或一直卡住) |
| Connect | 正在连接 | 毫秒级 |
| Active | 重试连接 | 反复切换 |
| OpenSent | 已发 Open | 毫秒级 |
| OpenConfirm | 等待确认 | 毫秒级 |
| Established | ✅ 正常运行 | 一直 |
七、思考
- BGP 状态机中,Active 状态表示什么?如果 BGP 连接一直卡在 Active,说明什么问题?
- 从 Idle 到 Established 需要经过哪些状态?哪一步最容易出问题?
- Connect 和 Active 状态有什么区别?什么情况下会从 Connect 退回到 Active?
- 如果 Open 报文中的 AS 号不匹配,BGP 连接会卡在哪个状态?
- Established 状态下的 BGP 对等体之间除了 Update 报文,还会交换什么报文?
下篇预告:第84篇《BGP 路径属性——AS_PATH、Next_Hop、Origin》——深入理解 BGP 最基础的三个路径属性。