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 的转发和控制平面行为至关重要.