如何理解Kademlia(KAD)协议?

10

最近,我阅读了一份Kademlia协议的文档,我试图理解这个协议,但仍有一些问题: 为什么一个节点必须在知道其ID但不知道IP或端口时找到另一个节点? 他如何拥有ID而不知道IP或端口,他从哪里获得ID? 我认为两个不同节点之间的“距离”不是路由距离或真实距离,它只是一种虚拟距离,可以用算法快速找到节点,对吗?

也许我的英语不是很清楚,因为英语不是我的母语,但如果需要,我会尽力表达清楚。 非常感谢!


2
请查看http://gleamly.com/article/introduction-kademlia-dht-how-it-works。 - Joshua Kissoon
2个回答

21
如cHao所说,网络的分布性意味着节点需要向其它节点发布其ID和联系方式。没有一个中心地带来映射ID和联系信息,因此每个节点必须为其路由表中网络上的一些节点保留此映射。
Kademlia路由表的结构使得节点能够详细了解靠近它们的网络,并且对远离节点的网络有指数级减少的了解。
使用按位异或作为衡量ID之间虚拟距离的方法具有优势,因为对于给定的目标ID,没有两个ID到目标的距离是相同的。
想象一个简单的例子,其中ID在00至63范围内。如果Kademlia例如使用纯数学差异作为距离的度量,则15和35将是到25相同的距离-两者都将具有10的距离。使用XOR,15和25之间的距离是22,而25和35之间的距离是58。
通过这种方式,k个最接近目标ID的ID组可以明确计算出来。
常数k在Kademlia中有几个用途,但主要用于复制因子。换句话说,数据存储在与数据ID最接近的k个节点上。
查找过程旨在返回一组k个节点(在将数据存储在每个节点上之前)或返回单个数据(在查找迭代期间持有它的第一个节点)。
由于这一点,纯Kademlia并不适合仅查找单个节点,因此我不确定您问题中的这部分是否相关。如果您确实想使用Kademlia来查找单个节点,则可能值得修改查找过程,以便在任何节点返回目标节点的联系详细信息时立即结束查找过程(方式与在过程中找到目标值时查找过程立即结束相同)。

9
由于网络是分布式的,所以根据定义,没有一个主表格来映射ID->地址。节点不必(通常也不会)知道其他所有节点。查找节点的过程基本上是向已知的“最接近”目标的节点询问,而不是直接询问目标节点,而是询问哪些节点更接近目标。查询的结果给出了下一组要查询的节点,并且该过程重复执行——因为节点返回的结果比它自己更接近,所以每次迭代往往会找到越来越靠近目标的节点,直到最终达到一个可以说“哦,节点X?它就在那边”的节点。
至少这就是我对它的理解。

1
谢谢您的快速回复,但我想知道为什么我必须找到节点X,我从哪里得到X的ID或名称?而两个节点之间的“距离”是什么意思?是因为X有我想要的文件吗? - rock_cloud
据我所了解,两个节点之间的“距离”就是它们ID的异或值。节点ID和“值”的ID(即内容、文件、查找信息等)共享同一个键空间,找到与关键字“最近”的节点之一的重点是让它们存储信息。查找值的方法与查找节点的方法相同,只不过如果节点具有对应ID的值,则会响应该值而不是节点列表。 - cHao
所以距离只是用于快速搜索算法的一个值。你的回答很有帮助,谢谢! - rock_cloud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接