一种多网口间以太网报文转发方法及系统与流程

文档序号:18712837发布日期:2019-09-20 20:45阅读:482来源:国知局
一种多网口间以太网报文转发方法及系统与流程

本发明涉及网络数据转发技术领域,尤其涉及的是一种多网口间以太网报文转发方法及系统。



背景技术:

在数据通讯领域,经常要碰到大流量以太网报文转发的需求,如何提升处理器转发能力和系统数据吞吐能力,是系统工程师要思考的问题。

传统的设计模式:网口A收报后,经过实际需要处理后,将报文指针传给网口B发送函数转发出去,同时给网口A重新申请内存,挂载在当前的BD上。网口B发送完成后,负责释放内存。另外,传统的网口驱动都采用中断方式,虽然实时性很强,但是在大流量下非常频繁的中断导致系统调度增加,内核也会消耗CPU资源。

以上方法在一般流量下可以从容应付,但是在大流量每秒钟收包达到五万个以上时,则会出现大量丢包,CPU占用率超高,系统变得很不稳定。系统在内存申请和释放的操作上消耗了太多CPU资源,每秒钟至少是申请释放五万次以上。

因此,现有技术还有待于改进和发展。



技术实现要素:

鉴于上述现有技术的不足之处,本发明的目的在于提供一种多网口间以太网报文转发方法及系统,旨在通过省略报文转发时内存申请和释放的操作提升系统性能,实现多网口间以太网报文零内存申请零拷贝的转发。

为了达到上述目的,本发明解决技术问题所采用的技术方案如下:

一种多网口间以太网报文转发方法,包括以下步骤:

A、预先设置每个网口接收报文缓冲区个数为第一预定值,每个接收报文缓冲区预先分配1600字节的内存,预先设置每个网口发送报文缓冲区个数为第二预定值,每个发送报文缓冲区不预先分配内存;

B、通过每个网口创建自己的接收以太网报文网络数据包任务,采取轮询方式收包;

C、当网口接收到以太网报文后,判断以太网报文是否需要转发;

D、当判断接收到的以太网报文需要转发时,通过调用需要被转发到的网口发包函数发送当前接收报文缓冲区报文,并对需要被转发到的网口当前发送报文缓冲区设置不需要释放内存的标识。

所述的多网口间以太网报文转发方法,其中,还包括步骤E:当判断网口接收到的以太网报文不需要转发时,则重新分配内存替代收到的以太网报文所在的内存,并将所述以太网报文内存传输给上层协议栈处理。

所述的多网口间以太网报文转发方法,其中,步骤B具体为:

每个网口接收报文缓冲区指针采用轮询方式、实时查询接收报文缓冲区是否已经收到报文,如果有收到报文,则查询下一个接收报文缓冲区,同时修改接收报文缓冲区指针。

所述的多网口间以太网报文转发方法,其中,步骤C具体为:当网口接收到以太网报文后,判断是否符合特定业务,如果是,则需要转发,否则不需要转发。

所述的多网口间以太网报文转发方法,其中,步骤D还包括:转发以太网报文的网口收包任务调用被转发到的网口发包函数时,通过发包函数首先判断发包网口发送报文缓冲区是否有保存上一轮发送时保存的、需要释放的内存指针,如果有,则释放,并保存当前发送的内存和释放标识。

一种多网口间以太网报文转发系统,包括:

预设置模块,用于预先设置每个网口接收报文缓冲区个数为第一预定值,每个接收报文缓冲区预先分配1600字节的内存,预先设置每个网口发送报文缓冲区个数为第二预定值,发送报文缓冲区不预先分配内存;

收包模块,用于通过每个网口创建自己的接收以太网报文网络数据包任务,采取轮询方式收包;

判断模块,用于当网口接收到以太网报文后,判断以太网报文是否需要转发;

转发模块,用于当判断接收到的以太网报文需要转发时,通过调用需要被转发到的网口发包函数发送当前接收报文缓冲区报文,并对需要被转发到的网口当前发送报文缓冲区设置不需要释放内存的标识。

