eMule协议的DHT算法


BT协议和eMule协议在算法中有着一些差异,导致两者的使用是无法兼容的。那么我们如何考虑这算法的差异呢?首先还是让我们了解一下两协议中的DHT算法。DHT的全称是Distributed Hash Table,即分布式哈希表技术,是一种分布式存储方法。这种网络不需要中心节点服务器,而是每个客户端负责一个小范围的路由,并负责存储一小部分数据,从而实现整个DHT网络的寻址和存储。和中心节点服务器不同,DHT网络中的各节点并不需要维护整个网络的信息,而是只在节点中存储其临近的后继节点信息,幅减少了带宽的占用和资源的消耗。DHT网络还在与关键字最接近的节点上复制备份冗余信息,避免了单一节点失效问题。我们可以把整个DHT网络想象成一个城市,那么每个客户端,就好比城市里各个角落的地图,上面绘制了附近区域的地形情况,把这些地图一汇总,城市的全貌就出来了。

而DHT所采用的算法中最出名的是Kademlia,eMule最早开始使用,Bitcomet、Azureus和BitTorrent只是步其后尘,同样使用Kademlia算法的DHT。不过它们各自的实现协议不尽相同,因此不能相互兼容BitComet与BitTorrent兼容,Azureus更像eMule,但与其它都不兼容)。
 
在2005年5月著名的BiTtorrent在4.0版实现基于Kademlia协议的DHT技术后,很快国内的BitComet和BitSpirit也实现了和BitTorrent兼容的DHT技术,实现trackerless下载方式。eMule协议实现的基于Kademlia类似的技术BT中叫DHT,eMule中叫Kad),和BT软件使用的Kd技术的区别在于key、value和node ID的计算方法不同。

对于BT协议,目前国内用户使用最多的BT客户端就是Bitcomet,默认情况下,无须做任何设置BitComet即可自动连接并使用DHT网络。启动软件,它会使用和TCP端口号相同的UDP端口进行DHT网络连接。任何P2P技术的改进都与版权的博奕脱不了干系,DHT网络能够引起如此注目亦是如此。

确实,BT采用DHT网络后,反盗版将变得更加困难。因为在此之前,用户进行BT下载时,必需首先连接上Tracker服务器,根据所获得的正在进行下载和上传的用户列表,才能够进行正常的文件交换。这样的话,只需封禁掉提供Tracker服务的网站,便可以截断盗版传播的途径。DHT网络则不同,由于此时互联网中任何一个运行BT客户端的用户都可以作为DHT网络中的节点,因此即使封禁掉那些提供Tracker服务的网站,用户还是能够通过全球范围的逻辑DHT网络分享文件,反盗版就无从谈起。除非让上的人都不上网,或宣布使用BT软件为重罪。但技术从来都是一把双刃剑。在批判BT助长盗版气焰的同时,我们也应该看到,BT也正在日渐成为合法作品传播的途径。由于无法承受超量流量的访问,一些免费和共享软件如Foobar2000等)开始采用BT方式分发型的合法软件——Linux系统,更是将BT作为主要的分发渠道。

在eMule协议中也有使用,常把它叫做KAD,只不过具体实现的协议有所不同。Kad网络的主要的目标是做到不需要服务器和改善可量测性。相对于传统的ed2k服务器只能处理一定数量的使用者(我们在服务器列表也都看到了,每个服务器都有最多人数限制),而且如果服务器连接人数过多,还会严重的的拖垮网络。传统的ed2k网络需要服务器支持作为中转和存储hash列表信息,kad可以不通过服务器同样完成ed2k网络的一切功能。Kad需要UDP端口的支持,之后Emule会自动按照客户端的要求,来判断它能否自由连线,然后同样也会分配一个id,这个过程和ed2k的高id和低id检查很像,不过这个id所代表的意义不同于ed2k网络,它代表一个是否“ly”的状态。

Kad能够自我组织,并且自我调节最佳的使用者数量以及他们的连接效果。因此,它更能使网络的损失达到最小。由于具备了以上所叙述的功能,Kad也被称之为Serverless network无服务器网络)。虽然目前一直处于开发阶段(alpha stage) 。通过进行Kad关键字搜寻,任何人可以在文件分享网络中寻找资料。没有任何中央服务器储存文件索引,这项工作是平均由所有客户端担当:拥有要分享的文件的枝节点,会先处理文件的内容,并从内容计算出一组杂凑Hash值,这组值将会在分享网络中辨识这个文件。kad网络首先给每个客户分配一个唯一的ID值,然后对不同的ID值进行异或来得到两个客户之间的“距离”,kad会维护一个桶,“距离”越近的用户桶里的数量会越多,kad定期对桶里的用户进行清理,以保持其有效性。

对于文件和用户eMule协议会有两个这样的结构,可以通过kad来查找文件和文件相关的用户信息;同样为了考虑冗余的问题,kad会将其自身的信息复制一份给“距离”它最近的一定数量的用户,这样就算在它下线后,这些信息也不会丢失。Kad本身有一个nodes.dat文件,也叫做节点文件,这里面存放了我们在Kad网络中的邻居节点,我们都是通过这些节点来进入Kad网络的,相当于Bt下载中通过router来加入DHT网络。

注:在eMule协议具体的实现过程中,采用的ID是28bit。例如:找到用户小则是通过将用户id异或的方式,两个id的二进位异或值决定他们之间的逻辑距离,如00距离0要比距离00近。那么当一个用户加入kad后,首先通过一个已知的用户找到一批用户的id和ip地址和端口。当该用户要寻找一个特定用户A的时候,该用户先询问几个已知的逻辑距离较A较近的用户,如B用户,C用户,D用户,B,C,D会告诉该用户他们知道的更加近的用户的id和ip地址和端口,同理类推,这个用户最终就能找到A。所以寻找的次数会在logN数量级,这里N代表询问的人数。

最令人遗憾的是BT和eMule中的DHT算法无法互通和兼容!

注:在Kad网络中,系统存储的数据以对形式存放。在BT的DHT实现中,其key值为torrent文件的info_hash串,其value值则和torrent文件有密切关系。

相关内容