跳转到内容

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

是什么

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

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

技术上拆成两件事:

  1. 失败路径(failover path):每个 AS(自治系统,可以理解为一家运营商或一家公司的网络)除了告诉邻居「我去 X 网段最优走这条」,再额外告诉它「万一这条断了,我能走那条」。
  2. 根因通告(Root Cause Notification, RCN):链路真断时,把「是哪条链路断了」直接喊出来,让所有人立刻切到备份路,而不是各自瞎试。

代价:每个 AS 多存几条额外路径,多发几条消息。换来的是单条 AS 间链路故障下零丢包的理论保证。

为什么重要

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

  • 为什么 2007 年前 BGP 出故障,收敛时间常常十几秒甚至几分钟——明明物理上路还在,包就是过不去
  • 为什么后来运营商愿意花钱买 MPLS Fast Reroute、SR-TE、BFD 这些「亚秒级切换」的东西——R-BGP 给出了第一个低成本的纯协议方案
  • 为什么 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 在平时就把「主路 + 一条精心挑选的备用路」推给会受影响的邻居。挑选规则基于 Gao-Rexford 三类关系(客户 / 供应商 / 对等),保证备用路不绕回到自己。
  • 断时立即放数据沿备用走:链路一断,路由器直接把流量导到已经在表里的备用路,不等控制面收敛。
  • 根因通告(RCN):把”是哪条链路死了”这条事实显式广播,让所有 AS 一次性把含这条链路的旧路径全部作废,path exploration 不再发生

数学上论文证明:在 Gao-Rexford 商业策略 + 单链路故障假设下,R-BGP 在收敛期间零丢包

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

实践案例

案例 1:一次故障的时序对比

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

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

R-BGP 下:

t=0 链路断
t=0 路由器立即把数据切到本地已存的备用路径
t=0 RCN 一次性广播「AS1-AS2 这条死了」
t=2s 所有 AS 同步把含这条链路的路径删掉、各自切到自己的备用

用户感知:前者断网十几到几十秒,后者几乎察觉不到。

案例 2:备用路怎么挑

每个 AS 不能随便选条路当备用,否则可能形成环路。R-BGP 用一条简单规则:只接受不经过当前主路上任何 AS 的备用

类比:主路是「家 → 公司 A 路 → 桥」,备用必须挑「家 → B 路 → 隧道」这种与主路完全错开的。这样主路上任何一节断了,备用都立刻可用。

案例 3:增量部署

R-BGP 不要求所有 AS 一次性升级。论文做了仿真:当前 30% AS 部署 R-BGP,整体丢包就降一半;50% 部署,丢包降 80%。这种「部分部署也有显著收益」的特性是它能进真实网络的关键。

案例 4:与 BFD / MPLS FRR 的分工

很多人会问:现在已经有 BFD(亚秒级链路检测)+ MPLS Fast Reroute(数据面立切),还需要 R-BGP 吗?

答案是:层不同,互补

  • BFD 解决「多快能发现死了」——把检测从 30 秒压到 50 毫秒
  • MPLS FRR 解决「单 AS 内部怎么切」——本地隧道层
  • R-BGP 解决「跨 AS 怎么协调切」——这是 BGP 协议层,前两者覆盖不到

实际生产中三件事常常一起开:BFD 快速发现 + MPLS FRR 域内立切 + R-BGP 思想做跨域备份。

踩过的坑

  1. 多链路同时挂的边界:R-BGP 只对单条 AS 间链路故障给零丢包保证。两条同时断(如同一物理光缆里走两条逻辑链路),保证失效。论文承认这是当前限制。
  2. RCN 可被恶意伪造:根因通告本质是新型协议消息,没有强鉴权。攻击者可以伪造 “X-Y 链路死了” 让全网把好链路当死的丢掉。这与 BGP 整体的鉴权问题同源——后续 RPKI / BGPsec 要解决的就是这层。
  3. 备用路存储成本被低估:论文说”额外消息和内存是常数级”,但运营商落地时发现,部分密集 peering 的 Tier-1 AS 表项膨胀显著,需要额外限流策略。
  4. 和 iBGP 交互:R-BGP 主要讲 eBGP(AS 之间),AS 内部的 iBGP 怎么传备份路径论文留给后续工作。这个洞 SR-TE / 段路由后来才补。

适用 vs 不适用场景

适用

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

不适用

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

一句话总结

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

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

历史小故事(可跳过)

  • 2000 年代初:测量论文(Labovitz 等)发现 BGP 故障收敛常常 30 秒甚至 3 分钟。互联网越来越关键,这个数字越来越扎眼。
  • 2002-2006:学术界提出过几种思路——延迟通告(MRAI)、消除不一致(BGP-RCN 早期版本)、多路径(MIRO)。这些要么效果有限,要么改协议太大。
  • 2007 NSDI:Kushman 等四人把”备用路径”和”根因通告”两件事捏到一起,给出零丢包数学证明 + 增量部署可行性,文章被广泛引用。
  • 2008 之后:思想被多个工程方案吸收——Cisco 的 BGP PIC(Prefix Independent Convergence)、Juniper 的 BGP add-paths 草案,本质都在做同样的事:让备份路径在故障前就到位
  • 2010 年代:MPLS Fast Reroute / BFD / SR-TE 在工程层提供”亚秒级切换”,思路与 R-BGP 一脉相承——先准备好备用,故障即切换,但下沉到了数据面更底层。
  • 2020 年代:BGP add-paths(RFC 7911)成为正式标准,让一个 AS 可以同时通告多条路径——这是 R-BGP failover-path 思想的标准化版本。

学到什么

  1. 协议层的”慢”,根因往往是「停不下来」而不是「找不到」——BGP 的痛点是 path exploration,不是缺路径
  2. 预备份是分布式系统抗故障的通用范式——数据库主从、CDN 多源、网络备用路,都是「平时多花一点,故障时少损失很多」
  3. Gao-Rexford 商业策略是路由协议设计的隐形地基——不懂三类 AS 关系(客户付钱给供应商、对等免费、供应商收钱),就没法理解为什么备用路必须按规则选
  4. 零丢包证明 + 增量部署是把研究推进工业的两件武器——只证明不工程、或只工程不证明,都进不去
  5. 控制面与数据面解耦是网络协议演进 20 年的总主题——从 R-BGP 到 SDN 再到 SR-TE,都在重复同一句话:让算法慢慢算,让转发立刻动
  6. 「故障的根因」要显式说出来——RCN 这个想法朴素到近乎废话,但 BGP 之前 20 年都没人这么做。很多协议优化的本质就是「把隐式的事实显式化」

延伸阅读

关联

  • mahajan-2002-bgp-misconfig —— 同领域,讲 BGP 日常出错率,R-BGP 解决其中故障收敛子问题
  • akamai-2002 —— CDN 也用「多源备份」对抗局部故障,与 R-BGP 思想同源
  • rest-fielding-2000 —— 互联网协议设计哲学的另一面:状态在哪里、谁负责一致性