一种域名类信息的存储及查询方法以及系统的制作方法

文档序号:7956933阅读:176来源:国知局
专利名称:一种域名类信息的存储及查询方法以及系统的制作方法
技术领域
本发明涉及通信技术领域,尤其涉及一种域名类信息的存储及快速查询方法以及域名类信息存储查询系统。
背景技术
随着计算机技术的飞速发展,信息的数量呈几何级数增长。如此大的信息量对于查找和存放信息都带来了不少困难。我们就需要有效找到数据的方法,查找的目的在于从一些数据中寻找一个特定的值,由此产生的各种查找方法都是为了追求更高的效率与更方便的操作。对于域名的查找同样如此,例如在具体的某个网络应用中如果需要知道某个域名是否已经被保存,如果已经被保存,就需要对发来的数据包做一次重定向。这种情况下,就需要很快的知道某个域名是否被存储了,如果花费大量时间在查询上会使网络的性能大打折扣,并且可能出现很多网络问题。
现有的相关检索技术主要有前缀树,BSD radix树两种。
BSD radix树是一种为查找IP地址而设计的数据结构。BSD radix树的节点的存储结构如图1所示,其内部节点和叶子节点使用的都是radix_node结构体,只是少数字段的定义有所不同。首先通过内部节点来查看radix_node结构体中的各个字段。该结构主要保存了指向子节点的指针和指向父节点的指针,还有需要检测的bit位的位置信息。BSDradix树的查找过程分为三步完成第一步,如图2所示,寻找叶子节点,假设现在需要在这个radix树中查找某个条路由。从树的顶端开始,根据沿途内部节点指定的bit进行测试。首先测试根节点的测试位,如果根据根节点的测试位测试结果是1那么进入左子树,如果测试结果是0就进入右子树。下面按照上述方法继续判断,将会遇到一个待测试字段为负值的节点,即叶子节点,于是查找操作将停止在此处。第二步,辨重如果在第一步中找到的叶子节点与查找键不满足匹配的条件,则需要遍历这个叶子节点的重复键链表。由于重复键链表中的叶子节点与第一步中找到的叶子节点的键值(也就是IP地址)是完全相同的,只是掩码呈逐渐缩短的趋势,因此可能在重复键链表中存在网络匹配的可能。重复键处理的过程如图3所示。第三步,回溯到目前为止,只是使用作为查找键的IP地址在radix树中根据内部节点指示的bit测试位置找到了某个叶子节点,并进行了重复键处理,仍然没有找到匹配的叶子节点。这并不能排除在radix树中还存在有其它可能满足网络匹配条件的叶子节点,因此就需要沿着来时的内部节点路径向树顶回溯,寻求网络匹配的可能。回溯过程如图4所示。回溯途中经过的是一系列的内部节点,对于每一个内部节点,将会判断它是否挂的有掩码链表,掩码链表在图4中用粗实线表示。没有掩码链表的内部节点将不予考虑,直接通过。如果某个内部节点挂的有掩码链表,那说明在它的子树中可能存在着网络匹配的可能,需要停下来做一下判断再决定是否继续回溯。
BSD radix树是一种基于以二进制表示的键值的查找树,尤其适合于处理非常长的、可变长度的键值。字符串当然也可以看作是一个二进制的键值,但是字符串中的每个字符的可能取值只有几十种(a-z,A-Z,等等),比起纯的二进制键值的每个字节可以取256种的情况小很多,但该方法将字符串也当作二进制流来做查询,因此用这种方法查询字符串不能很好体现出速度的优势。
前缀树多在数据挖掘中被使用,其存储方式如图5所示。前缀树如果把它的节点的字符集限定在26个英文字母之内,可以看作是最多只有26叉的树型结构。前缀树也可以提供一种相对比较快速的查询方法。但前缀树的结构保存了很多多余的字符串信息,这导致了在查找域名的时候会引起不必要的回溯。例如如图4所示的前缀树中要查找“中国人”,首先从根节点找起,“中”字匹配,进入“中国”子树。然后从头开始比较“中国”是否匹配,造成回溯。接着又进入“中国人”节点,又重新开始匹配,大量的时间浪费在不必要的回溯上了。该方法用于域名类字符串存储时,既浪费存储空间,又由于树结构深度深,查找速度就慢,并且,这种技术同样不能压缩数据的存储量。

