PIM(Protocol Independent Multicast)
PIMv2消息格式
PIMV2消息封装在IP包头中,协议号103,除了某些情况下用单播的消息外,PIMV2的IP目的地址是保留的多播地址224.0.0.13,TTL值设为1。
PIMV1也很常见,这个版本的IP协议号为2,使其成为IGMP协议的一个子集。版本1使用多播地址224.0.0.2。
PIMV2消息头
所有PIM消息均有标准的包头,如下图所示:
版本号(version):定义版本号
类型(type):定义了包头后的PIM消息类型,如下表所示:
校验和(chechsum):一个标准IP风格的检验和
保留(reserved):全为0,接收时忽略
HELLO消息格式
用于对邻居的发现和邻居的生存保持,这个消息默认为每30秒发送一个。
可选类型(option type):定义了可选项值中的可选项类型,当前,只有可选项类型1,它定义可选项类型为保持时间,2~16是保留的。
可选项长度(option length):定义了可选项值的长度,以字节为单位。当可选项值为保持时间(可选类型为1)时,可选值长度为2
可选项值(option value):可变长度的项,能装下可选项类型中定义的任何值。保持时间(可选项类型=1,可选长度=2)为路由器在宣布邻居无效前,等待从它发出的HELLO消息的时间,保持时间为HELLO间隔的3.5倍。
下图为采集到的HELLO报文。
Register(注册)消息格式
这个消息只用于PIM-SM,是从源DR向RP用单播发送的一个消息,它承载着从源发出的初始多播包。就是说,在还没有建立从源DR到RP的SPT之前,用Register消息把多播流量从源传送到RP。
校验和(checksum):在register消息里,只计算消息头,而不包括数据部分
B为边界比特,如果消息发起者为一个直连着源的DR,那么这个比特设为0,如果源为PIM多播边界路由器(PMBR),则这个比特设为1。
N为空注册比特。DR在注册抑制计时器超时前查找RP时设置这个比特为1。
多播数据包为来自源的一个多播包,它通过register消息传到RP。
Register Stop(注册终止)消息格式
这个消息用于RP响应DR产生的Register消息,此消息在两种情况下使用RP通过SPT收到多播,而不再需要收到register消息封装的多播消息没有直连的,或连到SPT、RPT上的组员等待RP转发这个包。
经编码的多播地址(encoded group address):是多播组的IP地址,对于这个地址,接收者要停止发送register消息
经编码的单播地址(encoded unicast source address):为多播源的IP地址,这顶也可以被(*,G)路由条目定义为全0,作为通配的源地址。
JOIN/PRUNE(加入/剪除)消息格式
这个消息将向上游RP或多播源发送,用于加入或退出RPT或SPT,这个消息由多播地址列表组成。对于每一个多播地址,有一个或多个源地址列表,这些列表共同定义了要加入和退出的(S,G)与(*,G)路由条目。
经编码的单播上游邻居地址(encoded unicast upstream neighbor address):是RPF或上游邻居的地址,这个消息将发送到这个地址上。
多播组数目(number of groups)定义了这个消息里面包含的多播组的数目。
经编码的多播组地址(encoded multicast groups address):定义了多播组的IP地址。
加入的多播组的数目(number of joined sources):定义了在这个多播组地址中列出的“经编码的加入多播源地址”的数目。
剪除的多播源的数目(number of pruned sources):定义了这个多播地址中列出的“经编码的剪除的多播源地址”的数目。
经编码的加入多播地址(encoded joined source address):定义(S,G)对的源地址或(*,G)对的通配置地址。(*,*,RP)三元组的两个通配符也可在此定义。除了源地址外,这一项中还规定了3个标识。
S为稀疏标识比特,这个比特设为1表示PIM-SM,用于与版本1的兼容
W为通配(WC)比特。这个比特设为1,则经编码的加入多播源地址代表(*,G)或(*,*,RP)路由条目中的通配符。当它设为0时,经编码的加入多播源地址代表(S,G)路由条目中的源地址,当向RP发送了JOIN消息,W比特必须设为1.
R为RPT比特,当这个比特设为1时,将向RP发送一个JOIN消息。当这个比特为0地,向多播源发送JOIN消息。
经编码的剪除的多播源地址(encoded pruned source address):定义了被剪除的多播源地址。这个编码与经编码的加入多播源地址相同,S、W、R比特同样与加入的地址一样,适用于被剪除的地址。
下图为采集到的报文。
Bootstrap(引导)消息格式
它由自举路由器(BSR)每60秒产生一个,扩散到PIM-SM域中,以保证一个组的所有路由器判断的RP相同,这个消息包含了一个或多个多播地址的列表,对于每一个组地址,都有一个候选RP及它们的优先权的列表,这个列表为这个组的RP集。收到消息的路由器用同样的算法从C-CP列表中算出这个组的RP。这个算法保证了PIM域中的路由器能得出相同的RP地址。
分段标签(fragment tag):用于bootstrap消息必须分为多个部分的情况。这个标签为一个随机产生的数,相同消息的片段分配同一个标签。
HASH掩码长度(hash mask length):用于hash算法的掩码的长度。
BSR优先权(BSR Priority):取值0~255,它定义了发出这个消息的BSR的优先权。有最高优先树的C-BSR会成为BSR。
经编码的单播BSR地址(encoded unicast BSR address):这个域的BSR的地址
RP计数(RP count):定义了对一个多播组列出的C-RP的总数,也就是RP集的大小。对RP集大小的描述很重要。因为如果bootstrap消息是分段的,一个分段丢失了,那么在PIM域中对RP的判断可能会不一致,因此,如果收到的RP集中的RP数目与RP数目不符,则整个RP集会被丢弃。
分段RP计数(fragment RP count):定义了对于某个组在这个分段中的C-RP的数目。
经编码的单播RP地址(encoded unicast RP address):为C-RP的IP地址。
RP保持时间(RPm holdtime):一个BSR在把一个C-RP从RP集中删除前等待C-RP发出Candidate-RP-Advertisement消息的时间,这个保持时间为150s。
RP优先权(PRm priority):取值0~255,用于选择RP的算法中,最高的优先权为0。
Assert(声明)消息格式
这个消息用于在多路访问网络中选举一个指定的转发路由器,PIM路由器在它的输出接口上收到多播包之后,会认定该数据链路层层上连接了另一台正在转发该多播组流量的路由器,因而该PIM路由器会发送一条Assert消息,以便让共享该多路接入网络的其它路由器能确定由谁负责转发该多播组的流量。
已编码的组地址(encoded group address):这个包的多播IP地址,这个地址触发了Assert消息。
经编码的单播源地址(encoded unicast source address):触发Assert消息的多播包的源地址。
度量优先组(metric preference):分配给提供到源的路由的单播路由器的优先权值。这个值与管理距离的使用相同,在比较不同路由协议发现的路由时提供一致的量度。
下图为采集到的报文。
Graft(嫁接)消息
PIM-DM路由器向上游邻居发出PIMV2 Graft消息,请求再次加入到以剪除的树中。其消息格式与JOIN/PRUNE消息格式类型相似,类型为6。
下图为采集到的报文。
Graft(嫁接确认)消息
PIM-DM路由器向下游邻居发送PIMv2 graft-ack消息,以响应其Graft消息。其消息格式与JOIN/PRUNE消息格式类型相似,类型为为7。
下图为采集到的报文。
Candidate-RP-Advertisement(候选RP宣告)消息格式
候选RP向BSR周期性单播发送Candidate-RP-Advertisement消息。BSR用于这个消息中的信息来建立RP集,这个RP集通过bootstrap消息域中的有的PIM-SM路由器来对外宣告。
前缀数目(prefix count):定义了包括在这个消息中的多播组地址的数目,如果发起消息的是一台多播域中所有多播组C-RP,则前缀数目为0
优先权(priority):取值0~255,定义了发起C-RP的优先权,这个值被用于选择RP的算法中,优先权与其值的大小相反:0为最高优先权,255为最低。
保持时间(holdtime):这个消息有效的时间
经编码的单播RP地址(encoded unicast RP address):为C-RP的地址,这个地址是路由器一个接口的IP地址,这个地址通常为loopback地址。
经编码的组地址(encoded group address):定义一个或多个多播组的地址,对于这个多播组,消息发起者为一个候选RP。
下图为采集到的报文。
============================================================
PIM-DM(Protocol Independent Multicast Dense Mode)
PIM-DM使用了5个PIMv2消息。
Hello
Join/Prune
Graft
Graft-Ack
Assert
在 PIM-DM 域中,运行 PIM-DM 协议的路由器周期性的发送 Hello 消息,发现邻接的 PIM 路由器,进行叶子网络、叶子路由器的判断,并且负责在多路访问网络中选举指定路由器(DR)。
PIM-DM 协议使用下面的假设:当组播源开始发送组播数据时,域内所有的网络节点都需要接收数据,因此采用“扩散-剪枝”的方式进行组播数据包的转发。组播源开始发送数据时,沿途路由器向除组播源对应的 RPF 接口之外的所有接口转发组播数据包。这样,PIM-DM 域中所有网络节点都会收到这些组播数据包。为了完成组播转发,沿途的路由器需要为组 G 和源 S 创建相应的组播路由项 (S, G)。 (S, G) 路由项包括组播源地址、组播组地址、入接口、出接口列表、定时器和标志等。
如果网络中某区域没有组播组成员,该区域内的路由器会发送剪枝消息,将通往该区域的转发接口剪枝,并且建立剪枝状态。剪枝状态对应着超时定时器。当定时器超时时,剪枝状态又重新变为转发状态,组播数据得以再次沿着这些分支流下。另外,剪枝状态包含组播源和组播组的信息。当剪枝区域内出现了组播组成员时,为了减少反应时间,协议不必等待上游剪枝状态超时,而是主动向上游发送嫁接报文,以使剪枝状态变为转发状态。
Prune消息的覆盖
如下图所示,运行PIM-DM的网络环境中,一台单独的路由器有多个多播下游邻居,上游路由器Mercury,把组内的多播包扩散到通过LAN连接的三台路由器上,copper路由器的输出接口表为空,于是向mercury发送一条剪除消息,但是sliver有一连接的组员,于是希望收到多播报文。
Mercury根据hello消息明确知道它的下游有两个邻居。但hello消息中并没有描述任何路由相关性信息,因而当copper发送prune消息时,mercury不知道是否要剪除该LAN接口。
PIM-DM利用剪除覆盖进程解决这个问题,copper向mercury发送了一条prune消息,但mercury的地址也被编码在该消息中,携带该消息的IP包被发送到ALL PIM ROUTERS地址224.0.0.13.当mercury接收到该prune消息后,并不立即剪除该接口,而是设置一个3秒定时器,与此同时,sliver也接收到了该prune消息,看到消息中所要剪除的多播组是其希望继续接收的多播流量的多播组,而且该消息已经被发送给正在转发多播流量的其上游邻居。
因而sliver向mercury发送了一条join消息。Sliver就覆盖了由copper发送的prune消息,只要mercury在3秒定时器到期前收到一条join消息,就不会中断多播流量。
PIM-DM指派路由器
PIM-DM会在多路接入网络中选举一台指派路由器,需要注意的是,PIM-DM协议本身不需DR,只是由于IGMPV1没有查询进程,为了管理IGMP查询,IGMP需要依赖该路由协议来选举DR。
DR选举进程很简单,每台PIM-DM路由器每隔30秒就发送一条PIMV2 hello消息或一个PIMV1 query消息,以进行邻居发现,在多路接入网络上,IP地址最大的PIM-DM路由器将成为DR,其他的路由器则监控DR发出的hello包,如果在105秒内都没有收到该hello包,则认为DR已失效,从而选举一个新的DR。
PIM转发路由器选举
如下图所示,在运行PIM-DM的网络环境中,mercury和copper都有一条去往多播源172.16.1.1的路由,且都有一个下行接口去住多播组239.70.49.238的成员。如果两台路由器都转发相同的多播流量到相同的网络上,那么网络效率会非常低下。
为了防止这种情况的发生,PIM路由器将在共享网络上选择一台转发路由器。由于PIM没有自己的路由协议,因而需要利用Assert(声明)消息来选择转发路由器。
当路由器在出站接口上接收到一个多播包时,会向网络发送一条Assert消息,消息中包含了多播源的地址和多播组的地址、去往多播源的单播路由器的度量值以及单播路由协议用来发现该路由的度量优先值(管理距离)。这两台路由器会比较这些信息,根据下面的规则来确定转发路由器。
所有宣告的度量优先值最低的路由器为转发路由器,如果这些路由器是通过不同的单播路由协议来发现这些去往多播源的路由,那么这些路由器仅宣告不同的度量优先值。
如果度量优先值相等,那么所宣告的度量值最低的路由器为转发路由器。也就是说,最靠近多播源的路由器就成为转发路由器。
如果度量优先值和度量值都相等,那么网络中IP地址最大的路由器就是转发路由器。
由转发路由器负责继续将多播流量转发到多路接入网络中,其他的路由器则停止转发该多播流量,并从各自的出站接口上删除该多路接入接口。