摘要

  • RFC 9721 处理的是 EVPN-IRB 的信息模型缺口:组合 MAC+IP 路由上的单一序列号,无法在 IP 换绑 MAC、MAC 换绑 IP,或全活 PE 在不同时间学习同一主机时,天然证明两种身份各自的新旧。
  • 规范没有增加第二个线字段,而是建立父 MAC 序列、子 MAC+IP 继承、同伴同步、取最大值的互操作规则、ARP/NDP 探测和分范围的重复地址恢复。较大序列号只是一份路由版本声明,不是主机身份、物理位置、FIB 收敛或业务恢复的证明。

假设一条组合路由写着序列号 31。它把 MAC 与 IP 一起送进网络,于是监控界面很容易把 31 理解为“这台主机的第 31 个版本”。问题是:主机究竟指什么?

虚拟机重建后可以保留 IP,却得到新 MAC;容器可能沿用 MAC,却换了 IP;防火墙后面的许多 IP 也可能共享一个 MAC。31 也许在给 MAC 的位置排序,也许来自某个 IP 之前的绑定,也许由同伴同步抬高。数字本身不会披露它继承了哪一段历史。

RFC 9721 的价值正在这里。它不是把计数器包装成更可靠的真相,而是承认一个字段面对两个可独立变化的对象时,必须依靠字段之外的关系才能成立。

组合路由把关系伪装成对象

RFC 7432 为 MAC 移动定义了 MAC Mobility Extended Community。MAC 从一个以太网段移动到另一个段时,较高序列号可以帮助远端 PE 选择较新的位置。此时被排序的对象清楚:MAC 路由。

EVPN-IRB 承载得更多。Route Type 2 可以同时包含 MAC 与 IP。根据 RFC 9135,MAC 进入桥表,IP 关联进入 ARP/NDP 表或 IP-VRF。它们共用一条 BGP 宣告,不等于共享一个永远不变的身份。

若把每个 {MAC, IP} 对当作独立对象,新绑定通常从零开始。旧的 IP-a/MAC-a 已经走到 31,新生的 IP-a/MAC-b 却是零;数值顺序与现实顺序相反。若只把新绑定任意抬高,又可能破坏 MAC-b 与其余 IP 子项之间的共同历史。

规范可以增加两个序列字段,分别给 MAC 和 IP 排序,但这会改变格式、兼容性和诊断模型。RFC 9721 选择另一条路:在 PE 本地把 MAC 路由定义成父项,相关 MAC+IP 路由作为子项继承父序列。

当本地学习到一个 MAC+IP 绑定时,PE 先计算或重算父 MAC。父序列必须高于同一 MAC 的有关远端状态;若该 IP 还与另一远端 MAC 绑定,则新父序列还要超过那一 MAC 的序列。随后,所有相关子项都继承更新后的值。

这套关系不会完整出现在路由包里。远端只能看见“一个值”,看不见本地比较过哪些远端路由、更新过哪些兄弟子项、是否吸收 Peer-Sync-Local 状态,也看不见 ARP 表里是否还残留旧绑定。因此 BGP 抓包能证明宣告发生,不能独自证明序列来源正确。

可审计记录必须从本地学习事件开始:接口、ESI、MAC、IP、时间、父序列的前后值、参与比较的远端值、被更新的子项,再到实际发出的宣告与撤回。少了这条链,合法数字也可能脱离它所声称排序的对象。

全活不是双份可用性,而是共享版本权

全活多归属让问题更尖锐。多个 PE 同时代表一个 Ethernet Segment。数据帧和 ARP/NDP 响应经过不同链路哈希,两个 PE 并不会同时看见同一学习事件。

主机从旧段移入新段时,PE1 可能在旧远端路由已经撤回后才学习,于是把它当作新对象并赋零;PE2 可能在撤回前就学习,于是把它当作远端转本地并赋 N+1。两台设备都可能忠实执行各自时刻的规则,却向远端提供相同 ESI 的两套版本。

后果不只是仪表板难看。远端 PE 可能因为序列不同而无法组成 ECMP;以后序列为 N 的路由返回时,PE2 认为它过旧,PE1 却认为它更新。客户眼中是同一全活接入,overlay 眼中却出现两个版本权威。

RFC 9721 要求多归属同伴同步本地和 Peer-Sync-Local 的 MAC/MAC+IP 序列。来自同伴的值可以抬高本地父项,所有子项必须跟随。真正要证明的是:每一台有权为该 ESI 发言的 PE,都进入同一版本世代。

同伴会话 Up 并不能证明这一点。记录应包含成员集合、同步对象、来源 PE、接收值、本地旧值、获胜值、受影响子项和每个宣告节点的应用确认。ESI 只划定共同责任域,不会替其中的数据库作证。

最大值是一项兼容策略,不是一台测量仪

