4.4. PIM Register Messages (PIM Register 消息)
当组播源开始发送数据时, 源的指定路由器 (DR) 负责将这些数据包注册到汇聚点 (RP).注册是通过将数据包封装在 PIM Register 消息中并单播发送到 RP 来完成的.
Register 机制的目的
Register 机制解决了以下问题:
- 源可以在任何时候开始发送, 而 RP 可能还没有为该组建立转发状态
- 通过将初始数据包发送到 RP, 确保接收者可以立即开始接收流量
- 允许 RP 决定是否需要加入到源的最短路径树
4.4.1. Sending Register Messages from the DR (从 DR 发送 Register 消息)
当源的 DR 接收到来自直连源的组播数据包时, 它会执行以下操作:
- 检查是否需要注册: 如果 (S,G) Register 状态为 "Join", 则需要注册
- 封装数据包: 将原始组播数据包封装在 PIM Register 消息中
- 单播到 RP: 将 Register 消息单播发送到该组的 RP
Register 状态机 (简化):
状态: Join (需要发送 Register)
- 接收到源数据包 → 封装并发送 Register
- 接收到 Register-Stop → 转换到 Prune 状态
状态: Prune (已收到 Register-Stop)
- Register-Stop 定时器运行
- 定时器到期前发送 Null-Register 探测
- 如果 RP 需要流量 → 转换回 Join 状态
状态: Join-Pending (等待 RP 响应)
- 已发送 Register, 等待 RP 确认
Null-Register: 当 DR 处于 Register-Stop 状态时, 在 Register-Stop 定时器到期前, DR 会发送不包含数据的 Null-Register 消息来探测 RP 是否仍然不需要该流量.
4.4.2. Receiving Register Messages at the RP (在 RP 接收 Register 消息)
当 RP 接收到 Register 消息时, 它执行以下操作:
-
解封装数据包: 从 Register 消息中提取原始组播数据包
-
检查是否需要流量:
- 如果有下游接收者 (olist 非空) → 转发解封装的数据包并加入到 (S,G) SPT
- 如果没有下游接收者 → 发送 Register-Stop 消息给 DR
-
发送 Register-Stop: 如果 RP 不需要该流量, 向 DR 发送 Register-Stop 消息, 指示 DR 停止发送 Register
RP 处理 Register 的条件:
if (接收到 Register 消息) {
if (是 Null-Register) {
if (不需要流量) {
发送 Register-Stop
}
} else {
解封装数据包
if (需要流量 AND 还未加入 SPT) {
发送 (S,G) Join 到源
转发解封装的数据包
} else if (不需要流量) {
发送 Register-Stop
} else {
转发解封装的数据包
}
}
}
Register 隧道优化
一旦 RP 加入到 (S,G) SPT 并开始接收原生的组播流量, Register 隧道就变得不必要了.此时:
- RP 发送 Register-Stop 给 DR
- DR 停止封装数据包
- 流量通过原生的组播路由到达 RP
备注
关于 Register 消息的详细格式,Border bit 处理和 Register-Stop 定时器值, 请参阅 RFC 7761 第 4.4 节和第 4.9.3-4.9.4 节的完整规范.