Skip to main content

PIM报文格式

PIM(Protocol Independent Multicast,协议无关组播)是一种组播路由协议,作为一种组播路由解决方案,也可以支持IPv4和IPv6网络,在实践中得到广泛的应用。

协议栈结构

PIM通过路由器之间交互PIM控制消息实现组播路由功能。PIM控制消息使用IP报文封装。

PIM消息的封装格式
+------------------+------------------+
|     IP Header    |    PIM Message   |
| (Protocol = 103) |                  |
+------------------+------------------+
  • IP报文头的协议类型字段值为103,用来标识数据部分封装了PIM消息。

  • IP报文头的目的地址字段用来标识该PIM消息的目的接收者。可以是单播地址,也可以是组播地址。

  • PIM-DM协议与PIM-SM协议,支持不同的控制消息。

PIM报文通用格式

PIM通过路由器之间交互PIM控制消息实现组播路由功能。所有的PIM控制消息头部有相同的格式.

PIM消息头部格式
 0           4        8            16         31
+-----------+--------+------------+------------+
|  Version  |  Type  |  Reserved  |  Checksum  |
+-----------+--------+------------+------------+
PIM消息头部字段
字段 长度 说明
Version 4比特 PIM版本,值为2。
Type 4比特 消息类型,详见PIM Type Code
Reserved 8比特 保留。发送者将其设置为0,接收者忽略此字段。
Checksum 16比特 校验和。
PIM Type Code
Value Type Scope
0 Hello DM,SM
1 Register ,SM
2 Register-Stop ,SM
3 Join/Prune DM,SM
4 Bootstrap ,SM
5 Assert DM,SM
6 Graft DM
7 Graft-Ack DM
8 Candidate-RP-Advertisement ,SM
9 State Refresh DM

PIM Hello

PIM路由器之间通过交互Hello消息,发现PIM邻居并维护邻居关系。Hello消息同时在PIM-DM与PIM-SM中使用。Hello消息中无法区分是PIM-DM还是PIM-SM。

  • IP报文头的协议类型字段值为103,用来标识数据部分封装了PIM消息。

  • 封装Hello消息的IP报文源地址为本地接口地址,目的地址为224.0.0.13,TTL值为1。

  • 使用组播方式发送。

Hello消息格式
 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            |
+-------+-------+---------------+-------------------------------+
|          OptionType           |         OptionLength          |
+-------------------------------+-------------------------------+
|                          OptionValue                          |
|                             ...                              |
+---------------------------------------------------------------+
|                               .                               |
|                               .                               |
|                               .                               |
+-------------------------------+-------------------------------+
|          OptionType           |         OptionLength          |
+-------------------------------+-------------------------------+
|                          OptionValue                          |
|                             ...                              |
+---------------------------------------------------------------+
Hello消息字段解释
字段 长度 说明
PIM Ver 4比特 PIM版本,值为2。
Type 4比特 消息类型,值为0。
Reserved 8比特 保留字段,发送时设置为0,接收时忽略此值。
Checksum 16比特 校验和。
OptionType 2B Option参数类型。详见PIM Hello Option Code
OptionLength 2B OptionValue字段的长度,字节为单位。
OptionValue 可变 Option参数值。
PIM Hello Option Code
Value Type 说明
1 Holdtime 表示保持邻居为可达状态的超时时间,若超时仍没有收到Hello消息则认为邻居不可达。
2 LAN Prune Delay 详见LAN Prune Delay
3-16   预留为将来使用。
18   预留不用。
19 DR Priority 表示各路由器接口竞选DR的优先级,优先级越高越容易获胜。
20 Generation ID Hello消息中携带的随机数,表示当前邻居状态。如果状态发生更新则随机数也会更新。当路由器发现接收到的来自上游的Hello消息中包含不同Generation ID值,则认为上游邻居已经丢失或上游邻居状态已经改变。
21 State Refresh Capable 表示邻居状态刷新时间间隔。
24 Address List PIM接口的从地址列表。
LAN Prune Delay
+-------------------+-------------------+
|T|Propagation_Delay| Override_Interval |
+-------------------+-------------------+
LAN Prune Delay字段解释
字段 长度 说明
T 1bit Join消息抑制能力位。
Propagation_Delay 15bits 表示在共享网段上传递Prune消息的延迟时间。
Override_Interval 16bits 在共享网段上执行剪枝前的否决时间。

