摘要

  • RFC 1954 只接手 RFC 1953 已经允许的那一步:把一个被上游邻居接受的 IFMP 标签落实为 ATM 的 VPI/VCI 和三种 AAL-5 载荷之一;未被重定向的 IPv4 与 IFMP 控制消息仍走 VPI 0、VCI 15 的默认通道。
  • 在带标签 VC 上观察到单元,能证明特定接口在特定时刻选择了本地数据面格式;它不能单独证明整包重组、下一跳接收、端到端交付、发送者身份、操作授权、规模部署,更不能证明它是 MPLS 的直系祖先。

先看一段看似不重要的减法。

Type 0 只删掉 LLC/SNAP 头。Type 2 从原始 IPv4 头中省略 10 个字节,再插入两个 Reserved 字节,净缩短 8 个字节。Type 1 少发 16 个字节,连源地址、目的地址、协议号,以及 TCP 或 UDP 的源端口和目的端口都不再随包出现。对后两类流而言,接收者仅凭载荷本身已经无法还原原始 IPv4 报文;虚电路和此前建立的流状态,变成了解码语境的一部分。

这正是 RFC 1954 比“标签交换的早期故事”更值得重读的地方。它并未宣布一套世界架构,而是谨慎地说明:在一条 ATM 链路上,当控制面已经做出选择,数据面究竟发往哪个虚电路,又究竟省略哪些重复字段。

三种格式把状态依赖写进字节

Flow Type 0 最接近普通 IPv4。它采用 RFC 1483 的 VC 多路复用空封装,不再携带 LLC/SNAP,但第一个载荷字节仍是 IPv4 的 Version/IHL,完整 IP 数据报都在,MTU 仍为 1500。协议类型从包内前缀移到了预先约定的 VC,IP 头本身没有被压缩。

Flow Type 1 则把重复信息交给绑定状态。它不发送 Version、IHL、TOS、TTL、Protocol、源地址和目的地址;IP 头之后的前 4 字节也不发送,对 TCP/UDP 来说就是两个端口。载荷开头只留下 Total Length、Identification、Flags、Fragment Offset 和 Checksum,随后才是数据。可承载的原始 IPv4 MTU 降为 1484。

Flow Type 2 保留更多现场信息。它从原始 IPv4 头省略 Version/IHL、TTL 和两端地址,共 10 个字节;线上格式补入两个 Reserved 字节,所以净缩短 8 字节,原始 IPv4 MTU 为 1492。TOS、Protocol 以及头后前 4 字节仍然保留。

两种压缩格式有两个颇能说明问题的细节。第一,Total Length 仍是删字段之前的 IPv4 总长度,不是实际发送的短载荷长度。第二,发送的校验和按“TTL 为零时应有的值”计算,也就是把逐跳变化的 TTL 从校验关系中扣除。它们都暗示接收端在重建一个既有数据报,而不是接收一种自足的新协议。

不能靠长度猜 Flow Type。AAL-5 在 8 字节尾部之前可填充 0 到 47 字节,分片又会改变保留字段的意义,不同应用数据也可能碰巧同长。真正的解析规则来自 VC 绑定的 Flow Type。一旦状态过期、被错误复用或交换机配置滞后,同一串字节就会进入错误的头部模板。

优化没有消灭信息。它只是把每包重复的信息迁移到共享状态;随之迁移的,还有故障位置与审计责任。

默认 VC 是控制面的退路

RFC 1953 规定谁有资格提出捷径,也规定对方可以拒绝。下游节点把流与标签的绑定发给上游邻居;上游可以忽略任何 Redirect。接受后的绑定有寿命,冲突或到期会让流回到默认状态。RFC 1954 不重复裁决这件事,它从接受之后开始。

默认 IPv4 帧使用 RFC 1483 的 LLC/SNAP 路由协议封装。八字节前缀说明后面是 IPv4,随后完整数据报被放入 AAL-5 CPCS-PDU;IPv4 MTU 为 1500。它固定使用 VPI 0、VCI 15。IFMP 控制消息也必须从这里通过。

