二层组播相关协议包括IGMP 和GMRP协议。让我们从分析组播MAC地址开始,逐步而深入的了解二层组播。

组播MAC地址

所谓组播MAC地址,是一类逻辑的MAC地址,该MAC地址代表一个组播组,所有属于该组的成员都接收以该组对应的组播MAC地址为目的地址的数据帧。

注意的是,组播MAC地址是一个逻辑的MAC地址,也就是说,在网络上,没有一个设备的MAC地址是一个组播MAC地址。组播MAC地址跟单播MAC地址(物理MAC地址)的区别是,组播MAC地址六个字节中,最高字节(第六字节)的最低位为1,而单播MAC地址则为0,如下图所示:

为了更进一步了解组播的概念,我们先从MAC层的数据帧接收过程说起。

MAC层数据帧的接收

在网卡的内部保留一张接收地址列表(可以理解为一个可读写的随机存储器),其中至少有两个MAC地址,即网卡的物理MAC地址和全1的广播MAC地址。每当计算机想接收一个组播数据,也就是说要加入一个组播组,那么上层软件会给网络层一个通知,网络层做完自己的处理后,也会发一个通知给数据链路层,于是,数据链路层根据网络层想加入的组播组的组地址(一般是一个组播的IP地址),根据一定的规则映射为一个组播的MAC地址,然后把该MAC地址加入接收地址列表。

每当数据链路层接收到一个数据帧的时候,就提取该数据帧的帧头,找出目的MAC地址,跟接收地址列表中的地址项目比较,如果在列表中遇到一个地址,跟该数据帧的目的MAC地址是相同的,就停止比较,接收该数据帧,并把该数据帧放到上层协议对应的接收队列中;如果在整个接收列表中没有找到一个匹配的MAC地址,则丢弃该数据帧。

现假设接收到的数据帧是发给自己的单播数据帧,于是该数据帧的目的MAC地址就是自己的硬件地址。数据链路层接收到该数据帧,跟接收列表中的地址比较,第一次比较就会通过,因为接收地址列表中的第一个MAC地址就是自己的硬件地址。所以在任何情况下,发给自己的数据帧一定能接收下来;

假设接收到的数据帧是一个广播数据帧,则在比较的时候,最后一项是匹配的,因为接收地址列表中肯定包含一个广播的MAC地址,这样就保证了任何广播数据报都会被正确接收;

假设上层软件想接收组播组G的数据,经过一番映射到数据链路层之后,数据链路层会在自己的接收数据列表中添加一项组播组G对应的MAC地址,假设为MAC_G,当计算机接收到一个数据帧,该数据帧的目的地址为MAC_G的时候,该数据帧会被接收并传递到上层,因为接收列表中有一项MAC_G记录。

组播转发表

在前面交换机的转发方式一节中讲到,交换机在转发组播数据包的时候,也是根据一个转发表来进行的,但跟单播转发表不同的是,该组播转发表对应的出口不是一个元素/端口,而是一组元素/端口,即一个出口列表。在转发数据的时候,交换机根据组播数据帧的目的组播地址查找组播转发表,如果在组播转发表中查不到相应的转发项,则把该组播数据帧当做广播数据帧处理,向所有端口上转发该数据帧(如果实现了VLAN,则仅仅向接收端口所属同一个VLAN的端口上转发);如果能查找到一个结果,则结果肯定是一个接口列表,于是,交换机把这个组播数据报复制成许多份,每份提交到一个出接口,从而完成数据的交换。

需要注意的是,这个组播转发项不像单播那样,是通过学习的方式获得的(在处理单播数据的时候,交换机每转发一个数据帧,会进行相应的学习过程,学习到一个单播转发项),而是通过一些二层的组播协议获得的,这些流行的组播协议有IGMP(Internet Group Management Protocol, 因特网组管理协议),GMRP(GARP Multicast Register Protocol,GARP组播注册协议,GARP- General Attribute Registration Protocol)等。下面部分详细解释每一种二层组播协议。

二层组播协议

上面我们提到,用于转发组播数据帧的组播转发项不是通过学习获得的,而是通过一些其他的组播协议,比如IGMP窥探,GMRP等协议获得的。至于为什么不能通过学习获得,是因为学习过程是分析一个数据帧的源地址,但组播地址在任何情况下不可能出现在源地址的位置(因为组播MAC地址是一个逻辑的MAC地址,网络上没有一个终端的MAC地址是一个组播MAC地址)。

下面我们分析二层组播协议,这些协议在构建组播网络的时候,有不可替代的重要地位。尤其是将来的流媒体应用会很广泛,在这种情况下,二层的组播将是必然的要求。

IGMP协议

在讲述IGMP窥探之前,先看一下IGMP协议,理解了IGMP协议,IGMP窥探就很容易了。

一般情况下,组播数据是从路由器的上游流下来的,而组播的接收端一般位于路由器的下游,典型的情况是,路由器通过一个以太网口连接企业网,另外通过一个串口连接Internet。组播数据源,比如流媒体服务器一般位于Internet上,组播数据流通过路由器到达企业网上的数据接收端。这种情况下,流媒体服务器是长时间工作的,也就是说,一天24小时,一周7天都在不停的发送媒体流信息,相当于电视频道。但企业网络中的数据接收端却不是这样,只有有限的时间接收端才接收数据,其他时间都是不接收数据的。这样,在企业网上没有数据接收端的时候,如果路由器也把大量的媒体流信息发到企业网内部,必然会浪费大量的资源,理想的情况是,如果企业网上没有数据接收端,则路由器就不转发媒体流,但如果只要有一个接收端,路由器就必须把媒体流引入企业网。这样必须有一种机制来保证路由器对企网上的数据接收端有一个清楚的了解,什么时候网络上有数据接收端,什么时候没有数据接收端,这种机制就是IGMP协议。

