P2P之Kademlia (二)

1.3 定位节点 

    节点查询可以异步进行,也可以同时进行,同时查询的数量由α表示,一般是3。在节点查询的时候,

它先得到它K桶中离所查询的键值最近的K个节点,然后向这K个节点发起 FIND_NODE消息请求,消息

接收者收到这些请求消息后将在他们的K桶中进行查询,如果他们知道离被查键更近的节点,他们就返回

这些节点(最多K个)。消息的请求者在收到响应后将使用它所收到的响应结果来更新它的结果列表,这个

结果列表总是保持K个响应FIND_NODE消息请求的最优节点(即离被搜索键更近的K个节点)。 然后消息发

起者将向这K个最优节点发起查询,不断地迭代执行上述查询过程。因为每一个节点比其他节点对它周边的节

点有更好的感知能力,因此响应结果将是一次一次离被搜索键值越来越近的某节点。如果本次响应结果中的节

点没有比前次响应结果中的节点离被搜索键值更近了,这个查询迭代也就终止了。 当这个迭代终止的时候,响

应结果集中的K个最优节点就是整个网络中离被搜索键值最近的K个节点(从以上过程看,这显然是局部的,而

非整个网络)

    节点信息中可以增加一个往返时间,或者叫做RTT的参数,这个参数可以被用来定义一个针对每个被查

询节点的超时设置,即当向某个节点发起的查询超时的时候,另一个查询才会发起,当然,针对某个节点的查询

在同一时刻从来不超过α个。

 

1.4 定位资源 

    通过把资源信息与键进行映射,资源即可进行定位,哈希表是典型的用来映射的手段。由于以前的STORE

消息,存储节点将会有对应STORE所存储的相关资源的信息。定位资源时,如果一个节点存有相应的资源的

值的时候,它就返回该资源,搜索便结束了,除了该点以外,定位资源与定位离键最近的节点的过程相似。

     考虑到节点未必都在线的情况,资源的值被存在多个节点上(节点中的K个),并且,为了提供冗余,还

有可能在更多的节点上储存值。 储存值的节点将定期搜索网络中与储存值所对应的键接近的K个节点并且把

值复制到这些节点上,这些节点可作为那些下线的节点的补充。另外,对于那些普遍流行的内容,可能有更

多的请求需求,通过让那些访问值的节点 把值存储在附件的一些节点上(不在K个最近节点的范围之类)来

减少存储值的那些节点的负载,这种新的存储技术就是缓存技术。通过这种技术,依赖于请求的数量,资源

的值被存储在离键越来越远的那些节点上,这使得那些流行的搜索可以更快地找到资源的储存者。由于返回

值的节点的NODE_ID远离值所对应的关键字,网络中的“热点”区域存在的可能性也降低了。依据与键的距

离,缓存的那些节点在一段时间以后将会删除所存储的缓存值。 DHT的某些实现(如Kad)即不提供冗余

(复制)节点也不提供缓存,这主要是为了能够快速减少系统中的陈旧信息。在这种网络中,提供文件的

那些节点将会周期性地更新网络上的信息(通过NODE_LOOKUP消息和STORE消息)。当存有某个文件

的所有节点都下线了,关于该文件的相关的值(源和关键字)的更新也就停止了,该文件的相关信息也就

从网络上完全消失了。

 

1.5 加入网络

 

      想要加入网络的节点首先要经历一个引导过程。 在引导过程中,节点需要知道其他已加入该网络的某个

节点的IP地址和端口号(可从用户或者存储的列表中获得)。假如正在引导的那个节点还未加入网络,它

会计算一个目前为止还未分配给其他节点的随机ID号, 直到离开网络,该节点会一直使用该ID号。

      正在加入Kademlia网络的节点在它的某个K桶中插入引导节点(负责加入节点的初始化工作),然后向

它的唯一邻居(引导节点)发起NODE_LOOKUP操作请求来定位自己,这种“自我定位”将使得Kademlia

的其他节点(收到请求的节点)能够使用新加入节点的Node Id填充他们的K桶,同时也能够使用那些查询过

程的中间节点(位于新加入节点和引导节点的查询路径上的其他节点)来填充新加入节点的K桶。这一自查询过

程使得新加入节点自引导节点所在的那个K桶开始,由远及近,逐个得到刷新,这种刷新只需通过位于K桶范

围内的一个随机键的定位便可达到。 

      最初的时候,节点仅有一个K桶(覆盖所有的ID范围),当有新节点需要插入该K桶时,如果K桶已满,K桶

