PIM-DM协议只需要从内核接收cache-miss消息。
二、SPT创建过程
1. linux内核协议栈收到组播源S的组播报文后检查MFC表项中是否存在该组播的转发表项,如果没有,内核将生成一条cache-miss消息上送给接收igmp管理报文的应用层程序(例如PIM-DM)。
2.PIM-DM的igmp管理报文socket收到来自内核的cache-miss消息后,解包得到组播报文的内容,并通过一系列的计算,随后下发MFC创建命令到内核,创建组播S的(S,G)路由表项。
3.生成的(S,G)转发表项出接口默认选择除入口以外的所有PIM-DM路由口,这样组播报文就会从入口外的所有其他路由接口转发出去。
4.各个收到组播报文的PIM-DM级联路由也会创建相应(S,G)表项,将入口以外的PIM-DM路由接口加入到表项出口和pruned口,并创建对应的剪枝定时器。
5.剪枝定时器到期前,组播报文会向所有PIM-DM路由和接口转发。剪枝定时器到期后,级联路由上的(S,G)表项中剪枝接口会从出口中删除,这样一来报文就无法转发了。
6.PIM-DM路由在加入-剪枝保持定时器到期后会重新发起剪枝过程。以维护SPT树。
7.级联路由在收到组播接收者的加入请求后会将接口者对应的路由口加入(S,G)转发表的出口和pruned口中,并同时向上联路由发送graft(嫁接报文)通告接收者信息,上联路由收到graft报文后会将报文接收端口加入到(S,G)转发表的出口和pruned口中,后面级联的路由同上。 一直到源路由收到此嫁接报文,整条链路上的SPT树通过嫁接操作又完整了。
综上: 以上就是PIM-DM,密集模式的整个处理过程,总结一下就是:源路由向所有路由通告:我把这个组播都给你们先,你们不要的话和我说下哈。 然后需要的路由就保持沉默,不需要的路由就告知源路由:这个组播我不需要,不要给我发了。 过了一段时间,源路由怕其他的路由器有信息更新,于是又问了一次... ... and so on.