PIM Register

当PIM-SM网络中出现活跃组播源时,源端DR向RP发送Register(注册)消息,进行源注册。Register消息只在PIM-SM中使用。

  • IP报文头的协议类型字段值为103,用来标识数据部分封装了PIM消息。

  • 封装Register消息的IP报文源地址为源端DR,目的地址为RP。

  • 使用单播方式发送。

Register消息格式
 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            |
+-+-+---+-------+---------------+-------------------------------+
|B|N|                       Reserved2                           |
+-+-+-----------------------------------------------------------+
|                                                               |
.                     Multicast data packet                     .
|                                                               |
+---------------------------------------------------------------+
Register消息字段解释
字段 长度 说明
PIM Ver 4比特 PIM版本,值为2。
Type 4比特 消息类型,值为1。
Reserved 8比特 保留位。发送时此字段被清零,接收时不处理此字段。
Checksum 16比特 校验和。
B 1比特 边界位。
N 1比特 空注册位。
Reserved2 30比特 保留位。发送时此字段被清零,接收时不处理此字段。
Multicast data packet 变长 组播数据报文。源端DR将接收到的组播数据报文封装在Register消息中发往RP。RP解封装后,学习到该组播数据报文的(S,G)信息。

PIM Register-Stop

在PIM-SM网络中,接收者不再通过RP接收发往某组播组的数据,或者RP不再为某组播组服务,或者组播数据转发路径已经由RPT切换到SPT,这三种情况下,RP将会向组播源端DR发送Register-Stop消息。组播源端DR收到Register-Stop消息后,停止使用Register注册消息封装组播数据报文,并进入注册抑制状态。Register-Stop消息只在PIM-SM中使用。

  • IP报文头的协议类型字段值为103,用来标识数据部分封装了PIM消息。

  • 封装Register-Stop消息的IP报文源地址为RP,目的地址为源端DR。

  • 使用单播方式发送。

Register-Stop消息格式
    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            |
  +-------+-------+---------------+-------------------------------+
  |             Group Address (Encoded-Group format)             |
  +---------------------------------------------------------------+
  |            Source Address (Encoded-Unicast format)           |
  +---------------------------------------------------------------+
Register-Stop消息字段含义
字段 长度 说明
PIM Ver 4比特 PIM版本,值为2。
Type 4比特 消息类型,值为2。
Reserved 8比特 保留位。发送时此字段被清零,接收时不处理此字段。
Checksum 16比特 校验和。
Group Address 32比特 组播组地址G。
Source Address 32比特 组播源地址S。

PIM Join/Prune

注册/剪枝(Join/Prune)消息可在PIM-DM和PIM-SM中使用。一条Join/Prune消息中可以同时包含Join信息和Prune信息。只包含Join信息的Join/Prune消息称为Join消息。只包含Prune信息的Join/Prune消息称为Prune消息。

  • IP报文头的协议类型字段值为103,用来标识数据部分封装了PIM消息。

  • 封装Join/Prune消息的IP报文源地址为本地接口地址,目的地址为224.0.0.13,TTL值为1。

  • 使用组播方式发送。

