eMule中的kad相关代码梳理

emule 源码下载 http://download.csdn.net/detail/huang_rong12/9506732


emule中的Kademlia代码总体描述(位于源代码中kademlia文件夹下)

emule中开始使用Kademlia网络后,便不再会有中心服务器失效这样的问题了,因为在这个网络中,没有中心服务器,或者说,所有的用户都是服务器,所有的用户也是客户端,从而完完全全得实现了P2P。接下来讲针对emule中的Kademlia网络进行分析,将会根据emule中实现Kademlia所使用的不同的类分别进行讲述。其中:

CKademlia是整个Kademlia网络的主控类,可以直接开始或者停止Kademlia网,并且含有Process方法来处理日常事务。

CPrefs负责处理自身的Kademlia相关信息,如自身的ID等。

CRoutingZoneCRoutingBinCContact三个类组成了每个节点所了解的联系信息以及由这些联系信息所组成的数据结构。

CKademliaUDPListener负责处理网络信息。

CIndexed负责处理本地存储的索引信息。

CSearchCSearchManager负责处理和搜索有关的操作,其中前者表示的是一个单一的搜索任务,后者负责对所有搜索任务进行处理。

CUInt128负责处理一个128位的长整数,并且内置其各种运算。前面已经提到过。

emule中的Kademlia的基本原理

Kademlia是一种结构化的覆盖网络(Structured Overlay Network),所谓的覆盖网络,就是一种在物理的Internet上面再次构建的虚拟网络,所有参与的节点都知道一部分其它节点的IP地址,这些节点称为它的邻居,如果需要查找什么东西,它先在本地寻找,如果找不到,就把这个查询转发到它的邻居处,希望能够有可能查找到相应的结果。覆盖网络里面分成了结构化和非结构化的两种情况,它们的区别在于每个节点知道哪些其它节点的信息是否有特定的规律。在非结构化的覆盖网中,每个节点的邻居状况没有特定的规律。因此在非结构化网络中,如果要进行查询,会采取一种叫做泛洪(flooding)的方法,每个节点如果在本地没有查找到想要的结果,会把查找请求转发到它的邻居中,然后再通过邻居的邻居这种方式来进行一步步的查找。但是这种方法如果处理不好,会造成整个网络的消息负载过大。已经有不少文章对于优化非结构化覆盖网络中的查询进行了很深入的探讨。

对于结构化的覆盖网络,它的特点是每个节点它会选择和哪些节点做邻居是有一定的规律的,从而在进行搜索的时候,节点把搜索请求进行转发的时候它能够通过一定的规律进行选择把请求转发到哪些邻居节点上。这样同时也能减少搜索代价。结构化的覆盖网络通常要求每一个节点随机生成一个ID,用以判断各个节点之间的关系。这个ID和它所在的物理网络必须是没有关系的。

对于Kademlia网络来说,这个ID是一个128位的数值,所有的节点都用这个ID来衡量自己与其它节点的逻辑距离。而逻辑距离的计算方法就是将两个节点进行异或(XOR)操作。在Kademlia网络的形成过程中,每个节点选择邻居的原则是离自己逻辑距离越近的节点越有可能被加入到自己的邻居节点列表中,具体来说就是在每次新得到一个节点的信息的时候,是否把它加入到自己的邻居节点列表是根据距离的远近来处理的。后面分析具体程序的代码时会有说明。

结构化的网络的好处就是如果我们要寻找一个距离某个ID逻辑距离足够近的节点,我们可以保证在O(logn)级别的跳数找到。只要先寻找自己已知的离目标ID逻辑距离足够断的节点,然后再问它知不知道更近的,然后就这样下去。因此在搜索的时候也是这样,当需要发布资源的时候,把文件进行hash,这样就能够计算出一个128位的ID,或者把关键字进行hash。然后寻找到离这个结果逻辑距离最近的节点,把文件或者关键字的信息发送给它,让它存起来。当有人要搜索同样的东西的时候,由于它用的是同一个hash算法,因此能够计算出对应的ID,并且去搜索那些和这个ID逻辑距离相近的节点,因为它知道,如果网络中真有这些资源的话,这些节点是最有可能知道这些信息的。由此我们可以看出,结构化的网络的资源查找效率是很高的&#x

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值