DHT全称叫分布式哈希表(Distributed Hash Table),是一种分布式存储方法.


Flooding 搜索方法
在最初的Gnutella协议中,使用的是Flooding方法,在网络中,每个节点都不知道其他节点的资源。当它要寻找某个文件,把这个查询信息传递给它的相邻节点,如果相邻节点含有这个资源,就返回一个QueryHit的信息给Requester。如果它相邻的节点都没有命中这个被查询文件,就把这条消息转发给自己的相邻节点。这种方式像洪水在网络中各个节点流动一样,所以叫做Flooding搜索。由于这种搜索策略是首先遍历自己的邻接点,然后再向下传播,所以又称为宽度优先搜索方法(BFS)。如图所示:搜索的节点一开始TTL=3,它每传播一次TTL减1,如果TTL减到0还没有搜索到资源,则停止。如果搜索到资源则返回目标机器的信息以用来建立连接。在搜索过程中可能出现循环,但是由于有TTL控制,所以这个循环不会永远进行下去,当TTL=0的时候自然结束。

Modified-BFS方法
这种方法是在宽度优先方法Flooding上面作了一定修改。跟Flooding搜索方法不同,搜索源只是随机的选取一定比例的相邻节点作为查询信息的发送目标,而不是发送给所有相邻节点。相比于Flooding方法来说,是以时间换取空间的有效尝试。
Iterative Deepening搜索方法
迭代递增是Flooding方法的改进,策略循环递增TTL(Time to Live)值,这个值用来控制Flooding的搜索深度。跟Flooding搜索方法给TTL赋一个较大的值不同,这种方法在初始阶段,给TTL一个很小的值,如果在TTL减为0,还没有搜索到资源,则给TTL重新赋更高的值。这种策略可以减少搜索的半径,但是在最坏的情况下,延迟很大,如果P2P网络内重复资源丰富,这种方法在不影响搜索质量的基础上将减少网络内的查询流量,在有的文献中亦称为Expanding Ring(扩展环搜索)。

Random Walk搜索方法
在随机漫步中,请求者发出K个查询请求给随机挑选的K个相邻节点。然后每个查询信息在以后的漫步过程中直接与请求者保持联系,询问是否还要继续下一步。如果请求者同意继续漫步,则又开始随机选择下一步漫步的节点,否则中止搜索。
Gnutella2的搜索方法
Gnutella2建立Super-Node,它存储着离它最近的叶子节点的文件信息,这些SuperNode,再连通起来形成一个Overlay Network.当叶子节点需要查询文件,它首先从它连接的SuperNode的索引中寻找,如果找到了文件,则直接根据文件所存储的机器的IP地址建立连接,如果没有找到,则SuperNode把这个查询请求发给它连接的其他超级节点,直到得到想要的资源,KaZaa,POCO等都是基于这种超级节点的思想。

基于移动Agent的搜索方法
移动Agent是一个能在异构网络中自主地从一台主机迁移到另一台主机,并可与其他Agent或资源进行交互的程序。Agent非常适合在网络环境中来帮助用户完成信息检索的任务。现在意大利的一些研究人员在移动 Agent 结合P2P方面做了一些前沿的研究,其中的一些想法,就是通过在P2P软件中嵌入Agent的运行时环境。当有节点需要搜索的时候,它发送一个移动Agent 给它相邻的节点,移动Agent记录着它的一些搜索的信息。当这个Agent到达一台新的机器上,然后在这个机器上进行资源搜索任务,如果这台机器上没有它想要的资源,则它把这些搜索的信息传给它的邻节点,如果找到资源,则返回给请求的机器。
Query Routing方法
这种方法是一种启发式搜索方法。首先每个Peer给本节点的资源做索引,并且纪录相邻节点的资源信息,当查询到达的时候,可以查询路由表直接定位到资源的位置,而不需要再次转发查询信息。
