首页> 中国专利> 用于多核转发网络地址端口转换的端口分配方法和装置

用于多核转发网络地址端口转换的端口分配方法和装置

摘要

本发明提出一种用于多核转发NAPT的端口分配方法和装置,该用于多核转发NAPT的端口分配方法包括:接收到报文后,在CPU独立占用的独立资源池中查找是否存在未分配的端口号;如果存在,则在所述未分配的端口号中确定匹配的端口号,并将所述匹配的端口号分配给所述报文;如果不存在,则在多核共有的共有资源池中查找是否存在未分配的端口号;如果所述共有资源池中存在未分配的端口号,则在所述未分配的端口号中确定匹配的端口号,并将所述匹配的端口号分配给所述报文;如果所述共有资源池中不存在未分配的端口号,选择可用CPU,并将所述报文转发给所述可用CPU进行处理。该方法能够提升多核转发NAPT的性能。

著录项

  • 公开/公告号CN105450792A

    专利类型发明专利

  • 公开/公告日2016-03-30

    原文格式PDF

  • 申请/专利权人 东软集团股份有限公司;

    申请/专利号CN201510980638.0

  • 发明设计人 刘健男;

    申请日2015-12-23

  • 分类号H04L29/12(20060101);

  • 代理机构北京清亦华知识产权代理事务所(普通合伙);

  • 代理人张大威

  • 地址 110168 辽宁省沈阳市浑南新区新秀街2号

  • 入库时间 2023-12-18 15:16:23

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2018-09-14

    授权

    授权

  • 2016-04-27

    实质审查的生效 IPC(主分类):H04L29/12 申请日:20151223

    实质审查的生效

  • 2016-03-30

    公开

    公开

说明书

技术领域

本发明涉及网络通信技术领域,尤其涉及一种多核转发网络地址端口转换 (NetworkAddressPortTranslation,NAPT)的端口分配方法和装置。

背景技术

NAPT是将数据包的源互联网协议(InternetProtocol,IP)地址转换成 另一个指定的IP地址,同时对初始源端口进行端口地址转换(PortAddress Translation,PAT),主要作用于从防火墙内部网络访问外部网络的情况,隐 藏内部网络使用的IP地址,一定程度上保障私有网络安全。

对于网络安全厂商,NAPT的实现主要就是在网络地址转换(Network AddressTranslation,NAT)的IP资源池中选择一个合法IP地址,并选择一 个未用的端口号(1024-65535)。如何高性能的查找未用端口号,就是NAPT 的性能关键点。

随着科技的不断发展,现在的防火墙已普遍使用多核处理器。相关技术中, 在多核转发场景下都是使用加锁的方式和普通的查找算法来确定NAPT的端口 分配策略,但是,这种端口分配策略使得多核转发NAPT性能有待提升。

发明内容

本发明旨在至少在一定程度上解决相关技术中的技术问题之一。

为此,本发明的一个目的在于提出一种用于多核转发NAPT的端口分配方 法,该方法可以提升多核转发NAPT的性能。

本发明的另一个目的在于提出一种用于多核转发NAPT的端口分配装置。

为达到上述目的,本发明第一方面实施例提出的用于多核转发NAPT的端 口分配方法,包括:接收到报文后,在CPU独立占用的独立资源池中查找是否 存在未分配的端口号;如果所述独立资源池中存在未分配的端口号,则在所述 未分配的端口号中确定匹配的端口号,并将所述匹配的端口号分配给所述报 文;如果所述独立资源池中不存在未分配的端口号,则在多核共有的共有资源 池中查找是否存在未分配的端口号;如果所述共有资源池中存在未分配的端口 号,则在所述未分配的端口号中确定匹配的端口号,并将所述匹配的端口号分 配给所述报文;如果所述共有资源池中不存在未分配的端口号,选择可用CPU, 并将所述报文转发给所述可用CPU进行处理。

本发明第一方面实施例提出的用于多核转发NAPT的端口分配方法,通过 为每个CPU分配独立资源池,可以使得多核之间在NAPT资源分配时互不干扰, 性能达到每核线性增长;通过在独立资源池中的资源不足时再从共有资源池中 分配端口号,可以通过较低的复杂度实现端口资源的分配,保证连接可以被及 时分配到可用的资源,从而提升多核转发NAPT性能。

