跳转到内容

R-BGP 2007 — 故障切换前先把备份路径塞进邻居口袋

待复核

R-BGP 是给 BGP 打的一个小补丁,让骨干网在某条链路挂掉的瞬间不再丢包。

日常类比:你每天上班只走一条路。某天主干道塌了,你才开始打开导航找替代路线,这十几分钟你卡在路上动不了。R-BGP 的做法是——每天上班顺手让邻居记一条「我家备用路」。主路一断,邻居立刻把车导到备用路,你一秒不耽误。

技术上拆成两件事:

  1. 失败路径(failover path):每个 AS(自治系统,可以理解为一家运营商或一家公司的网络)除了告诉邻居「我去 X 网段最优走这条」,再额外告诉它「万一这条断了,我能走那条」。
  2. 根因信息(Root Cause Information, RCI):链路真断时,把「是哪条链路断了」写进更新消息,让所有人立刻作废含该链路的旧路径,而不是各自瞎试。(注意:Pei 等人更早的 BGP-RCN 也是根因思路,但目标是缩短收敛;R-BGP 的 RCI 主要用来防环 + 配合备用路。)

代价:每个 AS 多存几条额外路径,消息量与普通 BGP 同量级。换来的是单条 AS 间链路故障下零瞬时断连的理论保证(仿真里受影响源 AS 从 22%/14% 降到 0)。

不理解 R-BGP,下面这些事讲不清楚:

  • 为什么 2007 年前 BGP 出故障,收敛时间常常十几秒甚至几分钟——明明物理上路还在,包就是过不去
  • 为什么后来运营商愿意花钱买 MPLS Fast Reroute、SR-TE、BFD 这些「亚秒级切换」的东西——域内已有亚秒恢复,跨 AS 仍缺可证明的纯协议方案;R-BGP 把「预备份」推到 eBGP
  • 为什么 BGP 收敛慢的根因不是「找不到新路」而是「停不下来探旧路」——这篇论文把 path exploration(路径探索)讲透了
  • 为什么”备份路径”在分布式系统里反复出现(数据库主备、CDN 多源)——R-BGP 是网络层的同一思想

R-BGP 想解决一个朴素问题:链路 A→B 挂了,从 A 到目的地 D 物理上还有别的路,为什么包会丢?

答案分三层:

  1. BGP 收敛慢:A 把”D 不可达”通告出去后,邻居们要轮流试自己手上的旧路径——这些旧路径其实都经过 A→B,最后都得作废。但试一遍要消息往返,整个过程可能几十秒。这叫路径探索(path exploration)
  2. 物理可达不等于路由可达:网络图上 A→C→…→D 这条路是通的,但 BGP 控制面没人告诉 C “你应该走自己手上的备用”,C 不敢用。
  3. 没有快速失效信号:BGP 用「没收到通告 = 还活着」推断状态,这种”沉默即可用”机制在故障时反应慢。

R-BGP 的三招直接对症:

  • 预先告诉邻居备用路(failover path):每个 AS 平时只向主路下一跳通告一条备用路(与 BGP「每邻居一条」同开销)。优先选与主路共享后缀最短的「最不相交」路径;商业策略仍按 Gao-Rexford(客户 / 供应商 / 对等)。
  • 断时立即放数据沿备用走:链路一断,紧邻上游 AS 立刻把流量导到已在表里的备用路,不等控制面收敛。
  • 根因信息(RCI):把「是哪条链路死了」写进更新,让相关 AS 本地作废含该链路的旧路径,避免环路与无用探索。

数学上论文证明:在 valley-free + prefer-customer 等假设 + 单链路故障下,收敛期间保持连通(仿真:边缘链路 22%→0、核心链路 14%→0 的瞬时断连源 AS)。

把这件事翻译成一句话:让”控制面收敛慢”和”数据面继续转发”解耦。控制面慢慢算最优,数据面立刻用备份。这是后续 SR-TE、TI-LFA 都共享的设计哲学。

普通 BGP 下,链路 AS1→AS2 断掉时:

t=0 链路断
t=0~30s 多个 AS 轮流试旧路径,消息满天飞,包持续丢
t=30s+ 最终所有人都收敛到新路径

R-BGP 下:

t=0 链路断
t=0 紧邻上游立刻把数据切到已存的 failover path
t=0 更新里带上 RCI:「AS1-AS2 这条死了」
随后 相关 AS 本地作废含该链路的旧路径;上游可暂沿旧主路把包送到 failover AS

用户感知:前者断网十几到几十秒,后者在单链路故障假设下几乎察觉不到。

不能随便选「第二优」当备用——第二优常与主路大段重叠,一断两路一起挂。R-BGP 选 most disjoint:与主路共享后缀最短的那条(目的地路由树里,两路一旦汇合就不会再分叉)。