发明内容
本发明所要解决的技术问题是提供一种适应快速查找域名类字符串的存储方式;本发明要解决的另一问题是提供一种与上述存储方法相对应的域名类字符串查询方法,该查询方法可以快速有效地判断某个域名类字符串是否已经被存储。
本发明还提供一种域名类信息存储查询系统。
本发明为解决上述技术问题所采用的技术方案为一种域名类字符串的存储方法,所述方法包括将待存储的域名字符串之间进行比较,把所述待存储域名类字符串相同前缀部分用一个节点存放,作为公共节点;将待存储域名类字符串不同部分作为该公共节点的子节点插入存放;对于完全不匹配的两个域名类字符串,则作为兄弟节点插入存放。
所述的方法,其中在已存放一个完整字符串的节点后面插入一个空节点。
所述的方法,其中所述的方法包括如下具体步骤
A、将待存储字符串与节点内字符串进行比较判断,当待存储字符串与当前节点内字符串完全匹配时,返回结果为真;当待存储字符串与当前节点内字符串完全不匹配时,进入步骤B;当待存储字符串与当前节点内字符串部分匹配时,进入步骤C;B、判断当前节点是否有兄弟节点,如果当前节点有兄弟节点,则把所述兄弟节点作为新的当前节点,返回步骤A;如果当前节点没有兄弟节点,则将待插入节点作为当前节点的兄弟节点插入;C、将不完全匹配的待存储字符串和/或当前节点内字符串分成相同前缀和不匹配部分,保留相同前缀作为当前节点,不匹配部分作为当前节点的子节点插入。
所述的方法,其中所述步骤C中当待存储字符串完全匹配,且当前节点内字符串部分匹配时,包括如下具体处理将当前节点内字符串分成第一相同部和第一不同部,保留第一相同部作为当前节点,把第一不同部作为当前节点的子节点插入存放,并在第一不同部节点后面插入一空节点。
所述的方法,其中所述步骤C中当节点内字符串完全匹配,且待存储字符串部分匹配时,其包括如下具体步骤C1、将待存储字符串分成第二相同部和第二不同部;C2、判断当前节点是否有子节点;C3、若有子节点,将所述第二不同部作为新的待存储字符串,子节点作为新的当前节点内字符串进行比较,重复步骤A;否则保留节点内字符串,将所述第二不同部作为当前节点的子节点插入存放,并在第二不同部节点后面插入一空节点。
所述的方法,其中所述步骤C中当节点内字符串部分匹配,且待存储字符串部分匹配时,包括如下处理将待存储字符串分成相同部和第二不同部;将节点内字符串分成相同部和第一不同部;保留相同部作为当前节点,把第一不同部作为当前节点的子节点插入存放,把第二不同部作为其兄弟节点插入存放,或把第二不同部作为当前节点的子节点插入存放,把第一不同部作为其兄弟节点插入存放。
一种域名类字符串的查询方法,所述方法包括如下步骤A、将节点内字符串与待查询字符串进行比较,判断节点内字符串是否与待查询字符串完全匹配;B、若节点内字符串完全匹配,取待查询字符串与节点内字符串不匹配部分作为新的待查询字符串,取当前节点内字符串的子节点作为新的当前节点,返回步骤A;C、若节点内字符串与待查询字符串不完全匹配,则取当前节点的兄弟节点作为新的当前节点内字符串,返回步骤A。
所述的查询方法,其中所述步骤A包括以下具体步骤A1、判断当前节点是否有效,若当前节点无效时直接返回真,有效时进入步骤A2;A2、将待查询字符串与节点内字符串进行比较,判断节点内字符串是否与待查询字符串完全匹配。
所述的查询方法,其中所述步骤C包括如下具体步骤C1、若节点内字符串与待查询字符串不完全匹配时,取当前节点的兄弟节点作为新的当前节点内字符串;C2、判断新的当前节点是否有效,若新的当前节点无效时直接返回假,有效时返回步骤A2。
一种域名类信息存储查询系统,包括一插入模块,一DNS-Tree存储模块,以及分别与所述插入模块和DNS-Tree存储模块连接的内存管理模块,所述内存管理模块用于比较域名类字符串,并对DNS-Tree存储模块的节点内存进行分配和管理;还包括与所述DNS-Tree存储模块连接的一查询处理模块,所述查询处理模块用于将待查询字符串与DNS-Tree存储模块中的字符串进行比较和判断,得出待查询字符串是否已经在DNS-Tree存储模块中的结果。
本发明的有益效果为本发明在充分考虑和利用了域名类字符串的特点后,采用了如上的域名类字符串存储方法,该方法不仅有效地减少了内存的需求量,而且由于这种存放方式建立的域名服务树(DNSTree)树结构不深,并且树结构平衡,降低了查询检索时的时间复杂度和空间复杂度,因此采用本发明的查询方法可以快速有效地判断某个域名类字符串是否已经被存储,加快了查询速度,提高了检索效率。