异构实现可能让 MAC-only 路由与同一 MAC 下的 MAC+IP 路由携带不同序列。RFC 9721 要求接收端以有关值的最大值推导远端父 MAC,并在路由撤回时重新计算。若根本没有 MAC-only 宣告,则从组合路由的最大值派生父项。

这是合理的防回退规则。接收端已经见过较高历史,就不应被较小兄弟项拖回过去。但“最大”只能解决排序,不能解释原因。最大值可能来自真实移动、同伴纠偏、竞态反复、陈旧邻居项,甚至受损主机侧发送的数据。

因此,序列号不是墙上时钟。它不能告诉我们移动发生的实际时间、MAC 是否属于目标工作负载、较高路由是否已经写入 FIB,或应用是否恢复。Best path 是控制面决定,不是物理世界的目击者。

当前 RFC 9721 勘误记录 中有一条已驳回的 Technical Erratum 9001。提交者指出,在混合部署中,只实现 RFC 7432 的 PE 并不必然知道:当同一 IP 换到新 MAC 时,新 MAC 的序列应超过该 IP 在旧 MAC 下的历史。Area Director 承认旧设备缺少这种新行为,但拒绝把它定义成向后不兼容;旧规范本来就未规定扩展场景,既有编码和原有行为仍可互通。

运营结论必须保持边界:这条勘误没有改写 RFC;但依赖扩展移动语义的相关 PE 必须真正实现 RFC 9721。版本清单不是采购附件,而是证据条件。

探测负责追问,不负责认证

PE 收到获胜的远端 MAC 或 MAC+IP 路由后,不能仅凭排序就删除本地现实。它需要针对相关本地绑定执行探测与删除。RFC 826 给出 ARP 基础,RFC 4861 给出 IPv6 Neighbor Discovery;RFC 9135 则描述 EVPN-IRB 移动中的相邻探测。

ARP/NDP 响应是很重要的运行证据:本地附件上有某个东西为该地址应答。但它不会认证目标 VM,也不会证明编排系统批准了绑定,更不会说明远端路径可用。不响应同样有多种原因:确实移走、主机沉默、过滤、丢包或探测上下文错误。

共享 MAC 的竞态说明为什么探测不能省略。两个 IP 可能交叉换绑,而旧 ARP、NDP 和 MAC 项尚未被清除。新路由在 PE 之间来回反弹,序列不断上升,直到陈旧项被探测并删除。更多数字不会结束竞态;删除错误观察才会。

事故记录因此必须包含探测目标、接口、发送时间、响应或超时、删除的具体表项、撤回的路由、替代 FIB 以及之后的数据包结果。“收到更高路由”只是触发器。

重复冻结是一种防御动作,不是归因结论

RFC 9161 规定 Proxy ARP/ND 的重复 IP 检测。RFC 9721 区分三类:重复 MAC;同一 IP 绑定不同 MAC;以及纯路由 overlay 中不携带 MAC 的主机 IP。RFC 9136 提供 Route Type 5 的背景。

配置的移动次数与时间窗可以把地址判定为重复并冻结。这是面对不确定性的保护措施,不是攻击证明。迁移循环、同步失步、双重编排和伪造都可能表现成频繁换绑。

恢复先发生在主机侧:取消错误地址或工作负载。之后可以等待老化,也可以执行 unfreeze 或清表加速。Unfreeze 会发出更高序列。如果冲突主机仍在,它只会让争议用更大的数字重新开始;如果只修复一个全活 PE,同伴同步还可能把被清除的世代带回来。

可靠结案要连接四份回执:错误端点确已撤销;PE 操作范围正确;所有有权同伴收敛;双向数据包和应用事务恢复。序列增长不能代替任何一项。

让序列号可治理的十三份记录

完整移动档案至少回答:谁授权工作负载与地址变化;哪一个本地帧或邻居消息触发学习;父 MAC 序列如何变化;哪些子绑定继承;Peer-Sync-Local 从谁到达;比较了哪些远端宣告与撤回;相关软件是否支持扩展规则;最大值怎样派生;RIB、桥表、ARP/NDP、IP-VRF 和 FIB 如何变化;探测删除了什么;重复阈值与冻结范围是什么;谁批准解冻或清表;最终应用是否在预期工作负载上完成。

这些问题属于不同权威。编排器拥有意图,接入 PE 拥有本地观察,多归属组拥有共享世代,BGP 负责传播,FIB 负责执行,应用负责结果。把它们折叠为“fabric 已收敛”,只会让上游记录借走下游证明力。

Lu Heng 的最小初始规范思想说明,共同线字段可以负责协调,不必负责身份与结果。现实分层要求宣告、选路、转发和业务互不冒充。运行代码优先则让同步表、主动探测、FIB 读取和真实数据包比整齐的路由记录更有分量。

RFC 9721 并没有让一个数字获得两种身份的全知能力。它用关系、同步和探测弥补数字的边界。领导层真正要保护的,不是计数器本身,而是计数器为何能代表这一世代的证据。

来源