一种报文转发方法及网络设备与流程

文档序号:17720189发布日期:2019-05-22 02:06阅读:147来源:国知局
一种报文转发方法及网络设备与流程

本申请实施例涉及但不限于通信技术领域,尤指一种报文转发方法及网络设备。



背景技术:

随着第五代移动通信技术(5g,fifth-generation)时代的到来,对通信网络的传输速率、性能提出了更高的需求,这就要求在网络数据传输过程中,网络节点处理报文的速率要越来越快,反映到路由器或交换机等设备上,就要求报文能够快速地在设备内部网络中传输、处理。



技术实现要素:

本申请实施例提供了一种报文转发方法及网络设备,可以提高网络设备内部报文的传输速率。

一方面,本申请实施例提供一种报文转发方法,包括:从内存块地址池取出其中存放的内存块信息,将输入输出硬件接收到的报文存放到所述内存块信息指示的内存块,得到所述报文的描述信息,将所述报文的描述信息放入第一收包队列;通过收包线程从所述第一收包队列读取描述信息;通过所述收包线程将第二收包队列内存放的一个标记为空闲状态的内存块信息存放到所述内存块地址池,并将从所述第一收包队列读取的描述信息放入所述第二收包队列;通过与所述第二收包队列对应的应用进程从所述第二收包队列读取描述信息,根据从所述第二收包队列读取的描述信息获取报文,并将所述第二收包队列中用于指示所获取的报文所在内存块的内存块信息标记为空闲状态;其中,所述内存块地址池内存放的内存块信息与所述第二收包队列中存放的内存块信息不重复。

另一方面,本申请实施例提供一种网络设备,包括:输入输出硬件、处理器以及存储器;所述输入输出硬件适于接收或发送报文;所述存储器适于存储报文转发程序,所述报文转发程序被所述处理器执行时实现上述报文转发方法的步骤。

另一方面,本申请实施例提供一种计算机可读介质,存储有报文转发程序,所述报文转发程序被执行时实现上述报文转发方法的步骤。

本申请实施例中,通过收包线程在内存块地址池和第二收包队列之间采用内存地址置换方式实现报文的零拷贝传递,整个报文传递过程中没有增加拷贝,从而提高了网络设备内部的报文传输速率。

本申请的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本申请而了解。本申请的目的和其他优点可通过在说明书、权利要求书以及附图中所特别指出的结构来实现和获得。

附图说明

附图用来提供对本申请技术方案的进一步理解,并且构成说明书的一部分,与本申请的实施例一起用于解释本申请的技术方案,并不构成对本申请技术方案的限制。

图1为linux内核socket收包技术的示意图;

图2为一种零拷贝收包技术的示意图;

图3为本申请实施例提供的报文转发方法的流程图;

图4为本申请实施例提供的报文转发方法的一种示例示意图;

图5为本申请实施例提供的报文转发方法的另一种示例示意图;

图6为本申请实施例提供的报文转发方法的另一种示例示意图;

图7为本申请实施例提供的报文转发方法的另一种示例示意图;

图8为本申请实施例提供的报文转发方法的另一种示例示意图;

图9为本申请实施例提供的报文转发方法的另一种示例示意图;

图10为本申请实施例提供的报文转发方法的另一种示例示意图;

图11为本申请实施例提供的报文转发方法的另一种示例示意图;

图12为本申请实施例提供的报文转发装置的示意图;

图13为本申请实施例提供的报文转发装置的另一示意图;

图14为本申请实施例提供的网络设备的示意图。

具体实施方式

下面将结合附图对本申请的实施例进行详细说明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互任意组合。

在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行。并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。

图1为linux内核socket收包技术的示意图。如图1所示,linux内核socket收包过程可以包括:报文从网卡进入网卡驱动;网卡驱动通过中断通知内核线程在网络协议栈中处理报文,该流程需要经过ip(internetprotocol,网络协议)层和tcp(transmissioncontrolprotocol,传输控制协议)/udp(userdatagramprotocol,用户数据报协议)层;网络协议栈处理完报文后通知应用层(比如,应用进程p1、pn)收包。

图1所示的socket收包技术虽然通用性较好,可以很好地支持多进程收包并且不受限制,但是存在以下缺点:从内核到应用层要经过ip层和tcp/udp层,这就增加了报文拷贝,增加报文拷贝会严重影响收包性能;当容器中的应用进程需要收包时,受限于命名空间(namespace)等限制,报文的传输要依赖于容器网络,也会增加报文拷贝。由此可见,linux内核协议栈中的报文拷贝是影响报文传输速率的重要因素。

图2为一种零拷贝收包技术的示意图。如图2所示,零拷贝收包过程可以包括:报文从网卡上来,并送到帧管理;帧管理会对报文进行解析、分类或哈希(hash)处理,然后送到特定的队列;队列管理负责分配队列给应用进程使用(比如,给应用进程p1分配队列1,给应用进程pn分配队列n),其中,每个应用进程至少需要分配一个队列才可以解决并发问题;应用进程从指定的队列中接收报文并处理。

图2所示的报文零拷贝技术可以直接将网卡驱动映射到应用进程中,这样应用进程就可以直接访问报文队列,从而实现报文的零拷贝。其中,网卡驱动可以放在内核中也可以直接放在应用进程中,应用进程直接与驱动队列进行交互,交互时需要确定本应用进程使用的队列编号、pool(池)编号、优先级调度策略等一系列问题。如果有多个应用进程都要实现收包,那么每个应用进程都要映射管理网卡驱动、确定队列编号、pool编号以及优先级调度策略,由于一般不同的应用进程可能由不同用户维护,上述方式无疑增加了工作量、浪费了人力。而且,本方案在有多个应用进程或容器收发报文的场景下存在一些问题,比如,在应用进程较多的情况下,网卡的硬件资源不够用,这样应用进程的个数就会受到限制;有些网卡不支持优先级调度或者调度不够灵活;容器中的进程收包时受限于命名空间(namespace)等限制,报文的传输要依赖于容器网络,导致增加报文拷贝;每个应用进程都要直接操作用户态驱动,会带来不必要的工作量等。

本申请实施例提供一种报文转发方法及网络设备,通过收包线程在内存块地址池、第一收包队列及第二收包队列传递内存地址的方式来实现报文零拷贝,网络设备内的报文传递过程没有增加拷贝,从而提高了网络设备内部的报文传输速率。而且,本申请实施例可以实现多应用进程收包时专注于应用而不必考虑底层硬件驱动细节,在不影响性能的同时提升了通用性、工作效率,并且减少了维护成本。通过不同的第二收包队列来对应不同的应用进程,通过增加第二收包队列和内存即可增加应用进程收包,从而克服应用进程的个数受限问题;而且,通过增加第二收包队列可以区分优先级,从而实现报文的优先级调度。通过增加收包线程并设置亲和性、排他性快速收包可以解决硬件资源受限以及硬件不支持优先级调度或者调度不够灵活所导致的无差别丢包等问题。

