组播原理详解.docx
《组播原理详解.docx》由会员分享,可在线阅读,更多相关《组播原理详解.docx(16页珍藏版)》请在冰点文库上搜索。
![组播原理详解.docx](https://file1.bingdoc.com/fileroot1/2023-6/21/99d961bd-3b89-4909-9f3f-6008dfb3bf16/99d961bd-3b89-4909-9f3f-6008dfb3bf161.gif)
组播原理详解
组播原理
第一章概述
随着数据通信技术的不断发展,各项基于数据通信技术的业务层出不穷,FTP,HTTP,
SMTP等传统的数据通信业务已经不能满足人们对信息的需求,视频点播,远程教学,新闻发布,网络电视等新型业务也逐渐发展起来,并被引入数据通信网络。
这些新型业务的特点是,有一个服务器(我们把这个服务器称为媒体流服务器)在发布信息,而接收端数量很大,可能有成千上万个,而且具体数目不固定。
在这种方式下,我们可以使用传统的客户服务器(C/S)模型解决,按照下面的思路:
1。
在媒体流服务器上启动媒体流播放进程,作为服务器;
2。
客户端每当想接受某个媒体流服务器的数据的时候,通过给出该媒
体流服务器的IP地址,来跟该媒体流服务器建立连接(比如,TCP
连接等);
3。
媒体流服务器维护一个客户列表,采用轮循的方式向每个客户发送
媒体流。
可以看出,这样的解决方案有两个缺陷:
1。
客户数目很大的时候,媒体流服务器就有可能承受不了,因为这种
媒体流跟传统的窄带业务(比如HTTP等)不同,它需要很高的带宽
来传输,而且服务器还必须维护每个客户的信息;
2。
严重浪费网络资源,相同的数据可能在网上传播了很多次,在一些
带宽较低的链路上,可能引起严重的通信瓶径。
在这个时候,我们自然而然的想起了组播。
这种技术最适合上面的这些新型业务。
因为组播通信有下列优点:
1。
媒体流服务器不必知道某个客户端的存在,它只管把媒体流以组播
地址播放出去即可,而且仅仅播放一份;
2。
媒体流数据在网上仅仅传送一份即可,即使有成千上万个客户端;
3。
客户端不必向媒体流服务器注册,如果想接收某个媒体流服务器的
数据,仅仅加入该媒体流服务器所播放的数据所在的多播组即可。
组播技术从提出到现在,它的一些标准和技术已经相当完善了,但推广还不是十分广
泛,尤其是在我国,人们对组播的认识还处于一个朦胧的阶段,更谈不上规模应用。
为了让
大家尽快的了解组播技术,我们在本文中给出一些学习指引,主要有下列内容:
1。
组播基础概念,这些概念是深入学习组播的最基础的东西,如果对这些基础概念不
了解,学习组播将是一句空话;
2。
流行组播协议,在文中我们不具体分析哪种组播协议,而给出组播协议的一些共性,
并列举了目前比较流行的组播协议和它的应用场合;
3。
列举了一些参考资料,这些资料按照不同的读者层次列举,既有面向组播专家的高级论题,也有面向初学者的入门文章。
总之,本文是面向组播初学者的,如果你从没有接触过组播技术,那么仔细的阅读本文并掌握介绍的一些基本概念,然后参考文中列举的其他文章,将会是一种良好的学习路径。
如果您是一位组播技术方面的专家,阅读本文也不无裨益,您可以从不同的角度来了解组播的基础概念,也可以参考文中提到的其他组播文章,相信对您也是有好处的。
第二章二层组播基础概念
在前面的介绍中,我们讨论了用多播的方式解决新型流媒体业务的好处,在该部分中,我们结合一个实际的网络给出一些多播的基础概念,掌握这些基础概念是深入掌握多播技术
的前提。
2.1网络实例
有下面一个网络需求:
在图中,媒体流服务器通过以太网交换机LSWA跟核心路由器GSR/连接起来,并启动
流媒体进程,不断的以多播IP地址224.10.10.10发送媒体流。
GSRA和GSRB>间采用以太网连接起来,GSRB1过以太网交换机LSWB连接了许多终端,其中两台终端需要媒体流服务器播放的媒体流。
下面我们仔细分析每一个步骤,在分析的过程中引入并介绍一些基础的组播概念。
2.2组播MAC地址和组播IP地址
在前面的介绍中,我们提到了媒体流服务器不断的以多播IP地址224.10.10.10发送
媒体流,224.10.10.10这个IP地址就是一个多播IP地址。
按照IP协议规定,位于
224.0.0.1—239.255.255.255范围内的IP地址都是多播地址。
所谓多播地址,实际上是一个逻辑的概念,在网络上,没有一个计算机的IP地址是一个多播IP地址,多播IP地址仅
仅代表了一个逻辑的组,加入该组的终端设备可以以该组所在的多播地址为目的IP地址来
发送数据,这时候,发送的数据不是针对某个具体主机的,而是针对一组机器,想接收这个多播数据流的计算机,只要倾听接收到的每个数据报,判断该数据报的目的IP地址是不是
组播组的IP地址即可。
若是,则接收,否则丢弃。
为了更好的理解组播IP地址的概念,我们举一个例子,如下面的网络图所示:
主机A(最左边的一台计算机)不断的以组播IP地址224.10.10.10发送数据,这时候
主机B(中间计算机)想接收组播组224.10.10.10的数据,于是它就会监听每个收到的数
据报,判断该数据报目的IP地址是不是224.10.10.10,如果不是则丢弃,如果是则接收下来送到上层处理。
这里牵涉到了一个问题:
主机B的哪个模块判断接收到的数据报是不是组播数据报,
并且是不是针对组224.10.10.10的数据报?
答案是主机B的IP模块。
我们看一下一台计算
机接收数据的过程:
IP层(至于数据链路层怎样接
1。
数据链路层把接收到的数据帧剥掉链路层头后送给收数据帧,在后面会详细探讨);
2。
IP模块维护一张接收列表(该列表是IP地址组成的结合),每当接收到一个数据报(链路层送上来的)后,便把数据报的目的IP地址提取出来,然后跟接收列表中的每个
IP地址比较,如果有一项匹配,则接收该数据,并向上层传送,否则丢弃;
3。
如果一台主机想加入一个多播组(加入与否由上层应用决定),比如你想看网络电
视频道,这时候你需要启动一个应用程序,并告诉该应用程序网络电视频道的组播IP地址,
该应用程序就会向IP模块注册,请求加入组播组。
IP模块于是在自己维护的接收列表里添加一项(同时也告诉数据链路层自己加入了一个组播组,并附带上组播组地址),添加的这
项就是组播组的组播IP地址。
这样每当接收到目的地址是该组播IP地址的数据报的时候,
IP模块就接收下来,并向上层传送。
4。
如果一台主机想退出组播组,比如你终止了电视频道接收程序,于是该程序在退出
的时候会告诉IP模块,自己不再接收组播组的数据,并告诉IP模块组播组的组拨IP地址,
于是IP模块就把该组播地址从接收列表中删除,这样以后如果再接收到该组播组的数据报
的话,因为接收列表里没有匹配的项目,所以IP模块就丢弃该数据报。
经过上面的分析可以看出,问题的关键在于IP模块维护的接收列表。
通常情况下(主
机没有加入任何组播组),该列表里只有两项,即主机自己的IP地址和广播IP地址
(255.255.255.255),这样主机只能接收针对自己的数据报和广播数据报。
细心的读者可以看出一个问题,就是数据链路层如何接收组播数据帧呢?
原来,数据
链路层的接收过程跟IP层原理一致,即数据链路层也有自己的接收列表(不过该列表的内
容不是IP地址,而是MAC地址),每当IP模块收到上层应用的加入组播组的请求之后,IP
模块就会向数据链路层通告(上面提到过),通告的时候携带了组播组的IP地址,于是数据
链路层就会把IP地址进行适当的变换,变换的结果就是一个组播MAC地址,于是数据链路
层把这个组播MAC地址插入自己的接收列表里面,以后每当有数据帧到来的时候,数据链路
层就会把数据正的目的MAC地址跟接收列表里的每项内容进行比较,遇到任何匹配的一项就
接收下来,并向IP层传送。
这样又引出了两个问题:
数据链路层如何区分单播MAC地址跟组播MAC地址?
数据链
路层做一个IP地址跟组播MAC地址的影射,这个影射是怎样的?
首先解释第一个,一般情况下,单播MAC地址的最高字节的最低比特为0,而组播MAC
地址的最高字节的最低比特为1,如下所示:
xxxxxx
组播地址,第六个字节的第一位为1
xximxO
单播MAC地址£第六个字节的第一位为0
这样数据链路层就可以根据该比特判断收到的数据帧是不是一个组播数据帧。
下图是第二个问题的答案:
XXXXXXXXJXXXXXXXXXXXXXXXXXXXXXXXX
■23hit*
「V
01-00-5E胡XXXXXXXXXXXXXXXXXXXXX
h2恥,
从可以看出,MAC地址跟IP地址的低23比特是对应的,比如IP模块告诉数据链路层软件,自己加入了一个组播组224.10.10.10,则数据链路层形成一个MAC地址
01--00--5E--0A--0A--0A(取组播IP地址低23位,高位为上面介绍的规则),并加入接收
地址列表中。
到此为止,我们分析了网络层和数据链路层对组播的处理过程,为了更加深理解,我们举一个实际中的例子,还是同样的网络拓扑:
xxxxxxxmxxxxxxxxxxxxxxxxxxxxxx
闫23就#
U1r
01-00-5E--0XXXXXXXXXXXXXXXXXXXXX
k型t.
假设图中从左到右计算机依次叫做PCApcbpcc并假设PCA上运行媒体流服务器发
送程序,以组播地址224.10.10.10来不停的发送电视频道数据流。
开始的时候,PCB和PCC都没有接收该数据流,于是在PCBPCC的数据链路层和网络层的接收列表中都没有针对224.10.10.10组播地址的接收项,从而当数据链路层接收到一
个数据帧,该该数据帧的目的MAC地址是01--00--5E--0A--0A--0A的时候,因为接收列表
中没有该地址,所以在数据链路层就被丢弃(到这里,读者应该能体会到,组播数据在数据
链路层就可以被隔离,而广播数据则必须到达网络层才能判断出是否需要丢弃,这也是使用
组播而不使用广播的最大好处)。
这时候,假设PCB计算机的一个用户想收看网络电视频道了,于是该用户启动一个程序(比如,WINDOW平台下的WMPLAYER并告诉该程序接收224.10.10.10组播组的数据流。
于是发生下列事情:
1。
该应用程序通过操作系统调用接口(API函数)告诉该PC机的IP模块,自己想接
收224.10.10.10组播组的数据(也就是说要加入组播组224.10.10.10);
2。
IP模块接收到该加入请求后,便把组播组地址224.10.10.10加入自己的接收列表
中,同时向数据链路层发送一个请求,告诉数据链路层自己想接收224.10.10.10组对应的
数据流;
3。
数据链路层接收到IP模块的这个请求后,根据组播MAC地址跟组播IP地址的影射规则,把组播IP地址224.10.10.10影射成组播MAC地址01--00--5E--0A--0A--0A,然后加入自己的接收列表,至吐匕动作完成。
完成上述动作后,PCB就可以接收组播组224.10.10.10的数据流了。
如果这时候用户不想继续看网络电视了(比如用户关闭应用程序),则应用程序在退出的时候会通知网络层,
自己退出组播组224.10.10.10了,于是网络层会把自己的接收列表中224.10.10.10项删除,
并通知数据链路层删除相应的列表项目。
到此为止,我们对组播IP地址跟组播MAC地址做了个详细的介绍,并详细分析了各个
协议模块怎么处理组播数据的。
这部分内容特别重要,如果还是不明白,请再读一遍,或者
参考其他的书籍。
2.3二层组播协议
在上面介绍的几个例子中,我们使用了以太网交换机连接许多主机终端,并假设以太网交换机按照广播的形式发送组播数据,即以太网交换机每当接收到一个组播数据报,就向
所有的端口上转发(除去接收端口)。
如下所示:
XXXXXXXKXXXXXXXXXXXXXXXXXXXXXXXX
峙23ht卜
门1r
01-00-5E-OXXXXXXXXXXXXXXXXXXXXX
I*23血,
还是原来的命名规则,计算机从左到右依次为PCAPCBPCC这样当交换机从PCA
所在端口接收到PCA发出的组播数据帧后,就向PCBPCC所在端口转发。
这时候假设PCB在接收组播数据流,而PCC没有接收组播数据流,于是PCC就可能接收到一些多余的数据(虽然这些数据在数据链路层就被隔离掉了,但毕竟不是理想的做法)。
理想的做法是,交换机只向需要组播数据的端口设备转发组播数据流,比如PCB需要
数据,则仅仅向PCB转发。
回忆我们以前讲解以太网技术的时候,曾经讲解了交换机的转发
过程,交换机是根据内部的一张CAM表来做出转发决定的,我们可以从概念上理解CAM表是这样构成的:
{目的MAC地址,出口集合},在单播情况下,交换机根据数据帧的目的MAC
地址查找CAM表,找到一个出口(在单播情况下,出口集合中只有一个元素),然后把这个
数据帧从该出口转发出去。
交换机上的这个CAM表同样适用于组播的情况,这时候,目的MAC地址就是一个组播
MAC地址(其特点和形成过程严格按照前面介绍的规则),而出口集合就可能不是一个元素
了,可能是多个元素的集合。
还是假设上面的例子,假设开始的时候只有PCB接收数据,则
交换机创建一个转发项(01--00--5E--0A--0A--0A,{B})(假设PCB连接交换机的B端口),
并按照该转发项转发组播数据流,这样PCC就不能收到无用的数据流了。
这时候假设PCC也加入了组播组224.10.10.10,于是交换机修改自己的转发表,把转发项(01--00--5E--0A--0A--0A,{B})修改成(01--00--5E--0A--0A--0A,{B,C})(假设
PCC连接交换机的C端口),这样每当交换机从PCA接收到一个数据帧,就根据这个转发项,复制成两份,一份给PCB一份给PCC
大家对交换机上的组播转发项已经很清楚了,这时候又一个问题出现了:
交换机根据
什么创建组播转发项,并对组播转发项的出口集合做出修改?
回忆单播的情况下,交换机是
根据学习来获得单播转发表的,在组播情况下,学习能否奏效?
其实在组播情况下,学习是不行的,因为在单播情况下的学习,是针对数据帧的源MAC地址进行的,而组播MAC地址不可能出现在数据帧的源MAC地址位置上(组播MAC地址出现
的唯一位置就是数据帧的目的MAC地址),所以根本无法学习。
这时候我们必须想一些其他
办法来解决该问题,这些办法就是二层组播协议。
第一种办法,也是最容易理解的办法就是GMRP通用组播注册协议),该协议需要计算机的网卡的配合。
该协议这样运行,每当计算机加入一个多播组的时候,计算机同时给交换机发送一条GMR加入消息,该消息携带的内容之一就是计算机加入的组播组的MAC地址。
这样交换机会根据不同的情况而采取不同的动作:
1。
如果交换机上没有创建针对该组播MAC地址的转发项,则创建一个转发项,把出口集合初始化为连接发出请求的计算机的端口,以后就根据这个转发项进行数据转发;
2,如果交换机上已经有了针对该组的转发项,则交换机仅仅把连接发出GMRF加入请求的计算机端口加入转发项的出口列表里面即可。
这种方式简单明了,容易理解,但需要计算机网卡驱动程序的支持,目前来说,很少网卡能有这种能力,所以应用不是很广泛。
另外一种应用很广泛的协议是IGMP窥探,这种协议是建立在IGMP协议上的,在介绍
这种协议之前,我们先介绍一下IGMP协议。
所谓IGMP,即INTERNET组管理协议,是用于主机跟路由器之间交互的一种协议,为了
说明这种协议出现的背景,请参考下面的图示:
一般情况下,路由器是不转发组播数据流的,即路由器假设自己的本地网络上不存在组播数据流的接收端,这样的假设是符合实际情况的。
在图中,媒体流不停的发送电视频道
数据,这些数据被路由器阻隔,所以到达不了本地网络。
假设本地网络上有一台计算机想接收该媒体服务器发出的数据流,这时候该计算机必须告诉路由器自己的需求,这样路由器才
能把组播数据流引入本地网络。
计算机告诉路由器使用的这种协议就是IGMP协议。
IGMP协议目前已经发展到了第三版,在这里我们仅仅对第一版做一个简单的讲解,其他版本跟第一版相差不大,可以参考相应的书目。
IGMP协议第一版主要有两种消息:
主机加入消息和成员查询消息,这两种消息分别从主机和路由器发出。
其中,主机加入消息是计算机用来告诉路由器,自己想加入某个组播组的,而成员查询消息是路由器发出,用来查询网络上是否还有某个组播组的成员的。
以上图为例,分析一下IGMP协议的运行过程:
1。
本地网络上的一台主机加入了一个多播组G,于是该主机发出一个IGMP加入消息给路由器,告诉路由器自己想加入组播组G,于是路由器开始从上游引入组播组G的数据到本地网络;
2。
路由器转发组播组G的数据一段时间后,会发出一个查询消息,看网络上是否还存
在组播组G的成员(因为有可能刚才加入的那台主机已经退出组播组了),加入组播组的成
员要重新发布IGMP加入消息来作为成员查询消息的响应,如果没有组播组的成员了,路由器将收不到响应,这时候路由器将再次进行查询尝试,如果还没有主机应答,路由器就认为网络上已经没有针对组播组G的主机了,于是停止转发组播组G的数据;
3。
路由器发出组播组成员查询消息后,只要收到一台主机的响应,则路由器就必须继续转发组播组G的数据,不能因为网络上接收端的数目少而停止发送。
这样IGMP协议就很清楚了,我们来看一下IGMP窥探协议是怎样工作的。
IGMP窥探是这样的,交换机分析每个接收到的组播数据帧(IGMP加入消息是以组播方
式发送的),看该数据正是否是一个IGMP加入消息,如果是,则从该消息中就可以判断出发出该消息的主机想加入的组播组,根据该组播组的IP地址形成组播MAC地址,并把接收到
该消息的端口加入出口列表,这样一个组播转发项就创建完成了。
完成之后,交换机把刚才拦截的IGMP消息再不加改变的转发出去。
这样不停的窥探,
交换机就可以掌握网络上的组播成员情况,并反映在自己内部的组播转发表里,以后就根据创建的组播转发表来进行数据的转发。
IGMP窥探存在一个严重的问题,就是交换机必须分析每个组播数据帧,判断该数据帧是否是IGMP加入消息,如果是,则进行进一步分析,否则转发。
这样对一些低性能的交换机来说,是一项很繁重的任务,所以该协议不适合低端交换机,而适合一些核心层的骨干交换机。
到此为止,一些二层的组播协议我们都做了个大体的介绍,相信读者读了这些介绍后,应该对这些协议有个大致的了解了,详细的了解以及一些具体的配置命令请参考相应的书籍。
籍。
第三章三层组播基础概念
在前面部分的介绍中,我们集中在了对二层组播基础概念的介绍上,在本章中,我们
引入一些三层组播的基础概念,在这些概念的基础上,简单介绍目前流行的组播路由协议(注意跟二层组播协议的区分)原理及应用场合,使读者对这些协议有个大致的了解,并为以后详细学习这些组播路由协议打下基础。
3.1组播转发项,组播树和RPF检查
为了引入这些概念,我们首先看一个实际的网络图:
在该图中,路由器MR1连接了一台多播数据源,该数据源不停的播放多播数据,MR2
和MR3连接的本地网络都有数据接收端,MR4的本地网络没有数据接收端。
这样MR1在转发
多播源数据的时候,就只需向MR2和MR3转发即可,没有必要再转发给MR4这样我们可以
通过在路由器MR1上创建三层转发项来完成,三层转发项可以是这样的结构:
(S,IIF,G,
{SO,S1,...}),其中S是组播数据源的IP地址,IIF是到达组播源S所使用的接口,即在单播方式下,路由器如果要给组播源S发送数据,则通过IIF接口发送,而G则是组播组地址,{SO,S1,。
。
。
}是一个出口集合。
这个转发项的含义很明确,就是当路由器接收到一个数据报后,把这个数据报的源IP地址和目的IP地址(该目的IP地址是一个组播地址)
读出来,跟转发项匹配,如果有一个转发项的源地址跟组播组地址相同,则把这个数据报向
出口集合中所有的接口转发(需要注意的是,在把数据包发送出去之前,还需要进行一个RPF检查,只有通过了才转发,否则丢弃)。
网络上所有路由器的三层组播转发项串接起来,就构成了一棵组播转发树,比如,在下面的图形中,MR1的组播转发项为(S,EO,G{SO,S1})(其中SO,S1连接MR2和MR3路由器),MR2组播转发项为(S,SO,G,{EO}),MR31播转发项为(S,SO,G{EO}),这样就构成下面的树状结构(以红色线条标出):
1O