一种媒体服务器及实现准实时发送媒体数据的方法

文档序号:7929463阅读:175来源:国知局
专利名称:一种媒体服务器及实现准实时发送媒体数据的方法
技术领域
本发明属于计算机应用领域,具体涉及一种媒体服务器及一种实现准实时发送媒体数据的方法。
背景技术
现有技术中,在基于Linux操作系统的媒体服务器应用中,需要定时的将媒体数据从服务器主机发送到网络上。定时发送机制的性能将直接关系到媒体服务的质量,关系到用户对媒体服务业务的满意程度。
现有技术中,用户进程实现定时发送媒体数据包的方法主要包括以下两种(1)延时方式;(2)定时器方式;
延时方式一般使用select或者nanosle印系统调用实现,当指定的延时结束之后调用返回给用户进程,用户进程继而可以进行媒体数据包的发送。
定时器方式一般使用setitimer系统调用实现,在指定的一段时间到了之后,通过信号的方式通知用户进程,在信号处理程序中完成媒体数据包的发送。
在现有技术的方式下,当延时系统调用或者定时器系统调用返回时,用户发包进程需要从内核态切换到用户态,期间将会进行系统调度。 一方面由于Linux是一个多任务而非实时操作系统,延时系统调用或者定时器系统调用与生俱来就具有不精确性,这使得在用户空间中执行的进程不能精确的控制时间;另一方面系统调度过程中可能也会有更高优先级的进程/线程抢占CPU,在执行中的进程随时会因为各种原因被抢占运行。这都将导致时延的产生,少则几个毫秒,系统负载较重时可能达到几秒以上,这点延迟时间虽然对于一般的应用程序而言实际算不了什么,但对于实时应用的媒体数据发送来说,却会导致服务质量的大幅下降。
用户发包进程使用发包系统调用发送媒体数据包,需要从用户态切换到内核态,在内核态完成数据包的组织之后,才能调用网卡驱动程序的发送接口将数据包发送出去。数据包组织的时间虽然很短,但是也将会对发包产生一些时延。
在媒体服务器负荷较重的情况下,从用户态切换到内核态,以及从内核态切换到用户态,再加上需要系统调度到相应的用户发包进程/线程,将会产生不稳定的延时从而引发媒体流的抖动,这对实时的媒体应用需求来说,将会极大的影响服务的质量。
由此可见,在媒体数据包的定时发送过程中,时延的不确定性主要产生在工作空间切换、数据包组织和系统调度上。如何有效地控制时延的产生,减少发包的抖动,对于提升媒体服务器的服务质量,具有非常重要的影响。

发明内容
本发明所要解决的技术问题是,提供一种媒体服务器,并提供一种实现准实时发送媒体数据的方法,本发明基于Linux的网络协议栈,在不影响Linux系统原有网络协议栈的情况下,尽量控制时延的产生,减少发包的抖动。
一种媒体服务器,所述媒体服务器包括设备模块、Linux内核模块和用户进程模块,所述用户进程模块用于承载用户进程,
所述设备模块包括网卡和带中断功能的定时器,所述网卡用于驱动发包系统调用接口发送数据包;所述定时器用于定时并在定时时间到后产生中断;
所述Linux内核模块位于所述设备模块与用户进程模块之间;包括网络协议栈模块、网卡驱动模块以及中断处理模块,所述网络协议栈模块基于AF_REALTIME套接字类型,用于为用户进程提供AF_REALHME类型的套接字编程接口;所述网卡驱动模块用于驱动网卡;所述中断处理模块用于登记发包处理函数和待发送的数据包并在所述定时器产生中断时调用所述发包处理函数发送所述待发送数据包。
所述网络协议栈模块可提供的套接字编程接口包括创建套接字(socket)系统调用、发包(sendmsg)系统调用,其中socket系统调用用于创建套接字;sendmsg系统调用用于采用硬件定时中断准实时发送数据包,其定义为
ssize—t sendmsg(int socket, const struct msghdr *msg, int flags);
其中,参数-
socket表示使用socket系统调用创建的AF—REALTIME套接字;msg表示待发送数据包的数据结构;flags为0。
所述发包系统调用的参数msg包括用于存放待发送数据包的计划发包时间的字段、用于存放所述计划发包时间的字段长度的字段、用于存放待发送数据包的载荷信息的字段、用于存放待发送数据包个数的字段、用于存放待发送数据包的头部控制信息的字段以及用于存放所述待发送数据包的头部控制信息长度的字段。
一种实现准实时发送媒体数据的方法,基于Linux网络协议栈,包括以下步

歩骤一设置发包系统调用的计划发包时间以及组装待发送的媒体数据,得到待发送数据包;
步骤二根据所述计划发包时间计算中断定时时长,并将所述发包系统调用的发包处理函数和待发送数据包登记到中断处理程序中,等待中断,同时将所述系统调用加入到内核等待队列中;
步骤三中断定时到期后产生中断,触发所述中断处理程序完成待发送数据包的发送,发送完成后唤醒所述内核等待队列中对应的发包系统调用。
所述歩骤一还包括对待发送数据包的路由查找、MAC地址学习、UDP /IP/MAC头部进行封装。
所述步骤三中
所述中断服务程序调用所述登记在其中的发包处理函数对所述登记在其中的待发送数据包进行发送。
本发明通过设置发包时间,提前从用户态切换到内核态,减少工作空间切换
导致的上下文切换开销,同时降低系统调度对时延的影响;利用具有中断功能的
定时器在定时时间到时产生中断的方式触发中断处理程序,实现了高精度的数据包定时及准实时发送。