图3为本申请实施例提供的报文转发方法的流程图。如图3所示,本实施例提供的报文转发方法应用于网络设备,用于实现在网络设备内部从网络设备的输入输出硬件(比如,网卡)到应用进程的报文传输。本实施例提供的报文转发方法可以应用于对多进程或多线程、容器化、通用性以及收发报文速率要求较高的网络设备,比如,路由器、交换机等。然而,本申请对此并不限定。

如图3所示,本实施例提供的报文转发方法包括以下步骤:

步骤s101、从内存块地址池取出其中存放的内存块信息,将输入输出硬件接收到的报文存放到内存块信息指示的内存块,得到该报文的描述信息,将该报文的描述信息放入第一收包队列;

步骤s102、通过收包线程从第一收包队列读取描述信息;

步骤s103、通过收包线程将第二收包队列内存放的一个标记为空闲状态的内存块信息存放到内存块地址池,并将从第一收包队列读取的描述信息放入该第二收包队列;

步骤s104、通过与该第二收包队列对应的应用进程从该第二收包队列读取描述信息,根据从该第二收包队列读取的描述信息获取报文,并将该第二收包队列中用于指示所获取的报文所在内存块的内存块信息标记为空闲状态;

其中,内存块地址池内存放的内存块信息与第二收包队列中存放的内存块信息不重复。

在一示例性实施例中,内存块地址池和第二收包队列中存放的内存块信息可以包括内存块首地址或者内存块标识(id);内存块为一段地址连续的物理内存,用于缓存输入输出硬件接收到的报文。例如,内存块地址池和第二收包队列中可以注入预先分配的内存块首地址,且内存块地址池中注入的内存块首地址与第二收包队列中注入的内存块首地址不重复。或者,内存块地址池和第二收包队列中可以注入预先分配的内存块id,且内存块地址池中注入的内存块id与第二收包队列中注入的内存块id不重复。

在一示例性实施例中,报文的描述信息可以包括:缓存报文的内存块的内存块首地址、报文长度以及报文基于该内存块首地址的偏移信息。然而,本申请对此并不限定。

在一示例性实施例中,第二收包队列可以为环形队列;每一个环形队列都是一个无锁队列,从而实现无锁。然而,本申请对此并不限定。在其他实施例中,第二收包队列可以为fifo(firstinputfirstoutput,先进先出队列)。

在一示例性实施例中,在步骤s101之前,本实施例的报文转发方法还可以包括:接收到应用进程的收包请求后,给该应用进程分配至少一个物理地址连续的内存片,从该内存片切割出多个内存块,将多个内存块对应的内存块信息(比如,内存块首地址或id)分别存放到内存块地址池和该应用进程对应的第二收包队列,并标记存放到该第二收包队列的内存块信息为空闲状态;或者,预留至少一个物理地址连续的内存片,接收到应用进程的收包请求后,从该内存片切割出多个内存块,将多个内存块对应的内存块信息(比如,内存块首地址或id)分别存放到内存块地址池和该应用进程对应的第二收包队列,并标记存放到该第二收包队列的内存块信息为空闲状态。其中,内存块地址池中注入的内存块信息与该第二收包队列中注入的内存块信息不重复。示例性地,可以通过收包进程实现内存片的地址分配、以及内存块地址池和第二收包队列中内存块首地址或id的注入。然而,本申请对此并不限定。

其中,在物理地址连续的内存片切割出的每一个内存块可以用于缓存报文,每一个内存块内部的物理地址连续。当一个内存片所提供的连续物理地址不足时,可以从多个内存片中切割出足够数目的内存块,只要满足从内存片中切割出的内存块内部的物理地址连续即可。

在一示例性实施例中,在步骤s102之后,本实施例的报文转发方法还可以包括:当第二收包队列中没有标记为空闲状态的内存块信息,则通过收包线程将从第一收包队列读取的描述信息所对应的内存块信息放回内存块地址池。其中,当第二收包队列中没有空闲状态的内存块信息(即第二收包队列内报文的描述信息已存满),则收包线程可以回收相应的内存块信息,从而丢弃相应的报文。

在一示例性实施例中,在步骤s102之后,本实施例的报文转发方法还可以包括:通过收包线程根据从第一收包队列读取的描述信息,读取在该描述信息指示的物理地址缓存的报文,通过解析读取到的报文,确定读取到的报文对应的第二收包队列;

相应地,步骤s103可以包括:通过收包线程将读取到的报文对应的第二收包队列内存放的一个标记为空闲状态的内存块信息放入内存块地址池,并将从第一收包队列读取的该描述信息放入该第二收包队列。

在一示例性实施例中,在通过收包线程根据从第一收包队列读取的描述信息,读取在该描述信息指示的物理地址缓存的报文,通过解析读取到的报文,确定读取到的报文对应的第二收包队列之后,本实施例的报文转发方法还可以包括:当通过收包线程读取到的报文对应的第二收包队列中没有标记为空闲状态的内存块信息,则通过收包线程将从第一收包队列读取的描述信息所对应的内存块信息放回内存块地址池。其中,当第二收包队列中没有空闲状态的内存块信息(即第二收包队列内报文的描述信息已存满),则收包线程可以回收相应的内存块信息,从而丢弃相应的报文。

在一示例性实施例中,在步骤s101之前,本实施例的报文转发方法还可以包括:接收应用进程的收包请求;根据应用进程的收包请求,给应用进程创建对应的一个或多个第二收包队列;向应用进程返回该应用进程对应的第二收包队列的创建信息。其中,一个应用进程可以对应一个第二收包队列,或者,对应多个第二收包队列(比如,一个第二收包队列组);一个第二收包队列仅对应一个应用进程。其中,收包请求的接收以及第二收包队列的创建过程可以通过收包进程实现。比如,收包请求的接收以及第二收包队列的创建可以通过收包进程内的收包线程实现。然而,本申请对此并不限定。在其他实施例中,收包请求的接收以及第二收包队列的创建可以通过收包进程内的其他线程(比如,通道管理线程)实现。

在一示例性实施例中,应用进程的收包请求可以携带以下信息:请求创建的第二收包队列的数量、第二收包队列的大小、接收报文的最大长度、接收报文的特征信息等。应用进程对应的第二收包队列的创建信息可以包括:该应用进程对应的第二收包队列的编号等信息。然而,本申请对此并不限定。

在一示例性实施例中,通过收包线程根据从第一收包队列读取的描述信息,读取在该描述信息指示的物理地址缓存的报文,通过解析读取到的报文,确定读取到的报文对应的第二收包队列,可以包括:通过将从第一收包队列读取的描述信息映射到虚拟地址,读取并解析报文,得到该报文的特征信息;根据解析出的该报文的特征信息,确定接收该报文的应用进程;根据接收该报文的应用进程以及应用进程与第二收包队列的对应关系(比如,应用进程与第二收包队列为一一对应关系),确定该报文对应的第二收包队列。