为达到上述目的,本发明第二方面实施例提出的用于多核转发NAPT的端 口分配装置,包括:第一查找模块,用于接收到报文后,在CPU独立占用的独 立资源池中查找是否存在未分配的端口号;第一分配模块,用于在所述独立资 源池中存在未分配的端口号时,在所述未分配的端口号中确定匹配的端口号, 并将所述匹配的端口号分配给所述报文;第二查找模块,用于在所述独立资源 池中不存在未分配的端口号时,在多核共有的共有资源池中查找是否存在未分 配的端口号;第二分配模块,用于在所述共有资源池中存在未分配的端口号时, 在所述未分配的端口号中确定匹配的端口号,并将所述匹配的端口号分配给所 述报文;转发模块,用于在所述共有资源池中不存在未分配的端口号时,选择 可用CPU,并将所述报文转发给所述可用CPU进行处理。

本发明第二方面实施例提出的用于多核转发NAPT的端口分配装置,通过 为每个CPU分配独立资源池,可以使得多核之间在NAPT资源分配时互不干扰, 性能达到每核线性增长;通过在独立资源池中的资源不足时再从共有资源池中 分配端口号,可以通过较低的复杂度实现端口资源的分配,保证连接可以被及 时分配到可用的资源,从而提升多核转发NAPT性能。

本发明附加的方面和优点将在下面的描述中部分给出,部分将从下面的描 述中变得明显,或通过本发明的实践了解到。

附图说明

本发明上述的和/或附加的方面和优点从下面结合附图对实施例的描述中 将变得明显和容易理解,其中:

图1是本发明一实施例提出的用于多核转发NAPT的端口分配方法的流 程示意图;

图2是本发明实施例中在未分配的端口号中确定匹配的端口号的流程示 意图;

图3是本发明实施例中判断是否在局部域中分配端口号的流程示意图;

图4是本发明另一实施例提出的用于多核转发NAPT的端口分配方法的 流程示意图;

图5是本发明另一方面实施例提出的用于多核转发NAPT的端口分配装置 的结构示意图;

图6是本发明另一方面实施例提出的用于多核转发NAPT的端口分配装置 的结构示意图。

具体实施方式

下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自 始至终相同或类似的标号表示相同或类似的模块或具有相同或类似功能的模 块。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能 理解为对本发明的限制。相反,本发明的实施例包括落入所附加权利要求书的 精神和内涵范围内的所有变化、修改和等同物。

图1是本发明一实施例提出的用于多核转发NAPT的端口分配方法的流 程示意图,该方法包括:

S11:接收到报文后,在CPU独立占用的独立资源池中查找是否存在未分 配的端口号。

例如,对应多核中的每个中央处理器(CentralProcessingUnit,CPU), 该CPU接收到报文后,可以先在自身对应的独立资源池中查找是否存在未分配 的端口号。

本实施例中,资源池可以包括:独立资源池和共有资源池。独立资源池的 个数与CPU的总数相同,分别与每个CPU对应。共有资源池是一个,是多个 CPU共有的资源池。

端口号的范围是0到65535,但是,由于相关规定中已将0到1023这个 范围分配给指定服务。故而对于NAPT而言,实际上可以用来分配的端口号是 1024到65535这一范围。

本实施例中,将1024到65535这一范围分为独立资源池和共有资源池, 且独立资源池中占用的端口号的个数相同。

假设参与转发的CPU个数为4个,分别为CPU0-CPU3,他们可以分配并使 用的端口号为1024-65536,共有64512个,假设共有资源池中端口号是15360 个,除此之外的端口号共49152个,四个CPU均被分配12288个,因此,每个 资源池内的端口号的情况分别是:

CPU0对应的独立资源池:1024-13111;

CPU1对应的独立资源池:13312-25599;

CPU2对应的独立资源池:25600-37887;

CPU3对应的独立资源池:37888-50175;

共有资源池:50176-65536。

因此,假设CPU0接收到报文后,可以先在CPU0对应的独立资源池(端口 号是13312-25599)中查找是否存在未分配的端口号。

S12:如果所述独立资源池中存在未分配的端口号,则在所述未分配的端 口号中确定匹配的端口号,并将所述匹配的端口号分配给所述报文。

例如,CPU0经过查找判断出在13312-25599这一范围内存在未分配的端 口号,则可以从中选择出一个未分配的端口号分配给报文。

一些实施例中,参见图2,在所述未分配的端口号中确定匹配的端口号, 包括:

