摘要

  • BGP 的 MULTI_EXIT_DISC 是一项弱、可选且不可传递的建议,用于说明同一广告 AS 的多个入口中更偏好哪一个;只有更强的本地条件相等时,较小数值才应占优。
  • 接收方保留控制权:它可以在选路前删除或改写入站 MED,而通常规则只在来自同一个相邻 AS 的路径之间比较这些数值。
  • 正确使用需要双方约定含义、足够完整的候选可见性与运行证据。把不同网络的数值当作统一排名,会在特定拓扑中制造不一致选择甚至持续振荡。

设想 AS 65001 与 AS 65002 在新加坡和法兰克福两处互联。对于同一前缀,65001 在新加坡通告 MED 20,在法兰克福通告 MED 80。意思很清楚:若其他重要属性相同,65001 希望来自 65002 的流量从新加坡进入。那里也许容量更大、内部距离更短、设施成本更低,或者另一处正在受维护限制。

最终仍由 65002 决定。它可能因为自己的合同而给新加坡路径更低的 LOCAL_PREF,也可能只在某些关系中采纳 MED;它可以删除属性、替换数值,或者做决策的路由器根本看不到另一条路径。较小数字不是对远端策略的写操作,而是在另一个独立治理系统内部被求值的建议。

RFC 4271 用 MULTI_EXIT_DISC 编码了这种克制的权限。MED 是一个四字节无符号、可选、不可传递的属性。其他条件相等时,数值较小者应被优先。它可以从 EBGP 边界经 IBGP 在接收 AS 内传播,却不得继续传给另一个相邻 AS。建议到赋予它语境的关系边界为止。

接收方的权力写得很明确。BGP 实现必须提供本地配置机制,在计算偏好与选择路径之前删除收到的 MED;实现也可以在同一阶段改写其数值。发送方拥有自己通告的数字,接收方拥有数字是否留下以及产生何种本地后果的决定权。

这条分界是有意设计的。RFC 1773 把 MED 的前身 inter-AS metric 描述为选路后段的弱因子。设计目标之一,是防止远端运营者在接收网络已有更强偏好时,强迫它吸收或排出流量。LOCAL_PREF、AS_PATH 长度及更早的判断项不是妨碍 MED 的缺陷;它们正是让建议保持有条件的本地权限边界。

所以“最低 MED 总会胜出”是错误说法。MED 10 的路径可能输给 MED 100,只因后一条具有更高 LOCAL_PREF,或在 MED 之前的步骤胜出。RFC 8326 把限制落到维护场景:提高某条链路的 MED 并不是完整的优雅维护手段,因为当替代路径在 LOCAL_PREF 或 AS_PATH 长度上先输掉时,MED 根本没有机会改变结果。

普通比较范围还要更窄。RFC 4271 只在来自同一个相邻 AS 的路径之间比较 MED,相邻 AS 由 AS_PATH 决定。若三条路都来自 AS 65001,它的数值可以表达三个入口的统一偏序;若第四条来自 AS 65003,另一个运营者很可能依据不同拓扑、成本与策略生成数字。一个关系中的 20 并不天然小于另一个关系中的 40。

因此 MED 不能形成全序。路径 A 和 B 来自同一邻居,A 因 MED 更低而胜出;路径 B 和 C 来自不同邻居,可能跳过 MED 而比较后续条件。这不能保证 A、B、C 排成一条可传递的顺序。结果会受到候选如何分组、哪个组内优胜者进入下一轮以及决策者能看到哪些信息的影响。

Cisco IOS XR 文档把这种分组模型写得很具体:先按相邻 AS 给候选路径分组,在每组内选出 MED 优胜者,然后让各组优胜者继续完成普通选路。这不只是内部技巧,而是协议有限比较域的体现,也解释了候选到达顺序与完整性为什么可能改变答案。

一些产品允许跨不同相邻 AS 比较 MED。表面上,所有数字进入同一场竞赛似乎更一致,实际却扩大了远端数值获得的权限。Juniper 对不同度量来源下的广泛比较给出警告,RFC 3345 也认为把它当作通用修复并不明智。字段宽度相同不等于计量单位相同。

组织当然可以主动建立统一尺度。接收方可以按自己的规则改写全部入站 MED,或者同参与者达成协议,让大家根据同一种服务度量生成数值。这时可比较性来自接收方赋予的含义,而不是互联网送来的四个字节。治理记录必须说明比较组、数值来源、缺失值处理和优先级,不能假定数字天生共享单位。

