理论上,PIM-SM域之间建立MSDP连接来交换组播源信息,是在RP与RP之间建立的,不建议在非RP上建立,MSDP是通过TCP来建立的,端口号为639,和BGP的邻居建立相似,所以要建立MSDP,必须手工指定MSDP peer的地址,TCP由地址小的一端主动发起连接,而地址高的一端则在LISTEN状态等待连接。 待MSDP peer建立成功之后,便开始传递SA信息,MSDP之间的Keepalive包每60秒一个,如果75秒没有收到Keepalive包,则会话被重置,而发送的SA信息也可以被当作Keepalive,即如果75秒没有收到Keepalive但收到了SA,也表示连接正常。当一个RP拥有多个MSDP peer时,在从一个peer那里收到SA之后,会转发给除发送者之外的其它所有peer,如下图:
在上图中,PIM-SM Domain 1中的RP路由器R2与PIM-SM Domain 2中的RP路由器R3以及PIM-SM Domain 3中的RP路由器R5之间建立全互联的MSDP连接,R2从R3收到的SA会转发给R5,从R5收到的SA也会转发给R3,并且R3从R2收到的SA会转发给R5,从R5收到的SA也会转发给R2,R5的动作和R2与R3一样,也会将自己收到的SA转发给其它MSDP peer,这样的转发结果就是对于同一个组播源信息会从多个MSDP peer收到多次重复的,比如对于PIM-SM Domain 2中的组播源信息,R5会同时从R3和R2收到,那么对于哪一条是正确的,在收到的时候会做一个检测,然后将正常的SA缓存起来,如上图中,R5只应该接收R3发来的SA,而R3也应该只接收R5发来的SA,对于PIM-SM Domain 2的SA,R2只应该接收R3发来的,对于PIM-SM Domain 3的SA,R2只应该接收R5发来的;(至于SA是谁发来的,是不是从正常路径发来的,我本人认为这并不重要,全部接收好了,我觉得没什么,因为它只是一个消息而已,并且不管是谁发来的,消息的内容都是一模一样的,有什么好纠结的呢?是谁发来的只要消息是对的,并不影响组播流量的转发!),路由器从MSDP peer收到SA之后,需要做Reverse Path Forwarding (RPF)检测,即反向路径检测,普通的RPF检测的方法是查看自己的路由表中去往发送者IP的数据包该从哪个接口出去,那么从哪个接口收到的数据包就被认为是合法有效的,这个合法的接口也被称为RPF接口,事实上MSDP对于SA数据包的RPF检测要比普通RPF检测复杂的多,但这是MSDP唯一的重点,也是唯一的难点,如果RPF检测失败,就表示SA信息被丢弃,那么组播树就无法建立,组播也就无法通信。
注:在当前的IOS版本中,将MSDP的SA信息缓存起来是强制执行的,不能人为手工开启或关闭,默认情况下,当MSDP邻居配置之后,命令“ip multicast cache-sa-state”将被自动添加到running configuration中,如果IOS版本早于IOS Releases 12.1(7) 和12.0(14)S1,默认是不开启SA信息缓存功能的,但可以通过手工输入命令“ip multicast cache-sa-state”来开启SA缓存功能。
PIM-SM域把SA发来之后,SA数据包里面明确写清楚了那个PIM-SM域内的RP地址是多少,这是SA数据包内我们唯一需要关心的内容,因为该RP地址对SA数据包的RPF检测至关重要,但是这个SA里面写的RP地址可以被人为更改,更改命令为ip msdp originator-id加接口,则使用相应接口的IP地址为SA内的RP地址。
对收到的SA数据包做RPF检测,和普通的RPF检测不一样,普通的RPF检测是根据所有的IGP路由表以及所有的BGP单播路由表来做检测的,即命令“show ip route”看到的路由表,而对SA数据包做的RPF检测只能根据BGP路由表来做检测,单播BGP和组播BGP都可以,即Unicast Border Gateway Protocol (uBGP)和Multicast Border Gateway Protocol (MBGP),MBGP是Multiprotocol-Border Gateway Protocol (MP-BGP)应用的一种,因为MP-BGP不仅可以扩展到组播,还可以扩展到IPv6以及MPLS。如果同时存在MBGP和单播BGP,则MBGP优先,既然对SA数据包做的RPF检测必须依靠BGP路由表,那就意味着PIM-SM域之间必须运行BGP,如果没有BGP,那么SA的RPF检测将失败,最终导致SA数据包被丢弃。
MSDP RPF检测详细规则
在以下3种情况下收到的SA是不需要做RPF检测的:(相当重要)
1.发送方MSDP peer是default MSDP peer或是唯一的1个MSDP peer(即只配置了1条ip msdp peer命令)的情况下;
2.发送方MSDP peer是MSDP Mesh Group中的一员;
3.发送方MSDP peer的IP地址与SA数据包中的RP地址相同。
所以在以上3种情况下,BGP和MBGP都是不需要的。
通常情况下,MSDP peer就是BGP或MBGP 邻居,但也有不是的情况,因为BGP的邻居类型分interior BGP (iBGP)和exterior (eBGP),所以SA的RPF具体检测过程也分如下3种:
1.MSDP peer是iBGP邻居;
2.MSDP peer是eBGP邻居;
3.MSDP peer不是BGP邻居(但域之间也必须有BGP)。
注:在以上3种检测情况下,都需要对比SA中RP的IP地址信息,所以务必保证将SA中RP的IP地址通告进BGP中;同样的,也建议使用建立MSDP peer的地址来建立BGP邻居,更能保证RPF的检测通过。
SA的RPF具体检测细节如下:
1.当MSDP peer是iBGP邻居
如果BGP路由表中显示去往SA数据包中RP地址的最佳路径就是走这个iBGP邻居,则检测通过,否则检测失败。(先查多播路由表(MRIB),再查单播路由表(URIB))
解释:BGP路由表中去往SA数据包中RP地址的最佳路径的下一跳地址等于发送该SA数据包的MSDP peer的地址。
★所以建议建BGP和建MSDP的地址使用同一个地址。
2.当MSDP peer是eBGP邻居;
如果BGP路由表中显示去往SA数据包中RP地址的最佳路径的下一跳AS号码就是这个eBGP邻居的AS号码,则检测通过,否则检测失败。(先查多播路由表(MRIB),再查单播路由表(URIB))
解释: 最佳路径的下一跳AS就是AS_PATH中的第1个AS,即AS_PATH中最左边的AS。
3.当MSDP peer不是BGP邻居(但域之间也必须有BGP)
如果BGP路由表中显示去往SA数据包中RP地址的最佳路径的下一跳AS号码和去往MSDP peer的最佳路径的下一跳AS号码相同,则检测通过,否则检测失败。(先查多播路由表(MRIB),再查单播路由表(URIB))