S21:获取上次分配的端口号,确定与所述上次分配的端口号相邻的下一 个端口号。

例如,可以对每次分配的端口号进行记录,因此在记录信息中可以获取上 次分配的端口号。初始时可以从每个CPU对应的独立资源池的最小端口号开始 分配。

例如,CPU0获取上次分配的端口号是1024,则与上次分配的端口号相邻 的下一个端口号是1025。

S22:如果所述下一个端口号未被分配,则将所述下一个端口号确定为匹 配的端口号。

例如,可以对端口号的分配情况进行记录,从而可以确定端口号是否被分 配。

例如,端口号1025未被分配,则可以将端口号1025确定为匹配的端口号, 以将端口号1025分配给报文。

S23:如果所述下一个端口号已被分配,选择下一个局部域,判断是否在 所述局部域中分配端口号,如果判断出在所述局部域中分配端口号,则在所述 局部域中确定匹配的端口号。

例如,端口号1025已被分配,则可以选择下一个局部域,并在下一个局 部域中适合分配端口号时,在下一个局部域中分配端口号。

通过局部域分配方式是符合列维定理(Lindburg-Levy)的,列维定理是 独立同分布随机变量序列的中心极限定理,是大量的随机值积累分布函数会逐 点收敛到正态分布函数的极限值。换言之,局部密集分布,然后跳跃到一个点 来列维分配,而这个点也是细致分配。

本实施例中,可以预先将每个资源处划分为多个局部域。例如,由于 0-1024位未被使用,可以将0-1024设置为两个2级位图(bitmap),就是2 个512bitmap分别代表资源端口端是否被使用。也就是说,每个资源池可以被 分为512个局部域。

以独立资源池为例,由于每个独立资源池的端口号个数是12288个,则每 个局部域包括12288/512=24个连续的端口号。

每个局部域可以用两位(bit)的字段来表示该局部域的端口号的使用情 况。

该两位的字段可以称为位图,假设表示为【xy】,其中,x表示:如果连 续24个端口号都未被分配的话,这个位就被置为0,否则被置为1。换言之连 续24个端口全部未被使用时为0,只要有一个被使用就为1;

y表示:如果连续24个端口号都被分配的话,这个位就被置为1,否则被 置为0。换言之连续24个端口全部被使用时为1,只要有一个空余就为0。

因此,每个局部域的位图【xy】可以具有的值及含义如下:

位图(bitmap)是【00】:这24个bit值均未被赋值,所有端口资源处于 待分配状态。

bitmap是【11】:这24个bit值全部使用完毕,所有端口资源均处于待 释放状态。

bitmap是【10】:大多数的情况,表示还有端口资源可以分配,有端口资 源待释放。

相应的,参见图3,判断是否在所述局部域中分配端口号,包括:

S31:获取所述局部域对应的位图,所述位图表示的状态包括:所述局部 域内所有端口号处于待分配状态、所述局部域内所有端口号处于待释放状态、 所述局部域内部分端口号处于待分配状态且部分端口号处于待释放状态。

例如,CPU0可以随机选择一个局部域,并获取该局部域的位图。位图可 以分别表示:

所述局部域内所有端口号处于待分配状态,例如,位图的值是【00】;

所述局部域内所有端口号处于待释放状态,例如,位图的值是【11】;

所述局部域内部分端口号处于待分配状态且部分端口号处于待释放状态, 例如,位图的值是【10】。

S32:如果所述位图表示的状态是所述局部域内所有端口号处于待分配状 态,或者,所述局部域内部分端口号处于待分配状态且部分端口号处于待释放 状态,则判断出在所述局部域中分配端口号。

例如,该局部域的位图的值是【00】或【10】,则可以在局部域内分配端 口号。

在该局部域中分配端口号时,例如,按序将该局部域内上次分配的端口号 的下一个端口号确定为匹配的端口号。

S33:如果所述位图表示的状态是所述局部域内部分端口号处于待分配状 态且部分端口号处于待释放状态,则判断出不在所述局部域中分配端口号。

例如,局部域的位图的值是【11】,则可以重新选择局部域并重复执行 S31-S32。

S13:如果所述独立资源池中不存在未分配的端口号,则在多核共有的共 有资源池中查找是否存在未分配的端口号。

