4.6. PIM Assert Messages (PIM Assert 消息)
PIM Assert 机制用于在多路访问网络(如以太网)上选举唯一的转发者.当多个上游路由器都向同一 LAN 转发相同的组播流量时, Assert 机制确保只有一个路由器实际转发, 避免重复数据包.
Assert 的触发条件
Assert 在以下情况下被触发:
- 路由器在非 RPF 接口上接收到组播数据包
- 这表明 LAN 上另一个路由器也在转发相同的流量
4.6.1. (S,G) Assert Message State Machine ((S,G) Assert 消息状态机)
每个接口维护 (S,G) Assert 状态以跟踪该接口上谁是转发者.
Assert 状态:
- NoInfo (NI): 无 Assert 活动
- I am Assert Winner (W): 本路由器赢得 Assert, 负责转发
- I am Assert Loser (L): 本路由器输掉 Assert, 不应转发
状态转换 (简化):
NoInfo 状态:
- 接收到数据包 (非 RPF 接口) → 发送 Assert, 进入 Winner 或 Loser
- 接收到 Assert (更好的度量) → 进入 Loser
Winner 状态:
- 周期性发送 Assert 消息刷新
- 接收到 Assert (更好的度量) → 进入 Loser
- Assert Timer 到期 → 进入 NoInfo
Loser 状态:
- 不转发流量
- 接收到 Assert (更差的度量) → 发送 Assert, 可能进入 Winner
- Assert Timer 到期 → 进入 NoInfo
4.6.2. (,G) Assert Message State Machine ((,G) Assert 消息状态机)
(*,G) Assert 处理共享树上的转发者选举, 机制类似于 (S,G) Assert.
关键差异:
- 使用到 RP 的路径度量而非到源的度量
- 可能被特定的 (S,G) Assert 覆盖
4.6.3. Assert Metrics (Assert 度量)
Assert 获胜者基于 Assert 度量选出, 度量比较顺序为:
-
优先级比较:
- (S,G) Assert 优于 (*,G) Assert
- 有 (S,G) 状态的路由器优先
-
路由度量比较:
- 到源(或 RP)的管理距离 (较小更好)
- 到源(或 RP)的度量 (较小更好)
-
IP 地址比较:
- 如果以上都相同, 选择 IP 地址较大的路由器
度量比较示例:
Router A: Admin Distance = 110, Metric = 10, IP = 10.1.1.1
Router B: Admin Distance = 110, Metric = 20, IP = 10.1.1.2
Router A 获胜 (度量更小)
4.6.4. AssertCancel Messages (AssertCancel 消息)
AssertCancel 是一种特殊的 Assert 消息, 带有无穷大度量.用于:
- 通知其他路由器本路由器不再声称是转发者
- 触发新的 Assert 选举
发送 AssertCancel 的场景:
- RPF 接口改变
- 路由度量发生显著变化
- 接口状态变化
4.6.5. Assert State Macros (Assert 状态宏)
PIM 使用多个宏来汇总 Assert 状态:
- lost_assert(S,G,I): 接口 I 上是否输掉了 (S,G) Assert
- lost_assert(*,G,I): 接口 I 上是否输掉了 (*,G) Assert
- AssertWinner(S,G,I): 接口 I 上的 (S,G) Assert 获胜者地址
- AssertWinnerMetric(S,G,I): 获胜者的 Assert 度量
这些宏用于转发决策和出接口列表计算.
备注
关于详细的 Assert 状态机图,度量比较算法和定时器值, 请参阅 RFC 7761 第 4.6 节的完整规范.