转载地址
一、什么是组播
1. 什么是组播?
组播是一种数据包传输方式,当有多台主机同时成为一个数据包的接受者时,出于对带宽和CPU负担的考虑,组播成为了一种最佳选择。
2. 组播如何进行工作?
组播通过把224.0.0.0-239.255.255.255的D类地址作为目的地址,有一台源主机发出目的地址是以上范围组播地址的报文,在网络中,如果有其他主机对于这个组的报文有兴趣的,可以申请加入这个组,并可以接受这个组,而其他不是这个组的成员是无法接受到这个组的报文的。
3. 组播和单播的区别?
为了让网络中的多个主机可以同时接受到相同的报文,如果采用单播的方式,那么源主机必须不停的产生多个相同的报文来进行发送,对于一些对时延很敏感的数据,在源主机要产生多个相同的数据报文后,在产生第二个数据报文,这通常是无法容忍的。而且对于一台主机来说,同时不停的产生一个报文来说也是一个很大的负担。
如果采用组播的方式,源主机可以只需要发送一个报文就可以到达每个需要接受的主机上,这中间还要取决于路由器对组员和组关系的维护和选择。
4. 组播和广播的区别?
如同上个例子,当有多台主机想要接收相同的报文,广播采用的方式是把报文传送到局域网内每个主机上,不管这个主机是否对报文感兴趣。这样做就会造成了带宽的浪费和主机的资源浪费。而组播有一套对组员和组之间关系维护的机制,可以明确的知道在某个子网中,是否有主机对这类组播报文感兴趣,如果没有就不会把报文进行转发,并会通知上游路由器不要再转发这类报文到下游路由器上。
众所周知的D类IP地址
D类地址 用途
224.0.0.1 在一个子网上的所有主机
224.0.0.2 在一个子网上的所有路由器
224.0.0.4 所有DVMRP协议的路由器
224.0.0.5 所有开放最短路径优先(OSPF)路由器
224.0.0.6 所有OSPF指定路由器
224.0.0.9 所有RIPv2路由器
224.0.0.13 所有PIM协议路由器
224.0.0.0-224.0.0.255 保留作本地使用,做管理和维护任务
239.0.0.0-239.255.255.255 留用做管理使用
二、组播协议的要素
通过和广播,单播的数据传输方式的比较,我们可以发现组播中最关键的两个部分:
1. 组的管理和维护
在组播这套协议中,在网络设备和所连接的子网需要有一套协议或机制来保证网络设备知道所连接的子网中,有多少台主机属于一个特定的组。
组播地址的分配
组播地址的动态分配:
SDR (Session Directory Tool)技术允许应用程序在建立新的会话时随意选用组播地址,通过冲突检测技术避免地址的重复使用,这种方法适用于初期应用较少的MBONE
MASC(Multicast Address Set-Claim)是 IETF 设计的新的组播分配方案,首先将组播地址段静态分配到不同的地区,在每个地区内仍然采用动态租用的方案使用组播地址,想法是好的,实现起来的难度较大,周期较长。
MADCAP(Multicast Address Dyna)与DHCP相似
组播地址的静态分配
目前的解决方案多采用静态组地址分配技术
SGAA(Static Group Address Assignment)是在 MASC 方案得以实现之前的应急之道。采用 233/8 地址段用于静态地址分配,中间两节包含网络自治系统号,最后一节用于组分配。
2. 组播报文的路由
*指定源组播地址
可以用于跨域组播应用,简化源组播地址维护,接收者需要指明要接收的源(S,G)加入
*不指定源组播地址
支持(*,G)加入方式
主播分发树:
最短路径树(基于源的分发树):是发现上游接口,离源最近的接口。因为组播路由协议只关心到源的最短路径。
通过(S,G)对来决定真正的下游接口,当所有的路由器都知道了他们的上下游接口,那么一颗多播树就已经建立完成。根是源主机直连的路由器,而树枝是通过IGMP发现有组员的子网直连的路由器
(3)管理多播树
单播路由只需要知道下一跳的地址,就可以进行报文得转发。而组播,是把从一个由源产生得报文发送给一组目的。在一个特定的路由器上,一个包要多个备份可能从多个接口上发出。如果有环路得存在,那么一个或多个包会返回到其输入的接口,而且这个包也会经复制发到其他的端口上。这一结果可能导致多播风暴,这个包不断在路由器与交换机间复制,直到TTL减为0。由于这是个复制过程,它的危害会比单播环路严重的多,所以所有的多播路由器必须知道多播包的源,并且需要保证多播包不能从源接口发出。所以他必须知道哪些是上游接口和下游接口,可以分辨出数据包的流向。如果在不是在源的上游接口收到数据包,就会把它丢弃掉。而多播路由协议必须关心到源的最短路径,或者说它关心到源的上游接口。同时,除了关心上游接口,但是在转发的时候,不能把数据包从除了上游接口的其他接口发送出去。所以,另外,他还要关心(S,G)下游接口。当关于一个(S,G)的上下游接口都被判断出来了,那么一颗多播树就形成了。
共享分发树(*,G):
组员可以在多播会话存活的时候,加入或退出一个组,而其相连的路由器必须动态的根据直连子网内组员的存在或退出来决定要加入或剪除多播树的树枝。这就是通过显式或隐式加入两种方式来完成。
隐式加入试用于密集模式,它是采用广播/剪除模式来去除多播树上的没有组播成员的树枝,也就是说,它是通过先把网际网络上的所有路由器都加入到多播树上,然后由每个路由器通过IGMP来查询是否有组员在直连的子网上,如果没有,就发出一条剪除消息,来剪除多余的树枝
而显示加入适用于稀疏模式,它是由每个路由器先查询子网内有无组员,然后才看是否要发加入信息给上游路由器。
基于源的树和共享树的比较?
基于源的树是针对一个源就会有一颗多播树构成,也就说,如果网络中有多个可以产生组播报文的源主机,那么就会有多少颗组播树组成,在组播表里,会有组数×每组的成员数的项目条数。这种拓扑主要适用于密集模式。
共享树是在整个网络中选一个RP,或叫集中点,所有的组播报文都需要从这个点来进行传送,所以它没有(S,G)项,只有(*,G)项,表明所有有多个源。RP是预先设定的一个路由器,承担转发所有的多播报文的责任。所有要发送组播报文的源主机在发送组播报文前,都需要到RP上进行注册,然后通过直连的路由器来确定到RP的最短路径,通过RP路由器来确定到目的地的最短路径。RP成为了多播树的根结点。
相对于基于源的树,共享树的多播表项更为精简,适合在稀疏模式下使用。但是也有一些缺点。共享树在RP上的选择,会导致从源主机到各个组地址的路由并非最优路径。
如果在整个局域网里同时有多条耗带宽的组播链路,会导致RP成为整个网络的瓶颈。并且在共享树中,采用选取RP来转发组播报文,会增加产生单点故障的可能。
三、如何来维护组成员
现在有IGMP和CGMP(Cisco专有的)两种协议,可以进行主机和网络设备之间的组员关系的维护。
IGMP是路由器和内部子网之间通信的方式,用于局域网中路由器或三层设备查询组播成员,也就是说它是三层设备对直连子网的组关系的维护机制。它可以分成两个部分,主机部分和路由器部分,每个部分可以完成不同的工作。但是它有一个限制,就是IGMP报文只能在本地子网内传送,使三层设备不能前转到其他的设备上,它的TTL总是1。
IGMP(Internet Group Management Protocol)有三个版本:
v1 RFC 1112 支持Windows95
v2 RFC 2236 支持Windows98后的各版本及大多数Linux系统,兼容IGMP v1((RFC 1112)
v3 RFC 3376 支持Windows XP,2003即少数Linux系统
-对于IGMP v1,主机离开组播组不需要发送任何报告
-对于IGMP v2,主机离开组播组需要发送‘leave’的报告
-对于IGMP v3,在原有的组地址上增加了Include/exxclude源地址列表
IGMPv2主机部分的功能:
运行IGMPv2的主机会产生以下3种信息:
* Member Report消息
用来指示一台主机想要加入一个组播组,这个消息在一个主机第一次加入组的时候会发出,也可以用来响应三层设备发出Membership Query消息。由于Membership Query消息的目的地址是组地址,除了路由器,网内其他的组员主机都会收到这个报文,一旦其他主机收到报文,他们将会抑制自己的Membership Query报文,避免了内部局域网充斥了Membership Query报文。它只需要让路由器知道网内还有一个组员。
* Version 1 Membership Report消息
是为了IGMPv2主机的向后兼容性,用于检测和支持子网中IGMPv1主机和路由器
* Leave Group消息
主机发出的,目的地址为224.0.0.2(所有路由器),告诉路由器主机离开了一个组。
*主机也可不必等待一个查询才能加入一个组,它可主动发送224.0.0.2以加入组。
IGMPv2路由器功能:
主要是查询功能,它会有两种查询报文,General Query和Group-Specific Query
General Query每隔一段时间就会向局域网内发送,目的地址是224.0.0.1(网内所有主机),所以子网里的每一个主机都会收到这个报文,并且会以Member Report报文回应,如果在一定的时间间隔内设备没有收到任何Member Report,它就会认为子网内没有组员。
Group-Specific Query报文,当路由器收到一个Leave Group报文的时候,它会发送这样一个具体包含有组地址的报文来查询这个组是否有组成员存在。
当如果在一个子网上同时有两个多播路由器,他们一开始都会认为自己是组播成员的查询者,当他们发送General Query报文时,通过比较从对端收到的报文源IP地址的大小来决定谁是查询者谁不是查询者,IP地址大的成为查询者。如果在一段时间内没有收到查询的报文,就会认为查询者down掉了,它就会充当起查询者的角色。
-二层交换机承担了IGMP的代理(Snooping) 作用:保证组播数据流被正确的发送给组播成员,实现IGMP报告查询的功能以及抑制其他成员的功能。
CGMP(Cisco专有)
考虑到了如果有交换机存在的情况,考虑到了在三层设备和主机中有二层设备,而IGMP是一个三层协议,二层设备如果收到这样一个类型的报文,只会向除了源端口以外的所有端口进行转发,这样会对网络的带宽和整体性能造成影响。解决的方法是希望交换机可以对有组播成员的端口进行组播报文的转发。
在交换式网络上,对组播流的控制有三种方法:
(1)手工配置的交换式多播树
在交换机的桥接表上配置静态的组播MAC地址和端口映射。
(2)GMRP(802.1p)
他让MAC层的多播组地址动态地在交换机上注册和取消。
(3)IGMP侦听
通过在交换机端口上配置,可以使交换机进行IGMP消息地检查,可以知道多播路由器和组员地位置。但是,检测IGMP消息意味着所有地IP包都要进行检查。尤其当这些如果是在软件地方式来实施,会严重降低交换机的性能。
CGMP的做法是通过路由器来告诉交换机,组播成员的组MAC地址和主机MAC地址,让交换机可以知道在那个端口上有组员,并且可以进行转发。
四、组播报文如何来进行路由
存在多个路由时,多点广播路由选择协议维护着整个广播生成树。现下常用的组播路由协议有一下几种,由于现在主流的路由器产品只支持PIM,其他的路由器协议都不支持,所以只会对PIM做个详细的解释。
稀疏和密集模式的比较?
稀疏模式-它是指在一个整体网络中,参与组播的主机相对来少的一种拓扑,主要出现在WAN中。
密集模式-和以上相反,主要出现在交换式LAN或校园网中参与组播主机相对集中的一种拓扑。
*密集模式路由选择协议
DVMRP(距离矢量多点广播路由选择协议)Distance Multicast Routing Protocal
它是通过RIP来发现到源的最短路径,采用广播/剪除的方式来构建一颗多播树。
MOSPF(多点广播开放最短路径优先协议) Multicast Open shortest path first
它是通过OSPF协议来发现到源的最短路径,也是用在密集方式的拓扑下。
PIM DM(独立于协议的多点广播密集模式) Protocol independent Multicast Dense Mode
PIM-DM 使用了和 DVMRP 及其它密集模式一样的溢出和修剪机制。 DVMRP 和 PIM-DM 之间的主要不同在于 PIM-DM 主要引入协议独立的观念。 PIM-DM 可以使用由任意底层单播路由协议产生的路由表执行反向路径转发(RPF)检查。PIM-DM假定网络中的每一个路由器都想接收组播数据包,一个发自组播源的数据包会被转发到组播路由器所有的下游路由器上,如果下游路由器不需要此组播组的数据,会向上游路由器发送剪枝要求,停止在此路径的转发。在这些网络中发送者和接收者非常接近,且只有一小部分发送者却有大量的接收者,组播的流量大,而且是持续的。所以PIM-DM主要是为部署小规模的网络
*稀疏模式路由选择协议
PIM SM(独立于协议的多点广播稀疏模式) Protocol independent Multicast Sparse Mode
它采用汇聚点(RP)收集并记录对组播数据有需求的路由器,并通过汇聚点将源发出的组播数据转发到这些路由器。而且PIM-SM还允许接收者切换到更优的转发路径来接受组播数据。主要用于帮助运营商实现大型网络(如Internet)中发送者和接收者距离远,且组播流持续性差的点到多点的组播服务。
CBT(基于核心的树) Centtral Base Tree
是一个与协议无关的,基于稀疏模式的,共享树协议。他和DVMRP和MOSPF的区别有两点:它无需要在组播中在加入一个路由协议,可以在现有的任何协议上查找到到源的最短路径;它是基于共享树的协议,所以必须要在网络里设置一个网络的核心来确保组播包的前转;更适合使用在稀疏模式下。
组播路由使用“反向路径转发”机制(RPF,Reverse Path Fording)
路由器在接收到由源S 向组播组G 发送的组播报文后,首先查找组播转发表。
如果存在对应(S,G)表项,且该组播报文实际到达接口与Incoming interface 一致,则向所有的outgoing interfaces 执行转发;
如果存在对应(S,G)表项,但是报文实际到达接口与Incoming interface 不一致,则对此报文执行RPF 检查。如果检查通过,则将Incoming interface 修改为报文实际到达接口,然后向所有的outgoinginterfaces 执行转发。
如果不存在对应(S,G)表项,则对此报文执行RPF 检查。如果检查通过,则根据相关路由信息,创建对应路由表项,然后向所有的outgoinginterfaces 执行转发。
RPF 检查执行过程如下:
在单播路由表中查找RPF接口。单播路由表中汇集了到达各个目的地址的最短路径。
如果当前组播路径沿袭从组播源S 到客户端的SPT 或组播源S 到RP的源树,则路由器以源S 的IP 地址为目的地址查找单播路由表,对应表项中的出接口为RPF接口。路由器认为由该RPF 接口接收到的组播报文所经历的路径是从源S 到本地的最短路径。
如果当前组播路径沿袭从RP 到客户端的RPT,则路由器以RP 的IP 地址为目的地址查找单播路由表,对应表项中的出接口为RPF 接口。路由器认为由该RPF 接口接收到的组播报文所经历的路径是从RP 到本地的最短路径。
将RPF 接口与组播报文的实际到达接口相比较,判断到达路径的正确性,从而决定是否进行转发。
如果两接口相一致,那么就认为这个组播包是从正确路径而来,RPF 检查成功。
如果两接口不一致,将该组播报文丢弃。作为路径判断依据的单播路由信息可以来源于任何一种单播路由协议、组播静态路由或者MBGP 路由协议。
RPF 的作用除了可以正确地按照组播路由的配置转发报文外,还能避免由于各种原因造成的环路。
组播是通过(S,G,V)来标识的,只要端口属于对应组播的VLAN就可以划分到组播组,一个端口当然可以属于多个组,限制就是VLAN,VLAN配置好了就OK了,至于静态不静态倒没有什么关系。