例如,CPU0经过查找判断出在13312-25599这一范围内不存在未分配的 端口号,则可以进一步在共有资源池(端口号是50176-65536)中查找是否存 在未分配的端口号。

S14:如果所述共有资源池中存在未分配的端口号,则在所述未分配的端 口号中确定匹配的端口号,并将所述匹配的端口号分配给所述报文。

例如,CPU0经过查找判断出在50176-65536这一范围内存在未分配的端 口号,则可以从中选择出一个未分配的端口号分配给报文。

在共有资源池中分配端口号的方式可以参照独立资源池中的分配方式,在 此不再赘述。

S15:如果所述共有资源池中不存在未分配的端口号,选择可用CPU,并 将所述报文转发给所述可用CPU进行处理。

例如,CPU0经过查找在CPU0对应的独立资源池以及共有资源池中都不存 在未分配的端口号,则可以选择可用CPU,例如,可用CPU是CPU1,则CPU0 可以将报文转发给CPU1,并由CPU1进行处理。

CPU1接收到报文后,可以执行上述的S11-S15。

一些实施例中,参见图4,该方法还可以包括:

S16:记录端口使用情况。

例如,每个CPU在独立资源池中分配端口号后,或者,在共有资源池中分 配端口号后,可以记录已分配的端口号(如1024等)。

相应的,选择可用CPU可以包括:

S151:如果所述共有资源池中不存在未分配的端口号,根据记录的端口使 用情况计算每个CPU的权重值。

例如,可以将CPU0-CPU3中的一个CPU作为配置核,假设CPU0是配置核, 则CPU0在进行上述处理之外还可以统计每个资源池的端口使用情况,并计算 每个CPU的权重值。

例如,CPU0会统计CPU1对应的独立资源池的已分配的端口号的总数,另 外,还可以统计共有资源池的已分配的端口号的总数,之后CPU0会根据这两 个总数以及预先配置的每个总数对应的系数,计算出CPU1对应的权重值。

S152:根据每个CPU的权重值,选择可用CPU。

例如,CPU0会计算出CPU0-CPU3的每个CPU对应的权重值,接收到报文 的CPU可以查看配置核计算出的每个CPU的权重值,从而根据权重值选择可用 CPU。假设权重值越大表示未分配的端口数越多,则可以将权重值最大的CPU 确定为可用CPU。

S153:将所述报文转发给所述可用CPU进行处理。

例如,接收到报文的CPU是CPU0,经过查看CPU1的权重值最大,则CPU0 可以将CPU1作为可用CPU,并将报文转发给CPU1。

在转发报文时,可以将所述报文放入所述可用CPU对应的核间队列中,以 便所述可用CPU从所述核间队列中获取所述报文。

例如,CPU0可以将报文放入CPU1对应的核间队列中,其中,每个CPU对 应一个核间队列,每个CPU可以采用轮询方式查询自身对应的核间队列中是否 存在报文,如果存在则从核间队列中读取报文。

另外,上述流程中,在独立资源池中处理时,采用无锁方式,在共有资源 池中处理时采用加锁方式。例如,在独立资源池中查找是否存在未分配的端口 号,确定匹配的端口号以及将匹配的端口号分配给报文,以及,报文的端口释 放等流程都采用无锁方式,而在共有资源池中查找是否存在未分配的端口号, 确定匹配的端口号以及将匹配的端口号分配给报文,以及,报文的端口释放等 流程都采用加锁方式。

本实施例中,通过为每个CPU分配独立资源池,可以使得多核之间在NAPT 资源分配时互不干扰,性能达到每核线性增长;通过在独立资源池中的资源不 足时再从共有资源池中分配端口号,可以通过较低的复杂度实现端口资源的分 配,保证连接可以被及时分配到可用的资源。进一步的,通过位图查找可以提 升查找性能,通过建立核间队列保证负载均衡。因此,上述流程处理可以提升 多核转发NAPT的性能。具体如下:

首先,可以实现多核NAPT端口分配性能线性增长。由于端口资源每个参 与转发的cpu都能公平的分到同等数量的端口数目,且这些端口之间互不冲 突。在大多数情况下,只要每核的固有端口数量是充足的,那么在NAPT分配 和释放这些固定分配的端口号时,就不会出现多核分配端口时出现竞争关系。

简单来讲,就是NAPT端口分配和释放时,大多数的情况下都是在不断的 在被分配的固有端口资源集中申请和释放,这些操作虽然是多核并发执行,却 因为每核资源独立性,无需加锁操作,使得多核的性能不受锁的影响,总体性 能随着cpu的个数线性增长。

