Keepalive 与 Hold 的关系
BGP 邻居建立后靠报文存活:Keepalive 定时器决定本端多久发一次保活,Hold 定时器决定多久收不到任何报文就判定邻居失效并断连,默认分别是 60 秒与 180 秒。两者的关系可以理解为「心跳频率」与「多久没心跳算死亡」。协商时取两端 Hold 的较小值,而 Keepalive 通常不应超过 Hold 的三分之一。实际调优要克制:把 Hold 调小能加快故障发现,但广域网上一次丢包或设备短暂卡顿就可能误判断连,全表重收敛的代价远大于等待时间;真正需要毫秒级检测时应该用 BFD,而不是把定时器压到极限。
基本信息
| 默认值 | Keepalive 60 秒,Hold 180 秒 |
|---|---|
| 协商规则 | Hold 取两端较小值,Keepalive 按本端配置发送 |
| 约束关系 | Keepalive 一般不超过 Hold 的三分之一 |
| Cisco 命令 | neighbor x.x.x.x timers <keepalive> <hold> |
| 华为命令 | peer x.x.x.x timer keepalive <秒> hold <秒> |
| 查看 | show ip bgp neighbors 中的 hold time 与 uptime |
典型使用场景
- 广域网链路抖动频繁:评估是否需要放宽 Hold 减少误断
- 需要更快故障检测:优先引入 BFD,而不是把 Hold 压到几十秒
- 两端定时器差异较大:确认实际生效值是否与设计一致
- 排障时判断断连原因:对比断连时间点与 Hold 到期时间
- 验收记录:把生效的定时器值写进隧道或邻居资产表
调整与验证
调整与验证
# Cisco:设置 keepalive 与 hold
router bgp 65001
neighbor 203.0.113.2 timers 10 30
# 华为:对应参数命名不同
# peer 203.0.113.2 timer keepalive 10 hold 30
! 验证实际生效的值
show ip bgp neighbors 203.0.113.2 | include hold time|keepalive
# 断连后确认原因是否与定时器相关
show log | include BGP|Hold参数影响对照
| 调整方向 | 收益 | 代价 |
|---|---|---|
| Hold 调小 | 故障发现更快 | 丢包或卡顿即断连,全表重收敛 |
| Hold 调大 | 容忍链路抖动 | 故障发现变慢,可能长时间黑洞 |
| Keepalive 调小 | 链路活跃度提高 | 报文与 CPU 开销上升 |
| 改用 BFD | 毫秒级检测且与协议解耦 | 增加会话资源,需两端支持 |
两端配置不同时按较小 Hold 生效:本端写 90 而对端写 180,实际按 90 计时;验收要以实际生效值为准,而不是配置文件里的数字。
大规模邻居场景下把 Keepalive 调小会成倍增加报文量,需要评估控制面 CPU 与链路开销。