4.9. PIM Packet Formats (PIM 数据包格式)
本节描述 PIM-SM 消息的数据包格式.所有 PIM 消息使用 IP 协议号 103.
PIM 消息头部格式
所有 PIM 消息共享通用头部:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|PIM Ver| Type | Reserved | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- PIM Ver: PIM 版本号(当前为 2)
- Type: 消息类型
- Checksum: 校验和,覆盖整个 PIM 消息
PIM 消息类型
| 类型值 | 消息类型 | 用途 |
|---|---|---|
| 0 | Hello | 邻居发现和维护 |
| 1 | Register | 源注册到 RP |
| 2 | Register-Stop | RP 停止注册 |
| 3 | Join/Prune | 构建分发树 |
| 4 | Bootstrap | BSR 机制 |
| 5 | Assert | LAN 转发者选举 |
| 6 | Graft | 用于 PIM-DM |
| 7 | Graft-Ack | 用于 PIM-DM |
| 8 | Candidate-RP-Advertisement | RP 候选通告 |
4.9.1. Encoded Source and Group Address Formats (编码的源和组地址格式)
PIM 消息中的地址使用编码格式来支持不同地址族和掩码长度.
编码地址格式:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Addr Family | Encoding Type | Rsrvd |S|W|R| Mask Len |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source/Group Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Addr Family: 地址族(IPv4=1, IPv6=2)
- S bit: Sparse bit
- W bit: WC (WildCard) bit
- R bit: RPT (RP Tree) bit
- Mask Len: 掩码长度
4.9.2. Hello Message Format (Hello 消息格式)
Hello 消息包含多个 TLV 选项:
基本结构:
- PIM 通用头部(Type=0)
- 多个 Hello 选项 TLV
常见 Hello 选项:
- Holdtime (类型 1): 邻居保持时间
- LAN Prune Delay (类型 2): 传播延迟配置
- DR Priority (类型 19): DR 优先级
- Generation ID (类型 20): 重启检测
- Address List (类型 24): 辅助地址列表
4.9.3. Register Message Format (Register 消息格式)
Register 消息用于封装组播数据包并单播到 RP:
结构:
PIM Header (Type=1)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2| Type=1 |Reserved |B|N| Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 封装的 IP 数据包 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- B bit: Border bit
- N bit: Null-Register bit(用于探测)
4.9.4. Register-Stop Message Format (Register-Stop 消息格式)
Register-Stop 由 RP 发送以停止 Register:
结构:
- PIM 头部(Type=2)
- 组地址(编码格式)
- 源地址(编码格式)
4.9.5. Join/Prune Message Format (Join/Prune 消息格式)
Join/Prune 消息可以携带多个组和多个源:
结构:
- PIM 头部(Type=3)
- 上游邻居地址
- Holdtime
- 组数量
- 对于每个组:
- 组地址
- Join 列表(源地址)
- Prune 列表(源地址)
组织结构:消息按组组织,每个组可以有多个 Join 和 Prune 的源.
4.9.5.1. Group Set Source List Rules (组集源列表规则)
Join/Prune 消息中的源列表遵循特定规则:
- (*,G) Join/Prune 使用 WC bit
- (S,G) Join/Prune 直接列出源
- (S,G,rpt) Prune 使用 RPT bit
4.9.5.2. Group Set Fragmentation (组集分片)
当 Join/Prune 消息过大时,需要分片:
- 保持在 MTU 限制内
- 每个分片包含完整的组条目
- 不在组中间分片
4.9.6. Assert Message Format (Assert 消息格式)
Assert 消息用于 LAN 转发者选举:
结构:
- PIM 头部(Type=5)
- 组地址
- 源地址
- Assert 度量:
- 度量优先级
- 路由度量
- 路由偏好
备注
关于所有 PIM 消息格式的详细字段定义,编码规则和示例,请参阅 RFC 7761 第 4.9 节的完整规范.数据包格式图和字段的精确位定义在原文中有详细说明.