在一示例性实施例中,根据应用进程的收包请求,给应用进程创建对应的一个或多个第二收包队列,可以包括:根据应用进程的收包请求,给该应用进程创建支持优先级调度的多个第二收包队列,其中,该应用进程待接收的报文所属的任一级优先级对应一个或多个第二收包队列。比如,一个应用进程待接收的报文对应有两个优先级,则可以给该应用进程创建至少两个第二收包队列(比如,队列1和队列2),其中一个优先级可以对应至少一个第二收包队列(比如,队列1),另一个优先级可以对应至少一个第二收包队列(比如,队列2);换言之,属于其中一个优先级的报文可以通过至少一个第二收包队列(比如,队列1)接收,属于另一个优先级的报文可以通过另外的至少一个第二收包队列(比如,队列2)接收。

在一示例性实施例中,通过收包线程根据从第一收包队列读取的描述信息,读取在该描述信息指示的物理地址缓存的报文,通过解析读取到的报文,确定读取到的报文对应的第二收包队列,可以包括:通过将从第一收包队列读取的描述信息映射到虚拟地址,读取并解析报文,得到该报文的特征信息;根据解析出的该报文的特征信息,确定接收该报文的应用进程以及该报文所属的优先级;根据接收该报文的应用进程、该报文所属的优先级、以及该应用进程对应的第二收包队列与优先级的对应关系,确定该报文对应的第二收包队列。其中,当应用进程对应的第二收包队列支持优先级调度时,应用进程可以按照一定比例从对应的第二收包队列接收报文,从而实现报文的优先级调度。比如,应用进程可以优先从较高优先级对应的第二收包队列接收较高优先级的报文。

在一示例性实施例中,在步骤s101之前,本实施例的报文转发方法还可以包括:接收到应用进程的收包请求后,给应用进程创建对应的内存块地址池;或者,根据输入输出硬件接收的报文类型,创建一个或多个内存块地址池。其中,可以给每个应用进程创建独立的内存块地址池,比如,可以根据应用进程的收包请求,给应用进程创建独立的内存块地址池,以提升该应用进程的收包性能;或者,多个应用进程可以共用一个或多个内存块地址池,比如,可以预先创建一个或多个内存块地址池。示例性地,可以根据输入输出硬件接收的报文类型(比如,报文大小)来创建多个内存块地址池,例如,可以创建两个内存块地址池,其中一个内存块地址池中存放的内存块信息所指示的内存块可以用于缓存报文大小小于预设值的报文,另一个内存块地址池中存放的内存块信息所指示的内存块可以用于缓存报文大小大于或等于预设值的报文。其中,可以通过收包进程实现内存块地址池的创建。然而,本申请对此并不限定。

在一示例性实施例中,在步骤s101之前,本实施例的报文转发方法还可以包括:接收到应用进程的收包请求后,给该应用进程创建对应的第一收包队列;或者,根据输入输出硬件的类型,创建一个或多个第一收包队列。其中,可以给每个应用进程创建独立的第一收包队列,比如,可以根据应用进程的收包请求,给应用进程创建独立的第一收包队列,以提升该应用进程的收包性能;或者,多个应用进程可以共用一个或多个第一收包队列,比如,可以预先创建一个或多个第一收包队列。示例性地,可以根据输入输出硬件(网卡)的类型来创建第一收包队列,例如,当网卡不支持优先级调度时,可以创建一个第一收包队列,当网卡支持优先级调度时,可以创建多个第二收包队列。其中,可以通过收包进程实现第一收包队列的创建。然而,本申请对此并不限定。

在一示例性实施例中,在步骤s101之前,本实施例的报文转发方法还可以包括:接收到应用进程的收包请求后,给应用进程创建对应的收包线程;或者,接收到应用进程的收包请求后,从已创建的收包线程中选择一个作为该应用进程对应的收包线程。其中,可以给每个应用进程创建单独的收包线程,或者,多个应用进程可以共用一个收包线程。例如,当接收到应用进程的收包请求后,若该应用进程可以与其他应用进程共用收包线程,则可以从给其他应用进程创建的收包线程中选择一个作为该应用进程对应的收包线程,比如可以设置一个默认的收包线程提供给多个应用进程。其中,可以通过收包进程实现收包线程的创建。然而,本申请对此并不限定。

在一示例性实施例中,多个应用进程可以仅对应一个收包线程,或者,多个应用进程对应多个收包线程。其中,可以仅通过一个收包线程给多个应用进程传递报文;或者,可以通过多个收包线程给多个应用进程传递报文,比如,可以通过两个收包线程给五个应用进程传递报文,其中一个收包线程可以给三个应用进程传递报文,另外一个收包线程可以给其余两个应用进程传递报文。

在一示例性实施例中,一个或多个应用进程可以位于容器内。本实施例提供的报文转发方法可以适用于容器内的应用进程需要收包的场景。其中,在主机(host)上的收包线程给容器中的应用进程收包时,由于命名空间(namespace)等不同,需要使用一段地址连续的物理内存来创建第二收包队列。

在一示例性实施例中,应用进程和收包线程可以均位于容器内。本实施例提供的报文转发方法可以适用于在容器中直接从输入输出硬件收包的场景。

在一示例性实施例中,本实施例的报文转发方法还可以包括:设置收包线程对中央处理单元(cpu)资源的亲和性或排他性。其中,可以设置收包线程的cpu亲和性,或者通过cgroup或排它技术独占某个cpu资源,从而提高收包性能。比如,当网卡不支持优先级调度,仅创建一个第一收包队列时,可以设置收包线程的cpu亲和性使得该收包线程排它独占某个cpu资源,从而减少无差别丢包的几率。然而,本申请对此并不限定。当第一收包队列为多个时,也可以设置收包线程的cpu亲和性,以提升收包性能。

在一示例性实施例中,本实施例的报文转发方法还可以包括:通过收包线程根据从第一收包队列读取的描述信息读取到报文后,更新该报文所属业务流的流统计计数,当限速时长内的流统计计数满足设定条件时,丢弃该报文;在每次达到限速时长后,将该流统计计数置为初始值。其中,本实施例提供的报文转发方法可以适用于业务流的流量过大的场景。

在一种示例性实施例中,流统计计数的初始值可以为0,在通过收包线程读取到报文后,可以将该报文所属业务流的流统计计数加一,当限速时长(比如,一秒)内的流统计计数满足设定条件(比如,大于该业务流的限速值)时,丢弃该报文;并在每次达到限速时长后,将该流统计计数置为初始值(此处为0)。

