3.2. Phase Two: Register-Stop (阶段二: Register-Stop)
数据包的 Register 封装由于两个原因而低效:
-
封装和解封装可能是路由器执行的相对昂贵的操作, 这取决于路由器是否具有用于这些任务的适当硬件。
-
一直传播到 RP, 然后再沿着共享树返回, 可能导致数据包传播相对较长的距离才能到达靠近发送者的接收者。对于某些应用程序, 这种增加的延迟或带宽消耗是不可取的。
尽管 Register 封装可能无限期地继续, 但由于这些原因, RP 通常会选择切换到原生转发。为此, 当 RP 从组 G 上的源 S 接收到 Register 封装的数据包时, 它通常会启动一个 (S,G) 源特定的 Join 指向 S。此 Join 消息逐跳地向 S 传播, 在路径上的路由器中实例化 (S,G) 组播树状态。(S,G) 组播树状态仅用于转发组 G 的数据包, 如果这些数据包来自源 S。最终, Join 消息到达 S 的子网或已经具有 (S,G) 组播树状态的路由器, 然后来自 S 的数据包开始沿着 (S,G) 树状态向 RP 流动。这些数据包也可能在通往 RP 的路径上到达具有 (*,G) 状态的路由器; 如果到达, 它们可以在此点抄近路进入 RP 树。
当 RP 正在加入 S 的源特定树的过程中时, 数据包将继续被封装到 RP。当来自 S 的数据包也开始以原生方式到达 RP 时, RP 将接收到这些数据包的两个副本。此时, RP 开始丢弃这些数据包的封装副本, 并向 S 的 DR 发送一个 Register-Stop 消息, 以防止 DR 不必要地封装数据包。
在阶段二结束时, 流量将以原生方式从 S 沿着源特定树流向 RP, 然后从那里沿着共享树流向接收者。在两棵树相交的地方, 流量可能从源特定树转移到 RP 树, 从而避免经由 RP 的长距离绕道。
请注意, 发送者可能在接收者加入组之前或之后开始发送, 因此阶段二可能发生在到达接收者的共享树构建之前。