所述的多网口间以太网报文转发系统,其中,还包括:

协议栈处理模块,用于当判断网口接收到的以太网报文不需要转发时,则重新分配内存替代收到的以太网报文所在的内存,并将所述以太网报文内存传输给上层协议栈处理。

所述的多网口间以太网报文转发系统,其中,收包模块具体为:每个网口接收报文缓冲区指针采用轮询方式、实时查询接收报文缓冲区是否已经收到报文,如果有收到报文,则查询下一个接收报文缓冲区,同时修改接收报文缓冲区指针。

所述的多网口间以太网报文转发系统,其中,判断模块具体为:当网口接收到以太网报文后,判断是否符合特定业务,如果是,则需要转发,否则不需要转发。

所述的多网口间以太网报文转发系统,其中,转发模块还包括:转发以太网报文的网口收包任务调用被转发到的网口发包函数时,通过发包函数首先判断发包网口发送报文缓冲区是否有保存上一轮发送时保存的、需要释放的内存指针,如果有,则释放,并保存当前发送的内存和释放标识。

有益效果: 相较于现有技术,本发明提供的一种多网口间以太网报文转发方法及系统,所述方法包括:A、预先设置每个网口接收报文缓冲区个数为第一预定值,每个接收报文缓冲区预先分配1600字节的内存,预先设置每个网口发送报文缓冲区个数为第二预定值,发送报文缓冲区不预先分配内存;B、通过每个网口创建自己的接收以太网报文网络数据包任务,采取轮询方式收包;C、当网口接收到以太网报文后,判断以太网报文是否需要转发;D、当判断接收到的以太网报文需要转发时,通过调用需要被转发到的网口发包函数发送当前接收报文缓冲区报文,并对需要被转发到的网口当前发送报文缓冲区设置不需要释放内存的标识。通过省略报文转发时内存申请和释放的操作,同时网口驱动采用轮询收报方式,每调度一次处理最多2000个报文,亦可节省OS内核调度时间,CPU占用率降低15%左右,实现多网口间以太网报文零内存申请零拷贝的转发,系统性能提升非常显著。

附图说明

图1为本发明提供的一种多网口间以太网报文转发方法较佳实施例流程图。

图2为本发明提供的一种多网口间以太网报文转发系统功能模块图。

具体实施方式

为使本发明的目的、技术方案及优点更加清楚、明确,以下参照附图并举实施例对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

请参见图1,图1是本发明提供的一种多网口间以太网报文转发方法较佳实施例流程图,包括步骤:

S100、预先设置每个网口接收报文缓冲区个数为第一预定值,每个接收报文缓冲区预先分配1600字节的内存,预先设置每个网口发送报文缓冲区个数为第二预定值,每个发送报文缓冲区不预先分配内存;

实施时,预先设置每个网口接收报文缓冲区、即接收报文缓冲区个数为第一预定值,第一预定值优选的为50000个,每个接收报文缓冲区预先分配1600字节的内存,预先设置每个网口发送报文缓冲区、即发送报文缓冲区的个数为第二预定值,第二预定值优选的为50000个,发送报文缓冲区不预先分配内存。

具体来说,预先设置每个网口接收报文缓冲区,即Receive(缩写为RX)Buffer Description(缩写为BD),亦即接收报文缓冲区个数为50000个,每个接收报文缓冲区预先分配1600字节的内存,预先设置每个网口发送报文缓冲区,即Transmit(缩写为TX)Buffer Description ,亦即发送报文缓冲区的个数为50000个,发送报文缓冲区不预先分配内存。

S200、通过每个网口创建自己的接收以太网报文网络数据包任务,采取轮询方式收包;

在本步骤中,通过每个网口创建自己的接收以太网报文网络数据包任务,即收包任务,采取轮询(即polling)方式收包。

步骤S200中具体收包方式为:每个网口接收报文缓冲区指针、即接收报文缓冲区 RING采用轮询方式、实时查询接收报文缓冲区是否已经收到报文,如果有收到报文,则查询下一个接收报文缓冲区,同时修改接收报文缓冲区指针,即接收报文缓冲区 RING 。

