专利名称:一种发送多路数据包的方法及系统的制作方法
技术领域:
本发明涉及网络通信技术领域,尤其涉及一种发送多路数据包的方法及系统。
背景技术:
在基于Linux操作系统的彩铃服务器应用中,需要将大量的音频文件传递 到IP网络上。但是,如果想通过IP网络传输音频数据,就需要将音频文件转 化为IP数据报,通过网络套接字(UDP)进行数据包的发送。
使用UDP进行数据包的发送,现有技术一般包括
步骤l、调用创建(socket)系统实现创建网络套接字。
步骤2、调用绑定(bind)系统实现将网络套接字与本地IP地址和UDP 端口相绑定。
步骤3、调用发送(sendto/sendmsg)系统实现发送UDP数据包到远端主机。
其中,发送UDP数据包时需要指定目标主机的远端IP地址和UDP端口 (即UDP数据包的目的IP地址和目的UDP端口 )。
步骤4、调用关闭(close)系统实现关闭网络套接字。
在现有技术的这种方式下,对于每一路音频流,都需要使用一个网络套接 字,用户进程将音频文件打包成实时传送协议(RTP, Real-time Transport Protocol) 数据包后,调用UDP数据包发送接口 ,将RTP数据包发送出去。
如果为远端IP地址(即目的IP地址)相同的多路音频流各自创建单独的 网络套接字,则只需要第一次调用发包接口前,使用IP地址和UDP端口绑定 接口设定本地IP地址和端口 ,然后在发包接口中指定远端IP地址和UDP端口 ,将数据包发送出去。由于同一路音频流的远端IP地址通常都不会变化,现有 发包接口中实现的路由緩存机制只能够支持一路音频流的远端IP地址的緩存, 因此发包时只需要查询一次路由表获取远端IP地址对应的下一跳IP地址和
MAC地址,后续的发送都将使用该网络套接字緩存的路由信息进行数据包的转发。
在多个数据包的目的IP地址相同的情况下,为了减少进程/线程切换的次
数,以及减小系统调用开销,现有技术可以将多个婆:据包共用一个套接字进4亍 发送。如果多路音频流共享同一个网络套接字,则每次调用发包接口前,需要 使用bind系统调用设定本地IP地址和UDP端口 ,然后在发包接口中指定远端 IP地址和UDP端口 ,将数据包发送出去。
然而,由于多路音频流的远端IP地址常常是不一样的,而现有发包接口 中实现的路由緩存机制在发送网络数据包时只能支持一路音频流的远端IP地 址的緩存,当远端IP地址发生变化的时候,需要重新查询存储在socket对应 的内核数据结构中的路由表来获取远端IP地址对应的下一跳IP地址和多媒体 接入控制(MAC)地址,而频繁查询路由表将会造成很大的系统开销。
因此当多路音频流的目的IP地址不同时,只能采用为多路音频流各自创 建单独的网络套接字进行发送的方式。然而,为每一路音频流都创建一个单独 的网络套接字,对于一个支持几千路甚至上万路的彩铃服务器来说,将会占用 大量的系统资源,多路进程/线程的频繁切换也会对系统的性能产生很大的影 响。
此外,用户进程每发送一个音频数据包,就需要使用一次发送系统调用, 每次系统调用需要先从用户态切换到内核态,系统调用返回后,再从内核态切 换到用户态。在彩铃服务器负荷较重的情况下,会触发大量的数据拷贝和上下 文切换操作,极大地消耗系统的CPU资源,降低系统的处理能力。
由此可见,在多个数据包的目的IP地址相同的情况下,为了减少进程/线 程切换的次数,以及减小系统调用开销,现有技术可以将多个数据包共用一个套接字发送。但是,当多个数据包的目的IP地址不同时,只能采用为多路音 频各自创建单独的网络套接字发送的方式,但是此种方式的系统调用、路由查 询开销以及进程/线程切换的次数都会比较大。现有技术每次采用网络套接字发 送数据包的时候,只能緩存一路数据包的目的IP地址,因此无法采用同一网 络套接字发送多个目的IP地址不同的数据包。
综上所述,现有技术无法采用同一网络套接字发送多路数据包。
发明内容
本发明实施例提供了 一种发送多路数据包的方法及系统,用以实现通过同 一网络套接字发送多路数据包,提高发送多路数据包的工作效率。
本发明实施例提供的一种发送多路数据包的方法包括
创建网络套接字,其中包含用于緩存多路数据包的路由信息的路由緩存数
组;
获取所述多路数据包的路由信息并添加到所述路由緩存数组中;
当需要发送所述多路数据包时,从所述路由緩存数组中获取所述多路数据 包的路由信息,并根据该路由信息将所述多路数据包发送出去。
本发明实施例提供的一种发送多路数据包的系统包括
创建套接字单元,用于创建网络套接字,其中包含用于緩存多路数据包的 路由信息的路由緩存数组;
发送处理单元,用于获取所述多路数据包的路由信息并添加到所述路由緩 存数组中;当需要发送所述多路数据包时,从所述路由緩存数组中获取所述多 路数据包的路由信息,并根据该路由信息将所述多路数据包发送出去。
本发明实施例,通过创建网络套接字,其中包含用于緩存多路数据包的路 由信息的路由援存数组;获取所述多路数据包的路由信息并添加到所迷路由緩 存数组中;当需要发送所述多路数据包时,从所述路由緩存数组中获取所述多 路数据包的路由信息,并根据该路由信息将所述多路数据包发送出去,从而实现了调用 一次系统就可以发送多路数据包,避免了发送一个数据包就需要调用 一次系统的繁瑣,因此减少了发送多路数据包时系统调用的开销,提高了发送 多路数据包的工作效率。
图1为本发明实施例提供的一种发送多路数据包的总体方法的流程示意
图2为本发明实施例提供的网络协议栈系统调用的处理流程示意图; 图3为本发明实施例提供的网络协议栈系统调用接口核心参数所使用的数 据结构示意图4为本发明实施例提供的一种发送多路数据包的系统结构示意图。
具体实施例方式
本发明实施例提供了 一种基于Linux的网络协议栈实现高性能地发送多路 数据包的方法及系统,在不影响Linux系统原有网络协议栈的情况下,实现通 过同一网络套接字发送多路数据包,尽量减少系统调用、路由查询或者进程/ 线程切换引起的CPU消耗,提高系统的处理能力,并且提高发送多路数据包 的工作效率。
本发明实施例以发送的多路数据包为多路音频流为例进行说明,当然,对 于其他类型的数据包同样可以适用本发明实施例提供的技术方案。 本发明所述的多路数据包是指目的IP地址不同的多个数据包。 下面结合附图对本发明实施例提供的技术方案进行说明。 参见图1,本发明实施例提供的一种发送多路数据包的方法总体包括步骤 SlOl、创建网络套接字,其中包含用于緩存多路数据包的路由信息的路由 緩存数组。
S102 、获取多路数据包的路由信息并添加到路由緩存数组中。S103、当需要发送所述多路数据包时,从路由緩存数组中获取多路数据包 的路由信息,并根据每一路数据包的路由信息将该路数据包发送出去。
本发明实施例创建了一个网络套接字,就可以实现多路音频流的发送,并 在该网络套接字内部实现多路音频流的路由信息的緩存机制,以便该网络套接 字在服务多路音频流时无需反复进行路由查询操作。
本发明实施例使用一次系统调用,就可以实现多路音频流的发送,每一次 系统调用都能够为多路音频流的每一路音频流发送一个数据包,需要说明的 是,创建了一个网络套接字,可能需要对多个用户多次发送数据包,每次发送 数据包都需要调用一次发送系统,但是本发明实施例每调用一次发送系统,可 以对多个用户发送数据包,即发送多路数据包。
本发明实施例在创建网络套接字的时候,在网络套接字的内核緩存空间为 每一路音频流分配一个路由緩存单元, 一种简单的实现方法是分配一个路由緩 存数组,用以緩存多路数据包的路由信息。
本发明实施例在创建了网络套接字之后的第 一次调用发送系统发送多路 数据包时,对于每一路音频流分别查询路由表获取该路音频流的路由信息,并 将每一路音频流的路由信息缓存到路由緩存数组中,实现多路音频流对应的路 由信息的緩存功能。路由緩存数组中緩存的每一路数据包的路由信息与该路数 据包的索引值相对应,根据多路数据包中的每一路数据包的索引值,就可以从 该路由緩存数组中获取该索引值所对应的该路数据包的路由信息。
在第 一次调用发送系统发送多路数据包之后再次调用发送系统发送多路 数据包时,对于每一路音频流,无需再次查询路由表获取其路由信息,而是才艮 据每一路音频流的索引值,直接从路由緩存数组的表项中获取其路由信息,完 成数据包的路由查找功能,从而可以将数据包快速发送出去。
本发明实施例在发送多路数据包完毕,关闭该网络套接字的时候,除了进 行普通的资源回收外,还需要完成该路由緩存数组的释放。
本发明实施例在发送多路数据包的系统调用接口 ,需要能够传入多个音频
8数据包的信息,包括音频数据包的载荷和对应的远端IP地址和UDP端口。在
系统调用内部,对于每一路音频流,根据其对应的索引值,从路由緩存数组中 获取路由信息,对音频数据包载荷封装之后,按照路由信息将每一路音频流发 送出去。
本发明实施例中,从路由緩存数组中获取的路由信息包括本端的下一跳 的IP地址,或者本端的下一跳的IP地址和MAC地址。
其中,才艮据本端的下 一跳的IP地址可以得到本端的下 一跳的MAC地址,
但是,为了处理速度更快,在路由緩存数组中除了緩存本端的下一跳的IP地 址之外,还可以进一步緩存本端的下一跳的MAC地址,以便直接获取本端的 下一跳的MAC地址。
本发明实施例由于使用一个网络套接字、进行一次系统调用,就可以实现 多路音频流的发送,因此可以避免由于服务多路用户而出现的多个进程/线程空 间的反复切换。
本发明实施例的网络协议栈提供的网络套接字编程接口包括用于创建网 络套接字的socket系统、用于关闭网络套接字的close系统、用于实现高性能 发送多路数据包的sendmsg系统。所述的网络协议栈用于实现多路数据包的路 由信息緩存功能,用于实现一次系统调用发送多路音频流,与现有Linux内核 的网络协议栈相比,减少了将音频数据包打包发送过程中的^各由查找开销和系 统调用开销。
下面结合附图对本发明实施例进行详细说明。
本发明实施例基于Linux的网络协议栈实现高性能发送多路数据包的方案 中,利用了原有的Linux网络协议栈,该网络协议栈利用内核模块机制实现, 所述内核^f莫块的加载和卸载都不会影响Linux内核原有的网络协议栈。
本发明实施例所述彩铃服务器的软硬件包括用户进程空间、Linux内核空 间和硬件设备(包括网卡)。在硬件设备与用户进程之间是Linux内核空间, 在该内核空间内的网卡驱动程序之上设置有网络协议栈,该网络协议栈给用户进程提供网络套接字编程接口 ,该网络套接字编程接口主要包括socket、 close、 sendmsg等系统,其中socket系统用于创建网络套接字,close系统用于关闭网 络套接字,sendmsg系统用于实现高性能发送多路数据包。
本发明实施例实现的网络协议栈系统调用的处理流程如图2所示,本发明 实施例的硬件环境要求有网卡,软件环境为网络功能正常的Linux内核。为了 实现高性能发送多路数据包的功能,本发明实施例在Linux内核的勤出上创建 了基于AF一MULTI网络套接字类型的MUTLI网络协议栈。该网络协议栈给用 户进程提供AF_MUTLI类型的网络套接字编程接口 。
本发明实施例实现的sendmsg系统的定义及其解释如下 定义ssize一t sendmsg(int socket, const struct msghdr *msg, int flags)。 功能通过网络套接字进行高性能发送多路音频流数据。在该系统调用内 部实现多路路由信息的路由緩存功能和多路数据包的转发功能。 输入输出参数的说明
socket 使用socket系统调用创建的AF_MUTLI网络套接字。 msg-〉msg—name 暂时不用,置为NULL 。
msg->msg—namelen 暂时不用,置为0。
msg->msg—iov 输入参数,是指向struct iovec数组的指针。每个struct
iovec结构包含一路待发送音频流数据的緩冲区地址和长度。
msg->msg—iovlen 專叙入参it,是用于存力文msg—iov所指向的struct
iovec数组的长度。
msg->msg—control 输入输出参数,输入时用于存放每个音频流数据包 的控制信息,包括本端及对端的IP地址和UDP端口等;输出时用于返回发送 失败或发送错误的数据包的索引值和错误码,进一步还可以返回发送成功的数 据包的个数和发送失败的数据包的个数。
msg->msg—controllen输入参数,用于存it msg—control信息的总长度。
msg->msg_flags 暂时不用,置为0。flags 暂时不用,置为0。
关于msg一control返回值的说明如果全部数据包都没有发送成功,则通 过输出参数msg—control返回-1,并设置错误码errno。所谓错误码包括发送失 败的原因等信息。如果全部数据包均发送成功,则通过msg—control返回0。如 果部分数据包没有发送成功,则通过msg—control返回发送成功的数据包的数 目或发送失败的数据包的数目,以及发送失败的数据包的索引值和相应的错误 码。
核心参数msg的数据结构struct msghdr如图3所示,包含3个待发送的音 频流数据包。构成音频流数据包的信息存放在参数msg中,msg_iov字段用于 存放待发送音频流数据包的载荷信息,包含用户数据緩冲区的地址和长度信 息,作为音频流数据包的载荷;msg—control字段用于存放待发送音频流数据 包的头部信息,包含远端的IP地址和UDP端口号等,用于生成IP数据包的头 部。
本发明实施例在调用sendmsg系统时,在内核空间为每一个待发送的音频 流数据包分配内核緩沖结构,该内核緩冲结构的数据由两部分组成 一部分是 音频流数据包的载荷,该载荷是从msg—iov中包含的载荷信息得到的;另一部 分是音频流数据包的头部信息,包括本端IP地址、UDP端口和MAC地址信 息,从msg—control中获取的远端IP地址和UDP端口 ,以及从路由緩存数组 中得到的路由信息,即本端的下一跳的IP地址和MAC地址。 下面结合附图介绍一下本发明实施例提供的系统。 参见图4,本发明实施例提供的一种发送多路数据包的系统包括 创建套接字单元41,用于创建网络套接字,其中包含用于緩存多路数据包 的路由信息的路由緩存数组。
发送处理单元42,用于获取多路数据包的路由信息并添加到路由緩存数组 中;当需要发送所述多路数据包时,从路由緩存数组中获取多路数据包的路由
信息,并根据该路由信息将多路数据包发送出去。
ii较佳地,所述发送处理单元42包括
添加路由信息单元421,用于获取多路数据包的路由信息并添加到路由緩 存数组中,该路由緩存数组中緩存的每一路数据包的路由信息与该路数据包的 索引值相对应。
发送单元422,用于当需要发送所述多路数据包时,根据多路数据包中的 每一路数据包的索引值,从路由緩存数组中获取该索51值对应的该路数据包的 路由信息,并根据该路由信息将该路数据包发送出去。
较佳地,所述发送单元422包括
路由信息获取单元4221,用于当需要发送所述多路数据包时,根据多路数 据包中的每一路数据包的索引值,从路由緩存数组中获取该索? 1值对应的该路 数据包的路由信息。
载荷获取单元4222,用于获取多路数据包的载荷。
头部信息获取单元4223,用于获取所述多路数据包的头部信息,其中包括 所述多路数据包的本地IP地址、网络套接字UDP接口和多々某体接入控制MAC 地址,远端IP地址和UDP接口,以及路由信息。
封装处理单元4224,用于利用各路数据包的载荷及其头部信息生成多路数 据包,并按照各路数据包的路由信息将该多路数据包发送出去。
例如,对于多路音频流中的每一音频流,将该音频流的载荷及头部信息生 成该音频流的IP数据包,并按照该音频流的路由信息将该IP数据包发送出去。
较佳地,所述发送处理单元42还包括
结果反馈单元423,用于输出发送成功的数据包的个数,和/或发送失败的 数据包的索引值及错误码。 较佳地,该系统还包括
关闭套接字单元43,用于关闭网络套接字,并释放路由緩存数组。 综上所述,本发明实施例提供的方法及系统充分利用了原有Linux网络协 议栈的单路路由查询功能,实现了多路路由緩存功能,与现有的Linux内核网络协议栈相比,本发明实施例实现了使用 一个网络套接字缓存多路数据包的路 由信息,减少了多路数据包转发过程中的路由查找操作。并且,本发明实施例
利用了原有Linux内核网络协议栈中系统调用的凄史据结构,通过一次系统调用 实现多路数据包转发功能,避免了发送一个数据包就需要一次系统调用的繁瑣 操作,减少了多路数据包转发过程中的系统调用开销。
需要说明的是,上述网络协议栈的实现是通过软件实现的,系统调用的实 现也是现有技术软件实现中所熟知的,因此本发明实施例中不再赘述其具体实 现过程。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发 明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及 其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
权利要求
1、一种发送多路数据包的方法,其特征在于,该方法包括创建网络套接字,其中包含用于缓存多路数据包的路由信息的路由缓存数组;获取所述多路数据包的路由信息并添加到所述路由缓存数组中;当需要发送所述多路数据包时,从所述路由缓存数组中获取所述多路数据包的路由信息,并根据该路由信息将所述多路数据包发送出去。
2、 根据权利要求1所述的方法,其特征在于,从所述路由緩存数组中获 取所述多路数据包的路由信息的步骤包括根据所述多路数据包中的每一路数据包的索引值从所述路由緩存数组中 获取该索? 1值对应的路由信息,得到所述多路数据包的路由信息。
3、 根据权利要求1所述的方法,其特征在于,根据所述路由信息将所述 多路数据包发送出去的步骤包括获取多路数据包的载荷以及头部信息;利用各路数据包的载荷及其头部信息生成多路数据包,并按照各路数据包 的路由信息将所述多路数据包发送出去。
4、 根据权利要求l、 2或3所述的方法,其特征在于,将所述多路数据包 发送出去之后,该方法还包括关闭所述网络套接字,并释放所述路由緩存数组。
5、 根据权利要求4所述的方法,其特征在于,将所述多路数据包发送出 去之后,关闭所述网络套接字之前,该方法还包括输出发送成功的数据包的个数,和/或发送失败的数据包的索引值及错误码。
6、 一种发送多路数据包的系统,其特征在于,该系统包括 创建套接字单元,用于创建网络套接字,其中包含用于緩存多路数据包的路由信息的路由緩存数组;发送处理单元,用于获取所述多路数据包的路由信息并添加到所述路由緩存数组中;当需要发送所述多路数据包时,从所述路由緩存数组中获取所述多 路数据包的路由信息,并根据该路由信息将所述多路数据包发送出去。
7、 根据权利要求6所述的系统,其特征在于,所述发送处理单元包括 添加路由信息单元,用于获取所述多路数据包的路由信息并添加到所述路由緩存数组中,所述路由缓存数组中緩存的每一路数据包的路由信息与该路数 据包的索引值相对应;发送单元,用于当需要发送所述多路数据包时,根据所述多路数据包中的 每一路数据包的索引值,从所述路由緩存数组中获取该索?I值对应的该路数据 包的路由信息,并根据该路由信息将该路数据包发送出去。
8、 根据权利要求7所述的系统,其特征在于,所述发送单元包括 路由信息获取单元,用于当需要发送所述多路数据包时,根据所述多路数据包中的每一路数据包的索引值,从所述路由緩存数组中获取该索卩1值对应的该路数据包的路由信息;载荷获取单元,用于获取所述多路数据包的载荷;头部信息获取单元,用于获取所述多路数据包的头部信息;封装处理单元,用于利用各路数据包的载荷及其头部信息生成多路数据包,并按照各路数据包的路由信息将所述多路数据包发送出去。
9、 根据权利要求7或8所述的系统,其特征在于,所述发送处理单元还 包括结果反馈单元,用于输出发送成功的数据包的个数,和/或发送失败的数据 包的索引值及错误码。
10、 根据权利要求6所述的系统,其特征在于,该系统还包括 关闭套接字单元,用于关闭所述网络套接字,并释放所述路由緩存数组。
全文摘要
本发明公开了一种发送多路数据包的方法及系统,用以实现通过同一网络套接字发送多路数据包,提高发送多路数据包的工作效率。本发明提供的一种发送多路数据包的方法包括创建网络套接字,其中包含用于缓存多路数据包的路由信息的路由缓存数组;获取所述多路数据包的路由信息并添加到所述路由缓存数组中;当需要发送所述多路数据包时,从所述路由缓存数组中获取所述多路数据包的路由信息,并根据该路由信息将所述多路数据包发送出去。
文档编号H04L12/56GK101447925SQ20081018610
公开日2009年6月3日 申请日期2008年12月17日 优先权日2008年12月17日
发明者梁建适, 王魏强, 萍 范 申请人:中兴通讯股份有限公司