跳到主要内容

4.1. PIM Protocol State (PIM 协议状态)

本节指定 PIM 实现为了正确运行应该维护的所有协议状态.我们将此状态称为树信息库 (Tree Information Base, TIB), 因为它保存了该路由器上所有组播分发树的状态.

虽然我们精确地指定了要保持的状态, 但这并不意味着 PIM-SM 的实现需要以这种形式保持状态.这实际上是一个抽象状态定义, 需要它来指定路由器的行为.

我们将 TIB 状态分为三个部分:

(*,G) 状态: 维护 G 的 RP 树的状态.

(S,G) 状态: 维护源 S 和组 G 的源特定树的状态.

(S,G,rpt) 状态: 在 G 的 RP 树上维护关于源 S 的源特定信息的状态.

4.1.1. General-Purpose State (通用状态)

对于每个接口, 路由器保持以下状态:

每个接口的状态:

  • Hello 定时器 (Hello Timer, HT): 用于触发下一个 Hello 消息的发送
  • 邻居状态: 对于每个邻居, 维护邻居的地址,代信息 ID (Generation ID),Hello 保持时间等信息
备注

关于详细的状态字段定义,定时器值和状态机转换, 请参阅 RFC 7761 第 4.1.1 节的完整规范.

4.1.2. (,G) State ((,G) 状态)

对于每个组 G, 路由器保持以下状态:

每个接口的状态:

  • 本地成员 (Local Membership): 状态为 "NoInfo" 或 "Include"
  • PIM (*,G) Join/Prune 状态: 包括状态(NoInfo, Join, Prune-Pending),Prune-Pending 定时器和 Join/Prune 到期定时器
  • (*,G) Assert Winner 状态: 包括状态(NoInfo, I lost Assert, I won Assert),Assert 定时器和赢家信息

非接口特定状态:

  • 上游 (*,G) Join/Prune 状态: 状态为 "NotJoined(,G)" 或 "Joined(,G)"
  • 上游 Join/Prune 定时器 (JT)
  • 最后使用的 RP
  • 最后使用的到 RP 的 RPF 邻居
备注

关于详细的状态字段定义,状态转换规则和宏定义, 请参阅 RFC 7761 第 4.1.2 节的完整规范.

4.1.3. (S,G) State ((S,G) 状态)

对于每个源/组对 (S,G), 路由器保持以下状态:

每个接口的状态:

  • 本地成员: 状态为 "NoInfo" 或 "Include"
  • PIM (S,G) Join/Prune 状态: 包括状态,定时器
  • (S,G) Assert Winner 状态: 包括状态,定时器和赢家信息

非接口特定状态:

  • 上游 (S,G) Join/Prune 状态
  • 上游 (S,G) Join/Prune 定时器
  • 最后使用的到 S 的 RPF 邻居
  • SPTbit: 指示 (S,G) 状态是否活动
  • (S,G) Keepalive 定时器 (KAT)

DR 处的额外 (S,G) 状态:

  • Register 状态: Join, Prune, Join-Pending 或 NoInfo
  • Register-Stop 定时器 (RST)
备注

关于详细的状态字段定义,SPTbit 的使用和 Keepalive 定时器的作用, 请参阅 RFC 7761 第 4.1.3 节的完整规范.

4.1.4. (S,G,rpt) State ((S,G,rpt) 状态)

对于路由器也具有 (*,G) 状态的每个源/组对 (S,G), 它还保持以下状态:

每个接口的状态:

  • 本地成员: 状态为 "NoInfo" 或 "Exclude"
  • PIM (S,G,rpt) Join/Prune 状态: 包括状态(NoInfo, Pruned, Prune-Pending)和定时器

非接口特定状态:

  • 上游 (S,G,rpt) Join/Prune 状态: RPTNotJoined(G), NotPruned(S,G,rpt) 或 Pruned(S,G,rpt)
  • Override 定时器 (OT)
备注

关于详细的状态字段定义和状态机行为, 请参阅 RFC 7761 第 4.1.4 节的完整规范.

4.1.5. State Summarization Macros (状态汇总宏)

PIM 规范使用了许多宏来汇总状态以确定转发行为和消息生成.这些宏包括:

  • immediate_olist(*,G): 立即出接口列表
  • inherited_olist(S,G): 继承的出接口列表
  • joins(*,G): 接口上是否有 (*,G) join 状态
  • pim_include(*,G): 接口是否有本地成员
  • lost_assert(*,G): 接口上是否丢失了 assert
  • 以及其他用于计算转发和加入/剪枝行为的宏
备注

关于所有状态汇总宏的完整定义和使用场景, 请参阅 RFC 7761 第 4.1.5 节的详细规范.这些宏对于理解 PIM 的转发和控制平面行为至关重要.