bgp
约 2170 字大约 7 分钟
2025-11-16
BGP特点
- 可靠性 利用TCP建立可靠连接 精确(无环)的路由选择信息
- 稳定性 通过计时器防止接口flaping 可以跟踪指定的路由,根据震荡历时进行衰减
- 可扩展性 对等体的数量,可以支持数百个会话 路由的数量,可以支持几十万条以上的路由条目
- 灵活性 丰富的路由属性 多策略的管理
BGP的邻居模型
提示
两种邻居模型: IBGP&EBGP
EBGP:
- 在不同AS间建立邻居关系
- 一般通过直连接口建立邻居关系(因为AS之间无IGP协议)
- EBGP管理距离为20
IBGP:
- 在相同AS内建立的BGP邻居关系
- 邻居之间不需要直连,只要IGP路由可达即可
- IBGP路由管理距离为200
BGP三张表
邻居表
- BGP邻居必须是显示配置,而IGP的邻居默认是隐式配置
- BGP邻居可以不在同一个广播域,不需要邻居发现机制
转发表(BGP数据库)
- 数据库会保存来自所有邻居的路径信息
- 数据库中如果出现到同一目的地的多条路径,BGP默认不会同时安装进路由表,而是通过一系列选路比较安装最优的一条
路由表
- 到路由表的安装过程需要通过比较AD值来完成
BGP邻居建立过程
基本条件
- BGP的邻居关系是基于TCP连接建立
- TCP连接是一种P2P的单播连接,要求TCP端点必须路由可达
- 端点路由需要依赖IGP协议来交互
- BGP邻居建立需要IGP路由来作为基础
- BGP的邻居也称为BGP对等体
建立过程
- 通过路由表查询路由发起TCP连接,完成三次TCP握手,发起连接的源端口为高位随机端口,目标端口为179
- 发起连接的源默认可能是邻居双方中的任意一方
- TCP三次握手完成后,相互产生OpenMessage进行邻居建立协商
- 协商成功后,通过Keepalive Message维持邻居关系
- 通过Update Message发送路由更新
- 如果邻居建立协商失败,或者是建立成功后出现故障,通过Notification Message来通知邻居,需要断开连接
BGP的四种报文
- open message:
- 在TCP连接建立后产生
- 用于协商邻居建立的关键参数(as number,hold time,router ID)
- hold time可以协商,以以比较小的一方数值为准
- router ID选择方式与OSPF一致
- 修改router ID会重置邻居关系
- keepalive message:
- 相当于IGP协议的hello报文
- 在open之后产生,用作心跳,确保邻居关系的存在
- 消息本身不携带任何参数,依靠IP包头内源地址确认邻居
- 默认频率60s,若180s内没有收到下一个keepalive,则认为邻居无效
- keepalive发送频率为协商后的hold time/3
- keepalive可能与open合为一个message发送
- update message:
- 用于在邻居之间交互路由信息
- 该消息采用触发更新和增量更新的方式发送
- 包含路径的路由前缀以及该路由携带的attribute
- 按照共性的方式进行排列(将attribute完全相同的归为一组)
- 一条update可以只通告一条路由,携带多个属性
- 一条update也可以通告多条路由,但是属性必须一致
- 一条update可以同时撤销多条路由
- notification:
- 用于向邻居发送一些错误通告(例:hello time无法协商或者超时、AS号不匹配)
状态机
- Idle(空闲):
- 空闲状态,BGP 邻居初始化状态.
- 如果neighbor 指定的为 EBGP 邻居,则启动直连检测,检测失败保持 Idle状态,如果检测成功则进入 Active 状态,开始尝试TCP 连接
- 如果 neighbor 指定的为 iBGP 邻居,则直接开始查询路由表,无论是否存在路由都转换状态为 Active, 准备尝试 TCP 连接。
- Active(激活):
- 活动状态,开始进行 TCP 连接建立
- 启用随机延时,确保两边不会同时开始 TCP 会话
- 如果查不到去往邻居的路由,并作为主动连接方,则继续保持该状态,每30秒重新检测一次路由条目。
- 如果查不到去往邻居的路由,并作为被动连接方,则继续保特该状态,等待对方发起的 TCP 连接。
- 如果存在去往邻居的路由,并作为主动连接方,但是收不到对方回应,则继续保持该状态,每30 秒尝试一次重新连接。
- 如果存在去往邻居的路由,但是作为被动连按方,并且收到了对方产生的TCP 连接,则退回到ldle, 并立即进入 Connect 状态。
- 如果 TCP 连接成功,则立即进入 Open sent 抉态,并开始协商,如果协商失败则退回到ldle, 并重新进入Active 状态,开始循环。
- Connect(连接):
- 连接状态,被动等待 TCP 连接的完成。
- 如果 TCP 连接建主成功则直接进入 Open sent 次态
- 如果 TCP 连接失败,则进入 Active 状态,尝试重新建立 TCP 连接
- Connect 状态一定要从ldle 状态进入
- OpenSent(已发送Open消息):
- 打开发送,双方进行参数协商,也就是产生 Open Message
- 如果 Open Message 协商成功,则进入到 Open confirm 状态
- 如果 Open Message 协商失败,则产生 Notification Message 并退回到 idle.
- OpenConfirm(已确认Open消息):
- 打开确认,协商取得一致
- 如果从对等体收到了 Keepalive,则进入 Establish 状态
- Established(已建立):
- 邻居建立成功
- BGP将开始通过update message交互路由信息
- 配置BGP进程并且指定neighbor以后,双方初始处于idle状态,开始检查路由
- 路由检测完成后,进入active状态,并启用随机延时计时
- 延时计时器较小的一方会主动发起TCP连接,而另一方将退回idle并立即进入connect状态
- 连接建立后双方进入Open sent状态,开始发送Open message 以及keepalive
- 协商完成后,双方进入Open confirm状态,并立即进入establish,邻居建立完成
邻居建立的必要条件
缺省路由的使用
- 对IBGP邻居与EBGP邻居均有效
- TCP连接的发起方不能使用缺省路由
- TCP连接的被连接放可以使用缺省路由回应
提示
针对BGP路由,更新源地址将会成为路由的next hop
直连检测
- 仅对EBGP邻居有效
- 如果对等体之间AS号相同,则TCP连接以及之后所有的message交互时,IP包头内的TTL=255
- 如果对等体之间的AS号不同,则TCP连接以及之后所有message交互时,IP包头内的TTL默认为1
- 因此如果EBGP邻居检测到到达对等体的路由是非直连路由,则不会发起连接,也不糊响应对端的TCP连接,可以关闭直连检测
neighbor x.x.x.x disable-connect-check- 如果TCP连接需要穿越三层设备,则必须修改TTL值才能完成连接
neighbor x.x.x.x ebgp-multihop [ttl value](1-255)提示
- 如果在直连的两个设备之间用loopback接口建立ebgp邻居,TTL=1也可以成功
- ebgp-multihop默认包含了disable-connect-check的功能
更新源检测
- 对IBGP和EBGP邻居均有效
- 对等体发起连接的源地址必须为本地neighbor所指定的地址,否则连接被拒绝
- 单向检测成功即可建立邻居关系
停留在不同状态原因
如果一直停留在 ldle 状态,则可能:
- EBGP 直连检测没有通过。
- 因为某些 BGP Feature 导致的连接被限制。例如:maximum-prefix
如果一直停留在 Active 状态,则可能:
- 没有去往邻居的路由
- 邻居没有回包路曲
- 邻居没有neighbor 指令
- 邻居neighbor 指令中地址错误
- 两端 AS number 不匹配
- 两端Authentication 不通过
选路原则
1、优选具有最高weight值的路径 2、具有较高local preference的路径优先(AS内传递) 3、优选本地始发的路由 4、优选AS path最短的路径 5、根据origin code的顺序(i>e>?) 6、优选MED(metric)最小的路径 7、ebgp优于ibgp 8、优选bgp next hop的igp开销最小的路径