此处要强调一下,为什么说大多数情况下都是在使用固有端口的资源。在 设计之初,就为每个参与转发的cpu分配了同等数量的端口;而在真实的网络 环境中,多cpu的防火墙在处理网络中的流量时,网卡采用多队列形式,可以 通过rss算法将流量分到多个cpu核处理。换言之,负载均衡时,使用的均 是每核的固定端口资源,因为无竞争和冲突,性能可以达到多核线性增长。

其次,使用位图bitmap法进行端口查找存储,节省内存空间。NAPT算法, 简单来讲就是端口分配。对于一个ip资源而言,它的待分配端口号是 1024-65536,在真实的网络环境中,ip资源池会有很多,需要分配的端口个 数应该就是ip资源数*可用端口数。

对于查找算法而言,有很多算法诸如数组法、链表法、哈希表法、红黑树 等等。然而对于查找可用端口号,如果使用如上算法,会占用大量内存空间, 造成存储空间的浪费。本发明使用的算法是bitmap法,又名位图法。即用一 个比特位是否为1来判断这个端口号处于待分配状态or正在使用状态,既节 省空间,又判断方便。

再次,快速的局部化资源查找方法。本发明端口分配的方法基于的首要原 则是初次查找连续,再次查找基于局部资源段方法。对于通用的查找算法而言, 只能是按序来判断每个bitmap是否被使用,以cpu0为例,最差的情况下,会 从1024到62464bit每位进行判断,如果从1位就开始被使用,则需要判断 12288次,时间复杂度为O(N)。

初次查找连续法也是最近使用连续法,就是按序来进行分配端口,这样正 常的流量转发过程,分配的端口号几乎都是按序的,以cpu0为例,按照时间 的顺序,就是每对于需要分配的natip资源池的一个ip地址,从1024,1025, 1026,一直到62464,在初始过程中,它们几乎都是按序增长的,也是随着时 间的发展,而对于资源的释放而言,大多数的情况下,也是最先分配的资源被 最先释放,如果按照这种大多数的情况,资源的释放也是按序的,最先分配的 1024先释放,然后1025,1026,一直向后排序到62464。这时查找的复杂度为 O(1)。

然而真实的网络环境没有绝对的公平,总有不均匀的时候,但是同一时间 段内建立的连接,确实是有很大的可能性同时断开连接,比如同一用户会在同 一时间段上网,它申请的连续局部资源可能正好是中间连续的5个资源段,而 他下线后,这连续的5个资源段也同时被释放了。假如在资源的分配和释放过 程中,出现了较为不连续的情况。主要强调的就是局部化概念,对于局部的段, 基于分配的时间和我们使用的方法,逻辑上资源的释放几乎都集中的。在初次 查找失败后,根据随机值和0-1024的bitmap【00】会选择下一个可用的连续 资源段,在找到这个可用资源段后,它的时间复杂度也几乎是O(1)。

再次,在负载不均衡时,即便有每核独立资源,仍然可以自适应调节napt 的端口资源的分配,保证端口的最大利用率。在自有资源和共有资源分配完毕 后,通过计算权重值算出被使用端口较少的cpu,将报文转发给这个cpu。由 于报文是转给了这个资源充足的cpu,当报文转移到这个cpu处理时,应该是 可以分配到独有资源的,独有资源的分配时无锁的,也可以保证有较高的性能。 通过这种报文在cpu之间的中转来实现端口分配的负载均衡,即能保证端口的 最大利用率。

举例而言,由于流量分布很不均匀,恰好cpuA的固有分配端口资源很快 就用完了,首先本发明中有共有资源供cpuA来分配,加入共有资源使用完毕, 还可以根据每核资源的使用情况计算权重值选择将报文发给资源充足的 cpuB,从而保证了端口分配的自适应,不会出现因为每核都被分配固有资源, 共有资源的不足而导致无法被分配到端口号的情况。

另外,上述流程可以具体包括如下内容:

第一,多级比特位标记的基于局部资源段的高效napt查找算法:

(1)Bitmap位法查找算法的空间复杂度最低,省内存空间。

(2)基于局部资源段方法,记录上次分配的napt的port号,以及自己所 在资源段的资源使用情况(是否完全空余,完全被使用完毕),根据列维模型 原则,来选择可用的资源段,极大的提升了查找的性能。

