发明内容
有鉴于此,本发明的目的在于提供一种分布式架构下的NAT端口资源分配方法及系统,提高NAT端口资源利用率。
为达到上述目的,本发明提供的技术方案如下:
一种分布式架构下的NAT端口资源分配方法,适用于包括主控板及一个以上业务板的分布式环境,该方法包括:
在主控板上统一管理NAT端口资源,各业务板根据本板的NAT业务量向主控板请求端口资源;主控板根据业务板的请求为业务板分配空闲的端口资源,然后业务板使用分配的端口资源进行NAT转换,其中,
所述端口资源在主控板上以端口块形式组织,所述主控板根据业务板的请求为业务板分配空闲端口资源包括:主控板根据业务板的请求为业务板分配空闲的端口块,并通过板间通信将分配的端口块信息通知业务板;所述业务板通过指针数组记录本板所有已申请到的端口块,并设置指向下一个可用端口块的指针,以及针对各申请到的端口块,分别设置用于记录本端口块中各端口使用状态的端口数组及用于表示本端口块中下一个可用端口在本端口块中相对位置的可用位置参数;所述业务板使用分配的端口资源进行NAT转换包括:业务板通过所述指向下一个可用端口块的指针获取当前可用的端口块,根据该端口块对应的可用位置参数确定可用的端口,然后使用该端口进行NAT转换,并将端口数组中该端口的状态设置为已使用,且判断当前端口块中的所有端口是否都已被使用,如果是,则将当前端口块对应的可用位置参数设置为无效,并从指针数组中找到下一个可用的端口块,更新所述指向下一个可用端口块的指针指向该找到的端口块,同时可用端口块个数减1;否则,将当前端口块对应的可用位置参数调整为下一个可用端口的位置。
该方法进一步包括:业务板将释放的端口块信息发送给主控板,主控板收到后将相应端口块释放到空闲状态。
所述主控板将所有空闲端口决串起来形成空闲端口块链表,所述为业务板分配空闲的端口块包括:主控板从空闲端口块链表中获取空闲的端口块分配给业务板,并将已分配的端口块从空闲端口块链表中删除;所述将相应端口块释放到空闲状态包括:主控板将相应端口块插入到空闲端口块链表中。
该方法进一步包括:设置申请阈值和释放阈值,业务板统计本板的可用端口块个数,当可用端口块个数小于申请阈值时,业务板向主控板请求端口资源;当可用端口块个数大于释放阈值时,业务板向主控板释放端口资源。
该方法进一步包括:业务板将未使用的端口状态设置为空闲,并通过该端口的端口号找到其所属端口块,在该端口决对应的可用位置参数无效时,将该可用位置参数调整为本次释放的端口位置;如果该端口块的所有端口都已释放,则可用端口块个数加1;如果本次释放之前该业务板上的端口已使用完毕,则调整所述指向下一个可用端口块的指针指向本次释放的端口所属的端口块。
一种分布式架构下的NAT端口资源分配系统,适用于包括主控板及一个以上业务板的分布式环境,所述主控板包括端口资源管理单元,所述业务板包括端口资源申请单元和NAT业务处理单元,其中,
端口资源管理单元,用于管理NAT端口资源,并接收业务板发来的端口资源请求,根据业务板的请求为业务板分配空闲的端口资源,将分配的端口资源信息通知业务板;
端口资源申请单元,根据自身所在业务板的NAT业务量向主控板发送端口资源请求,接收主控板返回的端口资源信息并保存;
NAT业务处理单元,从端口资源申请单元中获取可用端口进行NAT转换,
其中,所述端口资源管理单元以端口块形式组织端口资源,根据业务板的请求为业务板分配空闲的端口块,并通过板间通信将分配的端口块信息通知业务板;
所述端口资源申请单元通过指针数组记录本板所有已申请到的端口块,并设置指向下一个可用端口块的指针,以及针对各申请到的端口块,分别设置用于记录本端口块中各端口使用状态的端口数组及用于表示本端口块中下一个可用端口在本端口块中相对位置的可用位置参数;
所述NAT业务处理单元通过所述指向下一个可用端口块的指针获取当前可用的端口块,根据该端口块对应的可用位置参数确定可用的端口,然后使用该端口进行NAT转换,并将端口数组中该端口的状态设置为已使用,且判断当前端口块中的所有端口是否都已被使用,如果是,则将当前端口块对应的可用位置参数设置为无效,并从指针数组中找到下一个可用的端口块,更新所述指向下一个可用端口块的指针指向该找到的端口块,同时可用端口块个数减1;否则,将当前端口块对应的可用位置参数调整为下一个可用端口的位置。
所述端口资源申请单元进一步将业务板释放的端口块信息发送给主控板;主控板的端口资源管理单元收到后将相应端口块释放到空闲状态。
所述端口资源管理单元将所有空闲端口决串起来形成空闲端口块链表,从空闲端口块链表中获取空闲的端口块分配给业务板,将已分配的端口块从空闲端口块链表中删除,并将业务板释放的端口块插入到空闲端口块链表中。
所述端口资源申请单元进一步统计本板的可用端口块个数,当可用端口块个数小于设置的申请阈值时,向主控板请求端口资源;当可用端口块个数大于设置的释放阈值时,向主控板释放端口资源。
所述NAT业务处理单元进一步将未使用的端口状态设置为空闲,并通过该端口的端口号找到其所属端口块,在该端口块对应的可用位置参数无效时,将该可用位置参数调整为本次释放的端口位置;如果该端口块的所有端口都已释放,则可用端口块个数加1;如果本次释放之前该业务板上的端口已使用完毕,则调整所述指向下一个可用端口块的指针指向本次释放的端口所属的端口块。
由此可见,本发明中各个业务板上的端口资源不是静态配置的,而是主控板根据各板的NAT业务量需求动态分配的,这样就不会产生某个业务板上端口资源已经耗尽而另一业务板上还剩大量端口资源未使用的情况,从而实现了端口资源的合理分配,减少了端口资源浪费,提高了端口资源利用率。同时,由于主控板为业务板分配的是空闲的端口资源,因此也不会造成端口资源分配冲突的问题。
具体实施方式
为使本发明的目的、技术方案及优点更加清楚明白,下面参照附图并举实施例,对本发明作进一步详细说明。
本发明的基本思想是:在主控板上统一管理NAT端口资源,各个业务板根据本板的NAT业务量向主控板请求端口资源,主控板根据业务板的请求为业务板分配空闲的端口资源。也就是说,各个业务板上的端口资源不是静态配置的,而是主控板根据各板的NAT业务量需求动态分配的,这样就不会产生某个业务板上端口资源已经耗尽而另一业务板上还剩大量端口资源未使用的情况,从而实现了端口资源的合理分配,减少了端口资源浪费,提高了端口资源利用率。同时,由于主控板为业务板分配的是空闲的端口资源,因此也不会造成端口资源分配冲突的问题。
在具体实现时,可以将所有端口资源划分成若干个端口块(每个端口块中包含若干个端口),由主控板对所有端口块进行统一管理。当业务板因业务需要向主控板发出端口资源请求时,主控板为提出请求的业务板分配空闲的端口块,之后业务板使用主控板分配的端口块中所包含的端口进行NAT转换;当业务板不再使用分配的端口块时,业务板发送端口块释放请求给主控板,主控板收到后释放相应的端口块到空闲状态。
其中,端口块的大小可根据实际需求进行设置。比如,当可用端口范围是63K(1025~65535)时,可以将全部端口资源划分成63块,每块包含1024个端口。并且,每个端口块对应一个端口块索引ulBlockIndex,用来唯一标识一个端口块。通过端口块索引可以计算出对应端口块的端口范围,如当所述63个端口块的ulBlockIndex依次为1、2、...、63时,各端口块的端口范围即为(((1024×ulBlockIndex)+1)~1024×(ulBlockIndex+1))。主控板把某个端口块分配给业务板后,业务板就可以根据该端口块索引计算可使用的端口范围。
对于分成的各端口块,主控板可采取图3所示链表的方式进行组织(当然也可以采取其它组织方式,这里仅以链表为例进行说明),将所有未被使用的端口块串起来形成一个空闲端口块链表。图4示出了主控板基于空闲端口块链表进行端口块分配/释放的流程图,包括以下步骤:
步骤401:主控板接收业务板发来的消息,并判断该消息类型,如果是端口块申请消息,则执行步骤402;如果是端口块释放消息,则执行步骤404。
步骤402:主控板访问空闲端口块链表,判断空闲端口块链表是否为空,如果为空,则通知业务板端口资源耗尽,没有可用的端口资源,结束本流程;如果不为空,则执行步骤403。
步骤403:主控板从空闲端口块链表中取出空闲端口块分配给业务板,通过板间通信将分配的端口块信息(如端口块索引)告知业务板,同时将已分配的端口块从空闲端口块链表中删除,然后结束本流程。
步骤404~405:主控板从收到的端口块释放消息中取出释放的端口块信息,并将该端口块插入到空闲端口块链表中。
以上对主控板上的端口资源管理方式作了详细阐述,下面对业务板上的端口维护情况进行详细说明。
图5示出了一种业务板上的端口块组织方式示意图,其中,指针数组ppstPortBlock用于记录本业务板上所有已申请到的端口块,指针数组的大小与端口块个数一致,当可用端口范围(1025~65535)被划分成63块,每块包含1024个端口时,指针数组的大小就为63。初始情况下,ppstPortBlock上的所有指针都为空;当收到从主控板分配来的索引为ulBlockIndex的端口块时,指针ppstPortBlock[ulBlockIndex]指向分配到的端口块。另外,图5中的nextavailIndex指向下一个可用的端口块,availblknum记录本业务板上可用的端口块个数。
针对可用的端口块个数,可以设置两个阈值:申请阈值和释放阈值,业务板根据本板记录的availblknum及设置的申请或释放阈值决定是否向主控板申请或释放端口块资源。具体而言即:当本板availblknum小于设置的申请阈值时,业务板向主控板申请新的端口块资源;当本板availblknum大于设置的释放阈值时,业务板向主控板发送端口块释放请求,主动将部分可用的端口块资源退还给主控板。
针对各个已分配的端口块,业务板可采取位图方式来维护各端口块中的端口使用情况。如图5所示,数组ulPort[32]用于记录端口块中1024个端口的使用状态,其中包含32个元素,每个元素长度为32比特(bit),每个bit分别代表本端口块中的一个端口。如果某个端口对应的bit为1,则表示该端口已被使用;如果为0,则表示该端口未被使用,处于空闲状态。ulNextPortWord表示下一个可用端口在本端口块中的相对位置,其中,ulNextPortWord/32为该端口在数组ulPort[32]中的元素位置,ulNextPortWord%32为该端口在数组元素中的bit位置。
图6示出了业务板基于图5所示的端口块组织方式而进行的端口分配流程图,包括以下步骤:
步骤601:业务板收到需进行NAT转换的业务流后,查看nextavailIndex是否有效,如果有效,则执行步骤602;否则,表示本板上没有可用的端口资源,结束本流程。
步骤602:通过nextavailIndex找到下一个可用的端口块。
步骤603:查看该可用端口块的ulNextPortWord是否有效,如果有效,则执行步骤604;否则,表示该端口块中的端口已使用完毕,结束本流程。
步骤604:通过ulNextPortWord找到可用的端口,并将该端口在数组中对应的bit置为1,表示该端口已被使用。
其中,可用端口的端口号为(nextavailIndex×1024+ulNextPortWord)。该端口在数组ulPort[32]中对应的bit位置通过以下步骤获得:首先计算ulNextPortWord/32找到该端口在数组ulPort[32]中的元素位置,然后再计算ulNextPortWord%32找到该端口在数组元素中的bit位置。
步骤605:判断该端口块中的所有端口是否都已被使用,即判断该端口块对应的ulPort[32]数组中的所有bit是否都为1,如果是,则表示该端口块中的端口已被使用完毕,执行步骤606;否则,表示该端口块中还有可用端口,执行步骤607。
步骤606:将该端口块的ulNextPortWord设置为无效(如全F),表示该端口块中的端口已使用完毕;并且,从指针数组ppstPortBlock中找到下一个可用的端口块,更新nextavailIndex指向该找到的可用端口块,同时更新将availblknum,将availblknum减1。如果更新后的availblknum小于设置的申请阈值,业务板就向主控板申请新的端口块。
步骤607:将该端口块的ulNextPortWord调整为该端口块中下一个可用端口的位置,即下一个bit为0的位置。
图7示出了业务板基于图5所示的端口块组织方式而进行的端口释放流程图,包括以下步骤:
步骤701: 当业务板不再使用某端口时,通过该端口的端口号PortNumber找到该端口所属的端口块,所属端口块索引等于(PortNumber/1024)。
步骤702:计算((PortNumber%1024)/32)找到该端口在其所属端口块所对应的数组ulPort[32]中的元素位置,再计算((PortNumber%1024)%32)找到该端口在数组元素中的bit位置。
步骤703:判断找到的bit位是否为0,若是,则表示该bit位对应的端口已经释放,结束本流程;否则,执行步骤704。
步骤704:将找到的bit位设置为0。
步骤705:查看该端口块的ulNextPortWord是否有效,若无效,则执行步骤706;若有效,则执行步骤707。
步骤706:将该端口块的ulNextPortWord调整为本次释放的端口位置,然后执行步骤707。
步骤707:判断该端口块的所有端口是否都已释放,若是,则执行步骤708;否则,执行步骤709。
步骤708:将可用端口块个数availblknum加1,然后执行步骤709。
如果更新后的availblknum大于设置的释放阈值,业务板则向主控板发送端口块释放消息,请求释放该端口块。
步骤709:判断释放此端口之前该业务板上的端口是否已经使用完毕,如果已使用完毕即nextavailIndex为无效值,则执行步骤710,将nextavailIndex指向当前端口块;否则,结束本流程。
上述实施例通过分级管理的思想实现了端口资源的管理,即主控板负责端口块的分配和释放,业务板负责具体端口的分配和释放,主控板与业务板之间只进行端口块信息的交互,而无需针对各具体端口进行繁琐交互,这样可以减少主控板与业务板之间的交互信息量。
相应地,针对包括主控板及一个以上业务板的分布式环境,本发明还提供了一种分布式架构下的NAT端口资源分配系统。图8示出了该系统的示例性结构示意图,如图8所示,主控板包括端口资源管理单元,业务板包括端口资源申请单元和NAT业务处理单元。其中,端口资源管理单元,用于管理NAT端口资源,并接收业务板发来的端口资源请求,根据业务板的请求为业务板分配空闲的端口资源,将分配的端口资源信息通知业务板;端口资源申请单元,根据自身所在业务板的NAT业务量向主控板发送端口资源请求,接收主控板返回的端口资源信息并保存;NAT业务处理单元,从端口资源申请单元中获取可用端口进行NAT转换。
较佳地,端口资源管理单元可以以端口块形式组织端口资源,根据业务板的请求为业务板分配空闲的端口块,并通过板间通信将分配的端口块信息通知业务板。
具体实现时,端口资源管理单元可以将所有空闲端口块串起来形成空闲端口块链表,从空闲端口块链表中获取空闲的端口块分配给业务板,将已分配的端口块从空闲端口块链表中删除,并将业务板释放的端口块插入到空闲端口块链表中。
其中,业务板上的端口资源申请单元还进一步用于将业务板释放的端口块信息发送给主控板;主控板的端口资源管理单元收到后将相应端口块释放到空闲状态。
较佳地,端口资源申请单元还可进一步设置申请阈值和释放阈值,并统计本板的可用端口块个数,当可用端口块个数小于设置的申请阈值时,向主控板请求端口资源;当可用端口块个数大于设置的释放阈值时,向主控板释放端口资源。
具体实现时,端口资源申请单元可以通过指针数组记录本板所有已申请到的端口块,并设置指向下一个可用端口块的指针,以及针对各申请到的端口块,分别设置用于记录本端口块中各端口使用状态的端口数组及用于表示本端口块中下一个可用端口在本端口块中相对位置的可用位置参数。
在收到NAT业务流后,NAT业务处理单元可以通过所述指向下一个可用端口块的指针获取当前可用的端口块,并根据该端口块对应的可用位置参数确定可用的端口,然后使用该端口进行NAT转换,并将端口数组中该端口的状态设置为已使用,且判断当前端口块中的所有端口是否都已被使用,如果是,则将当前端口块对应的可用位置参数设置为无效,并从指针数组中找到下一个可用的端口块,更新所述指向下一个可用端口块的指针指向该找到的端口块,同时可用端口块个数减1;否则,将当前端口块对应的可用位置参数调整为下一个可用端口的位置。
当某端口不再被使用时,NAT业务处理单元进一步将未使用的端口状态设置为空闲,并通过该端口的端口号找到其所属端口块,在该端口块对应的可用位置参数无效时,将该可用位置参数调整为本次释放的端口位置;如果该端口块的所有端口都已释放,则可用端口块个数加1;如果本次释放之前该业务板上的端口已使用完毕,则调整所述指向下一个可用端口块的指针指向本次释放的端口所属的端口块。
以上所述对本发明的目的、技术方案和有益效果进行了进一步的详细说明,所应理解的是,以上所述并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。