Join/Prune消息格式
    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            |
  +-------+-------+---------------+-------------------------------+
  |        Upstream Neighbor Address (Encoded-Unicast format)    |
  +-------------------------------+-------------------------------+
  |  Reserved     | Num groups    |          Holdtime             |
  +-------------------------------+-------------------------------+
  |         Multicast Group Address 1 (Encoded-Group format)      |
  +-------------------------------+-------------------------------+
  |   Number of Joined Sources    |   Number of Pruned Sources    |
  +-------------------------------+-------------------------------+
  |        Joined Source Address 1 (Encoded-Source format)        |
  +---------------------------------------------------------------+
  |                             .                                 |
  |                             .                                 |
  +---------------------------------------------------------------+
  |        Joined Source Address n (Encoded-Source format)        |
  +---------------------------------------------------------------+
  |        Pruned Source Address 1 (Encoded-Source format)        |
  +---------------------------------------------------------------+
  |                             .                                 |
  |                             .                                 |
  +---------------------------------------------------------------+
  |        Pruned Source Address n (Encoded-Source format)        |
  +---------------------------------------------------------------+
  |                           .                                   |
  |                           .                                   |
  +---------------------------------------------------------------+
  |         Multicast Group Address m (Encoded-Group format)      |
  +-------------------------------+-------------------------------+
  |   Number of Joined Sources    |   Number of Pruned Sources    |
  +-------------------------------+-------------------------------+
  |        Joined Source Address 1 (Encoded-Source format)        |
  +---------------------------------------------------------------+
  |                             .                                 |
  |                             .                                 |
  +---------------------------------------------------------------+
  |        Joined Source Address n (Encoded-Source format)        |
  +---------------------------------------------------------------+
  |        Pruned Source Address 1 (Encoded-Source format)        |
  +---------------------------------------------------------------+
  |                             .                                 |
  |                             .                                 |
  +---------------------------------------------------------------+
  |        Pruned Source Address n (Encoded-Source format)        |
  +---------------------------------------------------------------+
Join/Prune消息字段解释
字段 长度 说明
PIM Ver 4比特 PIM版本,值为2。
Type 4比特 消息类型,值为3。
Reserved 8比特 保留。发送者将其设置为0,接收者忽略此字段。
Checksum 16比特 校验和。
Upstream Neighbor Address 32比特 上游邻居地址。也就是收到Join/Prune消息的路由器上,进行Join或Prune操作的下游接口地址。
Num groups 8比特 消息中包含的组播组数目。
Holdtime 16比特 接收Join/Prune消息的路由器保持相应接口加入/剪枝状态的时间。
Multicast Group Address 32比特 组播组地址。
Number of Joined Sources 16比特 针对该组播组,请求加入的组播源总数。
Number of Pruned Sources 16比特 针对该组播组,请求剪枝的组播源总数。
Joined Source Address 32比特 请求加入的组播源地址。
Pruned Source Address 32比特 请求剪枝的组播源地址。

PIM Graft/Graft-Ack

在PIM-DM网络中,路由器上出现组成员时,如果本身不在SPT上,则从对应的(S,G)表项的上游接口发送Graft消息。上游邻居立即恢复下游接口的转发,同时从该下游接口发出Graft-Ack消息,表示已经接受嫁接请求。如果上游邻居不在SPT上,则继续向上游发送Graft消息。Graft消息格式与Join/Prune消息相同,仅部分字段取值存在差异。Graft-Ack消息与Graft消息格式相同,并复制了Graft消息的内容。其中不同的是,Upstream Neighbor Address字段,在Graft-Ack消息中填为Graft消息的发出者地址。

  • IP报文头的协议类型字段值为103,用来标识数据部分封装了PIM消息。

  • 封装Graft-Ack消息的IP报文源地址为下游接口地址,目的地址为Graft消息的发出者。

  • 使用单播方式发送。

Graft/Graft-Ack消息格式
    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            |
  +-------+-------+---------------+-------------------------------+
  |        Upstream Neighbor Address (Encoded-Unicast format)     |
  +---------------+---------------+-------------------------------+
  |  Reserved     | Num groups    |          Holdtime             |
  +---------------+---------------+-------------------------------+
  |         Multicast Group Address 1 (Encoded-Group format)      |
  +-------------------------------+-------------------------------+
  |   Number of Joined Sources    |   Number of Pruned Sources    |
  +-------------------------------+-------------------------------+
  |        Joined Source Address 1 (Encoded-Source format)        |
  +---------------------------------------------------------------+
  |                             .                                 |
  |                             .                                 |
  +---------------------------------------------------------------+
  |        Joined Source Address n (Encoded-Source format)        |
  +---------------------------------------------------------------+
  |        Pruned Source Address 1 (Encoded-Source format)        |
  +---------------------------------------------------------------+
  |                             .                                 |
  |                             .                                 |
  +---------------------------------------------------------------+
  |        Pruned Source Address n (Encoded-Source format)        |
  +---------------------------------------------------------------+
  |                           .                                   |
  |                           .                                   |
  +---------------------------------------------------------------+
  |         Multicast Group Address m (Encoded-Group format)      |
  +-------------------------------+-------------------------------+
  |   Number of Joined Sources    |   Number of Pruned Sources    |
  +-------------------------------+-------------------------------+
  |        Joined Source Address 1 (Encoded-Source format)        |
  +---------------------------------------------------------------+
  |                             .                                 |
  |                             .                                 |
  +---------------------------------------------------------------+
  |        Joined Source Address n (Encoded-Source format)        |
  +---------------------------------------------------------------+
  |        Pruned Source Address 1 (Encoded-Source format)        |
  +---------------------------------------------------------------+
  |                             .                                 |
  |                             .                                 |
  +---------------------------------------------------------------+
  |        Pruned Source Address n (Encoded-Source format)        |
  +---------------------------------------------------------------+