第二,自适应的多核端口资源分配方法:

(1)先使用独立资源分配,保证整体资源分配的高效性;在每个cpu使 用自有资源时,同时会记录每核端口资源的分配和释放情况,以便当负载不均 衡时,通过每核的端口使用情况计算权重值。

(2)设计共有资源池,以便每核负载微微不平衡时,即每核独立资源使 用完毕时,则通过加锁的访问来和其他cpu竞争分配这个共有资源池。这一步 可以通过较低的复杂度即实现端口资源的分配,保证连接可以被及时分配到可 用的资源;

(3)建立核间队列,通过权重值计算来实现自适应的资源分配:如果前 两者(第一步的独立资源和第二部的共有资源)都被分配完毕,也就是负载极度 不均衡时,根据第一步记录的每核资源使用率计算权重值来选择负载较少的 cpu,通过核间队列将报文转发到这个cpu来进行分配资源,来保证负载均衡。

特别强调下,本发明的负载均衡,并不是大多数设计者使用的端口号分配 负载均衡,即在一个cpuA可处理的端口号不足时,由资源充足的另一个cpu 就借给这个cpuB一些端口范围使用,当这些被借的端口被全部使用完毕(正 常释放后)后再还回去。这是因为借来的端口号只有被完全释放完毕后才能换 回去,而资源的申请虽可认为控制顺序,然而释放却是按照真实网络环境,不 可控制,很有可能这些被借来的资源端口号中一直有几个碎片无法释放,而导 致无法及时被还回去。这样就会导致如果cpuA因负载中端口号不足后从cpuB 中借来了资源,慢慢的cpuA负载变小,但是因为资源释放部规律一直无法将 借来的资源还给cpuB,而隔了一会cpuB负载加重,资源也不够了却因为cpuA 无法还回去,而导致cpuB无法分配资源,事实可能是cpuA借来的资源端口号 95%都被释放,仅中间分布的5%因为释放不及时,导致资源大幅浪费,减少浪 费的方法就是每次借出去的端口范围极少,以便于及时释放的概率变大,但是 这样回收资源和分片资源的实现复杂度会增加。如果使用如上方法来设计,那 么还会涉及控制这些借来端口资源的释放和回归,不仅算法将十分复杂,重要 的是因为借来资源的很有可能被释放不及时,无法满足自适应的资源分配,还 会造成大量浪费。

本发明的端口资源的自适应均衡分配设计方案是基于每核的端口资源使 用情况,计算权重值选择cpu,将cpu报文通过队列转移到这个充足的资源的 cpu中处理,则大大减少了实现的复杂度,巧妙的实现了端口分配的负载均衡; 同时这种设计方法,保证了端口号范围的最大使用率,不会因为未释放的端口 号碎片导致有局部资源段无法被利用,几乎没有任何浪费。

第三,高性能的napt多核分配方法设计:

在第二点中提到了,算法的第一步就是每核的独立资源分配,port分段, 固定分给每个cpu一段可用的port,也就是说在大多数的情况下,NAPT的分 配都是使用独立资源分配,这个独立主要强调的都是多核之间无资源竞争,无 锁冲突。在真实的网络环境中,大多数都是均衡的情况,也就是几乎只能走到 第二点的第一步就可以分配到资源,这一步中资源的分配时独立的,无需通过 锁来保证资源分配的安全性,也因为无锁操作,使得多核之间在NAPT资源分 配时互不干扰,性能达到了每核线性增长。

图5是本发明另一方面实施例提出的用于多核转发NAPT的端口分配装置 的结构示意图,该装置50包括:第一查找模块51、第一分配模块52、第二查 找模块53、第二分配模块54和转发模块55。

第一查找模块51,用于接收到报文后,在CPU独立占用的独立资源池中 查找是否存在未分配的端口号。

例如,对应多核中的每个中央处理器(CentralProcessingUnit,CPU), 该CPU接收到报文后,可以先在自身对应的独立资源池中查找是否存在未分配 的端口号。

本实施例中,资源池可以包括:独立资源池和共有资源池。独立资源池的 个数与CPU的总数相同,分别与每个CPU对应。共有资源池是一个,是多个 CPU共有的资源池。

每个独立资源池中包括的端口号的个数是相同的。

