选路的本质
同一前缀收到多条路径时,BGP 不做加权计算,而是按固定顺序逐项比较路径属性,任一步分出胜负即停止,后面的属性不再看。因此排障时不要笼统问哪条更优,而要问在哪一步被判定:第 1 步到第 11 步的次序本身构成了全部判定依据,属性数值只有在轮到它时才起作用。
为什么要背顺序
顺序决定了调整属性的有效性边界。想让一条路径胜出,必须让它在前面的步骤里建立优势:如果两条路径的 LOCAL_PREF 不同,那么无论怎么改 AS_PATH 长度或 MED,结果都不会变化。反过来,属性完全相同时结果会落到年龄、Router ID、邻居地址这些看似无关的细节上,这也是选路结果让人费解的常见来源。
基本信息
| 适用设备 | Cisco IOS / IOS-XE、华为 VRP、FRR 等 BGP 实现 |
|---|---|
| 前提条件 | NEXT_HOP 可达,且通过入向策略与合法性检查 |
| 比较方式 | 逐项顺序比较,先分出胜负即停止 |
| 步骤计数 | 资料常表述为 11~13 步,差别在是否把本地起源、多路径装载单列 |
| 厂商差异 | weight 属 Cisco 实现;华为等以 preference 机制对应,需要按平台换算 |
| 查看命令 | show ip bgp <前缀> 列出全部候选路径并标注最优 |
典型使用场景
- 多出口环境确认流量实际从哪个 AS 出去,核对与出口设计是否一致
- 双运营商线路不对称,判定哪条路径被选中、回程是否走同一运营商
- 收到路由但业务不通,区分是选路结果问题还是策略把路由过滤掉了
- 调整属性前预判影响落在决策顺序的哪一步,避免改了低优先级属性
- 多厂商互联时核对两端对同一前缀是否得出相同结论,防止单侧改动
观察候选路径
观察候选路径
show ip bgp 10.1.1.0/24 # 列出候选路径,> 为当前最优
show ip bgp 10.1.1.0/24 longer-prefixes # 连带查看该网段的明细前缀
show ip bgp summary | include 10.0.0 # 核对相关邻居是否 Established
show ip bgp neighbors 10.0.0.2 advertised-routes # 核对本端发出的属性
show ip route 10.1.1.0/24 # 确认最优路径是否已进主表
show ip bgp rib-failure # 有 BGP 表项但未进主表时查看原因决策顺序(IOS 语义)
| 步 | 比较项 | 胜负判定 |
|---|---|---|
| 1 | Weight | 数值大者胜(本机属性) |
| 2 | LOCAL_PREF | 数值大者胜(AS 内传播) |
| 3 | 本地起源 | 本机 network / redistribute / aggregate 生成者胜 |
| 4 | AS_PATH | 长度短者胜(联盟段默认不计入) |
| 5 | ORIGIN | IGP 优于 EGP,EGP 优于 INCOMPLETE |
| 6 | MED | 数值小者胜(默认仅在同邻居 AS 之间比较) |
| 7 | eBGP / iBGP | eBGP 路径胜 |
| 8 | IGP 度量 | 到 NEXT_HOP 的 IGP 代价小者胜 |
| 9 | 年龄 | 两条 eBGP 路径中先收到者胜 |
| 10 | Router ID | 邻居 Router ID 小者胜;iBGP 先比 Originator ID,再比 Cluster List 长度 |
| 11 | 邻居地址 | 邻居 IP 地址小者胜 |
输出逐列读法
| 列 | 含义 | 读法要点 |
|---|---|---|
| 状态码 | * 有效、> 当前最优、i 经 iBGP 学到、r 已装入 RIB | 只有带 > 的那一行是实际生效路径 |
| Network | 前缀与掩码长度 | 确认查的是业务网段而非其明细 |
| Next Hop | 该路径下一跳 | 下一跳不可达的路径不参与比较 |
| Metric | 即 MED,默认 0 | 同邻居 AS 之间小者胜 |
| LocPrf | LOCAL_PREF | 默认 100,大者胜 |
| Weight | 本机权重 | 默认 0,本地起源路由为 32768 |
| Path | AS_PATH | 长度短者胜,末尾 i/e/? 为 ORIGIN |
现象与对应步骤
| 现象 | 先查哪几步 | 常见原因 |
|---|---|---|
| 流量走了非预期出口 | 第 1~2 步 | weight 或 LOCAL_PREF 在各设备不一致 |
| 主路径没被选中 | 第 4 步 | 对端对自己发布的 AS_PATH 做了预置 |
| 同 AS 对端两条链路选错 | 第 6 步 | MED 未按设计设置或被对端忽略 |
| iBGP 路径压不过 eBGP | 第 7 步 | 本机直学的外部路径天然占优,需前序属性建立优势 |
| 重启后路径变了 | 第 9~10 步 | 属性全同时由年龄与 Router ID 决定,重启会打乱顺序 |
| BGP 表有路由但业务不通 | 不在比较范围 | 下一跳不可达或 rib-failure 导致未进主表 |
逐项比对示例
逐项比对示例
# 同一前缀两条候选路径(示意)
# A: weight 0, locPrf 150, AS_PATH 65002 65010, MED 50, 邻居 10.0.0.2
# B: weight 0, locPrf 100, AS_PATH 65002 65020, MED 10, 邻居 10.0.0.3
# 第 1 步 weight 相同 → 继续;第 2 步 locPrf 150 大于 100 → A 胜,判定结束
# MED 更小的 B 不会胜出,因为比较到第 2 步就已分出胜负
show ip bgp 10.1.1.0/24
show ip bgp neighbors 10.0.0.2 | include Local\ Preference # 核对入向策略结果多路径装载(maximum-paths)是属性全部相当之后的并行转发行为,不属于单条路径的胜负判定,两者要分开理解。
选路在各路由器上独立进行:只改一台设备的属性,其他设备可能仍按旧结论转发,策略变更要覆盖全部参与选择的设备。
下一跳不可达时根本不会产生候选路径,此时属性怎么改都无效:先修 NEXT_HOP 可达性,再谈属性比较。
两种失败表现要分开:BGP 表里查不到前缀属于策略或邻居问题;表里有一条带 > 的路径但业务不通,属于下一跳、主表装载或回程问题。