摘要

  • RFC 9790 废弃了仅凭 MPLS 标签栈后四个比特识别载荷类型的做法。0x4 与 0x6 可以像 IPv4、IPv6,也可能只是非 IP 帧或栈后报头的开头。
  • 正确解释来自前置标签的控制面或管理面上下文。负载分担应优先使用显式 Entropy Label 或 FAT Pseudowire Label,而不是让中转设备猜一种格式后到错误偏移读取字段。
  • IANA 登记、控制字和熵标签都能缩小歧义,却不能单独证明设备已经实现、路径确实均衡、报文保持有序,或客户业务已达到结果。

一台中转设备找到 MPLS 标签栈底,看到后续字节以 0100 开始。旧解析器把它当作 IPv4 版本号,于是跳到“源地址”“目的地址”和“端口”应该出现的位置,用这些字节计算 ECMP。

实际报文却是伪线承载的以太网帧。0100 只是目的 MAC 地址的开头。设备没有识别出 IPv4;它只是把相似当成了身份,并据此作出真实的转发决定。

RFC 9790 处理的是一个只有十六种取值的空间,但它揭开的风险并不小:观察不等于上下文,上下文也不等于结果。

四个比特只证明四个比特存在

MPLS 报文由二层报头、若干四字节标签栈条目、可选的栈后报头以及可选的嵌入报文组成。最后一个标签条目的 Bottom-of-Stack 位告诉设备标签在哪里结束。它没有告诉设备后面必然是什么。

Post-stack First Nibble(PFN)只是标签栈后第一个字节的高四位。若后面恰好是裸 IPv4,它与版本号 4 重合;若是裸 IPv6,它与 6 重合。若后面是以太网帧、控制字、关联通道或其他栈后报头,这四位属于那个结构。

因此,RFC 9790 明确指出:必须结合前置标签条目或标签组在控制面、管理面中建立的上下文,才能正确解释 PFN。抓包能够证明线路上出现了 0x4,却不能靠这个事实证明报文是 IPv4。

这正是现实层纪律。比特属于数据平面观察;标签绑定说明预期服务;实现选择一种解析器;转发表再作出动作。把四句话压缩成“它是 IP”,就把推断伪装成事实。

猜测已经成为隐蔽的转发策略

旧方法之所以流行,是因为 IP 五元组适合分流。遇到 0x4 就按 IPv4 读取,遇到 0x6 就按 IPv6 读取,其他值退回标签栈哈希。对真正的裸 IP,这比只看顶层标签细致。

前提错误时,细致反而放大危险。以太网目的 MAC 可以以 4 或 6 开头。RFC 8469 说明,正式分配的 MAC 和隐私随机化地址都会产生这种模式。没有伪线控制字时,设备可能把以太网内容误读成 IP 字段,在无意义的偏移上制造哈希键。

后果并不限于统计不漂亮。属于同一有序流的报文可能被送到不同成员链路而乱序;差异化转发设备也可能基于虚构出来的“IP 字段”套用策略。四位启发式规则于是拥有了选择路径、定义流和改变服务质量的权力,却没有相称的证据。

语义来自标签上下文,而非视觉相似

RFC 9790 改变了提问方向。不是先问“这四位像什么”,而是先问“前面的标签绑定允许什么结构出现”。当 MPLS 载荷既不是 IPv4 也不是 IPv6 时,新规范要求使用首半字节不为 0x4 或 0x6 的栈后报头。

伪线控制字的一个价值,就是让旧硬件不会误启动 IP 解析器。它并不验证来源,也不证明后续帧正确;它只消除一种可预见的歧义。边界越准确,承诺越可信。

IANA 的 PFN 表故意允许复用。0x0 同时用于 DetNet、NSH 和伪线控制字,0x1 也服务多个关联通道。它们要靠前置服务标签区分。若把 PFN 当成全球唯一的类型号,反而误解了这份登记表的设计。

这与 Heng Lu 的最小初始规范相呼应:公共层只保存互操作真正需要的值、引用与约束。节点仍须依据自己持有的标签状态作本地验证。登记表协调语义,不替设备看包,更不替运营者证明结果。