端口号的范围是0到65535,但是,由于相关规定中已将0到1023这个 范围分配给指定服务。故而对于NAPT而言,实际上可以用来分配的端口号是 1024到65535这一范围。

本实施例中,将1024到65535这一范围分为独立资源池和共有资源池, 且独立资源池中占用的端口号的个数相同。

假设参与转发的CPU个数为4个,分别为CPU0-CPU3,他们可以分配并使 用的端口号为1024-65536,共有64512个,假设共有资源池中端口号是15360 个,除此之外的端口号共49152个,四个CPU均被分配12288个,因此,每个 资源池内的端口号的情况分别是:

CPU0对应的独立资源池:1024-13111;

CPU1对应的独立资源池:13312-25599;

CPU2对应的独立资源池:25600-37887;

CPU3对应的独立资源池:37888-50175;

共有资源池:50176-65536。

因此,假设CPU0接收到报文后,可以先在CPU0对应的独立资源池(端口 号是13312-25599)中查找是否存在未分配的端口号。

第一分配模块52,用于在所述独立资源池中存在未分配的端口号时,在 所述未分配的端口号中确定匹配的端口号,并将所述匹配的端口号分配给所述 报文。

例如,CPU0经过查找判断出在13312-25599这一范围内存在未分配的端 口号,则可以从中选择出一个未分配的端口号分配给报文。

可选的,第一分配模块52用于在所述未分配的端口号中确定匹配的端口 号,包括:

获取上次分配的端口号,确定与所述上次分配的端口号相邻的下一个端口 号;

如果所述下一个端口号未被分配,则将所述下一个端口号确定为匹配的端 口号;

如果所述下一个端口号已被分配,选择下一个局部域,判断是否在所述局 部域中分配端口号,如果判断出在所述局部域中分配端口号,则在所述局部域 中确定匹配的端口号。

例如,可以对每次分配的端口号进行记录,因此在记录信息中可以获取上 次分配的端口号。初始时可以从每个CPU对应的独立资源池的最小端口号开始 分配。

例如,CPU0获取上次分配的端口号是1024,则与上次分配的端口号相邻 的下一个端口号是1025。

例如,可以对端口号的分配情况进行记录,从而可以确定端口号是否被分 配。

例如,端口号1025未被分配,则可以将端口号1025确定为匹配的端口号, 以将端口号1025分配给报文。

例如,端口号1025已被分配,则可以选择下一个局部域,并在下一个局 部域中适合分配端口号时,在下一个局部域中分配端口号。

可选的,第一分配模块52用于所述判断是否在所述局部域中分配端口号, 包括:

获取所述局部域对应的位图,所述位图表示的状态包括:所述局部域内所 有端口号处于待分配状态、所述局部域内所有端口号处于待释放状态、所述局 部域内部分端口号处于待分配状态且部分端口号处于待释放状态;

如果所述位图表示的状态是所述局部域内所有端口号处于待分配状态,或 者,所述局部域内部分端口号处于待分配状态且部分端口号处于待释放状态, 则判断出在所述局部域中分配端口号。

位图的表示以及根据位图判断方式可以参见方法实施例中的相关描述,在 此不再赘述。

第二查找模块53,用于在所述独立资源池中不存在未分配的端口号时, 在多核共有的共有资源池中查找是否存在未分配的端口号。

例如,CPU0经过查找判断出在13312-25599这一范围内不存在未分配的 端口号,则可以进一步在共有资源池(端口号是50176-65536)中查找是否存 在未分配的端口号。

第二分配模块54,用于在所述共有资源池中存在未分配的端口号时,在 所述未分配的端口号中确定匹配的端口号,并将所述匹配的端口号分配给所述 报文。

例如,CPU0经过查找判断出在50176-65536这一范围内存在未分配的端 口号,则可以从中选择出一个未分配的端口号分配给报文。

转发模块55,用于在所述共有资源池中不存在未分配的端口号时,选择 可用CPU,并将所述报文转发给所述可用CPU进行处理。

第二分配模块54用于在所述未分配的端口号中确定匹配的端口号,包括:

获取上次分配的端口号,确定与所述上次分配的端口号相邻的下一个端口 号;

如果所述下一个端口号未被分配,则将所述下一个端口号确定为匹配的端 口号;

如果所述下一个端口号已被分配,选择下一个局部域,判断是否在所述局 部域中分配端口号,如果判断出在所述局部域中分配端口号,则在所述局部域 中确定匹配的端口号。

