MLDv1&v2
通过在与主机相连的接口上发送查询报文并接收主机反馈的加入报文和离开报文,路由器可以了解与该接口连接的网段上有哪些组播组存在接收者(即组成员)。如果出现组成员,组播路由器应将对应组的组播数据报文转发到这个网段;如果没有组成员则不转发。主机可以自主决定加入或退出某个组播组。
如图9-1所示,一个使能了MLD协议的路由器DeviceA会自动变为查询器并定时发出MLD查询报文,与DeviceA在同一网段的所有主机(HostA、HostB、HostC)都能收到它发出的查询报文。
主机收到查询报文的处理:
如果HostA之前已经加入了组G,就会在路由器允许的响应时间内随机地发送一个报告组G的MLD加入报文。
路由器收到组G的MLD加入报文会记录组G的相关信息,同时对该组启动一个定时器(如果已经启动则刷新),以便如果长时间没有主机响应时切断该组流量,并负责把组G的组播数据转发到HostA和DeviceA相连的接口所在的网段上。
如果主机不是任何的组播组成员,在收到MLD查询报文时则不做任何响应。
主机加入组播组:
一个新加入组播组G的主机会主动发送一个该组的MLD加入报文,通知路由器更新组播组信息,后续的加入报文则由路由器的查询报文来驱动。
主机离开组播组:
如果一个主机决定离开某个组播组G,会主动发送组G的MLD离开报文,路由器收到后会触发一个指定组G的查询,确定该组在当前网段接收者的存在情况。如果在查询结束后仍然没有收到主机针对该组的MLD加入报文,则删除已记录的组信息,停止转发该组数据到对应接口所在的网段上。
MLDv1报文处理
运行MLDv1的主机发送的MLD报告中仅携带组信息,当主机发送一个组的MLD加入报文给路由器后,路由器就会通知组播转发模块,以便这个组的组播数据到来时能够正确转发给该主机。
MLDv1协议具有报告抑制机制,可以减少网络中的MLD的重复报告。
当一个主机HostA加入了某个组播组G,在收到路由器的查询报文后,HostA会在0~最大响应时间(查询报文中已经指定)之间选择一个随机值作为定时器的超时时间,并在该定时器超时后,向路由器发送该组G的加入报文。如果在超时时间内HostA收到了其他加入同一个组的主机HostB发送的加入报文,则HostA不再向路由器发送该组G的加入报文。
当主机退出某个组G的时候,会向路由器报告一个指定组G的MLD离开报文。由于MLDv1报告抑制机制,路由器无法确定是否还有其他主机加入了组G。这时路由器会触发一个指定组G的查询,如果还有其他路由器加入了组G就会报告针对组G的MLD加入报文。
如果路由器发送了若干次数指定组G的查询之后仍然没有收到主机针对该组G的MLD加入报文,那么路由器就不再记录这个组,停止转发该组数据到对应接口所在的网段。
MLD的查询器和非查询器都会处理MLD组加入信息,但是只有查询器负责发送查询报文。MLD非查询器不处理MLDv1离开报文。
MLDv2报文处理
MLDv1协议报文中只能携带组播组的信息,不能携带组播源的信息,这样运行MLDv1的主机就只能选择加入某个组,而不能选择加入某个组播源/组。MLDv2协议解决了该问题。运行MLDv2的主机不仅能够选择组,还能够根据需要选择相应的组播源/组。同时主机发送的MLDv2报文中还可以包含多个组记录,每个组记录中可以包含多个组播源。
MLDv2协议相对于MLDv1协议,没有报文抑制机制,所有加入组播组的主机在收到查询时都会响应MLD加入报文。由于有了对组播源的选择,MLDv2路由器在通用查询和指定组查询的基础上增加了指定源/组查询,用于在收到特定组播源的数据时确定是否存在该数据的接收者。
MLDv2主机侧的报文类型共有6种:
MODE_IS_INCLUDE,表示组播组与源列表之间的对应方式为INCLUDE,即接收从指定源列表发往该组播组的数据。
MODE_IS_EXCLUDE,表示组播组与源列表之间的对应方式为EXCLUDE,即接收从指定源列表以外的组播源发往该组播组的数据。
CHANGE_TO_INCLUDE_MODE,表示组播组与源列表之间的对应方式由EXCLUDE转换到INCLUDE。如果这时指定源列表为空,则表示离开该组播组。
CHANGE_TO_EXCLUDE_MODE,表示组播组与源列表之间的对应方式由INCLUDE转换到EXCLUDE。
ALLOW_NEW_SOURCES,表示在现有的基础上,还希望从某些组播源接收组播数据。如果当前对应关系为INCLUDE,则向现有源列表中添加某些组播源;如果当前对应关系为EXCLUDE,则从现有源列表中删除某些组播源。
BLOCK_OLD_SOURCES,表示在现有的基础上,不再希望从这些组播源接收组播数据。如果当前对应关系为INCLUDE,则从现有源列表中删除这些组播源;如果当前对应关系为EXCLUDE,则向现有源列表中添加这些组播源。
在路由器侧,查询器通过发送查询报文并接收主机反馈的加入报文了解与该接口连接的网段上有哪些组播组存在接收者,并将对应的组播数据转发到相应的网段。MLDv2的组记录有include和exclude二种组过滤模式。
在include模式下
处于激活状态的组播源表示需要路由器转发这个源的数据。
不活动的源会被路由器删除并停止转发这个源的数据。
在exclude模式下
处于激活状态的组播源表示处于冲突域中。也就是说,与该路由器接口同一网段的主机中,有的主机需要该源的数据,有的主机不需要该源的数据,在这种情况下该源的数据仍然需要转发。
不活动的组播源表示不需要转发该源的数据。
组中没有记录的组播源的数据全部都要转发。