CN201410034940.2
2014.01.24
CN104811391A
2015.07.29
实审
审中
实质审查的生效IPC(主分类):H04L 12/801申请日:20140124|||公开
H04L12/801(2013.01)I
H04L12/801
中兴通讯股份有限公司
王魏强; 朱志勇
518057广东省深圳市南山区科技南路55号
北京康信知识产权代理有限责任公司11240
余刚; 梁丽超
本发明公开了一种数据包的处理方法、装置及服务器,该方法包括协议栈响应批量接收数据包的请求,通过操作系统的内核调试机制接收多个数据包,在多个数据包的数量大于预设的批量阈值后,返回多个数据包。本发明解决了相关技术中协议栈资源消耗大的问题,具有减轻资源消耗的有益效果。
权利要求书1. 一种数据包的处理方法,其特征在于,包括:协议栈响应批量接收数据包的请求,通过操作系统的内核调试机制接收多个数据包;在所述多个数据包的数量大于预设的批量阈值后,返回所述多个数据包。2. 根据权利要求1所述的方法,其特征在于,通过所述操作系统的内核调试机制接收所述多个数据包包括:通过所述操作系统的内核提供的jprobe机制接收所述多个数据包。3. 根据权利要求2所述的方法,其特征在于,通过所述操作系统的内核提供的所述jprobe机制接收所述多个数据包包括:利用jprobe的打点方法,在所述协议栈的收包接口中增加批量接收数据包函数;调用所述批量接收数据包函数,接收所述多个数据包。4. 根据权利要求3所述的方法,其特征在于,所述协议栈响应所述批量接收数据包的请求包括:所述协议栈响应用户进程的批量接收数据包的请求。5. 根据权利要求4所述的方法,其特征在于,在所述多个数据包的数量大于所述预设的批量阈值后,返回所述多个数据包包括:判断内核态的接收队列中接收到的所述多个数据包的数量是否大于所述预设的批量阈值;在所述多个数据包的数量大于所述预设的批量阈值的情况下,将所述内核态的接收队列中的多个数据包拷贝到用户态的数据缓冲区,其中,所述用户态与所述用户进程相应,所述内核态与所述协议栈相应。6. 一种数据包的处理装置,位于协议栈上,其特征在于,包括:控制模块,用于响应批量获取数据包的请求,通过操作系统的内核调试机制接收多个数据包;返回模块,用于在所述多个数据包的数量大于预设的批量阈值后,返回所述多个数据包。7. 根据权利要求6所述的装置,其特征在于,所述控制模块还用于通过所述操作系统的内核提供的jprobe机制接收所述多个数据包。8. 根据权利要求7所述的装置,其特征在于,所述控制模块包括:设置单元,用于利用jprobe的打点方法,在所述协议栈的收包接口中增加批量接收数据包函数;接收单元,用于调用所述批量接收数据包函数,接收所述多个数据包。9. 根据权利要求6所述的装置,其特征在于,所述控制模块还用于响应用户进程的批量接收数据包的请求。10. 根据权利要求9所述的装置,其特征在于,所述返回模块包括:判断单元,用于判断内核态的接收队列中接收到的所述多个数据包的数量是否大于所述预设的批量阈值;拷贝单元,用于在所述多个数据包的数量大于所述预设的批量阈值的情况下,将所述内核态的接收队列中的多个数据包拷贝到用户态的数据缓冲区,其中,所述用户态与所述用户进程相应,所述内核态与所述协议栈相应。11. 一种服务器,其特征在于,包括协议栈,所述协议栈包括权利要求6至10中任一项所述的装置。
说明书数据包的处理方法、装置及服务器 技术领域 本发明涉及通信领域,具体而言,涉及一种数据包的处理方法、装置及服务器。 背景技术 在基于Linux操作系统的流媒体服务器应用中,需要对码流进行转发,在这个过程中存在数据码流的接收,接收数据报文占用大量的CPU的资源,提高收包性能直接提高服务器的处理性能。 图1是根据相关技术的接收数据包的方法的流程图,在相关技术中,对于每一路音频流,都需要使用网络套接字,调用用户数据协议(User Date Protocol,简称为UDP)数据包接收接口,从协议栈接收数据。用户进程每接收一个数据包,就需要使用一次系统调用,每次系统调用需要先从用户态切换到内核态,系统调用返回后,再从内核态切换到用户态。在流媒体服务器负荷较重的情况下,会触发大量的数据拷贝和上下文切换操作,极大地消耗了系统的CPU资源,降低了系统的处理能力。 由上述流程可见,相关技术中,用户进程接收每个数据包,都需要调用一次系统,使系统接收数据包,从而导致频繁的系统调用,极大的消耗CPU资源,进而降低整个系统的性能,降低整个流媒体服务的质量。 针对相关技术中用户进程获取数据包时需频繁调用系统而导致的资源消耗大的问题,目前尚未提出有效的解决方案。 发明内容 本发明提供了一种数据包的处理方法、装置及服务器,以至少解决上述问题。 根据本发明的一个方面,提供了一种数据包的处理方法,包括:协议栈响应批量接收数据包的请求,通过操作系统的内核调试机制接收多个数据包;在所述多个数据包的数量大于预设的批量阈值后,返回所述多个数据包。 优选地,通过所述操作系统的内核调试机制接收所述多个数据包包括:通过所述操作系统的内核提供的jprobe机制接收所述多个数据包。 优选地,通过所述操作系统的内核提供的所述jprobe机制接收所述多个数据包包括:利用jprobe的打点方法,在所述协议栈的收包接口中增加批量接收数据包函数;调用所述批量接收数据包函数,接收所述多个数据包。 优选地,所述协议栈响应所述批量接收数据包的请求包括:所述协议栈响应用户进程的批量接收数据包的请求。 优选地,在所述多个数据包的数量大于所述预设的批量阈值后,返回所述多个数据包包括:判断内核态的接收队列中接收到的所述多个数据包的数量是否大于所述预设的批量阈值;在所述多个数据包的数量大于所述预设的批量阈值的情况下,将所述内核态的接收队列中的多个数据包拷贝到用户态的数据缓冲区,其中,所述用户态与所述用户进程相应,所述内核态与所述协议栈相应。 根据本发明的另一个方面,提供了一种数据包的处理装置,位于协议栈上,包括:控制模块,用于响应批量获取数据包的请求,通过操作系统的内核调试机制接收多个数据包;返回模块,用于在所述多个数据包的数量大于预设的批量阈值后,返回所述多个数据包。 优选地,所述控制模块还用于通过所述操作系统的内核提供的jprobe机制接收所述多个数据包。 优选地,所述控制模块包括:设置单元,用于利用jprobe的打点方法,在所述协议栈的收包接口中增加批量接收数据包函数;接收单元,用于调用所述批量接收数据包函数,接收所述多个数据包。 优选地,所述控制模块还用于响应用户进程的批量接收数据包的请求。 优选地,所述返回模块包括:判断单元,用于判断内核态的接收队列中接收到的所述多个数据包的数量是否大于所述预设的批量阈值;拷贝单元,用于在所述多个数据包的数量大于所述预设的批量阈值的情况下,将所述内核态的接收队列中的多个数据包拷贝到用户态的数据缓冲区,其中,所述用户态与所述用户进程相应,所述内核态与所述协议栈相应。 根据本发明的又一个方面,提供了一种服务器,包括协议栈,所述协议栈包括上述任一项所述的装置。 通过本发明,采用协议栈响应批量接收数据包的请求,通过操作系统的内核调试机制接收多个数据包,在多个数据包的数量大于预设的批量阈值后,返回多个数据包,解决了相关技术中协议栈资源消耗大的问题,进而达到了减轻资源消耗的效果。 附图说明 此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中: 图1是根据相关技术的接收数据包的方法的流程图; 图1a是根据本发明实施例的数据包处理方法的流程图; 图2是根据本发明实施例的数据包处理装置的结构示意图一; 图3是根据本发明实施例的数据包处理装置的结构示意图二; 图4是根据本发明实施例的数据包处理装置的结构示意图三; 图5是根据本发明实施例的服务器的结构示意图; 图6是根据本发明优选实施例的数据包处理方法一的流程图;以及 图7是根据本发明优选实施例的数据包处理方法二的流程图。 具体实施方式 下文中将参考附图并结合实施例来详细说明本发明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。 本发明实施例提供了一种数据包的处理方法,图1a是根据本发明实施例的数据包处理方法的流程图,如图1a所示,该方法包括以下步骤: 步骤S102,协议栈响应批量接收数据包的请求,通过操作系统的内核调试机制接收多个数据包; 步骤S104,在多个数据包的数量大于预设的批量阈值后,返回多个数据包。 通过上述步骤,改变了相关技术中用户进程每次接收一个数据包都需要调用操作系统的协议栈一次的做法,解决了相关技术中用户进程获取数据包时需频繁调用系统而导致的资源消耗大的问题,具有减轻资源消耗的有益效果。 在本发明实施例的一个优选实施方式中,通过操作系统的内核调试机制获取多个数据包的步骤可以包括:通过操作系统的内核提供的jprobe机制接收多个数据包。通过上述步骤可以不修改现有协议栈结构、用户态代码使用标准socket编程的情况下,通过内核提供的jprobe机制实现高效批量收包的方法,即可以有效减少系统调用,提高收包性能,同时有效降低代码的修改量。 在本发明实施例的一个优选实施方式中,通过所述操作系统的内核提供的所述jprobe机制接收所述多个数据包的步骤可以包括:利用jprobe的打点方法,在协议栈的收包接口中增加批量接收数据包函数;调用批量接收数据包函数,接收多个数据包。通过上述步骤,可以无需修改内核代码,灵活地增加内核处理流程,并且方便快捷、影响较小。 在本发明实施例的一个优选实施方式中,在多个数据包的数量大于预设的批量阈值后,将多个数据包返回给用户进程的步骤可以包括:协议栈判断内核态的接收队列中接收到的多个数据包的数量是否大于预设的批量阈值,在多个数据包的数量是否大于所述预设的批量阈值的情况下,将内核态的接收队列中的多个数据包拷贝到用户态的数据缓冲区,其中,用户态与用户进程相应,内核态与协议栈相应。通过上述步骤,提高了接收数据包的效率,将内核态、用户态切换的次数降低到1/n,其中,n是接收的数据包的数量。 在本发明实施例的一个优选实施方式中,该操作系统可以是Linux系统,数据包可以是流媒体数据包。当然,在其他的实施例中,也可能是其他操作系统,比如安卓系统,数据包也可能是其他类型的数据包,比如移动终端的语音通信的数据包。 在本实施例中还提供了数据包的处理装置,该装置用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。如以下所使用的,术语“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。该装置位于协议栈上,图2是根据本发明实施例的数据包处理装置的结构示意图一,如图2所示,该装置包括: 控制模块22,用于响应批量获取数据包的请求,通过操作系统的内核调试机制接收多个数据包; 返回模块24,用于在多个数据包的数量大于预设的批量阈值后,返回多个数据包。 优选地,控制模块22还用于通过操作系统的内核提供的jprobe机制接收多个数据包。 优选地,如图3所示,控制模块22还可以包括:设置单元222,用于利用jprobe的打点方法,在协议栈的收包接口中增加批量接收数据包函数;接收单元224,用于调用批量接收数据包函数,接收多个数据包。 优选地,如图4所示,返回模块24还可以包括:判断单元242,用于判断内核态的接收队列中接收到的多个数据包的数量是否大于预设的批量阈值;拷贝单元244,用于在多个数据包的数量大于预设的批量阈值的情况下,将内核态的接收队列中的多个数据包拷贝到用户态的数据缓冲区,其中,用户态与用户进程相应,内核态与协议栈相应。 本发明实施例提供了一种服务器,图5是根据本发明实施例的服务器的结构示意图,如图5所示,该服务器包括协议栈52,协议栈52包括上述实施例提供的数据包处理装置522。 以下结合优选实施例进行说明,以下优选实施例结合了上述实施例及其优选实施方式。 图6是根据本发明优选实施例的数据包处理方法一的流程图,该方法基于协议栈层处理,如图6所示,该方法包括以下步骤: 步骤S602,利用jprobe的打点方法,批量接收数据包。 使用linux系统提供的内核调试机制jprobe的打点方法,在协议栈的收包接口中插入增加的批量接收数据包函数,该函数用于批量接收数据包,比如,假设Linux系统所在的服务器是流媒体服务器,则通过jprobe调用批量接收数据包函数后,流媒体服务器便会从其他媒体资源服务器批量接收数据包,当然,如果该媒体资源在流媒体服务器本地,调用批量接收数据包函数后,流媒体服务器便会从本地获取多个数据包。通过上述方法无需修改Linux操作系统的内核代码,可以灵活地增加内核处理流程,使得处理变得方便快捷,影响较小。 优选地,步骤S602可以具体包括如下步骤: A,注册jprobe探测点,在注册探测点的时候,对被探测函数的指令码进行替换,替换为int3的指令码; B,在执行int3的异常执行中,通过通知链的方式调用jprobe的异常处理函数; C,在jprobe的异常处理函数中,判断是否存在pre_handler钩子函数,其中,钩子函数相当于批量接收数据包函数。如果存在钩子函数,则继续钩子函数; D,执行钩子函数后,准备进入单步调试,通过设置EFLAGS寄存器中的追踪标志位(TrapFlag,简称TF),把异常返回的地址修改为保存的原指令码; E,代码返回,执行原有指令,执行结束后触发单步异常; F,在单步异常的处理中,清除单步标志,执行post_handler流程,并最终返回; 步骤S604,返回多个数据包。 当内核态的skb接收队列所接收到的数据包达到预定的批量阈值时,将内核态的套接字缓存(socket buffer,简称skb)接收队列中的数据包批量地拷贝到用户态的数据缓冲区。通过上述步骤,提高了接收数据包的效率,将内核态、用户态切换的次数降低到1/n,其中,n是接收到的数据包个数。 图7是根据本发明优选实施例的数据包处理方法二的流程图。本实施例中,服务器可以包括用户进程、Linux内核空间和硬件设备。在硬件设备与用户进程之间是Linux内核空间,在该内核空间内的协议栈收包接口中增加钩子函数,即批量接收数据包函数,进行批量数据包的接收,在接收到指定数量的数据包后,向用户态批量返回数据包。如图7所示,该方法包括以下步骤: 步骤S702,用户进程向协议栈发送批量接收数据包请求。 用户进程使用标准协议栈创建socket套接字并使用标准的接收收据包接口recvmsg()进行数据包的接收。用户进程在struct msghdr收包结构的msg_name中指定批量接收数据包的个数,其中,recvmsg()函数相当于批量接收数据包请求,指定的批量接收数据包的个数相当于预设的批量阈值。 步骤S704,协议栈批量接收数据包。 协议栈通过jprobe插入judp_recvmsg收包处理函数,每次接收一批数据包。其中,judp_recvmsg收包处理函数相当于批量接收数据包函数。 步骤S706,将接收到的数据包存放在接收队列中。 协议栈将批量接收到的数据包存放在skb接收队列中。 步骤S708,将接收队列中的数据包拷贝到用户态的数据缓冲区中。 调用netif_recv_skb函数,将接收队列中的数据包拷贝到用户态的数据缓冲区中。 本实施例中,每次用户态到内核态切换可以接收一批数据包,有效减少系统调用的开销。 从以上的描述中,可以看出,本发明实现了如下技术效果:利用原有的Linux网络协议栈,通过内核调试机制实现批量数据包的接收,从而使得内核模块的加载和卸载都不会影响Linux内核原有的网络协议栈。 显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。 以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
《数据包的处理方法、装置及服务器.pdf》由会员分享,可在线阅读,更多相关《数据包的处理方法、装置及服务器.pdf(11页珍藏版)》请在专利查询网上搜索。
本发明公开了一种数据包的处理方法、装置及服务器,该方法包括协议栈响应批量接收数据包的请求,通过操作系统的内核调试机制接收多个数据包,在多个数据包的数量大于预设的批量阈值后,返回多个数据包。本发明解决了相关技术中协议栈资源消耗大的问题,具有减轻资源消耗的有益效果。。
copyright@ 2017-2020 zhuanlichaxun.net网站版权所有经营许可证编号:粤ICP备2021068784号-1