在一示例性实施例中,业务流的流统计计数的初始值可以为该业务流的限速值,在通过收包线程读取到报文后,可以将该报文所属业务流的流统计计数减一,当限速时长(比如,一秒)内的流统计计数满足设定条件(比如,限速时长内的流统计计数为0)时,丢弃该报文;并在每次达到限速时长后,将该流统计计数置为初始值(此处为限速值)。

在一示例性实施例中,本实施例的报文转发方法还可以包括:从第一发包队列取出其中存放的标记为空闲状态的内存块信息(比如,内存块首地址或id),将应用进程待发送的报文存放到该内存块信息所指示的内存块,得到该报文的描述信息,并将该报文的描述信息放入第一发包队列;通过发包线程从第一发包队列读取描述信息,将内存块地址池内存放的一个标记为空闲状态的内存块信息(比如,内存块首地址或id)放入第一发包队列,并将从第一发包队列读取的描述信息放入第二发包队列;从第二发包队列读取描述信息,并根据从第二发包队列读取的描述信息获取报文,通过输入输出硬件(比如,网卡)发送获取到的报文,并在发送获取到的报文后,将用于指示该获取到的报文所在内存块的内存块信息放回内存块地址池。本实施例可以通过发包线程在内存块地址池、第一发包队列以及第二发包队列传递内存地址的方式来发送报文。然而,本申请对此并不限定。在其他实施例中,报文发送过程也可以不采用上述方式。

图4为本申请实施例提供的报文转发方法的一种示例示意图。本示例性实施例说明通过收包线程、内存块地址池、第一收包队列和第二收包队列采用内存地址置换方式实现报文零拷贝传递的接收流程。其中,第二收包队列以环形队列为例进行说明,即一个第二收包队列即为一个环形队列(以下简称为环(ring)),每个环形队列是一个无锁队列。本示例中,一个应用进程对应一组第二收包队列(即一个ring组)。

在本示例性实施例中,在进行报文接收之前,先进行以下工作:

1)预留一段物理地址连续的内存片a,在内存片a中可以切割出多个内存块(block),用于缓存报文;其中,内存片a的大小大于或等于内存块(block)的总个数(比如,图4中的n,n为大于1的整数)乘以允许支持的报文最大长度(比如10kbyte);每个block都表示一段地址连续的物理内存,block首地址就表示这段地址连续的物理内存的首地址。

在其他实施例中,可以预留多个内存片,从这些内存片中切割出多个内存块,只要保证从中切割出的内存块内部的物理地址连续即可。

2)给硬件驱动(比如,网卡驱动)分配内存块地址池(以下简称为pool)b以及第一收包队列(以下简称为queue)c。其中,poolb用于存放内存块首地址,poolb可以为fifo队列、链表、数组、或者环形队列,然而,本申请对此并不限定。queuec可以为fifo结构或者环形队列结构,然而,本申请对此并不限定。

3)创建支持优先级调度的ring组d(即上述的多个第二收包队列);本示例中,ring组d可以包括m个ring,m可以为大于或等于1的整数。

4)创建用来从硬件驱动收包的收包线程(以下简称为thread)e,threade可以将物理地址连续的内存片a的首地址映射成虚拟地址以备解析报文使用。

其中,实现报文零拷贝传递的过程在poolb、queuec、ring组d以及threade之间进行,具体的内存地址置换动作发生在poolb和ring组d之间。

在本示例性实施例中,如图4所示,可以将k+1到n部分共n-k个block首地址注入到poolb中。将block1到blocki,总共i个block首地址放在ring0中;将blockj到blockk,总共k-j+1个block首地址放在ringm中;ring组d中其它ring内的block首地址的注入方式和ring0、ringm内block首地址的注入方式一样,初始时,ring组d中注入的所有block首地址的使用状态均为空闲状态。其中,i,j,k均为大于1的整数。整个block首地址的注入过程中保证所有的ring、poolb中注入的block首地址均不重复。其中,注入各个ring和poolb中的block首地址的数目可以相同或不同,本申请对此并不限定。其中,ring组d中所有block首地址个数加上poolb中所有block首地址个数之和可以为n。

基于上述设置的poolb、queuec、ring组d以及threade,本示例性实施例的报文转发方法可以包括步骤101至步骤109。

步骤101、网卡将接收到的报文送到帧管理。

步骤102、帧管理对报文进行解析、分类/哈希,并从poolb中取出一个block首地址存放报文。

步骤103、帧管理将该block首地址、报文长度、报文基于该block首地址的偏移信息等信息(对应上述的描述信息)填入描述符中,并将此描述符放入queuec中。其中,queuec的数目可以为一个或多个;当queuec的数目为多个,即采用多队列,则帧管理可以根据报文的特征信息来选择将该报文的描述符放入哪个queuec,从而支持优先级调度。本示例性实施例中,以一个queuec为例进行说明。

需要说明的是,在其他实现方式中,可以设置一个单独的线程,用于从poolb中取出一个block首地址存放报文,将该block首地址、报文长度、报文基于该block首地址的偏移信息等信息填入描述符中,并将此描述符放入queuec中。

步骤104、threade从queuec中轮询出描述符,取出报文的block首地址、报文长度、报文基于block首地址的偏移信息等信息,并通过简单的偏移运算得到这个报文的虚拟地址。其中,虚拟地址的计算方法可以为:报文的虚拟地址等于报文的block首地址减去连续的内存片a的首地址再加上连续的内存片a的首地址映射的虚拟地址。然后,threade可以读取并解析该报文,根据该报文的特征信息(比如,从报文的特征字段得到)可以确定这个报文要转发到的应用进程以及对应的ring。然后,threade可以通过步骤105至步骤106采用置换block首地址的方式将这个报文的block首地址、报文长度、报文基于block首地址的偏移等信息放入对应的ring。本示例中,以该报文对应的ring为ringm为例进行说明。

步骤105、threade从ringm中弹出一个空闲的block首地址还给poolb。

步骤106、threade将该报文的block首地址、报文长度、报文基于block首地址的偏移信息等信息放入ringm中对应的位置以供应用进程p11读取。其中,ringm中弹出一个空闲block首地址之后的位置可以放入该报文的block首地址、报文长度、报文基于block首地址的偏移信息等信息。

需要说明的是,如果ringm中没有空闲的block首地址用于置换,即ringm中存放的都是报文的描述信息(表示ringm中存储的描述信息已满),则执行步骤107,即threade可以将收到的这个报文对应的block首地址还给poolb;这种情况实现了报文无法上送时的丢弃操作,同时回收了block首地址。

需要说明的是,当仅有一个应用进程存在收包需求,且该应用进程对应一个ring或者对应的一个ring组不存在优先级时,threade从queuec中轮询出描述符,取出报文的block首地址、报文长度、报文基于block首地址的偏移等信息之后,可以不进行报文读取和解析,直接执行步骤105和步骤106。

