摘要

  • RFC 5308 用 TLV 236 表达 IPv6 前缀可达性,用 TLV 232 表达 IPv6 接口地址,并用 NLPID 142 声明 IPv6 协议支持。这是三类不同的陈述,不是一张合并后的转发收据。
  • 在共享的标准拓扑里,IPv6 路径通过 SPF 仍不足以证明交付。运维方还要把路径逐跳连接到 IPv6 能力、RIB、FIB 和真实报文结果;RFC 5120 可令拓扑成员资格显式化,却同样不能替代数据平面验证。

消失的不是路由,而是中间一跳的能力

想象一次看似无可挑剔的计算。目的前缀已经出现在链路状态数据库中,度量值没有越界,SPF 给出了稳定的前驱与下一跳。两端设备都支持 IPv6。可是所选路径中间有一台设备,只在共同的 IS-IS 图里建立了邻接,并没有满足这条 IPv6 路径所假定的转发条件。第一个数据包到达那里,控制平面的确定性就结束了。

这不是对某次事故的复述,而是 RFC 5308 与 RFC 5120 放在一起阅读后出现的制度性边界。前者让一个 IS-IS 进程能够承载 IPv4、IPv6 与 OSI 的信息;后者在需要分离路径时提供多拓扑成员资格。默认拓扑里的邻接只说明设备参加了 IS-IS 的连接关系。它没有承诺所有地址族在每条接口、每块线卡、每个路由上下文和当前 FIB 版本上都具备同等能力。

危险之处在于,每条单独记录都可能完全正确。起点确实发布了 IPv6 前缀,接收者确实完成了 SPF,中间路由器也确实是普通拓扑的邻居。错误只出现在把这些事实拼成“IPv6 一定能通过”时:那一步缺少逐跳能力连接。

三个编号,三种权限范围

TLV 236 是 IPv6 Reachability。每个条目携带前缀、32 位度量值、向下位、外部来源位以及可选的子 TLV。U 位说明路由是否沿层级向下传播,X 位说明它是否由另一种路由协议重新分发,S 位说明后面是否存在子 TLV 区块。三个比特都不能回答数据包是否已被转发。

TLV 232 则描述 IPv6 接口地址,而且其语义依赖承载它的 PDU。在 Hello 中,它只能包含发送接口的链路本地地址;在 LSP 中,它只能包含发布该信息的中间系统所拥有的非链路本地地址。若采集系统只保存地址而丢掉 PDU 类型,同一个值就可能被错误地提升为全域身份,或者被剥离原本的作用域。

NLPID 142 是第三类陈述。通过 IS-IS 支持 IPv6 路由的系统必须把这个标识放入 Protocols Supported TLV。它比“看见了 IPv6 前缀”更接近能力声明,但依然来自路由进程。它不证明特定接口的邻居解析成功,也不证明特定线卡、VRF 或正在生效的 FIB 世代已准备好转发报文。

数据库里存在,不等于进入正常选路

一个 LSP 可以包含零个、一个或多个 TLV 236。链路本地前缀不得通过该 TLV 发布。前缀字节按前缀长度压缩到最短表示,因此可靠的证据必须同时保留长度字段和实际有效字节,不能只存一个格式化后的字符串。

度量值还有更明确的边界。RFC 5308 沿用扩展度量机制中的 MAX_V6_PATH_METRIC,其值为 0xFE000000。度量值大于这个上限的前缀不得被正常 SPF 计算采用。该发布仍可能为了其他用途存在于数据库中。标准因此明确允许“可见但不具备正常路由资格”的状态。

遥测若只给出“已学习路由”,就抹掉了这条重要界线。至少应区分:LSP 中已观察、语法已接受、正常 SPF 可用、偏好已比较、度量值获胜、下一跳已解析、RIB 已安装、FIB 已编程,以及报文已交付。RFC 本身已经证明,数据库存在范围大于正常转发资格。

共享拓扑需要额外的不变量