Graft/Graft-Ack消息字段解释
字段 长度 说明
PIM Ver 4比特 PIM版本,值为2。
Type 4比特 消息类型,Graft值为6,Graft-Ack值为7。
Reserved 8比特 保留。发送者将其设置为0,接收者忽略此字段。
Checksum 16比特 校验和。
Upstream Neighbor Address 32比特 在Graft消息中填上游邻居地址。也就是收到嫁接消息的路由器上,进行嫁接操作的下游接口地址。 在Graft-Ack消息中填为Graft消息的发出者地址。
Num groups 8比特 消息中包含的组播组数目。
Holdtime 16比特 该字段为0。
Multicast Group Address 32比特 组播组地址。
Number of Joined Sources 16比特 针对该组播组,请求加入的组播源总数。
Number of Pruned Sources 16比特 该字段为0。
Joined Source Address 32比特 待嫁接的(S,G)的源地址。

PIM Bootstrap

Bootstrap消息只在PIM-SM中使用。当PIM-SM网络中使用动态RP时,配置了C-BSR的路由器从所有PIM接口周期性的发送Bootstrap消息,参与BSR竞选。竞选获胜者,继续发送PIM Bootstrap消息,向域内所有PIM路由器发布RP-Set信息。

  • IP报文头的协议类型字段值为103,用来标识数据部分封装了PIM消息。

  • 封装Bootstrap消息的IP报文源地址为C-BSR地址,目的地址为224.0.0.13,使用组播方式发送。

  • TTL为1,在PIM-SM网络中逐跳转发,最终达到全网泛滥。

Bootstrap消息格式
    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 |
+-------+-------+---------------+---------------+---------------+
| Fragment Tag | Hash Mask Len | BSR-priority |
+-------------------------------+---------------+---------------+
| BSR-Address |
+-------------------------------+-------------------------------+
| Group Address 1 (Encoded-Group format) |
+---------------+---------------+-------------------------------+
| RP-Count |Frag RP-Cnt(M) | Reserved |
+---------------+---------------+-------------------------------+
| RP-address [1] |
+-------------------------------+---------------+---------------+
| RP-holdtime [1] |RP-Priority [1]| Reserved |
+-------------------------------+---------------+---------------+
| . |
| . |
+---------------------------------------------------------------+
| RP-address [M] |
+-------------------------------+---------------+---------------+
| RP-holdtime [M] |RP-Priority [M]| Reserved |
+-------------------------------+---------------+---------------+
| . |
| . |
| . |
| . |
| Group Address K (Encoded-Group format) |
+---------------+---------------+-------------------------------+
| RP-Count |Frag RP-Cnt(M) | Reserved |
+---------------+---------------+-------------------------------+
| RP-address [1] |
+-------------------------------+---------------+---------------+c
| RP-holdtime [1] |RP-Priority [1]| Reserved |
+-------------------------------+---------------+---------------+
| . |
| . |
+---------------------------------------------------------------+
| RP-address [N] |
+-------------------------------+---------------+---------------+
| RP-holdtime [N] |RP-Priority [N]| Reserved |
+-------------------------------+---------------+---------------+
Bootstrap消息字段解释
字段 长度 说明
PIM Ver 4比特 PIM版本,值为2。
Type 4比特 消息类型,值为4。
Reserved 8比特 保留。发送者将其设置为0,接收者忽略此字段。
Checksum 16比特 校验和。
Fragment Tag 16比特 随机数,用来区分Bootstrap消息。
Hash Mask length 8比特 C-BSR的Hash掩码长度。
BSR-priority 8比特 C-BSR优先级。
BSR-Address 32比特 C-BSR地址。
Group Address 32比特 组播组地址。
RP-Count 8比特 希望为该组服务的C-RP的总数。
Frag RP-Cnt 8比特 在本段内包含的C-RP地址的个数。对于一个给定的组来说,如果Bootstrap消息分片,Frag RP-Cnt字段便于将RP-Set分片。
RP-address 32比特 C-RP的地址。
RP-holdtime 16比特 C-RP发出的advertisement消息的老化时间,表示C-RP的有效时间。
RP-Priority 8比特 C-RP的优先级。