图1为BSD radix树的节点存储结构示意图;图2为BSD radix树测试根节点的过程示意图;图3为BSD radix树重复键处理过程图;图4为BSD radix树回溯过程示意图;图5为前缀树存储方式示意图;图6为本发明DNSTree的树结构示意图;图7为本发明DNSTree存储方法流程图;图8为本发明DNSTree查询算法流程图;图9为本发明域名类存储查询系统示意图。
具体实施例方式
下面根据附图和实施例对本发明作进一步详细说明
由于域名字符串有它的特殊性,即域名不会太长,而且域名大多是有意义的方便记忆的字符串,所以常常可以找到许多相同的前缀如www,ftp等等,我们将具有上述特点与域名字符串类似的字符串称为域名类字符串。本发明根据这两个特点对于域名类存储和查询方法进行改进,以便加快域名类字符串的查找。下面以域名字符串为例加以说明,例如给出如下6个域名字符串www.baidu.comwww.google.com,www.goobersite.comwww.google.com.cnwww.yahoo.com.cnwww.yahoo.com本发明的存储方法是将待存储的域名字符串之间进行比较,把各个域名字符串的的相同的前缀部分用一个节点存放,不相同的部分作为子节点插入存放,完全不相同的字符串作为兄弟节点插入存放。例如www.baidu.com和www.google.com只有www.是相同的前缀,那么www.就可以作为公共节点,baidu.com和google.com就作为公共节点www.的两个子节点插入。当www.yahoo.com作为待存储字符串与www.baidu.com比较,也只有www.是相同的前缀,同样www.作为公共节点,不同部分yahoo.com作为baidu.com的兄弟节点插入。依此类推,得到如图6所示的DNSTree树型结构。这样的存放方式在存放有大量相同前缀字符串时会节省大量内存。下面是图6的简单表示法www.
+baidu.com+goo+bersite.com
+gle.com+.cn+“”+yahoo.com+.cn+“”“”图中的“”表示空节点,空节点是用来表示前面的字符串已经是一个完整的字符串了,后面不需要再添加任何的字符了。例如www.google.com和www.google.com.cn这两个字符串插入树中会有曾这样的形状www.google.com+.cn+ “”www.google.com后面加一个空节点“”,就表示www.google.com是一个完整的字符串,否则如果没有“”就难以区别是否有www.google.com这个字符串的存在。
以下根据图7所示的DNSTree存储方法流程图具体描述本发明域名字符串存储方法。首先对流程图中的缩略语和定义进行解释INN_STR结点内字符串,表示一个节点中所保存的字符串。
PPI_STR节点内字符串匹配部分,表示两个字符串相比较节点内字符串的相同前缀部分,例如abcde(结点内字符串)和abckef相比较,其PPI_STR为abc;BPI_STR节点内字符串的不匹配部分,表示两个字符串相比较节点内字符串的不相同部分。例如abcde(结点内字符串)和abckef相比较,其BPI_STR为de;WTI_STR待插入字符串,表示某个要插入到DNSTree的字符串;
PPW_STR待插入字符串的匹配部分,表示两个字符串相比较待插入字符串的相同前缀部分。例如abcde和abckef(待插入字符串)相比较,其PPW_STR为abc;BPW_STR待插入字符串的不匹配部分,表示两个字符串相比较待插入字串的不相同部分。例如abcde和abckef(待插入字符串)相比较,其BPW_STR为kef。
上述完全匹配的意思,表示某个字符串可以是另一字符串的前缀。如INN_STR完全匹配,表示INN_STR与WTI_STR相比较,INN_STR可以作为WTI_STR的前缀,例如abcd(INN_STR)和abcdefg(WTI_STR)。再如WTI_STR完全匹配,表示INN_STR与WTI_STR相比较,WTI_STR可以作为INN_STR的前缀,例如abcd(WTI_STR)和abcdefg(INN_STR)。
部分匹配的意思,表示两个字符串有一部分相同的前缀但是不是完全匹配,例如abcke与abkei。其中INN_STR部分匹配,表示INN_STR与WTI_STR相比较,INN_STR和WTI_STR有相同的前缀,例如abcde(INN_STR)和abeiek(WTI_STR)有相同的前缀ab,但是INN_STR后面还必须有不同的部分;WTI_STR部分匹配,表示INN_STR与WTI_STR相比较,INN_STR和WTI_STR有相同的前缀。例如abcde(WTI_STR)和abeiek(INN_STR)有相同的前缀ab,但是WTI_STR后面还必须有不同的部分。
完全不匹配,表示两个字符串完全没有相同的前缀。
根据上述定义,本发明对于域名类字符串存储方法的步骤为1、WTI_STR与INN_STR相比较,WTI_STR与INN_STR都完全匹配进入步骤2,完全不匹配进入步骤3,部分匹配进入步骤4;2、返回结果为真;3、判断当前节点有没有兄弟结点,如果有把兄弟结点当作当前节点,进入1。如果没有则作为兄弟节点插入。
4.部分匹配情况分以下三个子情况处理
1).WTI_STR完全匹配,INN_STR部分匹配a.把INN_STR分成PPI_STR和BPI_STR,b.将PPI_STR保留,BPI_STR作为当前节点的子节点插入到DNSTree树中,在BPI_STR节点后面再插入一个空节点。
2).INN_STR完全匹配,WTI_STR部分匹配a.判断INN_STR节点是否有子节点b.如果有子节点,那么BPW_STR作为新的WTI_STR,INN_STR的子节点为新的当前节点,然后转入1。
c.如果没有子节点,PPI_STR节点保留,BPW_STR作为当前节点的子节点插入,然后再插入的子节点后面在插入一个空节点。
3).INN_STR部分匹配,WTI_STR部分匹配。
a.把WTI_STR分成PPW_STR和BPW_STR;b.将PPI_STR作为当前节点保留,BPI_STR作为当前节点的子节点插入,BPW_STR作为BPI_STR节点的兄弟节点插入。
由此可见,由于将域名中相同的前缀部分用一个公共节点存放,因此根据此方法建立的DNSTree树结构不深,并且树结构平衡,无疑在查找域名过程中会降低查询检索时的时间复杂度和空间复杂度,提高了查询速度;同时这种存储方法有效地减少了内存的需求量。
针对这种DNSTree树结构,其相应的查找过程如图8所示,描述如下相关概念INN_STR节点内字符串,表示节点中所存储的字符串。
WTI_STR带比较字符串,表示某个需要查询是否已经存在的字符串。
1.判断当前节点是否有效,无效直接返回真,有效进入步骤2;2.判断INN_STR是否与WTC_STR完全匹配,如果匹配进入步骤3,如果不匹配进入步骤4;
3.取WTC_STR的不匹配部分作为新的WTC_STR,取当前节点的子节点作为新的当前节点,返回步骤1;4.取当前节点的兄弟节点作为新的当前节点;5.判断新的当前节点是否有效,如果无效返回假,如果有效返回步骤2,判断新的当前节点与WTC_STR是否完全匹配,进入下一循环。
本发明用于存储查询域名类字符串的系统如图9所示。包括四个主要的模块插入模块插入模块主要的功能就是按照DNS-Tree树结构把字符串插入到DNS-Tree树的特定节点上。这个模块主要在DNS-Tree初始化的时候使用,用该部分完成树的初始化。内存管理模块包括比较器和控制部分,内存管理模块主要管理DNS-Tree中的节点内存怎样的分配和管理。由于域名字符串都不长,所需的内存属于小块内存,所以内存管理模块采用现有技术内存池的方法来管理小块内存。查询处理模块查询模块的功能是查看待查询字符串是否已经在DNS-Tree中已经保存了。将待查询字符串进行处理,并与DNS-Tree中的字符串进行比较和判断,得出待查询字符串是否已经在DNS-Tree中的结果。DNS-Tree为存储模块,即一内存区。
可以理解的是,对本领域普通技术人员来说,可以根据本发明的技术方案及其发明构思加以等同替换或改变,而所有这些改变或替换都应属于本发明所附的权利要求的保护范围。
权利要求
1.一种域名类字符串的存储方法,所述方法包括将待存储的域名字符串之间进行比较,把所述待存储域名类字符串相同前缀部分用一个节点存放,作为公共节点;将待存储域名类字符串不同部分作为该公共节点的子节点插入存放;对于完全不匹配的两个域名类字符串,则作为兄弟节点插入存放。
2.根据权利要求1所述的方法,其特征在于在已存放一个完整字符串的节点后面插入一个空节点。
3.根据权利要求2所述的方法,其特征在于所述的方法包括如下具体步骤A、将待存储字符串与节点内字符串进行比较判断,当待存储字符串与当前节点内字符串完全匹配时,返回结果为真;当待存储字符串与当前节点内字符串完全不匹配时,进入步骤B;当待存储字符串与当前节点内字符串部分匹配时,进入步骤C;B、判断当前节点是否有兄弟节点,如果当前节点有兄弟节点,则把所述兄弟节点作为新的当前节点,返回步骤A;如果当前节点没有兄弟节点,则将待插入节点作为当前节点的兄弟节点插入;C、将不完全匹配的待存储字符串和/或当前节点内字符串分成相同前缀和不匹配部分,保留相同前缀作为当前节点,不匹配部分作为当前节点的子节点插入。
4.根据权利要求3所述的方法,其特征在于所述步骤C中当待存储字符串完全匹配,且当前节点内字符串部分匹配时,包括如下具体处理将当前节点内字符串分成第一相同部和第一不同部,保留第一相同部作为当前节点,把第一不同部作为当前节点的子节点插入存放,并在第一不同部节点后面插入一空节点。
5.根据权利要求3所述的方法,其特征在于所述步骤C中当节点内字符串完全匹配,且待存储字符串部分匹配时,其包括如下具体步骤C1、将待存储字符串分成第二相同部和第二不同部;C2、判断当前节点是否有子节点;C3、若有子节点,将所述第二不同部作为新的待存储字符串,子节点作为新的当前节点内字符串进行比较,重复步骤A;否则保留节点内字符串,将所述第二不同部作为当前节点的子节点插入存放,并在第二不同部节点后面插入一空节点。
6.根据权利要求3所述的方法,其特征在于所述步骤C中当节点内字符串部分匹配,且待存储字符串部分匹配时,包括如下处理将待存储字符串分成相同部和第二不同部;将节点内字符串分成相同部和第一不同部;保留相同部作为当前节点,把第一不同部作为当前节点的子节点插入存放,把第二不同部作为其兄弟节点插入存放,或把第二不同部作为当前节点的子节点插入存放,把第一不同部作为其兄弟节点插入存放。
7.一种域名类字符串的查询方法,所述方法包括如下步骤A、将节点内字符串与待查询字符串进行比较,判断节点内字符串是否与待查询字符串完全匹配;B、若节点内字符串完全匹配,取待查询字符串与节点内字符串不匹配部分作为新的待查询字符串,取当前节点内字符串的子节点作为新的当前节点,返回步骤A;C、若节点内字符串与待查询字符串不完全匹配,则取当前节点的兄弟节点作为新的当前节点内字符串,返回步骤A。
8.根据权利要求7所述的查询方法,其特征在于所述步骤A包括以下具体步骤A1、判断当前节点是否有效,若当前节点无效时直接返回真,有效时进入步骤A2;A2、将待查询字符串与节点内字符串进行比较,判断节点内字符串是否与待查询字符串完全匹配。
9.根据权利要求8所述的查询方法,其特征在于所述步骤C包括如下具体步骤C1、若节点内字符串与待查询字符串不完全匹配时,取当前节点的兄弟节点作为新的当前节点内字符串;C2、判断新的当前节点是否有效,若新的当前节点无效时直接返回假,有效时返回步骤A2。
10.一种域名类信息存储查询系统,其特征在于包括一插入模块,一DNS-Tree存储模块,以及分别与所述插入模块和DNS-Tree存储模块连接的内存管理模块,所述内存管理模块用于比较域名类字符串,并对DNS-Tree存储模块的节点内存进行分配和管理;还包括与所述DNS-Tree存储模块连接的一查询处理模块,所述查询处理模块用于将待查询字符串与DNS-Tree存储模块中的字符串进行比较和判断,得出待查询字符串是否已经在DNS-Tree存储模块中的结果。
全文摘要
一种域名类字符串的存储及查询方法以及系统,包括将待存储的域名类字符串之间进行比较,把待存储域名类字符串相同前缀部分用一个节点存放,作为公共节点;将待存储域名类字符串不同部分作为该公共节点的子节点插入存放;对于完全不匹配的两个域名类字符串,则作为兄弟节点插入存放。查询时,A.将节点内字符串与待查询字符串进行比较和判断;B.若二者完全匹配,取待查询字符串与节点内字符串不匹配部分作为新的待查询字符串,取当前节点内字符串的子节点作为新的当前节点,返回A;C.若二者不完全匹配,则取当前节点的兄弟节点作为新的当前节点,与待查询字符串进行下一轮比较和判断,返回步骤B。该方法提高了域名类字符串查询速度。
文档编号H04L29/12GK101055574SQ20061006034
公开日2007年10月17日 申请日期2006年4月13日 优先权日2006年4月13日
发明者刘竟, 郑志彬, 刘廷永, 孙知信, 宫婧 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1