两张登记表不是同一命名空间

IP Version Numbers 登记的是 IP 报头里的版本;Post-Stack First Nibble 登记的是栈后报头类型。RFC 9790 说,两者只有 4 与 6 因向后兼容而交叉。

新的 PFN 登记表覆盖十六个值,并以 Standards Action 管理新增条目。它能让占用、复用和引用变得可审计,但一条登记记录只证明规范状态。它不能证明现场报文符合该规范,不能证明某块线卡实现了对应解析,也不能证明配置已经启用。

登记不是运行。发布也不是采用。最危险的运营简写,是看到“已在 IANA 登记”便把后续所有因果链一并标绿。

把熵放到真正拥有上下文的位置

RFC 9790 推荐用专门标签承载负载分担信息,例如 RFC 6790 的 Entropy Label 或 RFC 6391 的 FAT Pseudowire Label。入口设备尚未被 MPLS 封装遮住视野,知道业务与原始报文格式,适合选择真实流字段并生成熵值。

在 RFC 6790 中,保留标签 7 是 Entropy Label Indicator,紧邻其后的才是 Entropy Label。中转节点只需对标签栈取哈希,无须猜测嵌入载荷。这不是把所有权交给入口,而是把判断放在信息更充分的位置。

显式也不等于成功。端点能力需要信令,标签栈深度有硬件限制,入口的哈希算法仍可能把大流撞到同一链路。熵标签能证明报文携带了一个明确值,不能证明利用率均衡、延迟达标或报文没有乱序。

FAT 伪线还保留单路径默认值,流感知模式是可选项。动态环境要交换发送、接收能力,静态伪线则要在两端一致配置。抓到一个 Flow Label 不能替代两端协商记录,更不能证明每个中转设备都按预期使用它。

废弃是一条方向,不是已经完成的迁移

RFC 9790 更新 RFC 4928,要求新实现、新部署不得再根据 PFN 推断载荷类型,同时让旧路由器继续原有行为。它还要求在彻底淘汰相关封装之前,先收集市场与部署中是否仍使用启发式分流的证据。

因此,网络会长期处于混合状态。标准文本改变了设计基线,却不会自动更新现网 ASIC、线卡与软件版本。同一条端到端业务可能经过行为不同的节点。

运行代码优先要求的不是相信“已废弃”标签,而是能回答:这台设备收到什么标签与报头?它持有什么上下文?实际使用哪些哈希输入?稳定流最终走了哪条成员链路?

让证据在边界处停下来

一次可复核的事件至少应保留九层记录:完整标签栈与栈底位置、紧随其后的原始字节与 PFN、当时的标签绑定、适用的报头规范与 IANA 条目、设备型号和解析版本、显式熵标签或回退哈希输入、每个稳定流的成员选择、乱序损失与时延观测,以及客户或应用结果。

抓包能支持前两层,控制面快照支持标签上下文,配置与能力记录支持解析路径,转发遥测和重复探测才支持路径与性能。任何一层都不能被“首半字节是 4”替代。

RFC 9790 的贡献不是赋予四个比特更多权威,而是拿走它们不该拥有的权威。可靠的协调系统不让符号变成主权者;它要求每一次跨层推断都出示自己的收据。

来源

  1. RFC 9790 — IANA Registry and Processing Recommendations for the First Nibble Following a Label Stack
  2. RFC 4928 — Avoiding Equal Cost Multipath Treatment in MPLS Networks
  3. RFC 3032 — MPLS Label Stack Encoding
  4. RFC 4385 — Pseudowire Emulation Edge-to-Edge Control Word
  5. RFC 6790 — The Use of Entropy Labels in MPLS Forwarding
  6. RFC 6391 — Flow-Aware Transport of Pseudowires over an MPLS Packet Switched Network
  7. RFC 8469 — Recommendation to Use the Ethernet Control Word
  8. IANA — Post-Stack First Nibble
  9. Heng Lu — Running-Code Primacy
  10. Heng Lu — Minimum Initial Specification, Localized Future Decision, and Voluntary Adoption
  11. Heng Lu — On Reality Layers, Symbolic Power, and Why Clarity Feels So Hostile