步骤108、应用进程p11可以从ringm中取出报文的block首地址、报文长度、报文基于block首地址的偏移信息等信息,然后从存储该报文的block读取该报文。在本示例性实施例中,应用进程p11放在容器1中。然而,本申请对此并不限定。在其他实施例中,应用进程p11也可以不放在容器中。

步骤109、应用进程p11在处理完报文后,可以将ringm中该报文对应的block首地址置成空闲状态,以便threade继续使用。

在本示例性实施例中,帧管理将报文放入block后,后续通过对存储报文的block首地址进行置换,从而实现报文零拷贝传递给应用进程。如此,可以封装应用进程对网卡的访问,屏蔽了应用进程和网卡驱动之间的直接交互,使得应用进程收包时不必考虑底层硬件驱动细节,在不影响传递性能的同时提升了通用性、工作效率,并减少了维护成本。

在一示例性实施例中,当网卡不支持优先级调度,即如图4所示中只有一个queuec,则所有从网卡上送的报文都要进入queuec。为了达到queuec不产生无差别丢包效果,可以设置收包线程的cpu亲和性,使其排它独占某个cpu资源,如此,收包线程可以尽可能地将queuec中的报文都收上来,从而减少无差别丢包的几率。如此,解决网卡不支持优先级调度或者调度不够灵活场景的报文转发。然而,本申请对此并不限定。在其他实施例中,可以通过cgroup(controlgroups)或其他排它技术使得收包线程独占某个cpu资源。

图5为本申请实施例的报文转发方法的一种示例示意图。本示例性实施例说明给多个应用进程创建收包通道的过程,其中,可以给每个应用进程创建支持优先级调度的一组第二收包队列(比如,一个ring组)。

如图5所示,本示例性实施例提供的报文转发方法包括以下步骤:

步骤201、应用进程有收发包需求,向收包进程p0发出收包请求;在本示例性实施例中,容器1中的应用进程p11至应用进程p1n、容器n中的应用进程pn1至应用进程pnn都有收包需求,则都可以向收包进程p0发出收包请求;其中,请求的方式有多种多样,可以是消息、保留内存等。示例性地,应用进程的请求信息可以包括:请求创建的ring的数目及大小、接收报文的最大长度、接收报文的特征信息等。本示例性实施例中,以一个收包进程p0为例进行说明,然而,本申请对此并不限定。在其他实现方式中,也可以采用多个收包进程。

步骤202、收包进程p0的任务(job)可以根据各个应用进程的收包请求,分别给各个应用进程创建收包通道。其中,job专门负责分配、管理携带收包需求信息的收包请求。然而,本申请对此并不限定。在其他实施例中,收包进程p0可以开启通道管理线程负责管理收包请求,及创建收包通道。

在本示例性实施例中,job可以预留一段物理地址连续的内存片,创建内存块地址池和第一收包队列,创建收包线程;以及根据每个应用进程的收包需求,给每个应用进程创建对应的支持优先级调度的ring组。其中,关于内存片、内存块地址池、第一收包队列、收包线程、ring组的说明可以参照图4中的相关描述,故于此不再赘述。

其中,任一应用进程可以对应一个ring组;比如,如图5所示,应用进程p11对应ring组d11,应用进程pnn对应ring组dnn,其中,每个ring组中ring的数目可以相同(比如,m+1个,m为大于或等于0的整数)或不同。然而,本申请对此并不限定。

以应用进程p11对应的ring组d11支持优先级调度为例,ring组d11中的任一个ring可以对应一级优先级,后续收包线程通过解析报文的优先级,可以将该报文的描述信息放入对应该级优先级的ring中。然而,本申请对此并不限定。在其他实施例中,支持优先级调度的ring组中的多个ring可以对应一级优先级。

步骤203、收包进程p0的job给应用进程p11创建支持优先级的ring组d11后,向应用进程p11返回其对应的支持优先级的ring组d11的创建信息;同样地,收包进程p0的job给其余的任一应用进程创建支持优先级的ring组后,会向该应用进程返回对应的ring组的创建信息;其中,job每给一个应用进程创建对应的ring组后,会给该应用进程返回对应的ring组的创建信息。其中,创建信息可以包括应用进程对应的支持优先级的ring组的队列管理信息(比如,ring组中的ring与优先级的对应关系)等。如此一来,即给各个应用进程创建好了收包通道。

在本示例性实施例中,应用进程可以按照一定比例从对应的ring读取不同优先级的报文,比如,优先从较高优先级对应的ring读取报文。

在本示例性实施例中,如图5所示,容器个数可以为多个,比如1到n;每个容器中的应用进程也可以为多个,比如pn1到pnn。当应用进程的个数受地址连续的内存片a(如图4所示)的限制时,只要将内存片a扩大,并增加收包进程的个数,就可以使得应用进程的个数不再受到网卡硬件资源的限制。其中,每一个ring组对应一个应用进程进行收包,通过增加ring组和内存就可以增加收包的应用进程,从而克服收包的应用进程的个数受到网卡硬件资源限制的情况。

本示例性实施例中每个应用进程的具体收包过程可以参照图4的相关说明,故于此不再赘述。

图6是本申请实施例提供的报文转发方法的一种示例示意图。本示例性实施例说明单个收包线程给多个容器的多个应用进程统一传递报文。其中,容器1中的应用进程p11至p1n、容器n中的应用进程pn1至pnn都有收包需求。

如图6所示,本示例性实施例提供的报文转发方法包括如下过程:

步骤301、各个应用进程确定自身是否需要支持优先级调度、每种优先级所支持的最大报文缓冲区大小、接收报文的最大长度、接收报文的特征信息等信息,并发送收包请求,其中收包请求可以携带上述信息。

步骤302、收包进程p0的job根据各个应用进程的收包请求,给各个应用进程创建收包通道;其中,收包通道的创建过程可以参照图5的说明,故于此不再赘述。本示例中,如图6所示,应用进程p11对应ring组d11,应用进程p1n对应ring组d1n,应用进程pn1对应ring组dn1,应用进程pnn对应ring组dnn,其中,每个ring组中ring的数目可以相同(比如,m+1个,m为大于或等于0的整数)或不同。然而,本申请对此并不限定。

步骤303、当有报文从网卡上送,通过帧管理上送到第一收包队列,收包进程p0中的收包线程可以轮询到这个报文,并经过特征信息解析后将存储这个报文的描述信息置换到这个报文对应的应用进程的ring中。关于本步骤的相关说明可以参照图4中的步骤101至步骤107,故于此不再赘述。

步骤304、容器1中的应用进程p11至应用进程p1n、容器n中的应用进程pn1至应用进程pnn可以各自轮询对应的ring组,取到报文。

步骤305、各个应用进程根据业务需求处理完报文后,可以将对应的ring中用于指示存储报文的内存块的内存块首地址置为空闲状态,以便继续使用。