缺少 MED 也要明确处理。属性既然是可选的,一条路径可能有数字,另一条没有。产品和策略对缺失的解释并不一致。运营者必须验证实际规则,不能猜测缺失永远等于零、最大值或某一家产品的选项。一个沉默属性仍通过接收方如何解释沉默而参与决定。

候选可见性让问题更复杂。全互联 IBGP 会让 speaker 看见更多出口;Route Reflection 与 Confederation 通过不在所有地方传播所有候选,降低分发成本。RFC 4456 警告,MED 并非始终可比,而每台路由器到 NEXT_HOP 的 IGP 距离也可能不同,因此某些反射拓扑会给出与全互联不同的选择。

这不是说路由层级本身不安全,而是要求把候选可见性放入证明。如果一个 route reflector 看见 A、B,另一个看见 B、C,而比较关系又不具传递性,那么每个节点都可能做出局部合理、却让别处依据失效的决定。扩展性节约已经改变了判断表面。

RFC 3345 记录了这种互动形成持续路由振荡的有限条件,包括特定反射器或联盟结构、不完整且不一致的出口可见性,以及受 MED 影响的选路。问题在这些条件下是确定性的,并非所有部署都带着的诅咒;它也不能被当成随机互联网噪声,因为局部有效的选择会反复撤回令另一选择有效的信息。

修复方式很多,但每一种都改变权限或可见性:重新设计反射结构,让关键边界路由器彼此看见,在边缘设置 LOCAL_PREF,标准化或删除 MED,限制哪些关系能提供它,或部署多路径分发能力。“全部比较”不是万能方案,因为它可能把不可比的政策空间强行放在一起;全面丢弃 MED 又会失去有用的双边建议。修复必须对应已证明的故障机制。

RFC 5004 处理的是相关但更窄的一类抖动。当现有外部最佳路径与候选替代路径都一直存活到很晚的 router identifier 比较时,speaker 可以保留现有外部路径,避免无意义切换。它能减少部分转发变化,并停止文中分析的例子;RFC 明确没有宣称解决 RFC 3345 的全部持续振荡。

时间顺序也是警报。RFC 4451 记录过某些实现因路径到达顺序和偏爱旧路径而产生非确定性 MED 结果。稳定选择应由定义好的输入与政策决定,而不应由哪条 UPDATE 先进入内存决定。确定性处理很重要,但配置里出现相关选项仍需逐路由验证。

证据链从流量之前开始。保留每个 peer 收到的原始路径、分组所用相邻 AS、MED 是否存在、政策后的数值、LOCAL_PREF、AS_PATH,以及决策点能看见的所有候选。让路由器说明最佳路径原因,并比较边界路由器和反射器,而不是只依赖一个 looking glass。

然后跨入转发层。BGP 最佳路径必须生成预期 FIB 下一跳,流量遥测还要证明相关目的流量确实经过预期互联。看见一个较低 MED 不证明它胜出;某个 RIB 选中路径不证明另一入口的包也使用它;一条安静链路可能表示改道、丢包,或本来就没有需求。

测试要覆盖两个方向。先对有限前缀调整发送方数值,观察对端收到和选择的状态是否变化;再在接收方删除或改写,确认本地选择符合声明政策。测试缺失、相等值、更早属性不等、多个相邻 AS、出口撤回、反射路径、到达顺序与回滚。目标不是证明数字会动,而是证明它的权限范围。

关系约定比命令语法更重要。如果客户期望供应商在两条私有互联上采纳 MED,双方应记录适用的前缀、地址族、链路与数值范围,哪些 LOCAL_PREF 会先于它,缺失如何解释,供应商何时可以覆盖,以及用什么遥测解决争议。没有这些语境,属性在语法上有效,在商业上却含混。

Heng Lu 的最小初始规范原则与 MED 极为契合。共同协议提供最小可用对象:一个可选度量、受限传播和有条件比较。它不决定数值代表容量、成本还是政策。这些后续选择仍属于运行路由器并承担后果的网络。

运行代码优先给出验收法。政策文档与成功提交只是表述;收到的属性、实际改写、可见候选、选择理由、FIB 下一跳与送达流量才是系统。如果预期入口没有收到数据包,通告的数字就没有取得实际权限。

这里的数据主权不是拥有远端路由,而是每个自治系统控制自身运行状态的能力。发送方可以说明希望的入口;接收方可以在符合合同与风险时采纳。协调之所以成立,正因为任何一方都不需要交出自己的决策机器。

MED 的成功取决于双方理解它的克制。较低数字可以推荐一扇门,却不能保证走廊存在、每台内部路由器都看见它、更强的本地政策同意,或流量真的穿过。弱属性并非残缺的权力;正是这份弱,允许一个网络建议另一个网络而不统治它。

来源