摘要

  • RFC 1504 让各自管理、号码可能冲突的 AppleTalk 网络通过隧道相连:隧道内使用由域标识与原始网段组成的唯一身份,本地再分配可用号码。
  • 本地号码只是呈现层。它若沿冗余路径返回、又失去原来的 DI/UI 来历,创建它的路由器会把自己的翻译误认成真实新网络,再做一次映射,形成“影子网络”。
  • 一个可用路由、一个 RI-Ack 或一行 MIB 数据都不足以闭合事实;还需保留映射时代、入站端口、连接与序列、快照和增量关系,以及实际业务包的结果。

号码复用前,旧身份是否真的离场

1993 年8月,Apple Computer 的 Alan Oppenheimer 以信息性 RFC 的形式发布了 RFC 1504。文件的目的,是完整记录一种可能运行在 Internet 之上的 Apple 协议,而不是制定 Internet 标准。它描述的 AURP 面向 AppleTalk Phase 2,把远端 AppleTalk 网络经 IP 等“外来网络”或点对点链路连接起来。

这份长文最有价值的地方,不是证明 AURP 曾经有多普及。资料没有给出部署数量。它留下的是一个极其具体的失败:路由器可以收到一个格式合法、号码也在本地范围内的网络,却无法判断那其实是自己先前制造的别名绕了一圈以后返回。

物理世界没有多出一张网。路由表里却可以多出一个影子。

冲突并不意味着任何一方号码“错误”

两个机构独立管理各自的 AppleTalk internet 时,完全可能使用相同的网络号。各自内部都没有冲突;隧道把它们放到一起后,号码才失去唯一性。

AURP 没有把其中一方的既有编号宣布为无效,而是引入两层表达。网络穿过隧道时使用唯一标识 UI。执行重映射的外部路由器把自己的域标识 DI 与原始网络号或网段连接起来,构成这个 UI。网络进入另一侧本地环境时,再从专用重映射区间取得一个不冲突的本地号码。

旧式节点继续使用普通 AppleTalk 网络号。边界路由器负责在本地呈现与隧道身份之间转换。这种安排保留了两侧的自主选择,也把责任集中到了映射关系上。

一个本地号并不自带“我来自哪个 DI、原来是哪一段”的说明。同一 UI 在不同地方可能显示为不同数字;同一个数字在不同时刻也可能服务于不同 UI。仅比较号码,既不能证明同一,也不能证明不同。

静态映射花号码,动态映射花历史

静态映射预先把某个本地号留给某个 UI。运维人员容易对应,代价是重映射区间很快被占满。动态映射在远端网络出现时才分配,容纳能力更大,代价是号码会进入多个时代。

RFC 1504 建议:在还有其他号码可用时,不要复用旧号码;一个网络刚下线,也不要立刻把它的 UI 或本地位置给新出现的网络。原因是路由表删除只描述当前表。延迟包、邻居缓存、管理记录和另一条路径仍可能携带旧含义。

因此,“本地 47 对应远端 X”不是完整记录。完整记录至少是:路由器、端口、映射时代、DI、原始网段、本地 47、生效时刻和撤销时刻。没有时代,47 只是一个会换人的座位。

重映射数字本身解决了执行问题;只有历史记录才能解决调查问题。

翻译器只认识自己理解的字段

RFC 1504 指定路由器可重写 DDP 报头中的网络号、NBP 实体地址和 AURP 路由数据。重写可能改变报头,也可能改变数据内容。如果包里有 DDP 校验和,路由器要先验证,然后在重映射后把校验和值设为零;旧值已经不能覆盖新的字节序列。

可是第三方协议可能把 AppleTalk 地址藏在任意位置。边界路由器不了解其语法,就找不到那些数字。外层包可被正确转发,内层引用仍指向旧号码。于是隧道在线、路由存在、确认返回,应用仍会失败。

网络管理也暴露了视角差异。跨隧道查询设备时,回应数据可能带回未重映射的原始号。管理站必须另外读取 AURP 映射库,才能把原始值与本地呈现对上。RFC 1742 后来为 AppleTalk 端口、RTMP 表和计数器定义了标准管理对象,增强了观察能力,却没有让单个 MIB 值变成跨边界身份。

如果仪表盘把原始 UI、本地别名和管理回应压成一个“网络号”,它不是简化了真相,而是删除了判断条件。

别名沿第二条路回到了出生地

影子网络需要冗余路径。两个 AppleTalk internet 既通过隧道连接,又被另一条路径相连。某个远端网络进入隧道边界时被改成本地号;这个本地号随后在本地网络传播,经备用路径返回最初创建映射的外部路由器。

返回时,它不再携带原始 DI 与网段构成的隧道 UI。对路由器而言,这个号码与一个真实本地网络没有明显差别。路由器因而把它当成新发现的网络,再映射一次,再通过隧道导出。

现在,两个号码指向同一张物理网络。下一圈还可能产生第三个。RFC 1504 把这种表中副本称为 shadow network。循环会持续到表面跳数超过限制。

