摘要

  • 路由抖动抑制不是凭空制造的管制。早期路由器确实可能被大量 BGP 更新拖垮,抑制机制试图把不稳定限制在靠近源头的位置。
  • 问题在于,惩罚计数器只看见撤回、重发和路径属性变化,看不见这是物理链路反复故障,还是 BGP 在一次撤回后探索备用路径。一次修复因此也可能被延迟最多一小时。
  • 真正可执行的权力并不集中在 IETF 或 RIPE。RFC 描述机制,厂商把默认值写进软件,运营商决定是否启用;前缀持有人却未必能看见或清除远端惩罚。
  • 2002 年后的修正先表现为停用,后来才以更高阈值恢复有限抑制。较深的选择性算法没有成为后来文档所记录的主流修复,参数调整则沿用至今仍可识别的软件控制面。

一个计数器无法识别“回滚”

RIPE-229 记下了一次计划内的软件升级。升级后的重载算一次 flap;新软件崩溃,又算一次;重新装回旧软件,再算一次。十分钟内三次变化。

从运维结果看,这是一个失败但完成回滚的变更:新版本不可用,旧状态被恢复。可在一些上游和对等网络的路由器上,较激进、按前缀长度分级的参数把这些变化累积成了惩罚。文档称,运营商及其客户的 /24 前缀在部分边界被抑制超过三小时。修复已经完成,远端路由器仍在等待计数衰减。

这段经历推动了新的参数选择。RIPE 27 的讨论决定,至少连续第四次 flap 后才开始抑制,并把最后一次 flap 后的最长抑制时间限制为一小时。与三小时相比,这是一种减轻;对已经恢复的 /24 而言,一小时仍是一段真实的不可达时间。

先有软件,后有标准

早期档案给出的约束很具体。20 世纪 90 年代初,互联网宣布的前缀增多,运营商之间的路径更密,外部路由变化需要被持有全表的路由器逐一处理。更新会触发 BGP 决策和转发表增删。处理能力紧张时,一台路由器可能连会话都维持不住;它的失败又会制造更多更新,把负载推给邻居。

RIPE 文档把 RFD 的开发时间写为 1993 年,并称 Cisco、ISI/RSd 与 GateD 从 1995 年起已有实现。RFC 2439 到 1998 年 11 月才发布。其作者当时已把这项技术描述为进入商业产品并广泛部署。也就是说,标准并没有先授权一项尚不存在的权力;运行中的代码和运维经验先形成了事实,再由 RFC 描述机制与边界。

机制为从外部 BGP 邻居学到的路由维护一个分数。撤回会增加惩罚,某些实现也会给重新宣布或属性变化记分。分数随时间指数衰减;超过抑制阈值,路由不再被使用;低于复用阈值,路由才返回。最长抑制时间为这种记忆设置上限。

RFC 2439 的目标没有争议性修辞:减少路由器处理负载,防止持续振荡,同时不牺牲通常表现良好的路由的收敛速度。它也承认一个根本限制——算法无法准确预言未来稳定性,只能把近期变化当作代理指标。此后所有争论,都发生在这个代理指标与真实故障之间的缝隙里。

统一参数解决了可诊断性,也扩大了共同误差

如果每个厂商和运营商使用不同的半衰期、阈值与最长等待时间,同一前缀会在不同网络里处于不同状态。源网络可以修好线路并清除自己的计数,却无法登录未知上游自治系统的路由器。局部已经恢复,全球可见性仍然碎片化,定位问题的人甚至不知道应该联系哪一个 NOC。

RIPE 26 的问题引出一次 BOF,RIPE 27 又促成任务组,1998 年形成 RIPE-178。UUNET 的 Tony Barber 设计了一组已经在其环境中运行数月的参数。2001 年的 RIPE-229 继续修订,并建议 ISP 与路由器厂商采用共同值。

这是一种协调影响力,不是可执行的中央命令。RIPE 文档无法设置远端路由器,RFC 也不会自动开启功能。厂商决定哪些计数器、常量和默认值被交付;运营商在自己拥有的设备上决定启用、停用或覆盖。许多局部决定加总后,才形成前缀在全球的可见性。

参数还分配了成本。RIPE-229 的“分级抑制”对 /24 及更长前缀更严厉:超过阈值后,/24 的最短和最长等待都可为一小时;较短前缀的范围更低。理由包括鼓励聚合,以及短前缀通常影响更多用户。但小型多宿主网络常常需要宣布不可聚合的较长前缀,前缀长度于是同时成了规模与议价能力的粗糙替身。

“Golden Networks”例外暴露了这种规则的边界。根服务器和顶级域名服务器也可能位于长前缀中,误抑制它们的代价太高,所以文档提出豁免。例外并没有证明前缀长度更能预测故障;它只承认,有些持有者承担不起同一惩罚。

BGP 把一次撤回放大成多次“犯错”

2002 年,Zhuoqing Morley Mao、Ramesh Govindan、George Varghese 与 Randy Katz 研究的不是另一条坏线路,而是 BGP 本身的收敛过程。一条路径被撤回后,邻居未必立刻得出“不可达”。它们会依次尝试若干备用 AS 路径,每次最佳路径变化都带来属性变化。抖动抑制看到这些变化,可能逐次加分,尽管源头只真正失败过一次。

