组播基础
1.保留的组播地址:224.0.0.1-224.0.0.255
公网上的组播地址:224.0.1.0-238.255.255.255
私网上的组播地址:239.0.0.0-239.255.255.255
2.组播在二层也要有对应的mac地址,组播ip:mac地址=32:1,mac地址前面25位是保留的00 10 5e 00 .....,加上组播地址的后23位.所以存在一个mac地址对应多个组播地址的可能,如果出现这样的情况,那么不同组之间的流量可以相通.IETF的观点是,在一个交换网络里出现这样情况的概率很低,可以接受,即使真的出现这问题,数据包也会因为3层的组播地址,4层的端口号,上层应用的验证等被丢弃.
这种可预测的组播mac地址有两个好处:
1.只需要向该组播mac地址发送一个数据帧,交换机就会帮你复制多份到需要的主机.
2.不需要ARP进程.
3.主机对查询包的相应--report报文,应该发送给相应的组地址,让其它的组成员也收到,这可以抑制其它组成员的report包,防止report包在交换网络里泛滥.
4.当有多台路由器为同一个MA网络转发组播流量的时候,要选出一个转发路由器和查询者.防止数据包的多份传输.
IGMP基础
IGMPv2
IGMPv2使用以下4种消息:
1.report消息
2.离组消息
3.特定组查询消息
4.普通查询消息
如果有主机想加入组,主机会主动向路由器发送report消息,表明自己想加入的组地址
路由器每60s向子网里(224.0.0.1)发送普通查询消息,并且要求在10s内收到report.
主机在收到普通查询消息后,会激活一个随机的定时器(<=10s),各个主机不尽相同,最先超时的那台主机会向本组发送report消息,其它组成收到后就抑制自己的report消息.
主机如果要离组,就发送离组消息,该消息发向224.0.0.2,因为其它组员并不需要知道你的离开
路由器收到离组消息后,会立马为该组组地址发送特定组查询,以查询是否还有剩余组员,并且等待2s,如果2s内没有收到其它组员的report,那么就认为子网中已无该组组员,删除该组.
为了防止特定组查询报文可能因为网络拥塞问题而丢包导致误认为没有组员,所以特定组查询报文会在1s内发送2个,一共发送2次.
当一个MA网络有多个路由器的时候,IGMPv2要选出一台作为查询者,一开始每台路由器都认为自己是查询者,都发送普通查询包,相互之间都能收到,通过比较包里的源ip,选出ip最小的作为查询者,其它非查询者监听查询者的查询包,如果在120s内(query-timeout)没有收到,那么就认为查询者down掉,重新选举查询者.
IGMPv1
IGMPv1和IGMPv2的不同之处:
1.v1,没有离组消息,是静悄悄的离开,路由器唯一能知道没有组员的方法就是等180s查询超时后知道.
2.无特定组查询.
3.v1的查询报文中不含最大响应时间字段,所以最大响应时间始终是10s.
4.v1没有查询者的选举,但是v1会通过PIM协议选举出一个DR(IP地址最大的),该DR将作为子网的查询者.
CGMP基础
IP组播的设计原则就是仅将流量分发到希望接收流量的目的地.
CGMP
和广播一样,默认情况下交换机会把组播流量泛洪到除接收端口的所有端口上-----原因所在
很明显,对交换机来说,最优处理方式是仅将组播流量转发到连接了组成员的端口上.CGMP就是支持该功能的一种协议.
交换网络中组播流量的控制方法:
1.手工配置交换式组播树
在mac表中配置静态表项,缺点是非动态,不可扩展,并且无法穿越vlan边界(即所有成员要在同一vlan)
2.GMRP
该协议可以在交换机中动态注册/撤销注册mac组播地址.GMRP是严格的二层协议
3.IGMP snooping
该协议是业界标准,只需要交换机开启,开启snooping的交换机会查看IGMP报文,并且知道组成员所处的端口位置.建议在交换机使用ASIC转发的时候使用.
4.CGMP
路由器和交换机都要开启CGMP,只有路由器会发送,交换机仅仅是处理.CGMP报文始终发送到mac 0100.0cdd.dddd 启用了CGMP的交换机会监听该地址.
CGMP报文里有两个字段:GDA(组目的地址)和USA(单播源地址)
当路由器激活CGMP的时候,发送的第一个CGMP Join包里的GDA=全0,USA=路由器的mac,用于告诉交换机该端口连接着一台路由器.以后每60s发送一次以保持激活状态.
当主机向路由器发送IGMP report信息要加入某组的时候,路由器会发送一条GDA=某组的mac,USA=该主机的mac,的CGMP报文给交换机.交换机通过mac表就能感知到该组员处在什么端口上.
当主机发送离组消息的时候,路由器会发送特定组查询,1s发2个,发2s.并且被交换机转发到所有的端口.如果有其它组员回应,那么路由器会发送GDA=该组播mac地址,USA=该主机的mac,的CGMP报文给交换机,让交换机删除该组员.如果没有成员相应特定组查询,那么路由器会发送GDA=该组mac,USA=全0,的CGMP报文给交换机,让交换机删除整个组.
交换机会把组播地址和端口的映射保存在CAM表里.
当有主机加入某组的时候,GDA=该组的mac,USA=该主机mac.交换机把mac表里的主机mac替换成GDA.离组CGMP报文也是这样.
GDA=0,USA=路由器的mac,表示:让交换机删除和路由器相关的组的端口,当在交换机端口上关闭了路由器的CGMP功能就会发送此包.
GDA=0,USA=0,表示:让交换机删除任何组和任何相关的端口,如果在路由器上使用clear ip cgmp 就会发送此包.
CGMP的格式
目的地址是0100 0cdd dddd 只有路由器能发起,CGMP被封装在SNAP头部中.
多播路由问题
1.多播路由器必须要进行RPF检查
路由器可能从很多接口收到多播流量,这时候会查看自己的单播表,检查去往组播源的单播路由是从哪个接口出去的,只有从这个接口收到的组播流量才是合法的,其它都无效.
如果单播表里去往源的路由负载了, 那么就看接口IP,IP大的接口被选中.
这样一来,组播流量就只能从一条路径,并且是最优路径,没有负载.
因为单播表会变化,所以多播树也是动态变化的
2.隐式加入和显式加入
组播路由协议的作用就是管理组播树的变化情况,在组成员加入多播组时负责嫁接,在组成员离开时负责剪枝.
隐式加入由发送方发起,而显式加入由接收方发起.隐式加入适合DM,显式加入适合SM.
隐式加入维护组播树的方式成为洪泛/剪除机制.
DM使用洪泛/剪除机制,并且会周期性的重泛洪.
被剪除的接口会维护一个定时器,210s,在超时后会重新洪泛流量,然后重新收到Prune.(周期性的重泛洪)
3.源树和共享树
源树的根就是组播源,每个组的每个组播源维护一棵树.组播树一定是最短路径,但内存消耗大.适用于DM
共享树的根是RP,每个组一棵树,不管有多少的源.内存消耗小,但是不一定是最短.适用于SM RP是预先确定好的,RP要仔细选取,当然,RP也是故障源.共享树的组播流量一定要经过RP
4.多播定界
多播定界就是限定多播流量能覆盖的最大范围
TTL定界,在DM模式下,在边界路由器会有问题,多播流量会被毫无必要的发送给边界路由器.
管理性定界,通过组播地址的分类来定界.
RP
1.静态配置RP.
需要在组播域内所有组播路由器上配置该命令,如果RP挂掉了,需要在每台路由器上修改RP的地址.不能做冗余.ip pim rp-address x.x.x.x,并且该RP地址必须被通告到IGP中.
2.auto-rp
这是cisco私有的协议,使用224.1.1.39和224.0.1.40两个组播地址.想要竞争RP的设备叫C-RP,他们会周期性的每60s发送RP-annnouce消息到224.0.1.39,而MA就处于224.0.1.39中,MA类似班主任,会对收到的竞争消息做比较,IP地址最大的作为RP,其它的作为备份,如果MA在180s内没有收到RP的RP-annouce消息,就认为RP挂掉了,会重新选举RP.MA可以有多个,同时存在,都处于224.0.1.39中,MA选出RP后,会向224.0.1.40发送RP-discovery消息,用于告诉所有路由器RP的地址,所有路由器都监听224.0.1.40这个地址.作为MA和RP的接口都必须要运行PIM协议.RP和MA最好都做多个.还有TTL,必须保证TTL足够大,否则可能导致RP选不出或者选举不一致.
3.Bootstrap
在PIM-SM里必须要有RP.
RP的确认有三种方式:
1.手工配置:
必须在每一台路由器上配置,并且如果配置的RP失效后,必须手工在每一台路由器上修改,否则组播无法通信.
2.Bootstrap:
如果让大家去选RP,那么可能出现每个人选出的结果不同.这样肯定是不行的,一个组里只能有一个RP.
原理:1.先选RP的裁判--BSR,作为预选BSR的路由器(称之为C-BSR),会发送Bootstrap消息,内含优先级(0-255)和IP地址,优先级越小越好(默认是 0),IP地址越大越好.选出的BSR作为RP的裁判
2.再选RP,作为预选RP的路由器(称之为C-RP),会向BSR发送Candidate-RP-Advertisement消息,内含优先级(0-255)和IP地址,优先级越小越好(默认是0),IP地址越大越好.由BSR收集C-RP的信息,然后告诉给大家,让大家自己选出RP,因为默认大家的算法是一样的,所以RP也一样.
Candidate-RP-Advertisement和Bootstrap都是每60s发送一次.
3.Auto-RP协议:
Auto-RP的工作过程与BSR相同,同样是在网络中配置多个候选RP和RP裁判,候选RP向RP裁判发送竟选消息(RP-Announce),最后RP裁判从候选RP的竟选消息中选出IP地址最高的为活动RP,然后发送RP-Discovery通告给每台路由器,不同的是,竟选活动RP只根据IP地址大小,没有优先级之分。在Auto-RP中,侯选RP仍然被称为C-RP,但RP裁判被称为映射代理(RP-mapping agent)。所有的C-RP向映射代理发送竟选消息,使用目的地址为224.0.1.39,每60秒发送一次,而映射代理从众多C-RP中选出活动RP后,以目的地址为224.0.1.40发给每台路由器(Discovery),也是每60秒发送一次。
PIM-DM
1.PIM-DM有如下5种PIMv2报文:
1.hello. 维护邻居,选举DR,
2.join/prune join用于剪除覆盖
3.Graft
4.Graft ack 在3s内必须收到Graft ack,否则重传Graft
5.Assert 选举转发路由器(即PIM前转器)
2.基础:
默认的PIMv2的hello间隔和PIMv1的Query间隔都是30s,超时是3.5倍(1分45秒).
PIMv2使用ip协议号103,组地址224.0.0.13
PIMv1使用ip协议号2,组地址224.0.0.2
PIM-DM使用洪泛/剪除机制来构建组播分发树.叶子路由器如果没有下挂任何组成员,那么会向上游路由器发送prune消息剪除自己.
一台路由器可能会从多个接口接收到组播流量,路由器会从多个接收接口中选出一个接口作为上行接口,选举原则就是通过单播路由表,哪个接口去往组播源最优就选哪个.(即RPF检查)
所以在组播路由表中表示的是去往源的路由信息.
接收到prune消息的接口会开启一个210s的定时器,在超时后会把该接口变成转发状态,发送组播流量,如果重新收到prune消息,就继续剪除该接口,并且重置210s定时器.
如果在组播路由表里看到上游邻居的ip地址是0.0.0.0,表示该路由器直连的设备是组播源.
被剪除的组播路由器,如果收到了组成员的IGMP消息(想加入组播组),那么该路由器会向上游路由器发送Graft消息,请求嫁接到组播分发树中,Graft消息以单播形式发送给上游,并且启动3s定时器,3s内未收到ack,就重传Graft消息.上游路由器收到Graft消息后,立马回复Graft-ack(嫁接确认).如果上游路由器也是被剪除的,那么就再向上游发送Graft并且要求在3s内收到ack.
注意:在路由器向下一跳邻居发送查询数据包,查询是否有组成员存在时,邻居必须发送join数据包来通告自己需要接收组播,然后不需要接收的,则发送prune将自己剪除,如果剪除后的路由器后来需要再接收组播,是不能发送join数据包的,而必须发送graft来将自己接入组播树。当被剪除的路由器向上一跳邻居发送graft数据包后,上一跳会将邻居接口标为组播的出口,即forward状态。如果上一跳邻居也是被剪除的,那么也会再向上一跳邻居发送graft
3.剪除覆盖:
R1把组播流量发送到MA网络100.1.1.0/24中,R2没有组成员,所以要向R1发送prune要求剪除MA网络,R3有一个组成员.
R2向R1发送prune的时候,该prune消息包含R1的地址,发送到组地址224.0.0.13,R1和R3都会接收到,R1接收到的时候,不会马上剪除MA网络接口,而是会设置一个3s的定时器,R3接口到的时候,必须在3s内向R1发送join消息,以此来覆盖R2的prune消息.这样,R1就不会中断发向MA网络的组播流量.
4.PIM-DM的DR:
选举方式很简单,在MA网络中,通过30s每次的hello来选举,最大ip地址的路由器成为DR.PIM-DM本身不需要DR,之所以选举,是为了给IGMPv1作为查询者.
5.PIM转发路由器选举:
当有多台路由器向同一个MA网络转发组播流量的时候,就应该选举出一个转发路由器.
一开始的时候,R1和R2都会认为自己是转发路由器,都向MA网络转发组播流量,R2会接收到R1转发的组播流量,R1也会接收到R2的,当R2接收到的时候,就会知道有多台路由器向同一个MA网络发送流量了,这时候R2会向组播地址224.0.0.13发送一个Assert消息(声明消息),Assert报文包含如下内容:
1.本路由器到达组播源的单播路由的AD 越小越好
2.本路由器到达组播源的单播路由的metric 越小越好
3.本路由器在本MA网络中的IP 越大越好
R2和R3会收到对方的Assert报文,通过比较以上3个参数来决定谁作为转发者.落选的路由器会把MA网络接口剪除掉.
PIM-SM
PIM-SM同时支持源树和共享树.PIM-SM使用的是显式加入机制.PIM-SM必须有一个RP.
PIM-SM流量转发原理:
在RP已经被所有路由器都认识的时候,有一个主机要加入某个组,就会向该子网的路由器发送IGMP join消息,该组播路由器知道RP的位置,所以会向RP发送PIM-join消息,RP收到后,创建(*,G)条目
因为不知道组播源的位置,所以是*,这时候RP到主机的共享树就形成了.此时如果有组播源,有流量发向该组播地址的时候,第一跳路由器知道RP的位置,所以第一个组播包会被封装在注册消息里,以单播的方式发送给RP,RP收到注册消息后,会查看组播表,如果有相应的(*,G)表项,那么就有组成员,于是拆开单播,把里面的组播流量从共享树发送给成员.
并且向组播源发送一个PIM-join消息用于形成源树,组播源收到join消息后,就形成了源树,此时组播流量就通过源树发送给RP,当然,也会通过注册消息,所以RP收到组播源发送来的第一个组播流量的时候要向源发送解除注册消息来阻止源发送的单播.
组播源收到解除注册消息后,就停止发送单播,从此就以组播形式发送流量.最后一跳路由器默认情况下当组播流量超过閥值0的时候会切换到源树,因为这时候这台路由器已经知道源的位置了(通过单播路由表),就可以向组播源发送PIM-join消息来形成源树,因为源树一定是最短路径树.
如果RP收到单播注册消息的时候没有相应的组成员,那么就直接发送解除注册给组播源,不发送PIM-join,这时候组播源就不发送组播流量了.