在共有资源池中分配端口号的方式可以参照独立资源池中的分配方式,在 此不再赘述。

一些实施例中,参见图6,该装置50还包括:

记录模块56,用于记录端口使用情况。

例如,每个CPU在独立资源池中分配端口号后,或者,在共有资源池中分 配端口号后,可以记录已分配的端口号(如1024等)。

相应的,转发模块55用于选择可用CPU,包括:

根据记录的端口使用情况计算每个CPU的权重值;

根据每个CPU的权重值,确定可用CPU。

例如,可以将CPU0-CPU3中的一个CPU作为配置核,假设CPU0是配置核, 则CPU0在进行上述处理之外还可以统计每个资源池的端口使用情况,并计算 每个CPU的权重值。

例如,CPU0会统计CPU1对应的独立资源池的已分配的端口号的总数,另 外,还可以统计共有资源池的已分配的端口号的总数,之后CPU0会根据这两 个总数以及预先配置的每个总数对应的系数,计算出CPU1对应的权重值。

例如,CPU0会计算出CPU0-CPU3的每个CPU对应的权重值,接收到报文 的CPU可以查看配置核计算出的每个CPU的权重值,从而根据权重值选择可用 CPU。假设权重值越大表示未分配的端口数越多,则可以将权重值最大的CPU 确定为可用CPU。

转发模块用于将所述报文转发给所述可用CPU进行处理,包括:

将所述报文放入所述可用CPU对应的核间队列中,以便所述可用CPU从所 述核间队列中获取所述报文。

多核中每个CPU对应的独立资源池中包括的端口数是相同的。

例如,接收到报文的CPU是CPU0,经过查看CPU1的权重值最大,则CPU0 可以将CPU1作为可用CPU,并将报文转发给CPU1。

在转发报文时,可以将所述报文放入所述可用CPU对应的核间队列中,以 便所述可用CPU从所述核间队列中获取所述报文。

例如,CPU0可以将报文放入CPU1对应的核间队列中,其中,每个CPU对 应一个核间队列,每个CPU可以采用轮询方式查询自身对应的核间队列中是否 存在报文,如果存在则从核间队列中读取报文。

另外,第一查找模块和第一分配模块在处理时,采用无锁方式,第二查找 模块和第二分配模块在处理时采用加锁方式。

本实施例中,通过为每个CPU分配独立资源池,可以使得多核之间在NAPT 资源分配时互不干扰,性能达到每核线性增长;通过在独立资源池中的资源不 足时再从共有资源池中分配端口号,可以通过较低的复杂度实现端口资源的分 配,保证连接可以被及时分配到可用的资源,从而提升多核转发NAPT性能。 进一步的,通过位图查找可以提升查找性能,通过建立核间队列保证负载均衡。

需要说明的是,在本发明的描述中,术语“第一”、“第二”等仅用于描 述目的,而不能理解为指示或暗示相对重要性。此外,在本发明的描述中,除 非另有说明,“多个”的含义是指至少两个。

流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为,表 示包括一个或更多个用于实现特定逻辑功能或过程的步骤的可执行指令的代 码的模块、片段或部分,并且本发明的优选实施方式的范围包括另外的实现, 其中可以不按所示出或讨论的顺序,包括根据所涉及的功能按基本同时的方式 或按相反的顺序,来执行功能,这应被本发明的实施例所属技术领域的技术人 员所理解。

应当理解,本发明的各部分可以用硬件、软件、固件或它们的组合来实现。 在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执 行系统执行的软件或固件来实现。例如,如果用硬件来实现,和在另一实施方 式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有 用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合 逻辑门电路的专用集成电路,可编程门阵列(PGA),现场可编程门阵列(FPGA) 等。

本技术领域的普通技术人员可以理解实现上述实施例方法携带的全部或 部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种 计算机可读存储介质中,该程序在执行时,包括方法实施例的步骤之一或其组 合。

此外,在本发明各个实施例中的各功能单元可以集成在一个处理模块中, 也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块 中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的 形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品 销售或使用时,也可以存储在一个计算机可读取存储介质中。

上述提到的存储介质可以是只读存储器,磁盘或光盘等。

在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、 “具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体 特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说 明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且, 描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例 中以合适的方式结合。

尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例 是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在本发明的 范围内可以对上述实施例进行变化、修改、替换和变型。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号