其中,收包,指的是接收网络报文数据包,任务 ,即 task,或者也称线程,即thread,嵌入式领域中,VxWorks中称task,Linux中称thread。

S300、当网口接收到以太网报文后,判断以太网报文是否需要转发;

步骤S300具体为:当网口接收到以太网报文后,判断是否符合特定业务,如果是,则需要转发,否则不需要转发。

举例来说,即当网口A收到报文后,判断是否符合特定业务,一般解析报文的二层或者三层的头部。如果是需要转发到网口B的报文,调用网口B的发包函数发送当前接收报文缓冲区,并对网口B当前发送报文缓冲区设置不需要释放内存的标识,最重要的是网口A的这个接收报文缓冲区不需要申请内存替代其所带的内存,即零内存申请。

其中,所述特定业务包括:对RTP报文的NAT功能,需要将以太网报文二层协议源MAC地址替换成对外的公网MAC地址,其中,RTP,即Real-time Transport Protocol,亦即实时传输协议;NAT,即Network Address Translation,亦即网络地址转换;MAC,即MAC(Media Access Control或者Medium Access Control)地址,意译为媒体访问控制或介质访问控制,亦或称为物理地址、硬件地址,用来定义网络设备的位置。在OSI模型中,第三层网络层负责 IP地址,第二层数据链路层则负责 MAC地址。因此一个主机会有一个MAC地址,而每个网络位置会有一个专属于它的IP地址,MAC地址是网卡决定的,是固定的。

本申请所说的零内存申请,指的是针对所述特定业务的转发,但是对协议栈报文还是需要申请内存的。在特定业务模式下,特定业务报文可能占99%以上,几乎可以认为网口驱动处在零内存申请的状态下。

S400、当判断接收到的以太网报文需要转发时,通过调用需要被转发到的网口发包函数发送当前接收报文缓冲区报文,并对需要被转发到的网口当前发送报文缓冲区设置不需要释放内存的标识;

步骤S400还包括:转发以太网报文的网口收包任务调用被转发到的网口发包函数时,通过发包函数首先判断发包网口发送报文缓冲区是否有保存上一轮发送时保存的、需要释放的内存指针,如果有,则释放,并保存当前发送的内存和释放标识。

具体来说,网口的发送功能没有创建任务,它是被别的任务所驱动。举例来说,网口A收包任务调用网口B发送功能时,网口B发包接口函数先判断网口B当前发送报文缓冲区是否保存上一轮发送时保存的需要释放的内存指针,如果有,则释放,并保存当前发送的内存和释放标识。

最关键的是,网口A让网口B发送的接收报文缓冲区,网口B还没有发送完成,网口A 收包任务又轮询了一圈回到当前位置,必然修改上次要转发报文的内容。这就是要优选设置5万个接收报文缓冲区的原因,假设网口1秒钟收包10万个,那么5万个接收报文缓冲区可以收0.5秒钟而不丢包,这还是在没有做任何处理而回收接收报文缓冲区的最低假设。网口硬件在0.5秒钟内必然已经将当前报文发送完成了。如果网口流量达不到10万个,而且CPU一直在处理接收BD,那么留给网口发送的时间肯定是大于0.5秒钟的。

当有多个发包网口时,参与转发的网口的发包接口函数都要判断,谁要发送报文,该网口的发包函数就要判断发送BD上挂的上一轮保存的内存指针是否要释放。

进一步的,当判断网口接收到的以太网报文不需要转发时,则重新分配内存替代收到的以太网报文所在的内存,并将所述以太网报文内存传输给上层协议栈处理。举例来说,如果网口A收到的报文不需要转发,则按传统流程,重新分配内存替代收到的报文所在的内存,并将报文内存递交给上层协议栈处理,协议栈处理完成后会释放该内存。

同时,传统的网口驱动采用中断方式收包,也可以使用所述技术方案。