从上面的分析中,我们可以看出IGMP协议是数据接收端和路由器之间的交互协议,数据接收端使用该协议来通知路由器,自己是否想接收组播数据流。如果想接收的话,接收哪个组播组的数据流。

一般情况下,存在两种类型的IGMP消息:组成员报告和组成员查询,其中组成员报告消息由计算机发出,用来告诉路由器,自己想加入某个组播组,而组成员查询消息则由路由器发出,用来查询网络上是否存在相应组的成员。一个指导性的原则是,只要网络上有组播组的数据接收端,不管该接收端的数量是多少,路由器必须把该组播组的数据转发到网络上。

IGMP消息也是通过组播地址发出的,在IGMP加入消息中,该组播地址(IGMP消息的目的地址)就是该计算机想加入的组播组的组地址。比如,计算机想加入224.0.0.2这个组播组,则该计算机发出的IGMP加入消息的目的IP地址就是224.0.0.2。这样当路由器接收到该组播消息后,就知道网络上有一个主机,该主机想接收到组播组224.0.0.2的数据,于是,每当从上游接收到目的地址是该组地址的数据的时候,就把该数据包向企业网上转发。

还有一类消息就是组播组成员查询消息。在IGMP协议第一版中,没有规定主机的离开消息,即如果一个主机不想接收某一组播组的数据了,它也不会通过某种消息通知路由器,而是静悄悄的离开该组播组。这样如果路由器不采取某种措施来掌握网络上组播组接收端的数目情况,就会产生问题,假设网络上所有的主机都不想接收组播数据了,根据IGMP协议第一版,这些主机不会通知路由器,而是不做任何处理。这样路由器不知道这些原来接收组播数据的主机现在已经不接收数据了,而且还以为网络上有一大批的接收端,于是仍源源不断的发送组播数据,这样必然浪费带宽。而引入了组成员查询消息后,路由器可以每隔一段时间发出该消息,用来查询网络上还有没有主机在接收组播数据。注意的是,该查询消息跟成员加入消息一样,采用的目的IP地址也是查询的组的组播IP地址。假设路由器想查询245.2.2.1这样一个组播组是否还有成员,发出的查询消息的目的IP地址就是245.2.2.1。当网络上接收该组播组数据的成员接收到这个查询消息后,就发出一个响应,该响应还是一个组播组成员加入消息。这样只要路由器接收到一个这样的响应,它就知道网络上必然还有终端在接收数据,于是不能停止转发。但路由器发出查询消息后,一段时间内没有接收到任何响应,它就判断网络上没有了数据接收端,于是停止转发组播数据。

到此为止,IGMP协议的一些细节已经介绍完毕,接下来介绍IGMP窥探。需要注意的是,IGMP协议是三层协议,而IGMP窥探则是二层组播协议,但它利用了IGMP的三层特性。注意,IGMP协议是运行在交换机上的一种协议,它使用该协议来形成转发组播数据的组播转发表。

下面是启动了IGMP窥探的交换机工作过程:

(1) 交换机从每个端口上监听接收到的数据帧,如果是单播数据帧就按照通常的转发方式进行转发,是组播数据帧则进行下一步处理;

(2) 如果接收到的数据帧是组播数据帧,则分析该组播数据帧的协议类型字段,看是否是IP协议,如果不是,则按照通常的方式转发(这时候可能查询组播转发表转发,如果没有查到结果,则向所有端口上转发);(3) 如果是IP协议数据,则进一步判断该数据是不是一个IGMP加入消息或IGMP查询消息。如果不是,则进行通常的组播数据发送,否则转下一步;

(4) 如果是一个IGMP加入或查询消息,则该交换机就可以判断,在接收到该数据帧的端口上一定连接一个组播数据接收端,该接收端想接收IGMP加入消息中目的地址所在的组播组数据。于是,交换机就检查组播转发项,看对应的组播MAC地址有没有在组播转发项中出现。如果出现了,则把接收到该数据帧的接口加入组播转发项对应的接口集合,如果没有出现,说明该组播转发项还没有创建,于是创建一个组播转发项,该转发项的组播地址是IGMP消息的目的IP地址的影射MAC地址,接口列表初始化为接收到该数据帧的接口,接下来继续按照通常的过程转发该数据帧。

到此为止,IGMP窥探的具体工作过程已经明了,可以看出,这种协议最大的一个缺点就是效率较低,交换机需要分析每个组播数据帧,看该数据帧是否是组播数据帧,如果是,继续看是否是IP数据帧,如果是,继续看是否是IGMP加入消息等等。

GMRP协议

当主机不支持IGMP协议的时候就无法实现窥探。我们考虑能不能开发一种专门的针对组播的协议,该协议可以高效的完成其他组播协议完成的任务。

这就是GMRP协议。该协议需要计算机网卡和交换机一起工作,因此需要计算机网卡的支持。由于该协议是一个较新的协议,故大多数网卡都没有支持,但作为一种标准的协议,将来的网络设备都会支持。

该协议的运行过程很简单,想接收组播数据的计算机只要告诉连接的交换机,它想接收哪个组的组播数据即可。交换机接收到通知后,就创建相应的组播转发项,把接收到组播请求的端口加入组播转发项中。当计算机不再想接收组播数据了,只简单的告诉交换机就可以了,交换机接收到通知后,就从组播转发项中把相应的端口删除掉。

总结

二层组播的一些基础概念就讲解完了,在这些内容中,组播MAC地址,组播和单播数据的接收过程以及三种组播协议是重点。这些内容也是学习后续内容(比如三层组播路由协议)的基础,在实际中,这些组播概念也是应用得最多的。