摘要

  • RFC 2443 让多台 ATM 组播地址解析服务器共享客户端和组成员状态,但每个客户端仍只注册到一台服务器。
  • 同一来源连续两次未更新在线状态后,其他服务器必须清除从它学来的成员信息。客户端随后要向备用服务器注册,并重新加入原来的组。

三份缓存完全一致,一个来源却已沉默

设想三台 MARS 服务器都显示同一行:某客户端属于一个组播组。共享视图看起来很健康。随后,最初为该客户端登记的服务器不再发送定期的重定向状态。其余两台仍保存着完全相同的记录,但 RFC 2443 不把记录一致当成来源仍在线、或客户端仍连接的证据。连续两次收不到更新后,它们必须清除从该服务器学来的成员信息。

这一界线正是设计要点。RFC 2022 描述了 MARS(组播地址解析服务器):它在 ATM 网络上分发第三层组播的地址与连接信息。在分布式 MARS 中,一个逻辑 IP 子网(LIS)内的每台服务器都必须能回答该 LIS 中任意组播组的信息。RFC 2443 于 1998 年 11 月以 Experimental RFC 发布,将服务器缓存同步协议(SCSP)用于 MARS 服务器之间的状态复制。

复制的是记录,不是原始归属

SCSP 提供一套同步框架:服务器建立邻接关系、对齐缓存,然后传播新状态。RFC 2443 为 MARS 指定协议标识符 0x0003,并以 LIS 划定服务器组。客户端向一台服务器注册后,该服务器会把注册以及后续组成员变化传播给同组服务器。但每个客户端仍只向一台 MARS 注册,并经由这台服务器的集群控制虚电路或服务器控制虚电路接入。副本扩大了整个服务器组能看到的范围,却没有把客户端原来的控制关系复制成多个独立归属。

复制也没有解决标识符由谁分配的问题。每个 MARS 客户端都需要在整个 LIS 中拥有唯一的集群成员标识符。RFC 2443 假设每台服务器配置互不重叠的标识符区间;外部协调机制可以承担分配,但不在本文范围内。多台数据库可以一致地复制一个冲突分配,却不会因此产生一个负责避免冲突的权威来源。

心跳是让旧知识失效的规则

每台服务器至少每两分钟刷新一次 MARS Server Redirect Entry,RFC 建议每分钟刷新。某个来源连续两次没有更新时,其他服务器必须清除从该来源学到的全部客户端与组成员信息。这不只是更新备用服务器列表:它把状态的新鲜度归属于明确的来源,并把失效操作限定在依赖该来源的数据上。

接下来要行动的是客户端。客户端检测到自己的 MARS 故障后,选择一台备用服务器并尝试注册;只有注册成功,才重新加入之前的组。若失败,它会继续尝试其他服务器。重定向映射只能告诉客户端可以尝试去哪里,并不能证明这个客户端已经迁移、注册、恢复组成员关系或重新收到组播流量。

同样,恢复一条成员记录,并不能证明 ATM 点到多点虚电路已经重建,也不能证明数据包抵达了应用。这些是不同的运行步骤。在真实网络中,控制面的一条复制记录只是行动的输入,不是行动成功的回执。

身份验证划出了信任边界,也放大了影响范围

RFC 2443 本身没有加密 MARS 专用的缓存状态字段,而是引用 SCSP 通用部分的安全机制。身份验证可以让服务器丢弃未经认证的伪造数据包;但该 RFC 也明确指出,一台经过有效认证的服务器所发来的状态会被信任,并继续传播至整个服务器组。因此,一台可信服务器遭到攻陷,就可能从源头污染整个共享数据库。认证限制了谁能发言,却不能保证获准发言者提供的状态为真,也不能隔离被攻陷节点的影响。

2004 年的 RFC 3790 指出,RFC 2443 为 IPv4 提供默认值,也可通过适当的 IANA 定义扩展到 IPv6。这是对已写入规范的扩展设计的记录,不是实现或部署的证据。RFC 写明协议要求与风险提示,却不证明它被部署了多少次,也不证明每个实现都照此运行。

因此,长期教训不只是“复制提升可用性”。还要问:每条状态由谁产生,来源最近何时被观测,来源证据失效后哪些数据必须撤销,下一步又由谁执行。然后分别检查注册、重新加入组、虚电路建立、数据转发和应用接收。三份缓存可以对过去达成一致;只有仍在线的客户端和真正工作的数据路径,才能证明组播服务已经恢复。

来源