PIM Assert

在共享网段上,如果PIM路由器从(S,G)或(*,G)表项的下游接口收到(S,G)报文,则表示该网段存在其他的转发者。路由器从该下游接口发出Assert消息,参与竞选。竞选落败者停止下游接口的转发。Assert消息同时在PIM-DM和PIM-SM中使用。

  • IP报文头的协议类型字段值为103,用来标识数据部分封装了PIM消息。

  • 封装Assert消息的IP报文源地址为本地接口地址,目的地址为224.0.0.13,TTL值为1。

  • 使用组播方式发送。

Assert消息格式
    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 |
+-------+-------+---------------+-------------------------------+
| Group Address [Encoded-Group format] |
+---------------------------------------------------------------+
| Source Address [Encoded-Unicast format] |
+-+-------------------------------------------------------------+
|R| Metric Preference |
+-+-------------------------------------------------------------+
| Metric |
+---------------------------------------------------------------+
Assert消息字段解释
字段 长度 说明
PIM Ver 4比特 PIM版本,值为2。
Type 4比特 消息类型,值为5。
Reserved 8比特 保留。发送者将其设置为0,接收者忽略此字段。
Checksum 16比特 校验和。
Group Address 32比特 组播组地址。
Source address 32比特 如果竞选(S,G)表项的唯一转发者,则为组播源地址。如果竞选(*,G)表项的唯一转发者,则为RP地址。
R 1比特 RPT位。如果竞选(S,G)表项的唯一转发者,该位为0;如果竞选(*,G)表项的唯一转发者,该位为1。
Metric Preference 31比特 到Source address的单播路径的优先级。
Metric 32比特 到Source address的单播路由的开销。

PIM C-RP Advertisement

当PIM-SM网络中使用动态RP时,配置了C-RP的路由器周期性的向BSR发送PIM C-RP Advertisement消息,通告希望服务的组范围。C-RP Advertisement消息只在PIM-SM中使用。

  • IP报文头的协议类型字段值为103,用来标识数据部分封装了PIM消息。

  • 封装Advertisement消息的IP报文源地址为源端C-RP,目的地址为BSR。

  • 使用单播方式发送。

C-RP Advertisement消息格式
    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 |
+-------+-------+---------------+-------------------------------+
| Prefix-cnt | Priority | Holdtime |
+---------------+---------------+-------------------------------+
| Group Address [1] |
+---------------------------------------------------------------+
| .... |
+---------------------------------------------------------------+
| Group Address [N] |
+---------------------------------------------------------------+
C-RP Advertisement消息字段解释
字段 长度 说明
PIM Ver 4比特 PIM版本,值为2。
Type 4比特 消息类型,值为8。
Reserved 8比特 保留。发送者将其设置为0,接收者忽略此字段。
Checksum 16比特 校验和。
Prefix-Cnt 8比特 组播地址前缀值。
Priority 8比特 C-RP优先级。
Holdtime 16比特 Advertisement消息的老化时间。
RP-Address 32比特 C-RP地址。
Group Address 32比特 组播组地址。

参考标准

标准 描述
RFC 4601 Protocol Independent Multicast - Sparse Mode (PIM-SM):Protocol Specification (Revised)
RFC 3973 Protocol Independent Multicast - Dense Mode (PIM-DM):Protocol Specification (Revised)
RFC 4607 Source-Specific Multicast for IP