普通 IS-IS 邻接可以传播描述多个网络层协议的 LSP。RFC 5308 要求具备 IPv6 路由能力的节点发布相应 NLPID,却没有把标准拓扑重定义为一张自动排除非 IPv6 节点的图。因此,集成拓扑要安全运行,必须有一个图外不变量:凡是可能成为 IPv6 路径中转节点的设备,都必须具备适用的 IPv6 控制面与数据面能力。

这个证明应当绑定到具体路径。资产清单里的“IPv6 已启用”远弱于一张能够关联所选前驱、下一跳、接口、路由上下文、软件能力、FIB 世代和报文观测的收据。ECMP 会把要求扩展到所有候选成员;一次探测成功只说明它碰巧走过的成员可用,不能替其余等价下一跳作证。

控制平面认证也不能补齐缺口。经过正确认证的 LSP 可以真实地声明邻接和 IPv6 前缀,而被选中的中间节点仍可能没有可用的 IPv6 转发表项。真实性回答“谁说了什么”,没有回答“整条转发链是否完整”。

多拓扑把“属于哪张图”写出来

RFC 5120 在 IIH 中显式表达拓扑参与。对点到点接口,如果对端没有发布某个拓扑 ID,本地路由器不得在该拓扑的 LSP 中包含这个邻居;双方没有共同拓扑时,也不应建立邻接。MT ID 2 保留给 IPv6 路由,TLV 237 则在继承 TLV 236 的 IPv6 可达性格式之前加入拓扑成员字段。

广播 LAN 的规则提醒我们,邻接仍然不是地址族授权。即使两台路由器没有共同的多拓扑,它们在 LAN 上仍会形成邻接,以保证所有参与者选出相同的 DIS。之后,拓扑专属的可达性必须受真正的共同成员资格约束。基础邻接是真的,却不能被解释为可以在所有拓扑中使用这个邻居。

分离 IPv4 与 IPv6 图可以消除一类错误的中转假设,同时也新增了运行状态:成员资格、拓扑专属 overload、TLV 237、独立 SPF 结果,以及可能独立的 RIB。同一地址族的多个拓扑若在一条接口上使用重叠地址,RFC 5120 还要求本地另有机制,为进入的报文选择正确 RIB。协议把差异表达出来,并没有替设备完成数据面决定。

后来的偏好修正不能被旧实现吞掉

RFC 5308 最初用 Level 1 up、Level 2 up、Level 2 down、Level 1 down 排列 IPv6 偏好。RFC 7775 随后指出,两层 IS-IS 模型并没有相应的 Level 2 inter-area 路由类型,因此不应以这种方式引入“Level 2 down”类别。它用符合 TLV 236 与 TLV 237 实际路由类型的规则替换了原描述。

审查实现时,应以 RFC 7775 的修正规则为准,而不是把 2008 年的排序当成最终答案。采集记录也应保留完整元组:TLV、拓扑、层级、U/X 位、来源协议、度量值、偏好类别与 SPF 世代。这样,即便标准后来修正某个字段的解释,原始 LSP 字节与当时决定仍可重新计算。

真正有用的收据必须沿 IPv6 报文逐跳前进

一张无需包含机密的收据,可以连接这些信息:节点身份、邻接及 PDU 类型;拓扑 ID;Protocols Supported TLV 与 IPv6 NLPID;TLV 232 地址及其 Hello/LSP 上下文;TLV 236 或 237 的前缀、U/X/S 位、度量值与子 TLV;SPF 世代;所选前驱与下一跳;全部 ECMP 成员;每个中转节点的 IPv6 能力;RIB 选择;FIB 世代及编程结果;链路本地邻居解析;探测路径;交付结果;以及回滚决定。

这不仅是日志更丰富。它保留了两种权力之间的界线:路由进程可以描述可达性,转发系统才负责移动报文。图可以作为图完全正确,而“IPv6 已经穿过这条路径”仍然没有得到证明。

Sources