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比特 | 消息类型,详见 |
| 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参数类型。详见 |
| OptionLength | 2B | OptionValue字段的长度,字节为单位。 |
| OptionValue | 可变 | Option参数值。 |
PIM Hello Option Code
| Value | Type | 说明 |
|---|---|---|
| 1 | Holdtime | 表示保持邻居为可达状态的超时时间,若超时仍没有收到Hello消息则认为邻居不可达。 |
| 2 | 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比特 | 组播组地址。 |
参考标准
| 标准 | 描述 |
|---|---|
| Protocol Independent Multicast - Sparse Mode (PIM-SM):Protocol Specification (Revised) | |
| Protocol Independent Multicast - Dense Mode (PIM-DM):Protocol Specification (Revised) | |
No comments to display
No comments to display