就开始分裂,(参见A Peer-to-peer Information System 2.4)分裂发生在节点的K桶的覆盖范围(表现为二叉

树某部分从左至右的所有值)跨过了该节点本身的ID的时候。对于节点内距离节点最近的那个K桶,Kademlia

可以放松限制(即可以到达K时不发生分裂),因为桶内的所有节点离该节点距离最近,这些节点个数很可能

超过K个,而且节点希望知道所有的这些最近的节点。因此,在路由树中,该节点附近很可能出现高度不平衡

的二叉子树。假如K是20,新加入网络的节点ID为“xxx000011001”,则前缀为“xxx0011……”的节点可能有

21个,甚至更多,新的节点可能包含多个含有21个以上节点的K桶。(位于节点附近的k桶)。 这点保证使得

该节点能够感知网络中附近区域的所有节点。(参见A Peer-to-peer Information System 2.4)

 

1.6 查询加速

 

    Kademlia使用异或来定义距离。两个节点ID的异或(或者节点ID和关键字的异或)的结果就是两者之间的距

离。对于每一个二进制位来说,如果相同,异或返回0,否则,异或返回1。异或距离满足三角形不等式:任何

一边的距离小于(或等于)其它两边距离之和。

   异或距离使得Kademlia的路由表可以建在多个bit之上,即可使用位组(多个位联合)来构建路由表。位组可

以用来表示相应的K桶,它有个专业术语叫做前缀,对一个m位的前缀来说,可对应2^m-1个K桶。(m位的前缀

本来可以对应2^m个K桶)另外的那个K桶可以进一步扩展为包含该节点本身ID的路由树。一个b位的前缀可以把

查询的最大次数从logn减少到logn/b.这只是查询次数的最大值,因为自己K桶可能比前缀有更多的位与目标键

相同,(这会增加在自己K桶中找到节点的机会,假设前缀有m位,很可能查询一个节点就能匹配2m甚至更多

的位组),所以其实平均的查询次数要少的多。

(参考Improving Lookup Performance over a Widely-Deployed DHT第三部分)

    节点可以在他们的路由表中使用混合前缀,就像eMule中的Kad网络。如果以增加查询的复杂性为代价,

Kademlia网络在路由表的具体实现上甚至可以是有异构的。

 

2 学术意义

 

    尽管异或标准对于理解Kademlia并不是必要,但是对于协议的分析却至关重要。 异或运算形成了允许闭

合分析的循环群,为了能够预见网络的行为和正确性,其他的一些DHT协议和算法都要求模拟或复杂的形式

分析,而Kademlia并不需要,另外,把位组作为路由信息也简化了Kademlia算法。

 

3 在文件分享网络中的应用

 

    Kademlia可在文件分享网络中使用,通过制作Kademlia关键字搜索,我们能够在文件分享网络中找到我们

需要的文件以供我们下载。由于没有中央服务器存储文件的索引,这部分工 作就被平均地分配到所有的客户

端中去:假如一个节点希望分享某个文件,它先根据文件的内容来处理该文件,通过运算,把文件的内容散列

成一组数字,该数字在文件分享网络中可被用来标识文件。这组散列数字必须和节点ID有同样的长度,然后,

该节点便在网络中搜索ID值与文件的散列值相近的节点,并把它自己的IP地址存储在那些搜索到的节点上,也就

是说,它把自己作为文件的源进行了发布。正在进行文件搜索的客户端将使用Kademlia协议来寻找网络上ID值

与希望寻找的文件的散列值最近的那个节点,然后取得存储在那个节点上的文件源列表。由于一个键可以对应

很多值,即同一个文件可以有多个源,每一个存储源列表的节点可能有不同的文件的源的信息,这样的话,

源列表可以从与键值相近的K个节点获得。

    文件的散列值通常可以从其他的一些特别的Internet链接的地方获得,或者被包含在从其他某处获得的索引文

件中。文件名的搜索可以使用关键词来实现,文件名可以分割成连续的几个关键词,这些关键词都可以散列并

且可以和相应的文件名和文件散列储存在网络中。搜索者可以使用其中的某个关键词,联系ID值与关键词散列

最近的那个节点,取得包含该关键词的文件列表。由于在文件列表中的文件都有相关的散列值,通过该散列值

就可利用上述通常取文件的方法获得要搜索的文件。

你可能感兴趣的:(网络,System,存储,performance,internet,p2p)