端口分配的方法及装置转让专利

申请号 : CN201610829953.8

文献号 : CN106254577A

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 孙浩

申请人 : 东软集团股份有限公司

摘要 :

本发明公开了一种端口分配的方法及装置,涉及互联网技术领域,解决了现有公网IP地址对应的协议端口的分配机制存在实际需求的协议端口数和可供分配的协议端口数之间的不平衡的问题。本发明的方法包括:接收协议端口请求;根据协议端口请求查找是否存在已分配的portmap,portmap为用于表示协议端口的占用情况的数组,数组中的元素与协议端口一一对应;若存在已分配的portmap,则将已分配的portmap对应的未占用的协议端口分配给连接;若不存在已分配的portmap,则启用新的portmap进行分配;并且,将新的portmap对应的未占用的协议端口分配给连接。本发明应用于网络地址转换的过程中。

权利要求 :

1.一种端口分配的方法,其特征在于,所述方法包括:

接收协议端口请求,所述协议端口请求表示,当内网中的计算机向外网发起连接时,请求为所述连接分配协议端口;

根据所述协议端口请求查找是否存在已分配的portmap,所述portmap为用于表示协议端口的占用情况的数组,所述数组中的元素与协议端口一一对应;

若存在已分配的portmap,则将已分配的portmap对应的未占用的协议端口分配给所述连接;

若不存在已分配的portmap,则启用新的portmap进行分配;并且,将所述新的portmap对应的未占用的协议端口分配给所述连接。

2.根据权利要求1所述的方法,其特征在于,所述根据所述协议端口请求查找是否存在已分配的portmap,包括:根据所述协议端口请求查找对应的数据结构节点,所述数据结构节点用于分配portmap对应的协议端口,数据结构节点与portmap是多对一的对应关系;

根据所述数据结构节点查找符合预设条件的已分配的portmap。

3.根据权利要求2所述的方法,其特征在于,根据所述数据结构节点查找符合预设条件的已分配的portmap,包括:判断所述数据结构节点是否存在对应的portmap;

若存在对应的portmap,则查找已分配的portmap中与所述数据结构节点对应的portmap;

若不存在对应的portmap,则查找已分配的portmap中符合预设规则的portmap,所述预设规则为portmap已经对应的数据结构节点数少于portmap能够对应的数据结构节点数。

4.根据权利要求2所述的方法,其特征在于,所述方法进一步包括:当任一portmap对应的协议端口出现被全部占用的情况时,触发自适应更新机制,所述自适应更新机制用于更新所有已分配的portmap对应的数据结构节点的n值,所述n值表示包括与n值对应的数据结构节点在内的n个数据结构节点能够对应一个portmap;

统计包含触发自适应更新机制时刻在内的预设时段内所有已分配的portmap对应的数据结构节点的m值,所述m值为预设时段内通过数据结构节点分配出去的与数据结构节点对应的portmap对应的协议端口的数量。

5.根据权利要求4所述的方法,其特征在于,所述方法进一步包括:当到达预设更新时间时,启动自适应更新机制,根据所述m值对对应的数据结构节点的n值进行调整。

6.根据权利要求5所述的方法,其特征在于,所述方法进一步包括:在到达预设更新时间前,若多次触发自适应更新机制,则分别统计每次触发自适应更新机制时,所有已分配的portmap对应的数据结构节点的m值;

选出到达预设更新时间前,已分配的portmap对应的每个数据结构节点对应的多个m值中最大的m值;

根据最大的m值对已分配的portmap对应的数据结构节点的n值进行调整。

7.根据权利要求2所述的方法,其特征在于,所述根据协议端口请求查找对应的数据结构节点,包括:获取所述协议端口请求对应的通信信息组,所述通信信息组包括所述协议端口请求对应的公网网间协议IP地址、目的IP地址、目的IP地址对应的协议端口;

从预设哈希映射表中查找与所述通信信息组对应的位置标识,所述位置标识为数据结构节点在数据结构节点数组中的位置标识;

根据所述位置标识在所述数据结构节点数组中查找对应的数据结构节点。

8.一种端口分配的装置,其特征在于,所述装置包括:

接收单元,用于接收协议端口请求,所述协议端口请求表示,当内网中的计算机向外网发起连接时,为所述连接请求分配协议端口;

查找单元,用于根据所述协议端口请求查找是否存在已分配的portmap,所述portmap为用于表示协议端口的占用情况的数组,所述数组中的元素与协议端口一一对应;

第一分配单元,用于若存在已分配的portmap,则将已分配的portmap对应的未占用的协议端口分配给所述连接;

第二分配单元,用于若不存在已分配的portmap,则启用新的portmap进行分配;并且,将所述新的portmap对应的未占用的协议端口分配给所述连接。

9.根据权利要求8所述的装置,其特征在于,所述查找单元包括:第一查找模块,用于根据所述协议端口请求查找对应的数据结构节点,所述数据结构节点用于分配portmap对应的协议端口,数据结构节点与portmap是多对一的对应关系;

第二查找模块,用于根据所述数据结构节点查找符合预设条件的已分配的portmap。