类比:主路是「家 → A 路 → 大桥 → 公司」,备用尽量早点分叉走「B 路 → 隧道」,少跟主路共走最后几段。只向主路下一跳通告这一条,开销与普通 BGP 相当。

案例 3:论文仿真数字(不是「部分部署百分比」)

Section titled “案例 3:论文仿真数字(不是「部分部署百分比」)”

论文在真实 AS 拓扑上仿真,不是「30% AS 部署就降一半」那种增量部署曲线:

  1. 单链路故障:边缘接入链路故障时,约 22% 源 AS 会瞬时断连;核心链路约 14%。R-BGP(最不相交备用)两边都降到 0
  2. 主备同时挂的最坏双故障:断连源从约 32.9% 降到 6.8%,相当于避开 BGP 约 80% 的瞬时断连。
  3. 只允许策略合规备用:仍可把边缘场景瞬时断连压到约 1.4%——即使不愿给非客户临时提供中转,收益也很大。
  • BFD:多快发现链路死了(检测从数十秒压到毫秒级)
  • MPLS FRR / TI-LFA:单 AS 域内数据面立切
  • R-BGP:跨 AS 的 eBGP 层预备份 + RCI——前两者覆盖不到的层

三者互补:发现快、域内切、跨域协调,不是互相替代。

  1. 多链路同时挂的边界:零瞬时断连证明针对单条 AS 间链路故障。主备路径上链路同时挂时,保证失效,但仍可避开约 80% 的 BGP 瞬时断连。
  2. RCI 可被恶意伪造:根因信息挂在更新里,没有强鉴权。伪造「X-Y 死了」可让别人误删好路径——与 BGP 整体鉴权问题同源,后续靠 RPKI / BGPsec 一类机制。
  3. 转发状态翻倍要算账:论文方案可用主/备两套转发表;骨干路由器内存通常扛得住,但落地仍要按前缀规模与 VPN 表项一起评估,不能当成「零成本」。
  4. 和 iBGP 交互:正文重点在 eBGP;AS 内部多路由器 / route reflector 有实现讨论,但域内备份工程化更多由后来的 SR-TE / TI-LFA 补齐。

适用

  • 骨干网 / Tier-2 运营商,主备链路明确、单点故障是主要威胁
  • 收敛期可用性要求高的服务(在线视频、金融、远程协作)
  • 不能立即换协议、但能升级路由器代码的场景

不适用

  • 链路双断 / 节点同时挂多个的灾难场景(需要多路径协议如 MP-BGP、SR-TE)
  • 安全敏感场景(RCI 鉴权未解决前,谨慎开放)
  • 小型企业网(自身路由表小,BGP 收敛快,收益不显著)

把”故障来了再找路”改成”平时就把备用路挂在邻居口袋里,故障来了用 RCI 喊一声立刻切”。预先准备 + 显式根因是 R-BGP 的两个关键齿轮,缺一个都转不起来。

读这篇之前如果你只把 BGP 当”路由表交换协议”,读完会发现它真正的难点是动态收敛中的瞬时一致性——和数据库里的两阶段提交、CDN 里的 TTL 失效,是同一类问题在不同领域的化身。

  • 2000 年代初:Labovitz 等测量发现 BGP 故障收敛常常 30 秒甚至数分钟,平均可伴随约 30% 丢包。
  • 2002-2005:MRAI、一致性断言、BGP-RCN(Pei 等,根因通知缩短收敛)等控制面优化;域内已有 MPLS FRR,但跨 AS 仍缺预备份。
  • 2007 NSDI:Kushman / Kandula / Katabi / Maggs 把 failover path + RCI 捏在一起,给出连通性证明与 AS 拓扑仿真。
  • 2008 之后:工程侧 BGP PIC、add-paths 等吸收「故障前备好第二条路」的思想。
  • 2020 年代:BGP add-paths(RFC 7911)标准化多路径通告——与 R-BGP 的 failover 通告相关但不等同(add-paths 更广,R-BGP 有特定选路与 RCI 机制)。
  1. 协议层的”慢”,根因往往是「停不下来」而不是「找不到」——BGP 的痛点是 path exploration
  2. 预备份是分布式系统抗故障的通用范式——数据库主从、CDN 多源、网络备用路同一逻辑
  3. Gao-Rexford / valley-free 商业策略是路由设计的隐形地基——不懂客户/供应商/对等,就读不懂备用路为何难选
  4. 证明 + 仿真数字比口号管用——22%→0、双故障仍避 80%,比「感觉更快」更能说服工程
  5. 控制面与数据面解耦:算法慢慢收敛,转发立刻用备份——与后来 SR-TE / TI-LFA 同哲学
  6. 把隐式事实显式化:RCI / BGP-RCN 都在说「告诉别人根因」,用途却不同(防环 vs 缩收敛)