BGP(边界网关协议)作为路径矢量路由协议,其邻居状态机是协议稳定运行、邻居关系建立与维护的核心机制。状态机的每一步转换都与 TCP 连接建立、BGP 报文交互、参数协商强相关,决定了邻居关系的正常建立、异常中断与恢复。
下面从状态机总览 、各状态详细解析 、状态转换触发条件 、关键影响因素 及实验常见问题五个维度,完整拆解 BGP 邻居状态机制。
一、BGP 邻居状态机总览
BGP 邻居状态共分为6 种核心状态 ,其中Idle 为初始状态,Established 为邻居正常建立状态,其余状态为中间过渡状态。状态转换的核心依赖TCP 连接状态 和BGP 报文交互结果,整体流转逻辑如下:
plaintext
Idle → Connect → Active → OpenSent → OpenConfirm → Established
↑(异常/重置) ↓(异常)
└─────────────────────────┘(异常/超时)
二、各状态详细解析
1. Idle(空闲状态)
(1)状态定义
BGP 的初始状态 ,也是最低优先级状态 。一旦配置 BGP 邻居(peer命令)、重置已有邻居,或邻居关系异常中断后,设备会进入该状态。
(2)核心行为
- 不主动向对端发起 TCP 三次握手,也拒绝对端的 TCP 连接请求。
- 进入该状态时会触发Start 事件 ,并启动32 秒的 Start 定时器(思科设备无此等待,配置后直接尝试建立连接)。
- 定时器超时后,才会尝试发起 TCP 连接,进入
Connect状态。
(3)常见触发场景
- 新配置 BGP 邻居,未到 32 秒启动时间。
- 去往邻居的 IP 路由不可达,无法发送 TCP SYN 报文,一直卡在
Idle。 - 手动挂起邻居 (华为命令:
peer xxx ignore),状态变为Idle (AdMin),管理员主动禁用邻居。 - 收到错误 Notification 报文后回退至该状态。
2. Connect(连接状态)
(1)状态定义
BGP 发起 TCP 连接后进入的中间过渡状态 ,核心任务是完成TCP 三次握手。
(2)核心行为
- 启动连接重传定时器(Connect Retry) ,默认值32 秒,用于重传 TCP 连接请求。
- 向对端发送 TCP SYN 报文,等待对端的 SYN+ACK 响应。
- 若 32 秒内完成 TCP 三次握手,发送 BGP Open 报文,进入
OpenSent状态。 - 若 TCP 握手失败,转入
Active状态;若定时器超时,仍停留在Connect状态。
(3)常见异常原因
- 对端未配置 BGP 邻居,收到 SYN 后回复 RST(重置),导致握手失败。
- 网络中间设备(防火墙 / ACL)拦截 TCP 179 端口,SYN 报文无法到达对端。
- EBGP 邻居未配置TTL 多跳(默认 EBGP 单跳,多跳场景需手动指定),TCP 连接被拒绝。
- 对端设备存在路由黑洞,无法回包。
3. Active(活跃状态)
(1)状态定义
TCP 三次握手失败后 进入的状态,是 BGP 邻居建立的异常状态 ,设备会持续尝试重新建立 TCP 连接。
(2)核心行为
- 与
Connect状态类似,仍会持续发起 TCP SYN 请求,直到握手成功或超时。 - 若多次尝试后 TCP 握手成功,发送 Open 报文,关闭 Connect Retry 定时器,进入
OpenSent状态。 - 若持续握手失败(如对端一直回复 RST),则长期停留在
Active状态。 - 若 Connect Retry 定时器超时且无响应,转回
Connect状态。
(3)核心特点
- 设备主动发起连接,而非被动等待(与
Connect的区别仅在于触发原因是 TCP 握手失败)。 - 常见于:对端配置错误、网络路由不通、对端拒绝连接的场景。
4. OpenSent(已发送 Open 状态)
(1)状态定义
TCP 连接已成功建立,本地已发送 BGP Open 报文,等待对端回复 Open 报文的状态。
(2)核心行为
- 等待对端的 Open 报文,进行参数协商(AS 号、Hold 时间、Router ID、能力协商等)。
- 协商成功:发送 Keepalive 报文,转入
OpenConfirm状态。 - 协商失败:发送 Notification 报文,转回
Idle状态。
(3)关键协商项
- AS 号:EBGP 需双方 AS 号匹配,IBGP 也需匹配(除非特殊配置),否则直接协商失败。
- Hold 时间 :取双方配置的最小值(默认 Hold 时间 180 秒,Keepalive 为其 1/3,即 60 秒)。
- 能力协商:如路由刷新(Route-Refresh)、4 字节 AS 号、地址族支持等。
5. OpenConfirm(Open 确认状态)
(1)状态定义
已收到对端的 Open 报文且协商成功,等待对端发送 Keepalive 报文的状态。
(2)核心行为
- 持续监听对端的 Keepalive 报文,维持邻居关系的保活机制。
- 收到 Keepalive 报文:转入Established 状态,邻居关系正式建立。
- 收到 Notification 报文:转回
Idle状态。 - 未收到 Keepalive 且 Hold 时间超时:TCP 连接断开,转回
Idle状态。
6. Established(已建立状态)
(1)状态定义
BGP 邻居关系正常建立的最终状态,此时邻居可正常交互路由信息、保活报文。
(2)核心行为
- 可交互的 BGP 报文类型:
- Update:交换路由信息(发布 / 撤销路由)。
- Keepalive:周期性保活,维持连接(默认每 60 秒发送一次)。
- Notification:异常中断通知。
- Route-Refresh:请求对端重新发送路由信息(策略变更时使用)。
- 正常运行:持续接收 Update/Keepalive,保持状态。
- 异常处理:
- 收到错误 Update/Keepalive:发送 Notification,转回
Idle。 - 收到 Notification:直接转回
Idle。 - TCP 连接拆链(FIN 报文):断开连接,转回
Idle。
- 收到错误 Update/Keepalive:发送 Notification,转回
三、状态转换核心触发条件
BGP 邻居状态的转换由事件驱动,核心事件与状态对应关系如下:
表格
| 触发事件 | 状态转换方向 |
|---|---|
| 配置 peer / 重置邻居 | Idle(启动 Start 定时器) |
| Start 定时器超时 | Idle → Connect(发起 TCP SYN) |
| TCP 三次握手成功 | Connect → OpenSent;Active → OpenSent |
| TCP 三次握手失败 | Connect → Active;Active → 持续尝试 |
| 收到对端 Open 报文 | OpenSent → OpenConfirm(协商成功) |
| Open 报文协商失败 | OpenSent → Idle(发送 Notification) |
| 收到对端 Keepalive 报文 | OpenConfirm → Established |
| 收到 Notification 报文 | 所有状态 → Idle |
| TCP 连接拆链(FIN) | 所有状态 → Idle |
| Hold 时间超时 | Established/OpenConfirm → Idle |
| 手动挂起邻居(ignore) | 任意状态 → Idle (AdMin) |
四、影响状态机的关键因素
1. 网络层基础(TCP 连接)
BGP 基于TCP 179 端口运行,TCP 连接是邻居状态建立的前提:
- 去往邻居的路由必须可达,否则无法发送 SYN,卡在
Idle。 - 防火墙 / ACL 需放行 TCP 179 端口,否则 TCP 连接无法建立。
- EBGP 多跳场景需配置
peer ebgp-max-hop,否则 TCP 连接被拒绝。
2. BGP 参数协商
- AS 号配置错误 :EBGP/IBGP 的 AS 号不匹配,Open 报文协商失败,转回
Idle。 - Router ID 冲突:同一 AS 内 BGP Router ID 重复,Open 报文协商失败。
- Hold 时间 / Keepalive 配置异常:Hold 时间小于 3 倍 Keepalive,配置无效(需满足 Hold≥3×Keepalive)。
3. 策略与属性
- 路由过滤:若对端过滤本地 BGP 报文,可能导致 Open 协商异常。
- 邻居挂起 :
peer ignore命令直接将邻居置为Idle (AdMin),禁用连接。
五、实验常见问题与排障思路
1. 邻居长期卡在 Idle
- 排查方向 :
- 检查去往邻居 IP 的路由表(
display ip routing-table),路由不可达则添加静态 / 动态路由。 - 检查是否配置
peer ignore,取消挂起。 - 检查 Start 定时器(思科无等待,华为等待 32 秒后再尝试)。
- 检查去往邻居 IP 的路由表(
2. 邻居卡在 Connect/Active
- 排查方向 :
- 抓包查看是否发送 TCP SYN,对端是否回复 SYN+ACK/RST(Wireshark 过滤
tcp port 179)。 - 检查 EBGP 是否配置多跳(
peer ebgp-max-hop)。 - 检查中间设备是否拦截 TCP 179 端口。
- 对端是否配置 BGP 邻居,AS 号是否正确。
- 抓包查看是否发送 TCP SYN,对端是否回复 SYN+ACK/RST(Wireshark 过滤
3. 邻居卡在 OpenSent/OpenConfirm
- 排查方向 :
- 查看 Open 报文协商项:AS 号、Router ID、Hold 时间是否匹配。
- 检查是否有 4 字节 AS 号能力协商冲突(两端设备是否支持)。
- 查看设备日志(
display logbuffer),获取 Notification 报文的错误原因。
4. 邻居频繁从 Established 断开
- 排查方向 :
- 检查 Keepalive/Hold 时间是否过短(默认 180/60 秒,可修改为
timer keepalive xx hold xx)。 - 检查网络链路是否抖动,TCP 连接频繁断链。
- 检查是否有策略变更触发 Route-Refresh,或设备重启导致邻居重置。
- 检查 Keepalive/Hold 时间是否过短(默认 180/60 秒,可修改为
总结
BGP 邻居状态机是TCP 连接机制 与BGP 协议交互逻辑 的结合体:从Idle的初始等待,到Connect/Active的 TCP 连接建立,再到OpenSent/OpenConfirm的参数协商,最终到Established的正常通信,每一步状态转换都有明确的触发条件和行为规则。
掌握状态机的核心逻辑,是排障 BGP 邻居关系异常、理解 BGP 路由传播机制的基础。实际网络中,多数 BGP 邻居故障都源于TCP 连接不通 或参数协商失败,需结合状态机与报文抓包快速定位。