摘要

  • RFC 9777 只让路由器发现直连 IPv6 链路上的监听兴趣,并不认证监听者,也不证明端到端路径成立。
  • socket 意图先被合并成接口状态,再被压缩成路由器的 INCLUDE/EXCLUDE 状态;每一层都丢失了一部分身份与时效信息。
  • 服务验收需要八张分开的收据:socket、报告发出、查询器、路由器状态、兼容模式、上游转发、复制路径和应用交付。

在故障现场,最容易令人误判的往往不是红灯,而是一盏含义过宽的绿灯。面板显示某个 (S,G) 的 Source Timer 仍大于零,接口处于 INCLUDE,运维人员便把它读成“接收端已经加入”。如果应用仍然没有数据,他们会去寻找一个与“加入成功”并存的异常。

其实异常可能就在这次翻译中。RFC 9777 于 2025 年 3 月成为 STD 101,它规范的是 IPv6 直连链路上的 MLDv2 监听发现。它把监听信息交给组播路由协议使用,却没有承诺上游树已经建立,更没有承诺数据已被应用消费。

一条意图被压缩两次

最原始的事实属于 socket。应用概念上向 IP 层提交 socket、接口、组播地址、过滤模式和源列表。INCLUDE 只接收列出的源;EXCLUDE 接收除列出源之外的其他源。

一台主机可能有多个 socket 对同一个组提出不同要求。MLDv2 因而计算接口级状态:全为 INCLUDE 时取源列表并集;只要出现 EXCLUDE,便按另一组规则合并,以满足所有 socket。接口报告已经不是应用清单。

路由器又把整条链路压缩一次。它通常只需知道至少有一个节点需要某个组与源,并不必追踪每台主机。INCLUDE 维护允许的源及其定时器;EXCLUDE 维护 Requested List 与 Exclude List。Requested List 为日后切回 INCLUDE 和快速阻断服务,本身并不直接决定转发。看到这张表,仍然无法回答究竟是哪一个进程在等待数据。

数据进入主机后还有一道边界。RFC 9777 明确指出,IP 层接收包以后,是否交给特定 socket 仍取决于该 socket 的状态,也可能取决于传输层端口;规范并不强制每个实现都按 socket 做独立源过滤。因此,以太网帧抵达、IP 接受、socket 收到、应用解码成功,是四个不同事实。

270 秒不是“现在”

MLDv2 使用软状态。Current-State Report 刷新状态,State-Change Report 报告变化,并按 Robustness Variable 重传。默认 Robustness Variable 为 2,Query Interval 为 125 秒,Query Response Interval 为 10 秒。由此得到默认 MALI:2 × 125 + 2 × 10 = 270 秒。

这 270 秒表达的是路由器在丢包假设下何时才可判定没有监听者,并不证明 270 秒内应用始终存在。增大 Robustness Variable 能容忍更多丢包,也会拉长离开时延。可靠性和新鲜度在同一个旋钮上交换。

快速离开同样不是立即删除。收到停止某源的状态变化后,查询器先询问链路上是否还有其他监听者。默认 LLQI 为 1 秒,查询次数为 2,LLQT 因而是 2 秒。在这段核验窗口内,MLD 仍建议继续转发。沉默只有经过定时询问,才会升级为“已不存在”。

定时器到期的含义还取决于模式。INCLUDE 下,源会被删除;EXCLUDE 下,源可能从 Requested List 移入 Exclude List;组的 Filter Timer 到期时,路由器再用 Requested List 切回 INCLUDE。把所有结果压成“expired”,就丢掉了真正决定流量命运的状态迁移。

兼容模式会暂时抹去源精度

主机收到 MLDv1 General Query 后,会在该接口进入 v1 兼容模式,并重置 Older-Version-Querier-Present Timer。按默认参数计算,该窗口为 2 × 125 + 10 = 260 秒。模式变化还会取消尚未完成的响应与重传;期间主机只使用 MLDv1,无法表达按源订阅。

路由器收到 MLDv1 Report 后,也会针对该组进入 v1 兼容。此时 BLOCK 记录被忽略,TO_EX 的源列表也被忽略。260 秒到期并不意味着精度立即恢复:下一次 General Query 才开始重新学习,原本应阻断的源可能继续开放到 MALI 结束。

RFC 4604 对 SSM 进一步收紧:旧版本、非源特定的请求不应在 SSM 地址范围内建立转发状态,主机和路由器必须对 SSM 范围达成一致。所以“向下兼容”是一项带计时器、语义损失和管理选择的运行状态,而不是无条件安全标签。

本地状态之后,才轮到分发树

RFC 9777 说明 MLDv2 信息不能覆盖组播路由信息。对 SSM 而言,RFC 4607 要求 (S,G) Join 逐跳向源传播,并依赖无环路径。RFC 7761 还展示了共享树、源树、树切换、分叉复制、短时重复与剪枝。监听报告可以正确到达本地路由器,而上游状态尚未收敛。

最后一跳还有 snooping 交换机。RFC 4541 把控制报文转发和数据转发分开讨论;组播路由器端口、拓扑变化与转发表都会影响数据是否到达接收端口。路由器的一张 MLD 表无法替交换机表作证。

此外,MLDv2 没有加密认证。链路本地源地址、Hop Limit 为 1 和 Router Alert 能挡住链路外伪造,却挡不住链路内攻击者。重放 Report 可以延长状态;伪造 v1 Report 可以迫使路由器降低语义精度。格式正确不是授权证明。

八张收据,各自回答一个问题

Socket 意图收据记录进程、授权、接口、过滤模式、源组与时间;报告发出收据证明正确的 Current-State 或 State-Change 记录确实离开接口;查询器收据固定查询器身份、版本、QRV、QQI 与派生定时器;路由器状态收据保存模式、列表和剩余时间。

兼容收据说明为何降级、何时退出及 SSM 语义是否仍成立;上游转发收据跟踪 Join/Prune 与 RPF;复制路径收据用每跳计数或抓包证明包进入并离开预期分支;接收交付收据最终检查序列连续性、丢包、延迟、解码和有效消费。

每张收据都要有观察者和时间。09:00 的 Report 不能替 09:04 的应用作证,本地链路的 INCLUDE 也不能替另一个管理域中的上游树作证。所谓端到端真相,正是这些局部事实没有互相冒名。

来源

  1. RFC 9777 — IPv6 MLDv2
  2. RFC 3810 — 已被取代的 MLDv2 规范
  3. RFC 2710 — MLDv1
  4. RFC 4604 — SSM 中的 IGMPv3/MLDv2
  5. RFC 4607 — 源特定组播
  6. RFC 7761 — PIM-SM
  7. RFC 4541 — IGMP/MLD Snooping 交换机