图7为本申请实施例提供的报文转发方法的一种示例示意图。本示例性实施例说明单个收包线程给多个应用进程统一传递报文。其中,由于收包进程p0与应用进程p1至pn都在同一个主机(host)上,因此,性能要求较低的应用进程也可以使用共享内存来创建ring。

如图7所示,本示例性实施例提供的报文转发方法包括如下过程:

步骤401、各个应用进程(比如,应用进程p1至应用进程pn)根据自身的收包需求,发送收包请求;其中,收包请求可以携带以下信息:请求创建的ring的数量及大小、接收报文的最大长度、接收报文的特征信息等。

步骤402、收包进程p0的job根据各个应用进程的收包请求,给各个应用进程创建收包通道;其中,收包通道的创建过程可以参照图5的说明,故于此不再赘述。本示例中,如图7所示,应用进程p1对应ring组d1,应用进程pm对应ring组dm,应用进程pn对应ring组dn,其中,每个ring组中ring的数目可以相同(比如,m+1个,m为大于或等于0的整数)或不同。然而,本申请对此并不限定。

步骤403、当有报文从网卡上送,通过帧管理上送到第一收包队列,收包进程p0中的收包线程可以轮询到这个报文,并经过特征信息解析后将存储这个报文的描述信息置换到这个报文对应的应用进程的ring中。关于本步骤的相关说明可以参照图4中的步骤101至步骤107,故于此不再赘述。

步骤404、应用进程p1至应用进程pn可以各自轮询对应的ring组,取到报文。

步骤405、各个应用进程根据业务需求处理完报文后,可以将对应的ring中用于指示存储报文的内存块的内存块首地址置为空闲状态,以便继续使用。

图8为本申请实施例提供的报文转发方法的一种示例示意图。本示例性实施例说明多个收包线程给多个容器内的多个应用进程统一收包。在某些场景下,单个收包线程无法满足某些业务的需要,比如采样、nat(networkaddresstranslation,网络地址转换)等业务,其对收包性能要求非常高,基于此可以通过增加收包线程的方式来满足某些对收包性能要求高的业务。

如图8所示,本示例性实施例提供的报文转发方法包括如下过程:

步骤501、各个应用进程(比如,容器1中的应用进程p11至p1n、容器n中的应用进程pn1至pnn)根据自身的收包需求,发送收包请求;其中,收包请求可以携带以下信息:请求创建的ring的数量及大小、接收报文的最大长度、接收报文的特征信息等。

步骤502、收包进程p0的job根据各个应用进程的收包请求,给各个应用进程创建收包通道。本实施例中,在给各个应用进程创建收包通道时,可以区分收包线程与应用进程的对应关系。比如,图8所示,收包线程1可以用于给应用进程p11至p1n以及应用进程pn1收包,收包进程s可以用于给应用进程pnn收包。其中,s可以为大于或等于1的整数。

本示例中,如图8所示,应用进程p11对应ring组d11,应用进程p1n对应ring组d1n,应用进程pn1对应ring组dn1,应用进程pnn对应ring组dnn,其中,每个ring组中ring的数目可以相同(比如,m+1个,m为大于或等于0的整数)或不同。然而,本申请对此并不限定。

其中,收包通道的其余创建过程可以参照图5的说明,故于此不再赘述。

步骤503、基于创建后的收包通道,收包线程(比如,收包线程1至s)可以为对应的应用进程收包。关于本步骤的相关说明可以参照图4中的步骤101至步骤107,故于此不再赘述。

步骤504、各个应用进程可以各自轮询对应的ring组,取到报文。

步骤505、各个应用进程根据业务需求处理完报文后,可以将对应的ring中用于指示存储报文的内存块的内存块首地址置为空闲状态,以便继续使用。

图9为本申请实施例提供的报文转发方法的一种示例示意图。本示例性实施例说明多个收包线程给多个多应用进程以及多个容器中的多个应用进程收包的过程。在某些场景下,有收包需求的应用进程可能在主机(host)上,也可能在容器中,这样就存在host和容器中都有应用进程需要收包的场景。

如图9所示,本示例性实施例提供的报文转发方法包括如下过程:

步骤601、各应用进程pi至pk,以及容器n中的应用进程pn1至pnn根据自身的收包需求,发送收包请求;其中,收包请求可以携带以下信息:请求创建的ring的数量及大小、接收报文的最大长度、接收报文的特征信息等。

步骤602、收包进程p0的job根据各个应用进程的收包请求,给各个应用进程创建收包通道。本实施例中,在给各个应用进程创建收包通道时,可以区分收包线程与应用进程的对应关系。比如,图9所示,收包线程1可以用于给应用进程pi至pk以及应用进程pn1收包,收包进程s可以用于给应用进程pnn收包。其中,s可以为大于或等于1的整数。

本实施例中,在host上的应用进程既可以使用共享内存也可以使用保留的地址连续的物理内存来创建ring组,但是在容器中的进程只能使用保留的物理地址连续的内存来创建ring组。

本示例中,如图9所示,应用进程pi对应ring组di,应用进程pk对应ring组dk,应用进程pn1对应ring组dn1,应用进程pnn对应ring组dnn,其中,每个ring组中ring的数目可以相同(比如,m+1个,m为大于或等于0的整数)或不同。然而,本申请对此并不限定。

其中,收包通道的其余创建过程可以参照图5的说明,故于此不再赘述。

步骤603、基于创建后的收包通道,收包线程(比如,收包线程1至s)可以为对应的应用进程收包。关于本步骤的相关说明可以参照图4中的步骤101至步骤107,故于此不再赘述。

步骤604、各个应用进程可以各自轮询对应的ring组,取到报文。

步骤605、各个应用进程根据业务需求处理完报文后,可以将对应的ring中用于指示存储报文的内存块的内存块首地址置为空闲状态,以便继续使用。

图10为本申请实施例提供的报文转发方法的一种示例示意图。本示例性实施例说明在容器中以物理内存置换方式给多个应用进程实现统一收包。对于某些cpu子卡芯片,其硬件已经可以支持虚拟化技术,通过将硬件网络虚拟成一个个的对象,就可以在容器中实现直接从网口mac(mediaaccesscontrol,介质访问控制)收包。对于这种场景,可以在容器中驻留一个收包线程来为各个应用进程收包。

如图10所示,本示例性实施例提供的报文转发方法包括如下过程:

步骤701、容器内的各应用进程p1至pm根据自身的收包需求,发送收包请求。其中,收包请求可以携带以下信息:请求创建的ring的数量及大小、接收报文的最大长度、接收报文的特征信息等。

步骤702、收包进程p0的job根据各个应用进程的收包请求,给各个应用进程创建收包通道。其中,收包通道的创建过程可以参照图5的说明,故于此不再赘述。