论文使用分析模型、模拟、真实轨迹与商业路由器测试床。在所研究的拓扑中,一次撤回加一次重新宣布,就足以由次生路径变化跨过阈值,让返回的路由被抑制最多一小时。RIPE-378 后来还记录过一次撤回在若干 ASN 跳之外产生 41 个 BGP 事件的测量。

这些结果有清楚的证据边界。论文没有测量全世界多少路由器启用了 RFD,也没有证明每种拓扑都会出现相同延迟。它留待后续研究准确刻画哪些网络结构会触发问题。但它推翻了一个关键推论:惩罚分数高,不必然表示物理链路反复故障,也可能表示路由系统正在计算自己的替代路径。

研究者提出“选择性抑制”:对于撤回后单调变化的路径探索,不把每次属性变化都当成新 flap。在其测试拓扑中,该方法消除了撤回触发的抑制,同时仍能压制每 40 秒真正反复撤回和宣布的路由。它是有实验支持的替代方案,却不是已经证明在全球生产网络普遍部署的事实。

2006 年的选择是先关掉

RIPE-378 在 2006 年记录了另一种现实。文档称,ISP 业界没有表现出推动 2002 年修改的需求,实现者也没有据此改造抑制算法。同时,路由器处理能力提高,90 年代最初的 CPU 压力不再同样紧迫。该文档宣布早期 RIPE 参数建议过时,并建议 ISP 不要使用当时的 RFD 实现;其判断是,副作用很可能比不运行抑制更糟。

2012 年的一份 IETF Internet-Draft 调查为后续提供了有限样本。调查通过多个网络运营者邮件列表征集,得到 63 份自选回复;13 人称在使用 RFD,49 人称没有使用,15 个“不使用”的答案提到 RIPE-378。样本不能代表全球部署率,但足以证明:停用建议已进入一部分运营者的实际判断,客户影响也是回复者反复提出的顾虑。

后来的回归没有否定 2002 年发现,而是缩小了计数器捕获的对象。RIPE-580 与 RFC 7196 所依据的测量显示,少量前缀制造了不成比例的更新。在 RFC 7196 引用的一周数据中,把抑制阈值从 2,000 提高到 6,000,相比完全不用 RFD 仍减少了 19% 的更新,同时被抑制的前缀比 2,000 阈值少 90%。阈值为 12,000 时,实验中只有 0.22% 的前缀被抑制,平均每小时更新量约减少 11%。

RFC 7196 因而建议,较激进但危害更小的设置不低于 6,000,保守设置不低于 12,000;实现还可以提供“只计算、不抑制”模式。但它又要求不要静默改变既有默认值,以免破坏现有运维配置。经核验的勘误进一步说明,文中 Cisco 与 Juniper 的默认参数表只是提供信息,并非标准背书。

这里没有一个中心机构完成“修复”。旧默认值被认为过于激进,自动改变它又有兼容性风险;选择性算法需要改代码和部署,高阈值则可以沿用现有配置入口。较低的协调成本,让参数改革胜出。

谁掌权,谁承担代价

前缀持有人可以控制自己的宣布、撤回和修复;登记记录可以证明谁持有号码资源。两者都不能强迫远端路由器立即复用这条路径。传输与对等运营商掌握设备配置,厂商掌握可执行默认值与可见性工具,RFC 和工作组文档提供技术语言与建议。把这些角色都称为“互联网的决定”,会抹去真正执行动作的人。

直接受益者是希望减少更新与 CPU 负载的网络。在早期严重情形下,避免控制平面崩溃也保护了其他用户。误判时,成本却由另一方承担:已修复前缀的持有人、其客户,以及访问服务的用户。故障排查可能跨越数个自治系统,而受影响者未必知道哪个网络仍保存惩罚。

运营商在自己设备上配置功能,具有狭义的本地授权。但 RFC 或 RIPE 建议并不等于每个受影响前缀持有人都授予了全球授权。现有证据也不足以证明违法或违反某份合同。更准确的合法性问题是:一个有外部后果的决定,受影响者能否看见、归因和提出异议。

反事实必须保留 90 年代的硬件约束

如果 1995 年完全没有 RFD,早期路由器不会自动变得更稳定。档案支持 CPU 与更新压力是真问题;可信的反事实必须提供另一种控制平面保护,而不是删除成本。

2002 年的选择性抑制是一条路线,但证据只覆盖测试环境。起初就采用保守阈值是另一条路线,它很可能减少误抑制,同时允许更多更新,后来的测量给出了这种方向性的代价。第三条路线是可观察性:让受影响的源 AS 看见惩罚、实施者、阈值和预计复用时间,并设计安全的清除流程。它不需要建立中央路由权威,却要解决认证与滥用。

对号码资源持有人而言,历史留下的边界非常清楚:登记簿可以说明前缀是谁的,源 AS 也可以正确宣布,但远端网络仍决定何时相信它。资源持有是证据,全球可达性则是一组持续运作的自治系统关系。

来源