组播原理详解 联系客服

发布时间 : 星期四 文章组播原理详解更新完毕开始阅读64a8e80053ea551810a6f524ccbff121dd36c594

(255.255.255.255),这样主机只能接收针对自己的数据报和广播数据报。

细心的读者可以看出一个问题,就是数据链路层如何接收组播数据帧呢?原来,数据链路层的接收过程跟IP层原理一致,即数据链路层也有自己的接收列表(不过该列表的内容不是IP地址,而是MAC地址),每当IP模块收到上层应用的加入组播组的请求之后,IP模块就会向数据链路层通告(上面提到过),通告的时候携带了组播组的IP地址,于是数据链路层就会把IP地址进行适当的变换,变换的结果就是一个组播MAC地址,于是数据链路层把这个组播MAC地址插入自己的接收列表里面,以后每当有数据帧到来的时候,数据链路层就会把数据正的目的MAC地址跟接收列表里的每项内容进行比较,遇到任何匹配的一项就接收下来,并向IP层传送。

这样又引出了两个问题:数据链路层如何区分单播MAC地址跟组播MAC地址?数据链路层做一个IP地址跟组播MAC地址的影射,这个影射是怎样的?

首先解释第一个,一般情况下,单播MAC地址的最高字节的最低比特为0,而组播MAC地址的最高字节的最低比特为1,如下所示:

这样数据链路层就可以根据该比特判断收到的数据帧是不是一个组播数据帧。下图是第二个问题的答案:

从可以看出,MAC地址跟IP地址的低23比特是对应的,比如IP模块告诉数据链路层软件,自己加入了一个组播组224.10.10.10,则数据链路层形成一个MAC地址01--00--5E--0A--0A--0A(取组播IP地址低23位,高位为上面介绍的规则),并加入接收地址列表中。

到此为止,我们分析了网络层和数据链路层对组播的处理过程,为了更加深理解,我们举一个实际中的例子,还是同样的网络拓扑:

假设图中从左到右计算机依次叫做PCA,PCB,PCC,并假设PCA上运行媒体流服务器发送程序,以组播地址224.10.10.10来不停的发送电视频道数据流。

开始的时候,PCB和PCC都没有接收该数据流,于是在PCB,PCC的数据链路层和网络层的接收列表中都没有针对224.10.10.10组播地址的接收项,从而当数据链路层接收到一个数据帧,该该数据帧的目的MAC地址是01--00--5E--0A--0A--0A的时候,因为接收列表中没有该地址,所以在数据链路层就被丢弃(到这里,读者应该能体会到,组播数据在数据链路层就可以被隔离,而广播数据则必须到达网络层才能判断出是否需要丢弃,这也是使用组播而不使用广播的最大好处)。 这时候,假设PCB计算机的一个用户想收看网络电视频道了,于是该用户启动一个程序(比如,WINDOWS平台下的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 二层组播协议

在上面介绍的几个例子中,我们使用了以太网交换机连接许多主机终端,并假设以太网交换机按照广播的形式发送组播数据,即以太网交换机每当接收到一个组播数据报,就向所有的端口上转发(除去接收端口)。如下所示:

还是原来的命名规则,计算机从左到右依次为PCA,PCB,PCC。这样当交换机从PCA所在端口接收到PCA发出的组播数据帧后,就向PCB,PCC所在端口转发。这时候假设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(通用组播注册协议),该协议需要计算机的网卡的配合。该协议这样运行,每当计算机加入一个多播组的时候,计算机同时给交换机发送一条GMRP加入消息,该消息携带的内容之一就是计算机加入的组播组的MAC地址。这样交换机会根据不同的情况而采取不同的动作:

1。如果交换机上没有创建针对该组播MAC地址的转发项,则创建一个转发项,把出口集合初始化为连接发出请求的计算机的端口,以后就根据这个转发项进行数据转发; 2,如果交换机上已经有了针对该组的转发项,则交换机仅仅把连接发出GMRP加入请求的计算机端口加入转发项的出口列表里面即可。

这种方式简单明了,容易理解,但需要计算机网卡驱动程序的支持,目前来说,很少网卡能有这种能力,所以应用不是很广泛。

另外一种应用很广泛的协议是IGMP窥探,这种协议是建立在IGMP协议上的,在介绍这种协议之前,我们先介绍一下IGMP协议。

所谓IGMP,即INTERNET组管理协议,是用于主机跟路由器之间交互的一种协议,为了说明这种协议出现的背景,请参考下面的图示:

一般情况下,路由器是不转发组播数据流的,即路由器假设自己的本地网络上不存在组播数据流的接收端,这样的假设是符合实际情况的。在图中,媒体流不停的发送电视频道数据,这些数据被路由器阻隔,所以到达不了本地网络。假设本地网络上有一台计算机想接收该媒体服务器发出的数据流,这时候该计算机必须告诉路由器自己的需求,这样路由器才能把组播数据流引入本地网络。计算机告诉路由器使用的这种协议就是IGMP协议。 IGMP协议目前已经发展到了第三版,在这里我们仅仅对第一版做一个简单的讲解,其他版本跟第一版相差不大,可以参考相应的书目。

IGMP协议第一版主要有两种消息:主机加入消息和成员查询消息,这两种消息分别从主机和路由器发出。其中,主机加入消息是计算机用来告诉路由器,自己想加入某个组播组