本示例中,如图10所示,应用进程p1对应ring组d1,应用进程pm对应ring组dm;其中,每个ring组中ring的数目可以相同(比如,a+1个,a为大于或等于0的整数)或不同。然而,本申请对此并不限定。

步骤703、基于创建后的收包通道,收包线程可以为对应的应用进程收包。关于本步骤的相关说明可以参照图4中的步骤101至步骤107,故于此不再赘述。

步骤704、各个应用进程可以各自轮询对应的ring组,取到报文。

步骤705、各个应用进程根据业务需求处理完报文后,可以将对应的ring中用于指示存储报文的内存块的内存块首地址置为空闲状态,以便继续使用。

在一示例性实施例中,在某些情况下,为了解决某些业务流的流量过大问题,可以在收包线程处添加针对每一种业务流的限速处理。

本示例性实施例提供的报文转发方法可以包括以下过程:

步骤801、各个应用进程根据自身的收包需求,发送收包请求;其中,收包请求可以携带以下信息:请求创建的ring的数量及大小、接收报文的最大长度、接收报文的特征信息、接收业务流在限速时长内的限速值(比如,每秒限速值)。

步骤802、收包进程的job根据各个应用进程的收包请求,给各个应用进程创建收包通道,并记录每一种业务流的限速值。其中,收包通道的创建过程可以参照图5的说明,故于此不再赘述。

步骤803、基于创建的收包通道,收包线程可以给对应的应用进程收包。

其中,收包线程每收到一个报文,更新该报文所属业务流的流统计计数,比如,将该报文所属业务流对应的流统计计数加一(流统计计数的初始值为0);如果在限速时长内该业务流的流统计计数大于该业务流的限速值,就做丢包处理。在每次达到限速时长后(比如,一秒之后),收包线程将该业务流的流统计计数置为0,从而完成业务流的限速处理流程。或者,收包线程每收到一个报文,将该报文所属业务流对应的流统计计数减一(流统计计数的初始值为限速值);如果在限速时长内该业务流的流统计计数等于0,就做丢包处理。在每次达到限速时长后(比如,一秒之后),收包线程将该业务流的流统计计数置为限速值,从而完成业务流的限速处理流程。

关于本步骤的收包过程说明可以参照图4中的步骤101至步骤107,故于此不再赘述。

步骤804、各个应用进程可以各自轮询对应的ring组,取到报文。

步骤805、各个应用进程根据业务需求处理完报文后,可以将对应的ring中相应的内存块首地址置为空闲状态,以便继续使用。

图11为本申请实施例提供的报文转发方法的一种示例示意图。本示例性实施例说明通过发包线程、内存块地址池、第一发包队列和第二发包队列采用内存地址置换方式实现报文零拷贝传递的发送流程。

在本示例性实施例中,在进行报文发送之前,先进行以下工作:

1)预留一段物理地址连续的内存片,在内存片a中可以切割出多个内存块(block),用于缓存报文;其中,内存片的大小大于或等于内存块(block)的总个数(比如,图11中的n,n为大于1的整数)乘以允许支持的报文最大长度(比如10kbyte);每个block都表示一段地址连续的物理内存,block首地址就表示这段地址连续的物理内存的首地址;

在其他实施例中,可以预留多个内存片,从这些内存片中切割出多个内存块,只要保证从中切割出的内存块内部的物理地址连续即可。

2)给硬件驱动(比如,网卡驱动)分配内存块地址池以及发包队列(即上述的第二发包队列);其中,内存块地址池用于存放内存块首地址,内存块地址池可以为fifo队列、链表、数组、或者环形队列,然而,本申请对此并不限定。第二发包队列可以为fifo结构或者环形队列结构,然而,本申请对此并不限定。

3)创建支持优先级调度的环形队列组(以下简称为ring组)(即上述的多个第一发包队列);本示例中,环组可以包括v个ring,v可以为大于或等于1的整数。

4)创建用来向硬件驱动发包的发包线程。

其中,内存地址置换过程发生在内存块地址池和用于发包的环组之间。

在本示例性实施例中,如图11所示,可以将k+1到n部分共n-k个block首地址注入到内存块地址池中。将block1到blocki,总共i个block首地址放在ring0中;将blockj到blockk,总共k-j+1个block首地址放在ringv中;ring组中其它ring内的block首地址的注入方式和ring0、ringv内block首地址的注入方式一样,初始时,ring组中注入的所有block首地址的使用状态均为空闲状态。其中,i,j,k均为大于1的整数。整个block首地址的注入过程中保证所有的ring、内存块地址池中注入的block首地址均不重复。其中,注入各个ring和内存块地址池中的block首地址的数目可以相同或不同,本申请对此并不限定。其中,ring组中所有block首地址个数加上内存块地址池中所有block首地址个数之和可以为n。

基于上述设置的内存块地址池、第二发包队列、发包线程以及环组,本示例性实施例的报文转发方法可以包括步骤901至步骤906。

步骤901、容器1中的应用进程p11从对应的环组中的环形队列(比如,环v)取出其中存放的标记为空闲状态的block首地址,将应用检测p11待发送的报文存放到该block首地址所指示的内存块,并将缓存该报文的block首地址、报文长度、报文基于该block首地址的偏移信息等信息放入该环形队列(即ringv)。

步骤902、发包线程轮询环v,并从环v读取缓存该报文的block首地址、报文长度、报文基于该block首地址的偏移信息等信息。

步骤903、发包线程从环v读取缓存该报文的block首地址、报文长度、报文基于该block首地址的偏移信息等信息后,将内存块地址池内的一个空闲状态的block首地址放入环v。

步骤904、发包线程将缓存该报文的block首地址、报文长度、报文基于该block首地址的偏移信息等信息放入第二发包队列。

步骤905、帧管理从第二发包队列读取缓存该报文的block首地址、报文长度、报文基于该block首地址的偏移信息等信息,并根据报文的上述信息从对应的block获取该报文。

步骤906、通过网卡对外发送该报文。

步骤907、帧管理发送完报文后,将存储该报文的block的block首地址放回内存块地址池,以便后续继续使用。

需要说明的是,上述发包过程仅为一种示例,本申请对此并不限定。不同类型的网卡的发包流程不同。比如,在步骤903之后,发包线程可以将缓存该报文的block首地址、报文长度、报文基于该block首地址的偏移信息、第二发包队列的队列标识(比如,queueid)以及报文发送后相应的内存块首地址需要释放到的内存块地址池的池标识(比如,poolid)等信息组成描述符,调用网卡驱动接口发送即可。报文发送完成后,网卡驱动会将缓存报文的物理地址对应的block首地址还回内存块地址池。