图1是本发明所述网络协议栈发包系统调用的核心参数所使用的数据结构
示意图2是本发明所述方法的流程图。
具体实施例方式
以下结合附图和较佳实施例,对本发明做进一步详细说明。本发明基于Linux网络协议栈实现准实时发送媒体数据,利用了现有的Linux网络协议栈架构,现有的Linux网络协议栈利用内核模块机制实现,所述内核模块的加载和卸载都不会影响Linux内核原有的网络协议栈。
本发明所述媒体服务器,包括用户进程模块、Linux内核模块和设备模块,
所述用户进程模块用于承载用户进程,
所述设备模块包括网卡和带中断功能的定时器;
所述Linux内核模块位于设备模块与用户进程模块之间,包括网络协议栈模 块、网卡驱动模块以及中断处理模块,所述网络协议栈模块基于AF一REALHME 套接字类型,用于为用户进程提供AF—REALTIME类型的套接字编程接口;所述网 卡驱动模块用于驱动网卡;所述中断处理模块用于登记发包处理函数和待发送的 数据包并在所述定时器产生中断时调用所述发包处理函数发送所述待发送数据 包。
为了实现准实时发送媒体数据的功能,本发明在原有Linux内核模块的网络 协议模块的基础上创建了基于AF—REALTIME套接字类型的REALTIME网络协议栈, 该协议栈给用户进程提供AF—REALTIME类型的套接字编程接口 ,包括socket系 统调用、close系统调用、sendmsg系统调用;其中socket系统调用用于创建套 接字,close系统调用用于关闭套接字,sendmsg系统调用用于准实时发送媒体 数据包。
现有技术的sendmsg系统调用原有标准语义不能够实现本发明的功能,必须 对其进行重新定义,本发明所述sendmsg系统调用的定义为
ssize—t sendmsg(int socket, const struct msghdr *msg, int flags); 输入输出参数的含义如下
socket:输入参数,表示使用socket系统调用创建的AF_REALTIME套接字; msg:输入输出参数,表示存放待发送数据包信息的数据结构struct
msghdr {}, 具体包括
msg-〉msg—name字段指向Linux内核中用来描述时间的数据结构struct
timespec {}的指针,表示待发送数据包的计划发包时间;
msg-〉msg一namelen字段用于存方夂struct timespec {}的长度; msg-〉msg_iov字段指向数据结构struct iovecU的指针;所述struct
iovecU包含一路待发送媒体数据包的载荷和长度。
msg-〉msg—iovlen字段用于存方夂msg—iov所指的struct iovecU的个数,
这里取值为1。
7msg-〉msg—control字段输入时用于存放对应媒体数据包的头部控制信息, 所述头部控制信息包括IP地址、UDP端口等;输出时用于返回发送错误数据包 的索引和错误码。
msg-〉msg—controllen字段用于存放msg—control字段的总长度。 msg-〉msg—flags字段本实施例中暂时不用,置为0。 Flags:输入参数,本实施例中暂时不用,置为O。 sendmsg系统调用返回值
若数据包都没有发送成功,则所述sendmsg系统调用返回值为_1,并通过 所述sendmsg系统调用的输出参数返回错误码。
若数据包部分或者全部发送成功,则所述sendmsg系统调用返回成功发送的 数据包的数目,并通过所述sendmsg系统调用的输出参数返回没有发送成功的数 据包的索引和相应的错误码;
参数msg的数据结构struct msghdr示意图如图1所示,包含1个待发送媒 体数据包,每个字段后面的数字表示该字段的长度,msg—name字段指向数据结 构struct timespec {},所述struct tiraespec {}包括表示秒数的tv—sec字段禾口 表示纳秒数的tv—nsec;msg—iov字段指向数据结构struct iovec {},所述struct iovecU包括iov_base和iov_len字段,其中iov—base字段表示一路待发送数 据包的载荷,而iov—len字段表示一路待发送数据包的长度,本实施例中为172 字节。
构成媒体数据包的信息存放在参数msg中,msg』ame字段用于存放待发送 媒体数据包的计划发送时间,使用系统绝对时间表示;msg—iov字段用于存放待 发送媒体数据包的载荷信息,包含待发送数据包缓冲区的地址和长度信息,作为 媒体数据包的载荷;msg一control字段用于存放待发送媒体数据包的头部信息, 包含IP地址、端口号等,用于生成待发送的媒体(这里为IP数据包)的头部。
如图2所述,是本发明所述方法的流程图,具体包括如下步骤
步骤201:设置发包系统调用的计划发包时间;
所述计划发包时间用于指待发送的媒体数据的发送时刻,当前发包进程调用 发包系统调用提前从用户态切换到内核态,减少工作空间切换导致的上下文切换 开销,同时降低系统调度对时延的影响。因此,发包系统调用接口除了需要能够 传入待发送数据包的载荷和组织数据包的头部控制信息之外,还需要能够传入数
8据包的计划发送时间。
步骤202:对所述发包系统调用本次待发送的数据进行组包; 该步骤还包括数据包的路由査找、MAC地址学习、UDP /IP /MAC头部的封装; 步骤203:根据所述计划发包时间计算中断定时时长;
步骤204:将所述发包系统调用的发包处理函数和待发送的数据包登记到中 断处理程序中,等待中断;
步骤205:将所述系统调用加入内核等待队列;
步骤206:中断定时时间到后产生中断,触发所述中断处理程序;
步骤207:所述中断处理程序调用所述登记在其中的发包处理函数对所述登
记在其中的数据包进行发送;
本发明中,若登记到中断处理程序中的待发送数据包的负荷比较大,则中断
处理程序中完成所有发包动作可能会影响系统的整体响应能力,所以中断处理程
序会将发包处理任务提交给内核高优先级任务进行排序;使用内核高优先级任务
完成数据包的发送。
步骤208:唤醒对应的发包系统调用,进入下一轮媒体数据的准实时发送。 以上针对本发明各较佳实施例的描述较为详细和具体,并不能因此而认为是
对本发明专利保护范围的限制,本发明的专利保护范围应以所附权利要求为准。
权利要求
1、一种媒体服务器,所述媒体服务器包括设备模块、Linux内核模块和用户进程模块,所述用户进程模块用于承载用户进程,其特征在于,所述设备模块包括网卡和带中断功能的定时器,所述网卡用于驱动发包系统调用接口发送数据包;所述定时器用于定时并在定时时间到后产生中断;所述Linux内核模块位于所述设备模块与用户进程模块之间;包括网络协议栈模块、网卡驱动模块以及中断处理模块,所述网络协议栈模块基于AF_REALTIME套接字类型,用于为用户进程提供AF_REALTIME类型的套接字编程接口;所述网卡驱动模块用于驱动网卡;所述中断处理模块用于登记发包处理函数和待发送的数据包并在所述定时器产生中断时调用所述发包处理函数发送所述待发送数据包。
2、 如权利要求1所述的媒体服务器,其特征在于,所述网络协议栈模块可提供的套接字编程接口包括所述网络协议栈模块可提供的套接字编程接口包括创建套接字系统调用、发包系统调用,其中创建套接字系统调用用于创建套接字;发包系统调用用于采用硬件定时中断准实时发送数据包,其定义为ssize—t sendmsg(int socket, const struct msghdr氺msg, int flags);其中,参数socket表示使用创建套接字系统调用创建的AF—REALTIME套接字;msg表示待发送数据包的数据结构;flags为0。
3、 如权利要求2所述的媒体服务器,其特征在于,所述发包系统调用的参数msg包括用于存放待发送数据包的计划发包时间的字段、用于存放所述计划发包时间的字段长度的字段、用于存放待发送数据包的载荷信息的字段、用于存放待发送数据包个数的字段、用于存放待发送数据包的头部控制信息的字段以及用于存放所述待发送数据包的头部控制信息长度的字段。
4、 一种实现准实时发送媒体数据的方法,基于Linux网络协议栈,其特征在于,包括以下步骤步骤一设置发包系统调用的计划发包时间以及组装待发送的媒体数据,得到待发送数据包;步骤二根据所述计划发包时间计算中断定时时长,并将所述发包系统调用的发包处理函数和待发送数据包登记到中断处理程序中,等待中断,同时将所述系统调用加入到内核等待队列中;歩骤三中断定时到期后产生中断,触发所述中断处理程序完成待发送数据包的发送,发送完成后唤醒所述内核等待队列中对应的发包系统调用。
5、 如权利要求4所述的实现准实时发送媒体数据的方法,其特征在于,所述步骤一还包括对待发送数据包的路由査找、MAC地址学习、UDP /IP /MAC头部进行封装。
6、 如权利要求4所述的实现准实时发送媒体数据的方法,其特征在于,所述步骤三中所述中断服务程序调用所述登记在其中的发包处理函数对所述登记在其中的待发送数据包进行发送。
全文摘要
本发明涉及一种媒体服务器及一种实现准实时发送媒体数据的方法,所述方法首先设置计划发包时间以及组装待发送的媒体数据,得到待发送数据包;然后根据计划发包时间计算中断定时时长,并将发包处理函数和待发送数据包登记到中断处理程序中,等待中断,同时将所述系统调用加入到内核等待队列中;中断定时到期后产生中断,触发所述中断处理程序完成待发送数据包的发送,发送完成后唤醒所述内核等待队列中对应的发包系统调用。本发明减少了工作空间切换导致的上下文切换开销,同时降低了系统调度对时延的影响;实现了数据包的准实时发送。
文档编号H04L29/06GK101465854SQ20081024159
公开日2009年6月24日 申请日期2008年12月26日 优先权日2008年12月26日
发明者丁向军, 夏洪升, 王魏强 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1