跳数上限能终止可达性,不能恢复来历。一个条目因为“太远”被抛弃,并不会自动告诉运维人员它其实是另一个条目的回流副本。

真正的故障组合是:翻译改变呈现,冗余扩大路径,回流信息丢失来源。任何一项单独存在都未必制造影子,三者叠加才让一个真实对象变成多个表中对象。

“一条虚拟链路”是协议前提,不是测量结论

AURP 把多点隧道当作一条虚拟数据链路,并要求外部路由器在这条隧道上执行 split horizon:只导出本地网络,不把同一隧道上从其他外部路由器学来的路由再送回去。

规则隐含了全互通前提。现实中的多点隧道可能只部分互通,可能是管理员有意限制,也可能是配置错误。中间路由器通常不能只凭协议状态判断是哪一种。

若 A、B、C 实际只能 A—B—C 通信,逻辑模型却把三者标为同一共享链路,split horizon 会阻止 B 转交必要信息。把它们建成两条独立隧道反而能诚实表达拓扑。这里的关键不是某个配置一定正确,而是逻辑标签不能替代邻接事实。

部分启用重映射,让检测能力也变成“部分”

重映射按路由器配置。RFC 1504 警告,同一隧道上有些路由器启用、有些不启用时,号码冲突更可能出现。更隐蔽的是检测不对称:重映射路由器执行相关循环检测,未重映射的路由器不执行。

循环如果形成在两个未重映射的外部路由器之间,它们不会把它识别为重映射循环;信息最后到达启用重映射的路由器时,已经可以表现为多个影子副本。

两个冗余的重映射路由器还必须为同一本地 internet 使用相同 DI,并把相同远端 UI 映射到相同本地号。文件提出可由管理员完整配置,或未来由一个路由器向其他路由器提供信息,同时明确说明 AURP 当时并不支持这种同步功能。

第二条物理路径很容易增加;第二份一致身份状态却没有随路径自动出现。

相似只触发调查,回流探针才增加证据

RFC 1504 允许用网段大小与 zone 列表判断某条信息“可能表明循环”。它没有把属性相同直接当作有罪判决,而是要求启动 loop-investigation:从隧道发出一个 AppleTalk 数据包,再观察它是否从本地端口返回。

这把证据分成了两层。属性相似生成假设;同一探针实例返回,说明当前拓扑确有回流路径。探针仍不能证明管理员意图、长期稳定性或所有应用的结果,但它足以支持有边界的本地处置。

安全章节同样克制。RFC 1504 只讨论 network hiding 与 device hiding,并称之为较弱的安全形式;一般安全问题不在范围内。Chooser 看不见某个服务,不能证明网络不存在,更不能证明路由得到认证。

一次 RI-Ack 没有让所有路由器处在同一时刻

AURP 通过初始交换加后续事件,减少 RTMP 与 ZIP 周期流量。单向连接有连接 ID,包有序列号,发送者收到 RI-Ack 后才继续;确认丢失时会重发对应回应。

可靠交付并没有把全网状态变成原子快照。新对等方可能在旧对等方还有事件待发送时接入。它收到的 RI-Rsp 快照与之后到达的 RI-Upd 事件可能看起来不一致。

RFC 1504 为此给出容错解释:未知网络的距离变化可按新增处理;已知网络的新增可按距离变化处理;未知网络的某些下线或路径变化可忽略。这些规则帮助接收方形成可运行状态,却不能证明每个对等方在同一时刻持有相同表。

如果接收方表溢出,丢失的网络信息不会必然作为增量重新传送。接收方应重新发 RI-Req,取得完整路由表。历史一旦出现孔洞,最新一条事件不能证明孔洞里没有关键变化。

拆解影子需要六张凭证

至少应保留六类关联记录:原始 <DI, 网段>;本地映射与时代;连接 ID、序列号及快照/事件类型;入站端口和路径;选中的下一跳与表版本;绑定具体服务和时间的探针或业务结果。

用这些记录才能回答:这是两个域合法重号,还是一个 UI 被显示成两个别名?这是号码复用,还是自己的翻译绕回?这是路由身份问题,还是内嵌地址未被翻译?这是控制面可达,还是业务真正交付?

一个数字无法独自回答这些问题。它可触发本地执行,却不应获得跨层身份裁决权。

资料没有证明什么

现有资料没有说明 AURP 部署量、任何厂商的完整实现、某次真实影子网络事件、当前网络采用率或现役 Apple 产品行为。RFC 1504 保存了设计与警告,不是运行证明。

RFC 1378 说明 PPP 如何协商 AppleTalk,以及点对点链路如何携带 AURP 路由信息;它不证明 AURP 已收敛。RFC 1742 给出管理词汇;它不保证某台设备暴露完整映射状态。Lu Heng 的文章在这里提供的是阅读纪律:规范、实现、本地呈现、管理决定与观察结果必须分别留据。

影子网络的历史价值正来自这种边界。兼容层并非虚假,它真的能转发;但它的本地答案一旦失去来源,就会对“世界里到底有几个对象”给出完全错误的结论。

来源