图12为本申请实施例提供的报文转发装置的示意图。如图12所示,本实施例提供的报文转发装置,包括:第一收包模块1201,适于从内存块地址池选取出其中存放的内存块信息,将输入输出硬件(比如,网卡)接收到的报文存放到该内存块信息指示的内存块,得到该报文的描述信息,并将该报文的描述信息放入第一收包队列;第二收包模块1202,适于通过收包线程从第一收包队列读取描述信息;将第二收包队列内存放的一个标记为空闲状态的内存块信息放入内存块地址池,并将从第一收包队列读取的描述信息放入第二收包队列;第三收包模块1203,适于通过与该第二收包队列对应的应用进程从第二收包队列读取描述信息,根据从第二收包队列读取的描述信息获取报文,并将第二收包队列中用于指示所获取的报文所在内存块的内存块信息标记为空闲状态;其中,内存块地址池中存放的内存块信息与第二收包队列中存放的内存块信息不重复。

在一示例性实施例中,第二收包模块1202,还可以适于当第二收包队列中没有标记为空闲状态的内存块信息,通过收包线程将将从第一收包队列读取的描述信息所对应的内存块信息放回内存块地址池。

在一示例性实施例中,第二收包模块1202还可以适于通过收包线程根据从第一收包队列读取的描述信息,读取在该描述信息指示的物理地址缓存的报文,通过解析读取到的报文,确定读取到的报文对应的第二收包队列。

在一示例性实施例中,第二收包模块1202可以包括收包线程和任务(job)(或者,通道管理线程)。

图13为本申请实施例提供的报文转发装置的一种示例示意图。在一示例性实施例中,如图13所示,本实施例提供的报文转发装置还可以包括:第二收包队列创建和管理模块1204,适于接收应用进程的收包请求;根据应用进程的收包请求,给应用进程创建对应的一个或多个第二收包队列;向应用进程返回该应用进程对应的第二收包队列的创建信息。

其中,第二收包队列创建和管理模块1204可以用于创建第二收包队列,并提供报文的读、写、释放(free)、置换等接口。如果应用进程在容器内,由于有命名空间(namespace)等差异,可以使用一段连续的物理内存来创建第二收包队列组。如果应用进程不在容器中,则既可以使用一段连续的物理内存,也可以使用linux共享内存等来创建第二收包队列组(比如,ring组)。另外,每一个ring组对应一个应用进程,从而通过增加ring组和内存即可以增加应用进程收包。

在一示例性实施例中,如图13所示,本实施例的报文转发装置还可以包括:内存块地址池创建模块1205,适于接收到应用进程的收包请求后,给应用进程创建对应的内存块地址池;或者,根据输入输出硬件(网卡)接收的报文类型,创建一个或多个内存块地址池。其中,内存块地址池可以根据业务需求创建多个。比如,可以规划某些block的大小为1kbyte用来存放短报文,并将这些block对应的内存块首地址放到一个内存块地址池中,而另外再规划一些block的大小为10kbyte用来存放长报文,并将这些block对应的内存块首地址放到另外一个内存块地址池中。

在一示例性实施例中,如图13所示,本实施例的报文转发装置还可以包括:第一收包队列创建和管理模块1206,适于接收到应用进程的收包请求后,给应用进程创建对应的第一收包队列;或者,根据输入输出硬件(网卡)的类型,创建一个或多个第一收包队列。

在一示例性实施例中,如图13所示,本实施例的报文转发装置还可以包括:物理内存分配管理模块1207,适于接收到应用进程的收包请求后,给应用进程分配至少一个物理地址连续的内存片,从内存片切割出多个内存块,将多个内存块对应的内存块信息分别注入内存块地址池和应用进程对应的第二收包队列,并标记存放到第二收包队列的内存块信息为空闲状态;或者,预留至少一个物理地址连续的内存片,接收到应用进程的收包请求后,从内存片切割出多个内存块,将多个内存块对应的内存块信息分别注入内存块地址池和应用进程对应的第二收包队列,并标记存放到第二收包队列的内存块信息为空闲状态。其中,内存块地址池中注入的内存块信息(比如,内存块首地址或标识)与第二收包队列中注入的内存块信息不重复。其中,物理内存分配管理模块1207可以用于分配一段物理地址连续的内存片给应用进程和驱动使用,当应用进程比较多时可以支持提供分段管理等。

另外,关于本实施例提供的报文转发装置的相关说明可以参照上述方法实施例的描述,故于此不再赘述。

图14为本申请实施例提供的一种网络设备的示意图。如图14所示,本实施例提供的网络设备1400(比如,路由器、交换机等)包括:输入输出硬件(比如,网卡)1403、处理器1402以及存储器1401;输入输出硬件1403适于接收或发送报文;存储器1401适于存储报文转发程序,该报文转发程序被处理器1402执行时实现上述报文转发方法的步骤,比如图3所示的步骤。本领域技术人员可以理解,图14中示出的结构,仅仅是与本申请方案相关的部分结构的示意图,并不构成对本申请方案所应用于其上的网络设备1400的限定,网络设备1400可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。

其中,存储器1401可用于存储应用软件的软件程序以及模块,如本实施例中的报文转发方法对应的程序指令或模块,处理器1402通过运行存储在存储器1401内的软件程序以及模块,从而执行各种功能应用以及数据处理,比如实现本实施例提供的报文转发方法。存储器1401可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。

另外,关于本实施例提供的网络设备的相关实施过程说明可以参照上述报文转发方法及装置的相关描述,故于此不再赘述。

此外,本申请实施例还提供一种计算机可读介质,存储有报文转发程序,该报文转发程序被执行时实现上述报文转发方法的步骤,比如图3所示的步骤。

本领域普通技术人员可以理解,上文中所公开方法中的全部或某些步骤、系统、装置中的功能模块/单元可以被实施为软件、固件、硬件及其适当的组合。在硬件实施方式中,在以上描述中提及的功能模块/单元之间的划分不一定对应于物理组件的划分;例如,一个物理组件可以具有多个功能,或者一个功能或步骤可以由若干物理组件合作执行。某些组件或所有组件可以被实施为由处理器,如数字信号处理器或微处理器执行的软件,或者被实施为硬件,或者被实施为集成电路,如专用集成电路。这样的软件可以分布在计算机可读介质上,计算机可读介质可以包括计算机存储介质(或非暂时性介质)和通信介质(或暂时性介质)。如本领域普通技术人员公知的,术语计算机存储介质包括在用于存储信息(诸如计算机可读指令、数据结构、程序模块或其他数据)的任何方法或技术中实施的易失性和非易失性、可移除和不可移除介质。计算机存储介质包括但不限于ram、rom、eeprom、闪存或其他存储器技术、cd-rom、数字多功能盘(dvd)或其他光盘存储、磁盒、磁带、磁盘存储或其他磁存储装置、或者可以用于存储期望的信息并且可以被计算机访问的任何其他的介质。此外,本领域普通技术人员公知的是,通信介质通常包含计算机可读指令、数据结构、程序模块或者诸如载波或其他传输机制之类的调制数据信号中的其他数据,并且可包括任何信息递送介质。

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