10.根据权利要求9所述的装置,其特征在于,所述第二查找模块用于:判断所述数据结构节点是否存在对应的portmap;

若存在对应的portmap,则查找已分配的portmap中与所述数据结构节点对应的portmap;

若不存在对应的portmap,则查找已分配的portmap中符合预设规则的portmap,所述预设规则为portmap已经对应的数据结构节点数少于portmap能够对应的数据结构节点数。

说明书 :

端口分配的方法及装置

技术领域

[0001] 本发明涉及互联网技术领域,尤其涉及一种端口分配的方法及装置。

背景技术

[0002] 内网中的计算机在访问互联网时,需要通过网络地址转换技术将内网计算机对应的内网网间协议(Internet Protocol,IP)地址转换为互联网中的公网IP地址,然后使用公网IP地址访问互联网。网络端口地址转换(Network Address Port Translation,NAPT)是一种常用的网络地址转换技术。在实际的应用中,NAPT是在内网IP地址对应的计算机向互联网发起连接时,将内网IP地址转换为公网IP地址,并且为对应的连接分配一个公网IP地址对应的协议端口。每个公网IP地址可以使用的协议端口数量为65536个,由于协议端口数量是有限的,因此对于协议端口的抢占是不可避免的。为了保证在进行协议端口分配时不冲突,通常使用portmap来表示协议端口的占用情况。portmap是一个8K内存的char pm[8192]数组,由于每个字节由8个比特组成,8192个字节共占用65536个比特,因此可以用portmap来表示65536个协议端口的占用情况。通常比特置1则表示对应的协议端口被占用,比特置0则表示对应的协议端口未占用。
[0003] 对于一个计算机数量较多的内网,通常会分配多个公网IP地址,使内网中的计算机可以通过不同公网IP地址访问互联网。对于有多个公网IP地址的情况,现有的公网IP地址对应的协议端口的分配机制为:每个公网IP地址对应各自的portmap,相当于每个公网IP地址都只能分配各自对应的portmap对应的65536个协议端口,对于每个公网IP地址来讲,当对应的访问互联网的连接较少时,对应需要分配的协议端口较少,但是依然会提供一个portmap对应的65536个协议端口供分配,会造成其中大量的协议端口未使用,当对应的访问互联网的连接较多并且需要分配的协议端口超过65536个时,仍然只能提供一个portmap对应的65536个协议端口供分配,从而造成一些连接无法分配到协议端口。综上,可以看出现有的公网IP地址对应的协议端口的分配机制存在实际需求的协议端口数和可供分配的协议端口数之间的不平衡的问题。

发明内容

