1.本发明涉及组播数据流技术领域,具体是一种组播数据流转发的优化方法。
背景技术:2.当前,linux下igmp proxy的运行依赖于linux kernel中的mroute模块,igmp proxy流程如下:
3.1.igmp proxy用户进程首先创建igmp raw socket(igmp原始套接字),用于接收igmp包,同时通过mrt_init激活linux kernel中的mroute功能。
4.2.igmp proxy用户进程通过mrt_add_vif在linux kernel中创建vif虚拟网络设备,之后持续监听igmp raw socket。
5.3.当从igmp raw socket接收到下行接口上主机发送过来的加入组报文时,假如该主机是该组网中第一个主机,igmp proxy会创建新的组播路由表来记录该组播组,同时启用上行接口向上发送加入组报文。
6.4.当上行接口收到该组的数据流时,igmp proxy会添加该组的组播路由转发项,linux kernel会根据该组播路由转发项转发组播数据流。
7.5.当从igmp raw socket接收到下行接口上主机发送过来的离开组报文时,假如该主机是该组网中最后一个主机,igmp proxy会将该组播路由表删除,同时删除linux kernel中的组播路由转发项,并启用上行接口向上发送离开组报文。
8.6.当从igmp raw socket接收到上行接口发来的通用组查询和特定组查询报文时,igmp proxy查找组播路由表,看是否有该组播组,如果该组播组存在则响应服务器的组播查询。
9.正常linux下igmp proxy的组播数据流的转发是在ip层通过查找相应的组播路由转发项,来确定组播数据流该从哪个接口发送出去。这样转发必定会经过netfilter各个钩子函数的过滤,以及ip层的路由选择等处理,影响转发效率。
10.本发明方法是利用在linux kernel接收数据包的处理函数__nertif_receive_skb_core中注册组播数据流的处理函数handle_multicast_frame_hook,在该函数中根据组播组和出接口的对应绑定关系,查找出组播数据流的出接口,从而直接在入口处把组播数据流从相应的出接口转发出去。这样可以简化组播数据流的处理流程,提高组播数据流的转发效率。
技术实现要素:11.本发明的目的在于提供一种组播数据流转发的优化方法,当linux kernle中存在大量需要转发的组播数据流时,能够减少linux kernel中对组播数据流的处理,从而提高组播数据流在linux kernel下的转发效率,以解决上述背景技术中提出的问题。
12.为实现上述目的,本发明提供如下技术方案:
13.一种组播数据流转发的优化方法,具体有以下步骤:
14.(1)首先创建并注册linux内核模块gcmulticast,该模块用于维护组播组和出接口的对应绑定关系,同时提供用于注册的组播数据流的处理函数handle_multicast_frame_hook。
15.在该模块中提供了相应的用于读写组播组和出接口对应的绑定关系的接口,通过proc文件系统开放给用户空间,提供给用户空间进程igmp proxy使用。
16.(2)在linux下,当有组播数据流到来时,linux kernel会发送一个消息给igmp proxy,igmp proxy在接收到组播数据流到来消息时会通过mrt_add_mfc给linux kernel添加组播路由转发项。
17.在添加组播路由转发项的同时,通过内核模块gcmulticast提供的proc接口,把组播组和对应的出接口绑定关系添加到内核中。
18.当igmp proxy接收到下行接口上主机发送过来的离开组报文时,如果该主机是该组网中最后一个主机,igmp proxy会将该组播路由表删除,同时通过mrt_del_mfc来删除linux kernel中的组播路由转发项。在删除组播路由转发项的同时,通过内核模块gcmulticast提供的proc接口,把组播组和对应的出接口绑定关系从内核中删除。
19.(3)在linux kernel中接收数据包的处理函数__nertif_receive_skb_core中注册处理组播数据流的函数handle_multicast_frame_hook。handle_multicast_frame_hook在linux内核模块gcmulticast中实现,该函数根据数据包的目的地址过滤组播数据包,如果不是组播数据包,则函数直接返回。
20.然后根据组播数据包的目的地址查找组播组和对应的出接口绑定关系,如果找到相应的出接口,则将数据包直接从该出接口中发送出去,同时不再执行后续的接收流程;如果没有查找到出接口,则函数直接返回,继续执行后续的接收流程。
21.与现有技术相比,本发明的优点是:
22.1.本发明提出的方法可以提高组播数据流在linux kernel中的转发效率。
23.2.在没有特殊硬件用于实现硬件转发组播数据流的情况下,在软件层面上对组播数据流的转发进行了优化,简化了linux kernel中对组播数据流的处理流程。
附图说明
24.图1为本发明的内核模块gcmulticast中维护组播组和出接口绑定关系的流程图。
25.图2为本发明的处理组播数据流的函数handle_multicast_frame_hook的处理流程图。
具体实施方式
26.下面结合具体实施方式对本专利的技术方案作进一步详细地说明。
27.目前linux下通过igmp proxy实现的组播转发,是在igmp proxy中维护组播路由表,在有组播数据流到达时,通过igmp proxy向linux kernel添加组播路由转发表项,从而使组播数据流通过linux kernel中的组播路由转发项进行转发。
28.一种组播数据流转发的优化方法,具体有以下步骤:
29.步骤1:如图1所示,首先创建内核模块gcmulticast;gcmulticast用于维护linux kernel下组播组和出接口的绑定关系,用于绑定的数据结构如下所示:
30.#define max_out_if 4
31.#define ifnamsiz 16
32.typedef struct gcgroupbindinterface_s
33.{
34.unsigned int group;
35.char if_name[max_out_if][ifnamsiz];
[0036]
struct list_head list;
[0037]
}gcgroupbindinterface_t;
[0038]
group:代表组播组;if_name代表出接口,同一个组能支持的最大出接口数由宏max_out_if定义。
[0039]
步骤2:gcmulticast内核模块首先初始化组播组和出接口绑定关系列表g_group,然后初始化相应的用于读写组播组和出接口绑定关系的proc接口。当有组播数据流到达时,igmp proxy在添加组播路由转发项的同时,会调用相应proc接口来添加组播组和出接口的绑定关系到gcmulticast。gcmulticast中会动态分配gcgroupbindinterface_t结构来存储绑定关系,同时把动态分配的gcgroupbindinterface_t结构插入到g_group列表中。
[0040]
步骤3:当igmp proxy接收到下行接口上主机发送过来的离开组报文时,如果该主机是该组网中最后一个主机,igmp proxy在将该组播路由表删除并删除linux kernel中的组播路由转发项的同时,会调用相应proc接口来删除gcmulticast中组播组和出接口的绑定关系。gcmulticast中会根据对应的组播组查找到相应的gcgroupbindinterface_t结构,并把该结构从g_group列表中删除,同时释放相应的内存。
[0041]
步骤4:gcmulticast内核模块提供用于处理组播数据流的函数handle_multicast_frame_hook,该函数注册在__nertif_receive_skb_core中。组播数据流的处理流程如图2所示。该函数首先判断接收数据包的目的地址是否为组播地址,如果不是则直接返回0;如果是组播地址则接着判断该组播地址是否为保留的组播地址,如果是则直接返回0;如果不是则根据数据包的目的地址从g_group列表中查询相应的出接口,如果找到相应的出接口,则把数据包从相应的出接口发送出去同时函数返回1,如果找不到相应的出接口,则直接返回0。__nertif_receive_skb_core中会判断handle_multicast_frame_hook的返回值来决定数据包是否继续执行后续的接收流程。
[0042]
步骤5:当gcmulticast内核模块注销时,首先会删除相应的proc接口,然后会遍历g_group列表,删除所有组播组和出接口的绑定关系,同时释放相应的内存。
[0043]
上面对本专利的较佳实施方式作了详细说明,但是本专利并不限于上述实施方式,在本领域的普通技术人员所具备的知识范围内,还可以在不脱离本专利宗旨的前提下作出各种变化。