因此,0/15 不是“优化失败时随便找的旧路”。它是让邻接双方在没有标签、标签失效、Redirect 被拒绝或状态发生矛盾时仍能理解彼此的共同语法。捷径可以消失,控制通道与完整 IP 封装仍然存在。

RFC 1954 只另外承认 0/0 表示未分配单元。它明确不使用 ATM 的 OAM 单元、CLP 位或 ABR RM 单元。抓包里看到这些机制,并不能因为同一接口也跑过 IFMP 就归因于这份 RFC。

标签没有成为新的身份证

IFMP 的 Label 字段长 32 位。放到 ATM 上,低 16 位对应 VCI,再往上的 12 位对应 VPI,最高 4 位保留。链路如果不支持完整位宽,未用的高位必须为零;发送端应清零保留位,接收端忽略它们。

这段映射把标签变成某条链路上的虚通道选择,而不是跨网络通用的名字。同一组 VPI/VCI 在不同端口、不同方向、不同邻接生命周期里可以有完全不同的含义。脱离接口、方向、绑定寿命和 Flow Type 保存一个数字,等于保留了外壳却丢掉了解释权。

它也不能替代交换机控制。RFC 1987 的 GSMP 让控制器建立或释放 ATM 交换连接、管理端口、读取配置与统计、接收链路事件。RFC 1954 负责被选中 VC 上的 IPv4 载荷长什么样。两份规范可能围绕同一个 VPI/VCI 工作,却描述不同的执行者和不同的成功条件。

若要证明一次真正的转发,记录至少要把这些环节连起来:哪一个邻接、哪个方向、哪次 Redirect、是否接受、寿命是否仍有效、Flow Type 是什么、端口支持什么位宽、交换连接是否当时存在、AAL-5 是否完成重组、接收端是否按正确格式补回被省略的字段。VPI/VCI 本身只回答其中一个问题。

单元证据停在链路上

ATM 交换的是单元,而一个 AAL-5 CPCS-PDU 横跨一串单元。看到某个单元带着已知 VPI/VCI,只能确认发送接口在观察点选择了该虚通道。收齐单元、验证 AAL-5 尾部以后,才有资格谈完整载荷;再结合当时的 Flow Type,才能谈 IPv4 头重建。

即便如此,证据仍没有越过这条链路。它没有证明下一节点正确补回地址、协议或端口,没有证明 IP 包通过后续路由,更没有证明终端应用收到并处理了数据。RFC 1954 的安全章节只说没有讨论安全问题。标签不是凭证,校验和不是签名,虚通道也不是授权书。

更稳妥的证据梯子是:收到 Redirect;决定接受;绑定仍有效;交换连接已编程;发送端选择带标签 VC;AAL-5 完整重组;省略字段正确恢复;IPv4 继续转发;下一跳观察到;终点接收;应用产生结果。每一级只能为下一级提供条件,不能替下一级出具收据。

相似术语不能自动组成家谱

RFC 2105 后来描述 Tag Switching,RFC 3031 给出 MPLS 架构,RFC 5036 又规定 LDP,包括 ATM 标签相关机制。它们都尝试把重复的转发判断沉淀为状态,再用较短的标签驱动数据面。这种结构相似值得研究,但不是因果证明。

RFC 1954 自己是一份 Informational 私有协议记录,不是 IETF 工作组成果,也不是标准轨架构。仅凭“label”、VPI/VCI 或后来的 ATM LSR,不能推出实现继承、代码复用、互操作演进或产业采纳。要建立谱系,还需要设计记录、作者证言、代码历史、部署资料与可比的运行轨迹。

Heng Lu 所说的运行代码优先,在这里并不是轻视文档。恰恰相反,它要求把文档读到准确的尺寸:共同规范只负责可验证的最小边界,后续接受、执行、采纳与效果由各自的运行事实证明。把一个本地标签抬升为身份、授权或历史正统,正是让符号吞掉现实层。

一个单元确实带着标签驶过。但它给出的事实很窄:这个接口、这个时刻、这条 VC、这种帧语法。窄并不等于无用;窄是它可信的原因。

来源