[0004] 鉴于上述问题,本发明提供一种端口分配的方法及装置,用以解决现有的公网IP地址对应的协议端口的分配机制存在实际需求的协议端口数和可供分配的协议端口数之间的不平衡的问题。
[0005] 一方面,本发明提供了一种端口分配的方法,包括:
[0006] 接收协议端口请求,所述协议端口请求表示,当内网中的计算机向外网发起连接时,请求为所述连接分配协议端口;
[0007] 根据所述协议端口请求查找是否存在已分配的portmap,所述portmap为用于表示协议端口的占用情况的数组,所述数组中的元素与协议端口一一对应;
[0008] 若存在已分配的portmap,则将已分配的portmap对应的未占用的协议端口分配给所述连接;
[0009] 若不存在已分配的portmap,则启用新的portmap进行分配;并且,[0010] 将所述新的portmap对应的未占用的协议端口分配给所述连接。
[0011] 具体的,所述根据所述协议端口请求查找是否存在已分配的portmap,包括:
[0012] 根据所述协议端口请求查找对应的数据结构节点,所述数据结构节点用于分配portmap对应的协议端口,数据结构节点与portmap是多对一的对应关系;
[0013] 根据所述数据结构节点查找符合预设条件的已分配的portmap。
[0014] 具体的,根据所述数据结构节点查找符合预设条件的已分配的portmap,包括:
[0015] 判断所述数据结构节点是否存在对应的portmap;
[0016] 若存在对应的portmap,则查找已分配的portmap中与所述数据结构节点对应的portmap;
[0017] 若不存在对应的portmap,则查找已分配的portmap中符合预设规则的portmap,所述预设规则为portmap已经对应的数据结构节点数少于portmap能够对应的数据结构节点数。
[0018] 具体的,所述方法进一步包括:
[0019] 当任一portmap对应的协议端口出现被全部占用的情况时,触发自适应更新机制,所述自适应更新机制用于更新所有已分配的portmap对应的数据结构节点的n值,所述n值表示包括与n值对应的数据结构节点在内的n个数据结构节点能够对应一个portmap;
[0020] 统计包含触发自适应更新机制时刻在内的预设时段内所有已分配的portmap对应的数据结构节点的m值,所述m值为预设时段内通过数据结构节点分配出去的与数据结构节点对应的portmap对应的协议端口的数量。
[0021] 具体的,所述方法进一步包括:
[0022] 当到达预设更新时间时,启动自适应更新机制,根据所述m值对对应的数据结构节点的n值进行调整。
[0023] 具体的,所述方法进一步包括:
[0024] 在到达预设更新时间前,若多次触发自适应更新机制,则分别统计每次触发自适应更新机制时,所有已分配的portmap对应的数据结构节点的m值;
[0025] 选出到达预设更新时间前,已分配的portmap对应的每个数据结构节点对应的多个m值中最大的m值;
[0026] 根据最大的m值对已分配的portmap对应的数据结构节点的n值进行调整。
[0027] 具体的,所述根据协议端口请求查找对应的数据结构节点,包括:
[0028] 获取所述协议端口请求对应的通信信息组,所述通信信息组包括所述协议端口请求对应的公网网间协议IP地址、目的IP地址、目的IP地址对应的协议端口;
[0029] 从预设哈希映射表中查找与所述通信信息组对应的位置标识,所述位置标识为数据结构节点在数据结构节点数组中的位置标识;
[0030] 根据所述位置标识在所述数据结构节点数组中查找对应的数据结构节点。
[0031] 另一方面,本发明提供了一种端口分配的装置,包括:
[0032] 接收单元,用于接收协议端口请求,所述协议端口请求表示,当内网中的计算机向外网发起连接时,为所述连接请求分配协议端口;
[0033] 查找单元,用于根据所述协议端口请求查找是否存在已分配的portmap,所述portmap为用于表示协议端口的占用情况的数组,所述数组中的元素与协议端口一一对应;
[0034] 第一分配单元,用于若存在已分配的portmap,则将已分配的portmap对应的未占用的协议端口分配给所述连接;
[0035] 第二分配单元,用于若不存在已分配的portmap,则启用新的portmap进行分配;并且,
[0036] 将所述新的portmap对应的未占用的协议端口分配给所述连接。
[0037] 具体的,所述查找单元包括:
[0038] 第一查找模块,用于根据所述协议端口请求查找对应的数据结构节点,所述数据结构节点用于分配portmap对应的协议端口,数据结构节点与portmap是多对一的对应关系;
[0039] 第二查找模块,用于根据所述数据结构节点查找符合预设条件的已分配的portmap。
[0040] 具体的,所述第二查找模块用于:
[0041] 判断所述数据结构节点是否存在对应的portmap;
[0042] 若存在对应的portmap,则查找已分配的portmap中与所述数据结构节点对应的portmap;
[0043] 若不存在对应的portmap,则查找已分配的portmap中符合预设规则的portmap,所述预设规则为portmap已经对应的数据结构节点数少于portmap能够对应的数据结构节点数。
[0044] 具体的,所述装置进一步包括:
[0045] 触发单元,用于当任一portmap对应的协议端口出现被全部占用的情况时,触发自适应更新机制,所述自适应更新机制用于更新所有已分配的portmap对应的数据结构节点的n值,所述n值表示包括与n值对应的数据结构节点在内的n个数据结构节点能够对应一个portmap;
[0046] 统计单元,用于统计包含触发自适应更新机制时刻在内的预设时段内所有已分配的portmap对应的数据结构节点的m值,所述m值为预设时段内通过数据结构节点分配出去的与数据结构节点对应的portmap对应的协议端口的数量。
[0047] 具体的,所述装置进一步包括:
[0048] 启动单元,用于当到达预设更新时间时,启动自适应更新机制,根据所述m值对对应的数据结构节点的n值进行调整。
[0049] 具体的,所述装置进一步包括:
[0050] 所述统计单元,还用于在到达预设更新时间前,若多次触发自适应更新机制,则分别统计每次触发自适应更新机制时,所有已分配的portmap对应的数据结构节点的m值;
[0051] 选择单元,用于选出到达预设更新时间前,已分配的portmap对应的每个数据结构节点对应的多个m值中最大的m值;
[0052] 调整单元,用于根据最大的m值对已分配的portmap对应的数据结构节点的n值进行调整。
[0053] 具体的,所述第一查找模块,用于:
[0054] 获取所述协议端口请求对应的通信信息组,所述通信信息组包括所述协议端口请求对应的公网网间协议IP地址、目的IP地址、目的IP地址对应的协议端口;
[0055] 从预设哈希映射表中查找与所述通信信息组对应的位置标识,所述位置标识为数据结构节点在数据结构节点数组中的位置标识;
[0056] 根据所述位置标识在所述数据结构节点数组中查找对应的数据结构节点。
[0057] 本发明提供的端口分配的方法及装置,能够在内网中的计算机向外网发起连接,并请求为对应的连接分配协议端口时,首先查找是否存在已分配的portmap,若存在已分配的portmap,则将已分配的portmap对应的未占用的协议端口分配给连接;若不存在已分配的portmap,则重新启用一个新的portmap,并将新的portmap对应的未占用的协议端口分配给连接。与现有技术相比,不存在一个portmap与某一个公网IP地址对应的情况,并且在分配协议端口时,先查找已分配的portmap,而不是查找与连接对应的公网IP地址对应的特定的portmap,实现了portmap的共享,因此在连接较少时,portmap对应的未占用的协议端口可以被别的公网IP地址对应的连接共享,在连接较多时,一个portmap对应的协议端口不够用时,因为portmap可以共享,因此可以使用其他的portmap中的空闲的协议端口或者启用新的portmap对应的协议端口,因此可以根据实际需要的协议端口数来适应性地提供协议端口,避免了现有技术中协议端口需求数量与可提供的协议端口数量不平衡的现象。
[0058] 上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。

