摘要
- RFC 3353 揭示了流量触发组播 LSP 的启动循环:下游节点要先看到数据包才知道需要分支,但在分支建立前,数据包又不能通过二层抵达。
- L2/L3 混合转发或由上游发起标签交换可以打破循环;不过首包到达、组播路由状态、标签信令、硬件复制与接收端交付仍是五种不同的事实。
先看一个只有两步的场景。一条组播流已经沿 MPLS 到达旧接收端,新接收端在另一个下游路由器之后加入。为了不让沉默的组长期占用标签,系统决定“见包再建”。新节点收到首包后触发标签分支,似乎既经济又灵活。
问题在“收到”二字。若新节点要在 L2 看到首包,首包就必须走一条已经存在的 LSP;若 LSP 已经存在,就不需要首包来触发它。RFC 3353 第 5.3.1 节把它直称为鸡与蛋问题。真正的矛盾不是先后顺序难以描述,而是观察者和执行者位于分支两侧,自动化缺少一条启动路径。
这份 2002 年 8 月发布的文档属于 Informational,而不是一项互联网标准。它提供的是问题框架:当 IP 组播路由产生一棵会分叉、会增删成员、会切换根与源的树,MPLS 如何把这些状态映射成标签交换路径。单播常可围绕一个目的地和下一跳组织;组播的一个入接口可能对应多个出接口,树形本身就是执行语义。
状态粒度先决定成本。共享树以 (*,G) 表示,同一组的多个源共用状态,标签数量较少,却会引出多点到多点与合并能力。源树以 (S,G) 表示,每个源与组分别建树,合并问题减轻,标签和状态却随活跃源增加。RFC 3353 没有选出“最佳”组播协议,因为标签空间、底层链路能力和树的动态程度各不相同。
Flood-and-Prune 把时间因素放大。数据出现时,路由器创建状态;不需要流量的分支被剪除;空闲计时器到期后,本地状态又可消失。若 L2 紧跟每一次变化,信令和标签会频繁抖动;若提前为所有树建 LSP,沉默流量也占用资源;若等数据出现再建,首包延迟和启动可见性就成为代价。
RFC 3353 将触发机制分成三类。请求驱动会截获 Join、Prune 或资源预留消息;拓扑驱动把组播路由表中的树映射到 L2,即使没有实际数据;流量驱动只在包到达后建立路径。这三个名字不是同一功能的不同按钮。它们分别把成本放在协议耦合、空闲状态和首包启动上。
打破循环的一种办法是让上游先行动。已经看见流量的上游 LSR 可以向下游请求标签,也可以根据模式分配并通告上游标签。此时,观察者与触发者处于同一侧,不必让尚未连通的下游先提供证据。RFC 3353 的组合表因此把触发方向与标签分发方向绑定起来,而不是允许任意拼装。
另一种办法是 L2/L3 混合转发。同一台节点可以让已有分支继续在二层交换,同时把新分支暂时交给三层 IP 转发。首包经 L3 抵达,形成实际需求证据;系统再完成标签交换与硬件编程,之后才把该分支切到 L2。这里的混合并非架构不纯,而是保留了一条可逆的过渡通道。
混合转发也必须防止重复。L3 引擎要知道哪些出接口已经由 L2 提供副本,否则同一接收方向会得到两份包。RFC 3353 明确指出,没有混合能力时,由下游根据流量发起标签的组合会陷入循环;只有上游主动的分发方式能让建立继续。触发机制与分发模式存在依赖边,配置界面若把它们画成互不相关的选项,就会制造一个永远等不到首包的状态。
由此可以建立清晰的证据阶梯。上游看到一个包,只能证明该包到达了这个观察点。组播转发缓存 miss,只能证明本地缓存没有对应条目。MRT 中出现一行,只能证明控制进程持有本地树状态。标签请求或映射,只能证明一次信令阶段发生。芯片表项写入,只能证明本设备接受了转发动作。要说某个接收端收到,还必须在那个接收端或其可信边界看到数据。
RFC 3353 的 Unix Multicast Forwarding Cache 例子进一步说明:执行层变化会改变观察层。首包在内核中产生 cache miss,组播守护进程返回路由信息;后续流量一旦进入 L2 标签交换,L3 就不再亲自处理这些包。如果 L3 的空闲计时器只看自己的计数,明明活跃的状态可能被误判为沉默并过期。
文档提出用 L2 测量更新 L3 计数器。做法务实,但这是一种跨层投影。此时计数器不再只表示“L3 转发了多少包”,而是包含“L2 报告某个关联分支仍在活动”。来源、采样窗口、重置时间、分支映射若不被保存,数字仍会增长,却失去可解释性。把执行移到更低层,不会消灭观测责任,只会要求新的对账。
PIM-SM 的共享树与源树共存又制造了一类过渡状态。路由器可能同时拥有 (*,G) 与 (S,G);从 RP 树切向最短源树时,同一源的包可能短暂从两个入接口到达。L3 可以依靠源特定状态抑制错误副本。纯 L2 方案则需容忍短暂重复、为活跃源另配标签,或把部分流量交还 L3。标签负责快速执行,却不能替代“哪个副本应当继续”的语义判断。
封装边界更加直接。共享树源可以把数据隧道送到根节点,在根处解封装。封装与解封装是 L3 操作,因此一条端到端 L2 LSP 不可能像根节点没有解析过包一样连续穿过。MPLS 仍可服务隧道本身或其他分支,但架构图必须承认回到 L3 的位置。
把标签映射附带在组播路由消息中,也不是免费的同步。它能让路由与标签更接近,减少独立消息;代价是为每种组播协议增加扩展,排除若干触发组合,并可能把 LDP 基于 TCP 的可靠交换换成周期性软状态。看到一条同步消息,仍不代表数据面已完成复制。
多接入链路会把标签权力问题推到表面。同一组播流的多个下游节点必须接受相同标签。它们可以记住共享链路上的所有分配、划分标签范围,或选出一个分配者。上游分配符合“树上只有一个上游”的结构,但拓扑变化可能替换上游;下游分配更能保留上游变化前的标签,却要解决多个下游提议不一致。RFC 3353 把选择留给实现与运营条件。
后续标准将分支写得更具体。RFC 4461 提出了 P2MP TE LSP 的建立、增删叶子、故障报告和扩展性要求。RFC 4875 用 RSVP-TE 定义由多条 source-to-leaf sub-LSP 组合而成的 P2MP LSP,分支路由器负责合并信令与复制数据。它特别提醒:信令状态可以发生“分支”,而数据面并不一定在同一点复制。这句话直接阻止了把控制树当成交付凭证。
RFC 5332 还修正了 2002 年视角中的一个假设。RFC 3353 提到 MPLS 单播与组播使用不同链路层 codepoint;RFC 5332 记录这种用法从未部署,并把第二个 codepoint 重定义为多接入介质上的上游分配标签。历史文章应同时保存早期框架与后来的纠正,不能把设计空间写成部署事实。
到 RFC 6513 的 BGP/MPLS IP VPN 组播架构,系统仍在分发树与通过单播隧道做入口复制之间权衡。前者增加共享控制状态,后者让入口多发副本、消耗带宽。复制可以换位置,却不会免费。
RFC 3353 最值得保留的,不是某种方案最终胜出,而是它拒绝把启动瞬间抹平。标签分支之前,必然有一个观察、一个临时路径或一个上游决定;信令之后,仍有编程、复制与接收验证。网络的真实含义存在于这些阶段之间。
来源
- RFC 3353:MPLS 环境中的 IP 组播
- RFC Editor 的 RFC 3353 记录
- RFC 3353 勘误记录
- IETF Datatracker 的 RFC 3353 历史
- RFC 3031:MPLS 架构
- RFC 3032:MPLS 标签栈编码
- RFC 3036:LDP 规范
- RFC 2236:IGMP 第 2 版
- RFC 2362:PIM 稀疏模式
- RFC 4461:P2MP TE MPLS LSP 信令需求
- RFC 4875:P2MP TE LSP 的 RSVP-TE 扩展
- RFC 5332:MPLS 组播封装
- RFC 6513:MPLS/BGP IP VPN 中的组播
- Lu Heng:Running-Code Primacy
- Lu Heng:Minimum Initial Specification
- Lu Heng:Reality Layers
会员简报
档案背景详情
使用相应会员等级登录,即可解锁完整简报与来源注释。
仅限 Strategic Circle
Strategic Circle
所有读者均可浏览。加入并登录后可解锁档案简报。
加入 Strategic Circle仅限 Leadership Alliance
Leadership Alliance
符合条件的 IP 资产所有者和管理层可登录查看 Leadership Alliance 简报。
加入 Leadership Alliance
