R-BGP 2007 — 故障切换前先把备份路径塞进邻居口袋
待复核R-BGP 是给 BGP 打的一个小补丁,让骨干网在某条链路挂掉的瞬间不再丢包。
日常类比:你每天上班只走一条路。某天主干道塌了,你才开始打开导航找替代路线,这十几分钟你卡在路上动不了。R-BGP 的做法是——每天上班顺手让邻居记一条「我家备用路」。主路一断,邻居立刻把车导到备用路,你一秒不耽误。
技术上拆成两件事:
- 失败路径(failover path):每个 AS(自治系统,可以理解为一家运营商或一家公司的网络)除了告诉邻居「我去 X 网段最优走这条」,再额外告诉它「万一这条断了,我能走那条」。
- 根因信息(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 物理上还有别的路,为什么包会丢?
答案分三层:
- BGP 收敛慢:A 把”D 不可达”通告出去后,邻居们要轮流试自己手上的旧路径——这些旧路径其实都经过 A→B,最后都得作废。但试一遍要消息往返,整个过程可能几十秒。这叫路径探索(path exploration)。
- 物理可达不等于路由可达:网络图上 A→C→…→D 这条路是通的,但 BGP 控制面没人告诉 C “你应该走自己手上的备用”,C 不敢用。
- 没有快速失效信号: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 都共享的设计哲学。
案例 1:一次故障的时序对比
Section titled “案例 1:一次故障的时序对比”普通 BGP 下,链路 AS1→AS2 断掉时:
t=0 链路断t=0~30s 多个 AS 轮流试旧路径,消息满天飞,包持续丢t=30s+ 最终所有人都收敛到新路径R-BGP 下:
t=0 链路断t=0 紧邻上游立刻把数据切到已存的 failover patht=0 更新里带上 RCI:「AS1-AS2 这条死了」随后 相关 AS 本地作废含该链路的旧路径;上游可暂沿旧主路把包送到 failover AS用户感知:前者断网十几到几十秒,后者在单链路故障假设下几乎察觉不到。
案例 2:备用路怎么挑
Section titled “案例 2:备用路怎么挑”不能随便选「第二优」当备用——第二优常与主路大段重叠,一断两路一起挂。R-BGP 选 most disjoint:与主路共享后缀最短的那条(目的地路由树里,两路一旦汇合就不会再分叉)。
类比:主路是「家 → A 路 → 大桥 → 公司」,备用尽量早点分叉走「B 路 → 隧道」,少跟主路共走最后几段。只向主路下一跳通告这一条,开销与普通 BGP 相当。
案例 3:论文仿真数字(不是「部分部署百分比」)
Section titled “案例 3:论文仿真数字(不是「部分部署百分比」)”论文在真实 AS 拓扑上仿真,不是「30% AS 部署就降一半」那种增量部署曲线:
- 单链路故障:边缘接入链路故障时,约 22% 源 AS 会瞬时断连;核心链路约 14%。R-BGP(最不相交备用)两边都降到 0。
- 主备同时挂的最坏双故障:断连源从约 32.9% 降到 6.8%,相当于避开 BGP 约 80% 的瞬时断连。
- 只允许策略合规备用:仍可把边缘场景瞬时断连压到约 1.4%——即使不愿给非客户临时提供中转,收益也很大。
案例 4:与 BFD / MPLS FRR 的分工
Section titled “案例 4:与 BFD / MPLS FRR 的分工”- BFD:多快发现链路死了(检测从数十秒压到毫秒级)
- MPLS FRR / TI-LFA:单 AS 域内数据面立切
- R-BGP:跨 AS 的 eBGP 层预备份 + RCI——前两者覆盖不到的层
三者互补:发现快、域内切、跨域协调,不是互相替代。
- 多链路同时挂的边界:零瞬时断连证明针对单条 AS 间链路故障。主备路径上链路同时挂时,保证失效,但仍可避开约 80% 的 BGP 瞬时断连。
- RCI 可被恶意伪造:根因信息挂在更新里,没有强鉴权。伪造「X-Y 死了」可让别人误删好路径——与 BGP 整体鉴权问题同源,后续靠 RPKI / BGPsec 一类机制。
- 转发状态翻倍要算账:论文方案可用主/备两套转发表;骨干路由器内存通常扛得住,但落地仍要按前缀规模与 VPN 表项一起评估,不能当成「零成本」。
- 和 iBGP 交互:正文重点在 eBGP;AS 内部多路由器 / route reflector 有实现讨论,但域内备份工程化更多由后来的 SR-TE / TI-LFA 补齐。
适用 vs 不适用场景
Section titled “适用 vs 不适用场景”适用:
- 骨干网 / Tier-2 运营商,主备链路明确、单点故障是主要威胁
- 对收敛期可用性要求高的服务(在线视频、金融、远程协作)
- 不能立即换协议、但能升级路由器代码的场景
不适用:
- 链路双断 / 节点同时挂多个的灾难场景(需要多路径协议如 MP-BGP、SR-TE)
- 安全敏感场景(RCI 鉴权未解决前,谨慎开放)
- 小型企业网(自身路由表小,BGP 收敛快,收益不显著)
把”故障来了再找路”改成”平时就把备用路挂在邻居口袋里,故障来了用 RCI 喊一声立刻切”。预先准备 + 显式根因是 R-BGP 的两个关键齿轮,缺一个都转不起来。
读这篇之前如果你只把 BGP 当”路由表交换协议”,读完会发现它真正的难点是动态收敛中的瞬时一致性——和数据库里的两阶段提交、CDN 里的 TTL 失效,是同一类问题在不同领域的化身。
历史小故事(可跳过)
Section titled “历史小故事(可跳过)”- 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 机制)。
- 协议层的”慢”,根因往往是「停不下来」而不是「找不到」——BGP 的痛点是 path exploration
- 预备份是分布式系统抗故障的通用范式——数据库主从、CDN 多源、网络备用路同一逻辑
- Gao-Rexford / valley-free 商业策略是路由设计的隐形地基——不懂客户/供应商/对等,就读不懂备用路为何难选
- 证明 + 仿真数字比口号管用——22%→0、双故障仍避 80%,比「感觉更快」更能说服工程
- 控制面与数据面解耦:算法慢慢收敛,转发立刻用备份——与后来 SR-TE / TI-LFA 同哲学
- 把隐式事实显式化:RCI / BGP-RCN 都在说「告诉别人根因」,用途却不同(防环 vs 缩收敛)
- 论文 PDF:R-BGP 2007 NSDI
- 同源测量:Labovitz et al. — Delayed Internet Routing Convergence, SIGCOMM 2000
- 工程对照:MPLS Fast Reroute / Segment Routing TI-LFA
- mahajan-2002-bgp-misconfig —— 同期 BGP 测量,讲误配置率
- mahajan-2002-bgp-misconfig —— 同领域,R-BGP 解决故障收敛子问题
- akamai-2002 —— CDN「多源备份」与网络备用路同源
- rest-fielding-2000 —— 状态在哪里、谁负责一致性
- calder-2015-anycast-cdn —— Calder 2015 — Anycast CDN 在生产环境真的能用吗
- codons-2004 —— CoDoNS — 用 P2P 哈希表替代分层 DNS 的实验
- gao-2001-as-relations —— Gao 2001 — 用算法猜出互联网上 AS 之间谁给谁付钱
- ron-2001 —— RON 2001 — 让一小撮节点自己绕开 BGP 故障
- subramanian-2002-internet-hierarchy —— Subramanian 2002 — 用多个观察点把互联网切成 5 层