附图说明

[0059] 通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
[0060] 图1示出了本发明实施例提供的一种端口分配的方法流程图;
[0061] 图2示出了本发明实施例提供的另一种端口分配的方法流程图;
[0062] 图3示出了本发明实施例提供的一种端口分配的装置的组成框图;
[0063] 图4示出了本发明实施例提供的另一种端口分配的装置的组成框图。

具体实施方式

[0064] 下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
[0065] 为解决现有公网IP地址对应的协议端口的分配机制存在实际需求的协议端口数和可供分配的协议端口数之间的不平衡的问题,本发明实施例提供了一种端口分配的方法,如图1所示,该方法包括:
[0066] 首先需要说明的是,本实施例针对的是一个内网对应多个公网IP的情况,即内网中的计算机可以通过不同公网IP地址访问外网的情况。其中内网指的是局域网,外网指的是互联网。在内网中的计算机通过公网IP地址访问外网时,通常需要通过网络设备对内网计算机进行网络地址转换,其中网络设备是指具有网络地址转换技术的路由器、交换机等设备。一种较常用的网络地址转换技术为NAPT,本实施例是针对NAPT中具体的协议端口分配的方式作的优化。
[0067] 101、接收协议端口请求。
[0068] 当内网中的计算机访问外网时,需要向外网发起连接,在连接发送到外网之前首先会通过NAPT将该连接对应的内网计算机的内网IP地址转换为公网IP地址(外网中可以使用的IP地址),并为对应的连接分配一个协议端口,该协议端口与转换后的公网IP地址作为上述连接对应的源协议端口和源IP地址,然后使内网计算机可以通过源协议端口和源IP地址去访问外网中的目的IP地址和对应的目的协议端口。
[0069] 对应上述说明,本实施例中“协议端口请求”请求的是内网计算机访问外网中的目的IP地址和对应的目的协议端口时使用的源协议端口。
[0070] 102、根据协议端口请求查找是否存在已分配的portmap。
[0071] 其中,portmap是用于表示协议端口是否占用情况的数组。portmap是一个8K内存的char pm[8192]数组,由于每个字节由8个比特组成,8192个字节共占用65536个比特,因此可以用portmap来表示65536个协议端口的占用情况,数组中的元素(比特)与协议端口一一对应。通常比特置1则表示对应的协议端口被占用,比特置0则表示对应的协议端口未占用。
[0072] 103、若存在已分配的portmap,则将已分配的portmap对应的未占用的协议端口分配给连接。
[0073] 其中已分配的portmap表示,portmap对应的协议端口中至少有一个被分配出去过。根据步骤102的描述,其中,“将已分配的portmap对应的未占用的协议端口分配给所述连接”,可以为“将已分配的portmap中置0比特对应的协议端口分配给步骤101中的涉及的向外网发起的连接”。
[0074] 需要说明的是已分配的portmap的相关的记录信息可以记录在任何可以记录或者保存信息的数据结构中,具体使用什么数据结构进行记录和保存可以由程序设计人员自由设定,因此可以通过相关记录来查找和确定已分配的portmap。
[0075] 104、若不存已分配的portmap,则启用新的portmap进行分配。
[0076] 重新分配一个新的portmap,将新的portmap对应的未占用的协议端口分配给连接,即将新的portmap对应的比特置0对应的协议端口分配给步骤101中的涉及的向外网发起的连接。
[0077] 本发明实施例提供的端口分配的方法,能够在内网中的计算机向外网发起连接,并请求为对应的连接分配协议端口时,首先查找是否存在已分配的portmap,若存在已分配的portmap,则将已分配的portmap对应的未占用的协议端口分配给连接;若不存在已分配的portmap,则重新启用一个新的portmap,并将新的portmap对应的未占用的协议端口分配给连接。与现有技术相比,不存在一个portmap与某一个公网IP地址对应的情况,并且在分配协议端口时,先查找已分配的portmap,而不是查找与连接对应的公网IP地址对应的特定的portmap,实现了portmap的共享,因此在连接较少时,portmap对应的未占用的协议端口可以被别的公网IP地址对应的连接共享,在连接较多时,一个portmap对应的协议端口不够用时,因为portmap可以共享,因此可以使用其他的portmap中的空闲的协议端口或者启用新的portmap对应的协议端口,因此可以根据实际需要的协议端口数来适应性地提供协议端口,避免了现有技术中协议端口需求数量与可提供的协议端口数量不平衡的现象。
[0078] 进一步的,作为对图1所示方法的细化及扩展,本发明另一实施例还给出了一种端口分配的方法。如图2所示,该方法包括:
[0079] 201、接收协议端口请求。
[0080] 本步骤的实现方式与图1步骤101的实现方式相同,此处不再赘述。
[0081] 202、根据协议端口请求查找对应的数据结构节点。
[0082] 具体的根据协议端口请求查找对应的数据结构节点的过程包括以下步骤:
[0083] 第一,获取协议端口请求对应的通信信息组;
[0084] 其中通信信息组包括该协议端口请求对应的公网IP地址、目的IP地址、目的IP地址对应的协议端口。公网IP地址是由协议端口请求对应的内网计算机的内网IP地址经过网络地址转换后得到的,目的IP地址为协议端口请求对应的连接的目的IP地址。通常公网IP地址记作sip、目的IP地址记作dip、目的IP地址对应的协议端口记作dport。
[0085] 第二,从预设哈希映射表中查找与通信信息组对应的位置标识。
[0086] 其中预设哈希映射表是关于通信信息组与位置标识之间的映射关系,其中位置标识为数据结构节点在数据结构节点数组中的位置标识,其中数据结构节点用于分配协议端口,数据结构节点分配协议端口的实现是通过数据结构节点对应的p指针指向portmap来实现的。
[0087] 另外关于预设哈希映射表的设计进行说明:预设哈希映射表是通过哈希映射得到的,具体在实现哈希映射时,是使用网络数据的标准散列函数进行映射的,具体的标准散列函数的构造方法可以是除留余数法、平方取中法、折叠法等。实际的应用中标准散列函数的选择可以根据实际需求自由选定。其中对应的哈希映射可以表示为f(sip,dip,dport)=Id,其中f表示标准散列函数,(sip,dip,dport)为预设哈希映射表对应的键值,Id为位置标识。
[0088] 需要说明的是,数据结构节点对应的数据结构的设计为:设计port_st数据结构,则数据结构节点可以表示为port_st节点,在port_st上对应设置p指针、m、n三个字段,其中p指针指向portmap,m表示当前port_st节点的p指针指向的portmap中通过该port_st节点分配出的比特对应的协议端口的数量,n表示由包含当前port_st节点在内的n个port_st节点共享当前port_st节点指向的portmap,在初始化时,n是预先设定的,并且在初始化时每个port_st节点设置的n值是相等的。其中当前port_st节点表示根据当前的协议端口请求对应的通信信息组对应的port_st节点。
[0089] 第三,根据位置标识在数据结构节点数组中查找对应的数据结构节点。
[0090] 203、根据数据结构节点查找符合预设条件的已分配的portmap。
[0091] 在查找符合预设条件的的已分配的portmap之前,首先判断数据结构节点是否存在对应的portmap,根据是否存在对应的portmap的情况,将根据数据结构节点查找符合预设条件的已分配的portmap分为两种情况:
[0092] 第一种情况,若数据结构节点存在对应的portmap,则查找已分配的portmap中与数据结构节点对应的portmap。给出对应第一种情况的示例进行说明:因为不同的连接或者不同时刻的相同连接可能对应相同的通信信息组,而相同的通信信息组对应的数据结构节点是相同的,而一个数据结构节点只能对应一个portmap,因此当数据结构节点在第一次确定对应的portmap之后,之后的所有相同通信信息组对应的portmap也是唯一固定的。因此当连接对应的通信信息组对应的数据结构节点已经有对应的portmap时,该对应的portmap即符合预设条件的已分配的portmap。
[0093] 第二种情况,若不存在对应的portmap,则查找已分配的portmap中符合预设规则的portmap,预设规则为portmap已经对应的数据结构节点数少于portmap能够对应的数据结构节点数。给出对应第二种情况的示例进行说明:在初始阶段,一个连接对应的数据结构节点还未指向任何portmap,即没有对应的portmap,这时需要在已分配的portmap中查找符合预设规则的portmap。其中关于预设规则进行具体说明:若一个portmap设定能够由50个数据结构节点对应,即可以有50个数据结构节点共享portmap对应的协议端口,而该portmap已经被少于50的数据节点对应,则该portmap即为符合预设规则的portmap。
[0094] 另外,在实际的应用中,为了达到更优的协议端口分配效果,还可以将预设规则设置为:数据结构节点的n值与portmap能够对应的数据结构节点数相等,且portmap已经对应的数据结构节点数少于portmap能够对应的数据结构节点数。
[0095] 进一步的,在实际的应用中,还需要设计portmap节点与port_st节点进行配合使用,portmap节点与portmap一一对应,port_st节点与portmap节点是多对一的对应关系:具体的portmap节点包含portmap,并且设置pp指针、Pm、Pn三个字段,其中pp指针指向可以指向portmap节点中包含的portmap的port_st节点,Pm表示portmap节点中包含的portmap已经被Pm个port_st节点对应,Pn表示portmap节点中包含的portmap最多能够被Pn个port_st节点对应。
[0096] 进一步的,针对上述描述,当找到符合预设规则的已分配的portmap之后,将数据结构节点的指针p指向对应的符合预设规则的已分配的portmap,并将符合预设规则的已分配的portmap节点的Pm值加1。
[0097] 204、若存在符合预设条件的已分配的portmap,则将符合预设条件的已分配的portmap对应的未占用的协议端口分配给连接。
[0098] 其中,在将符合预设条件的已分配的portmap对应的未占用的协议端口分配给连接之前,还包括:判断符合预设条件的已分配的portmap中是否存在未占用的协议端口,即判断符合预设条件的已分配的portmap对应的portmap中是否存在置0比特。然后根据判断的结果分配协议端口,具体的:若存在未占用的协议端口,即存在置0比特,则将符合预设条件的已分配的portmap中置0比特对应的协议端口分配给连接;若不存在未占用的协议端口,即不存在置0比特,则分配失败。
[0099] 205、若不存在符合预设条件的已分配的portmap,则启用新的portmap进行分配。
[0100] 启用新的portmap对应的协议端口进行分配,并且将新的portmap中置0比特对应的协议端口分配给连接。
[0101] 另外,对于新的portmap,需要将其对应的Pn值设置为与连接对应的数据结构节点的n值相等,并将其Pm值加1,还需要将新的portmap对应的portmap节点的pp指针指向连接对应的数据结构节点。
[0102] 进一步的,在上述图1以及图2涉及的协议端口分配的过程中,若任一portmap出现其中所有的比特置1的情况,即portmap对应的协议端口全部被占用的情况,则触发自适应更新机制。触发自适应更新机制不是启动自适应更新机制,启动自适应更新机制需要到达预设更新时间时启动,通常预设更新时间设为业务不繁忙的时间,如午夜等。
[0103] 进一步的,触发自适应更新机制后,需要统计包含触发自适应更新机制时刻在内的预设时段内所有已分配的portmap对应的所有port_st节点对应的m值,每个port_st节点对应一个m值。若在到达预设更新时间前,多次触发自适应更新机制,则分别统计每次触发自适应更新机制时,所有已分配的portmap对应的port_st节点对应的m值,每个port_st节点对应多个m值,这时对于每个port_st节点需要选出多个m值中最大的m值。
[0104] 然后根据预设时段内统计的m值或者最大的m值对对应的port_st节点的n值进行调整。下面以在到达预设更新时间前只触发一次自适应更新机制的情况为例对调整n值的过程进行说明:其中以某一个portmap为例进行说明。首先,将在预设时段内统计的portmap对应的所有port_st的m值相加;若相加的总和超过一个portmap对应的总的协议端口数(65536),则将按照从大到小的顺序选出前u个m值,其中选出的前u个m值需满足相加后的总和刚好超过65536的一半;将选出的前u个m值对应的port_st节点对应的n值进行调整,具体的调整公式为“n=portmap对应的总的协议端口数/m”,在本实施例中调整公式为“n=65536/m”。需要说明的是,除前u个m值对应的port_st节点之外,其它m值对应的port_st对应的n值保持不变。另外对于前u个m值需要满足的条件也可以设置为:前u个m值相加后的总和刚好超过总的协议端口数(65536)的1/3或者2/3等。在实际应用中,前u个m值需要满足的条件可以根据具体的应用需求进行设定。
[0105] 需要说明的是,对于在到达预设更新时间前多次触发自适应更新机制的情况,上述调整n值的过程中,只需将预设时段内统计的m值替换为预设时段内统计的最大的m值。
[0106] 进一步的,当对已分配的portmap对应的port_st节点的n值进行调整后,将所有已分配的portmap释放,并重新启动NAPT。
[0107] 进一步的,由于根据请求协议端口的需求来适应性地提供不同数量的portmap,每个portmap都会占用8k的内存,因此相对于现有技术中始终提供与公网IP地址数量相等的固定数量的portmap的方式节省了资源的占用。
[0108] 进一步的,在发生portmap对应的协议端口被全部占用的情况时,进行记录,并在到达预设更新时间时,对portmap能够共享的数据结构节点的数量进行自适应调整,进一步的提高了协议端口分配的平衡性。
[0109] 进一步的,作为对上述各实施例的实现,本发明实施例的另一实施例还提供了一种端口分配的装置,用于实现上述图1和图2所述的方法。如图3所示,该装置包括:接收单元31、查找单元32、第一分配单元33以及第二分配单元34。
[0110] 首先需要说明的是,本实施例针对的是一个内网对应多个公网IP的情况,即内网中的计算机可以通过不同公网IP地址访问外网的情况。其中内网指的是局域网,外网指的是互联网。在内网中的计算机通过公网IP地址访问外网时,通常需要通过网络设备对内网计算机进行网络地址转换,其中网络设备是指具有网络地址转换技术的路由器、交换机等设备。一种较常用的网络地址转换技术为NAPT,本实施例是针对NAPT中具体的协议端口分配的方式作的优化。
[0111] 接收单元31,用于接收协议端口请求,协议端口请求表示,当内网中的计算机向外网发起连接时,为连接请求分配协议端口。
[0112] 当内网中的计算机访问外网时,需要向外网发起连接,在连接发送到外网之前首先会通过NAPT将该连接对应的内网计算机的内网IP地址转换为公网IP地址(外网中可以使用的IP地址),并为对应的连接分配一个协议端口,该协议端口与转换后的公网IP地址作为上述连接对应的源协议端口和源IP地址,然后使内网计算机可以通过源协议端口和源IP地址去访问外网中的目的IP地址和对应的目的协议端口。
[0113] 对应上述说明,本实施例中“协议端口请求”请求的是内网计算机访问外网中的目的IP地址和对应的目的协议端口时使用的源协议端口。
[0114] 查找单元32,用于根据协议端口请求查找是否存在已分配的portmap,portmap为用于表示协议端口的占用情况的数组,数组中的元素与协议端口一一对应。
[0115] 其中,portmap是用于表示协议端口是否占用情况的数组。portmap是一个8K内存的char pm[8192]数组,由于每个字节由8个比特组成,8192个字节共占用65536个比特,因此可以用portmap来表示65536个协议端口的占用情况,数组中的元素(比特)与协议端口一一对应。通常比特置1则表示对应的协议端口被占用,比特置0则表示对应的协议端口未占用。
[0116] 第一分配单元33,用于若存在已分配的portmap,则将已分配的portmap对应的未占用的协议端口分配给连接。
[0117] 需要说明的是已分配的portmap的相关的记录信息可以记录在任何可以记录或者保存信息的数据结构中,具体使用什么数据结构进行记录和保存可以由程序设计人员自由设定,因此可以通过相关记录来查找和确定已分配的portmap。
[0118] 第二分配单元34,用于若不存在已分配的portmap,则启用新的portmap进行分配;并且,
[0119] 将新的portmap对应的未占用的协议端口分配给连接。
[0120] 重新分配一个新的portmap,将新的portmap对应的未占用的协议端口分配给连接,即将新的portmap对应的比特置0对应的协议端口分配给接收单元31涉及的向外网发起的连接。
[0121] 进一步的,如图4所示,查找单元32包括:
[0122] 第一查找模块321,用于根据协议端口请求查找对应的数据结构节点,数据结构节点用于分配portmap对应的协议端口,数据结构节点与portmap是多对一的对应关系。
[0123] 需要说明的是,数据结构节点对应的数据结构的设计为:设计port_st数据结构,则数据结构节点可以表示为port_st节点,在port_st上对应设置p指针、m、n三个字段,其中p指针指向portmap,m表示当前port_st节点的p指针指向的portmap中通过该port_st节点分配出的比特对应的协议端口的数量,n表示由包含当前port_st节点在内的n个port_st节点共享当前port_st节点指向的portmap,在初始化时,n是预先设定的,并且在初始化时每个port_st节点设置的n值是相等的。其中当前port_st节点表示根据当前的协议端口请求对应的通信信息组对应的port_st节点。
[0124] 第二查找模块322,用于根据数据结构节点查找符合预设条件的已分配的portmap。
[0125] 进一步的,第二查找模块322用于:
[0126] 判断数据结构节点是否存在对应的portmap;
[0127] 若存在对应的portmap,则查找已分配的portmap中与数据结构节点对应的portmap;
[0128] 若不存在对应的portmap,则查找已分配的portmap中符合预设规则的portmap,预设规则为portmap已经对应的数据结构节点数少于portmap能够对应的数据结构节点数。
[0129] 在查找符合预设条件的的已分配的portmap之前,首先判断数据结构节点是否存在对应的portmap,根据是否存在对应的portmap的情况,将根据数据结构节点查找符合预设条件的已分配的portmap分为两种情况:
[0130] 第一种情况,若数据结构节点存在对应的portmap,则查找已分配的portmap中与数据结构节点对应的portmap。第二种情况,若不存在对应的portmap,则查找已分配的portmap中符合预设规则的portmap,预设规则为portmap已经对应的数据结构节点数少于portmap能够对应的数据结构节点数。
[0131] 另外,在实际的应用中,为了达到更优的协议端口分配效果,还可以将预设规则设置为:数据结构节点的n值与portmap能够对应的数据结构节点数相等,且portmap已经对应的数据结构节点数少于portmap能够对应的数据结构节点数。
[0132] 进一步的,在实际的应用中,还需要设计portmap节点与port_st节点进行配合使用,portmap节点与portmap一一对应,port_st节点与portmap节点是多对一的对应关系:具体的portmap节点包含portmap,并且设置pp指针、Pm、Pn三个字段,其中pp指针指向可以指向portmap节点中包含的portmap的port_st节点,Pm表示portmap节点中包含的portmap已经被Pm个port_st节点对应,Pn表示portmap节点中包含的portmap最多能够被Pn个port_st节点对应。
[0133] 进一步的,针对上述描述,当找到符合预设规则的已分配的portmap之后,将数据结构节点的指针p指向对应的符合预设规则的已分配的portmap,并将符合预设规则的已分配的portmap节点的Pm值加1。
[0134] 进一步的,如图4所示,装置进一步包括:
[0135] 触发单元35,用于当任一portmap对应的协议端口出现被全部占用的情况时,触发自适应更新机制,自适应更新机制用于更新所有已分配的portmap对应的数据结构节点的n值,n值表示包括与n值对应的数据结构节点在内的n个数据结构节点能够对应一个portmap。
[0136] 若任一portmap出现其中所有的比特置1的情况,即portmap对应的协议端口全部被占用的情况,则触发自适应更新机制。触发自适应更新机制不是启动自适应更新机制,启动自适应更新机制需要到达预设更新时间时启动,通常预设更新时间设为业务不繁忙的时间,如午夜等。
[0137] 统计单元36,用于统计包含触发自适应更新机制时刻在内的预设时段内所有已分配的portmap对应的数据结构节点的m值,m值为预设时段内通过数据结构节点分配出去的与数据结构节点对应的portmap对应的协议端口的数量。
[0138] 触发自适应更新机制后,需要统计包含触发自适应更新机制时刻在内的预设时段内所有已分配的portmap对应的所有port_st节点对应的m值,每个port_st节点对应一个m值。
[0139] 进一步的,如图4所示,装置进一步包括:
[0140] 启动单元37,用于当到达预设更新时间时,启动自适应更新机制,根据m值对对应的数据结构节点的n值进行调整。
[0141] 以在到达预设更新时间前只触发一次自适应更新机制的情况为例对调整n值的过程进行说明:其中以某一个portmap为例进行说明。首先,将在预设时段内统计的portmap对应的所有port_st的m值相加;若相加的总和超过一个portmap对应的总的协议端口数(65536),则将按照从大到小的顺序选出前u个m值,其中选出的前u个m值需满足相加后的总和刚好超过65536的一半;将选出的前u个m值对应的port_st节点对应的n值进行调整,具体的调整公式为“n=portmap对应的总的协议端口数/m”,在本实施例中调整公式为“n=65536/m”。需要说明的是,除前u个m值对应的port_st节点之外,其它m值对应的port_st对应的n值保持不变。另外对于前u个m值需要满足的条件也可以设置为:前u个m值相加后的总和刚好超过总的协议端口数(65536)的1/3或者2/3等。在实际应用中,前u个m值需要满足的条件可以根据具体的应用需求进行设定。
[0142] 进一步的,如图4所示,装置进一步包括:
[0143] 统计单元36,还用于在到达预设更新时间前,若多次触发自适应更新机制,则分别统计每次触发自适应更新机制时,所有已分配的portmap对应的数据结构节点的m值;
[0144] 选择单元38,用于选出到达预设更新时间前,已分配的portmap对应的每个数据结构节点对应的多个m值中最大的m值;
[0145] 若在到达预设更新时间前,多次触发自适应更新机制,则分别统计每次触发自适应更新机制时,所有已分配的portmap对应的port_st节点对应的m值,每个port_st节点对应多个m值,这时对于每个port_st节点需要选出多个m值中最大的m值。
[0146] 调整单元39,用于根据最大的m值对已分配的portmap对应的数据结构节点的n值进行调整。
[0147] 进一步的,第一查找模块321,用于:
[0148] 获取协议端口请求对应的通信信息组,通信信息组包括协议端口请求对应的公网IP地址、目的IP地址、目的IP地址对应的协议端口;
[0149] 其中通信信息组包括该协议端口请求对应的公网IP地址、目的IP地址、目的IP地址对应的协议端口。公网IP地址是由协议端口请求对应的内网计算机的内网IP地址经过网络地址转换后得到的,目的IP地址为协议端口请求对应的连接的目的IP地址。通常公网IP地址记作sip、目的IP地址记作dip、目的IP地址对应的协议端口记作dport。
[0150] 从预设哈希映射表中查找与通信信息组对应的位置标识,位置标识为数据结构节点在数据结构节点数组中的位置标识;
[0151] 其中预设哈希映射表是关于通信信息组与位置标识之间的映射关系,其中位置标识为数据结构节点在数据结构节点数组中的位置标识,其中数据结构节点用于分配协议端口,数据结构节点分配协议端口的实现是通过数据结构节点对应的p指针指向portmap来实现的。
[0152] 根据位置标识在数据结构节点数组中查找对应的数据结构节点。
[0153] 本发明实施例提供的端口分配的装置,能够在内网中的计算机向外网发起连接,并请求为对应的连接分配协议端口时,首先查找是否存在已分配的portmap,若存在已分配的portmap,则将已分配的portmap对应的未占用的协议端口分配给连接;若不存在已分配的portmap,则重新启用一个新的portmap,并将新的portmap对应的未占用的协议端口分配给连接。与现有技术相比,不存在一个portmap与某一个公网IP地址对应的情况,并且在分配协议端口时,先查找已分配的portmap,而不是查找与连接对应的公网IP地址对应的特定的portmap,实现了portmap的共享,因此在连接较少时,portmap对应的未占用的协议端口可以被别的公网IP地址对应的连接共享,在连接较多时,一个portmap对应的协议端口不够用时,因为portmap可以共享,因此可以使用其他的portmap中的空闲的协议端口或者启用新的portmap对应的协议端口,因此可以根据实际需要的协议端口数来适应性地提供协议端口,避免了现有技术中协议端口需求数量与可提供的协议端口数量不平衡的现象。
[0154] 在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
[0155] 可以理解的是,上述方法及装置中的相关特征可以相互参考。另外,上述实施例中的“第一”、“第二”等是用于区分各实施例,而并不代表各实施例的优劣。
[0156] 所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
[0157] 在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
[0158] 在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
[0159] 类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
[0160] 本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
[0161] 此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
[0162] 本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的发明名称(如端口分配的装置)中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
[0163] 应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。