MLDv1&v2
通过在与主机相连的接口上发送查询报文并接收主机反馈的加入报文和离开报文,路由器可以了解与该接口连接的网段上有哪些组播组存在接收者(即组成员)。如果出现组成员,组播路由器应将对应组的组播数据报文转发到这个网段;如果没有组成员则不转发。主机可以自主决定加入或退出某个组播组。
如图10-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模式下
处于激活状态的组播源表示处于冲突域中。也就是说,与该路由器接口同一网段的主机中,有的主机需要该源的数据,有的主机不需要该源的数据,在这种情况下该源的数据仍然需要转发。
不活动的组播源表示不需要转发该源的数据。
组中没有记录的组播源的数据全部都要转发。
MLD组兼容
MLD组兼容模式是指支持高MLD版本的组播设备可以兼容低版本的主机。例如v2版本的设备可以正确处理v1主机的加入。当组播设备工作在兼容模式时,收到低版本的主机的MLD加入报文后会自动降低组的兼容版本到该主机对应的版本,并工作在该版本上。
工作在MLDv2版本的组播设备收到MLDv1主机发送的加入报文,会自动把该组的兼容模式设定为v1模式。在这种情况下,设备忽略MLDv2的BLOCK报文以及MLDv2的TO_EX报文的源列表,即抑制了MLDv2对组播源的选择功能。
通过手工配置把组播设备的MLD版本从低版本升到高版本时,如果有组存在,则会继续使组工作在低版本的兼容模式,直到低版本的主机退出该组播组。
MLD查询器选举
使能了MLD协议的组播设备在网段中的角色有两个:
查询器
负责发送查询报文并接收主机反馈的加入报文和离开报文,以此来了解与该接口连接的网段上有哪些组播组存在接收者(即组成员)。
非查询器
只接收主机反馈的加入报文,了解与该接口连接的网段上有哪些组播组存在接收者,并根据网段中查询器的动作确定当前网段中有哪些组播组成员离开。
通常情况下一个网段只有一个查询器,因此组播设备之间需要用某些方式来选出查询器。查询器选举时采用以下的原则:
DeviceA使能MLD协议后,在MLD协议启动阶段会默认自己为当前网段中的查询器,向网段中发送查询报文。如果收到link-local地址比自己小的DeviceB发来的查询报文,则DeviceA由查询器转为非查询器,并启动“其他查询器存在定时器”,记录DeviceB为当前网段的查询器。
如果DeviceA在非查询器状态时收到查询器DeviceB发送的查询报文,则更新“其他查询器存在定时器”;如果此时收到的查询报文不是先前记录的查询器DeviceB发来的,而是新的DeviceC发来的,且DeviceC的link-local地址比DeviceB的小,则更新查询器为DeviceC,同时更新“其他查询器存在定时器”。
如果DeviceA在非查询器状态时,“其他查询器存在定时器”超时,则由非查询器转为查询器状态,承担起查询器的职责。
当前仅支持同网段上同版本的组播设备之间进行查询器选举。为了保证正常工作,需要在同网段所有设备上配置相同版本的MLD。