第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 ✅ 正常运行 一直

七、思考

  1. BGP 状态机中,Active 状态表示什么?如果 BGP 连接一直卡在 Active,说明什么问题?
  2. 从 Idle 到 Established 需要经过哪些状态?哪一步最容易出问题?
  3. Connect 和 Active 状态有什么区别?什么情况下会从 Connect 退回到 Active?
  4. 如果 Open 报文中的 AS 号不匹配,BGP 连接会卡在哪个状态?
  5. Established 状态下的 BGP 对等体之间除了 Update 报文,还会交换什么报文?

下篇预告:第84篇《BGP 路径属性——AS_PATH、Next_Hop、Origin》——深入理解 BGP 最基础的三个路径属性。