本发明所述技术方案,当判断接收到的以太网报文需要转发时,通过调用以太网报文需要被转发到的网口的发包函数发送当前接收报文缓冲区,做到了多个物理网口之间以太网报文转发过程中零内存申请和零内存拷贝的转发机制,省略了现有技术中以太网报文转发过程中系统在内存申请和释放的频繁操作,尤其当需要转发大流量的以太网报文时,系统性能提升非常显著。同时网口驱动采用轮询收报方式,每调度一次处理最多2000个报文,此处亦可节省OS内核调度时间,CPU占用率降低15%左右。

相应于上述方法,请参见图2,,图2是本发明提供的一种多网口间以太网报文转发系统较佳实施例功能模块图,包括:

预设置模块10,用于预先设置每个网口接收报文缓冲区个数为第一预定值,每个接收报文缓冲区预先分配1600字节的内存,预先设置每个网口发送报文缓冲区个数为第二预定值,发送报文缓冲区不预先分配内存,具体如上所述;

收包模块20,用于通过每个网口创建自己的接收以太网报文网络数据包任务,采取轮询方式收包,具体如上所述;

判断模块30,用于当网口接收到以太网报文后,判断以太网报文是否需要转发,具体如上所述;

转发模块40,用于当判断接收到的以太网报文需要转发时,通过调用需要被转发到的网口发包函数发送当前接收报文缓冲区报文,并对需要被转发到的网口当前发送报文缓冲区设置不需要释放内存的标识,具体如上所述。

所述的多网口间以太网报文转发系统,其中,还包括:

协议栈处理模块,用于当判断网口接收到的以太网报文不需要转发时,则重新分配内存替代收到的以太网报文所在的内存,并将所述以太网报文内存传输给上层协议栈处理,具体如上所述。

所述的多网口间以太网报文转发系统,其中,收包模块20具体为:用于每个网口接收报文缓冲区指针采用轮询方式、实时查询接收报文缓冲区是否已经收到报文,如果有收到报文,则查询下一个接收报文缓冲区,同时修改接收报文缓冲区指针,具体如上所述。

所述的多网口间以太网报文转发系统,其中,判断模块30具体为:用于当网口接收到以太网报文后,判断是否符合特定业务,如果是,则需要转发,否则不需要转发,具体如上所述。

所述的多网口间以太网报文转发系统,其中,转发模块40还包括:用于转发以太网报文的网口收包任务调用被转发到的网口发包函数时,通过发包函数首先判断发包网口发送报文缓冲区是否有保存上一轮发送时保存的、需要释放的内存指针,如果有,则释放,并保存当前发送的内存和释放标识,具体如上所述。

综上所述,本发明所提供的一种多网口间以太网报文转发方法及系统,所述方法包括:A、预先设置每个网口接收报文缓冲区个数为第一预定值,每个接收报文缓冲区预先分配1600字节的内存,预先设置每个网口发送报文缓冲区个数为第二预定值,发送报文缓冲区不预先分配内存;B、通过每个网口创建自己的接收以太网报文网络数据包任务,采取轮询方式收包;C、当网口接收到以太网报文后,判断以太网报文是否需要转发;D、当判断接收到的以太网报文需要转发时,通过调用需要被转发到的网口发包函数发送当前接收报文缓冲区报文,并对需要被转发到的网口当前发送报文缓冲区设置不需要释放内存的标识。通过省略报文转发时内存申请和释放的操作,同时网口驱动采用轮询收报方式,每调度一次处理最多2000个报文,亦可节省OS内核调度时间,CPU占用率降低15%左右,实现多网口间以太网报文零内存申请零拷贝的转发,系统性能提升非常显著。

当然,本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关硬件(如处理器,控制器等)来完成,所述的程序可存储于一计算机可读取的存储介质中,该程序在执行时可包括如上述各方法实施例的流程。其中所述的存储介质可为存储器、磁碟、光盘等。

应当理解的是,本发明的应用不限于上述的举例,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,所有这些改进和变换都应属于本发明所附权利要求的保护范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1