9

最近看了一篇关于 Kademlia 协议的文档,试图去理解这个协议,但我还是有一个疑问:为什么一个节点知道自己的 ID 而不是 ip 或端口就必须找到另一个节点?为什么他有ID而他不知道IP或端口,他从哪里得到ID?我认为两个不同节点之间的“距离”不是路由距离或真实距离,它只是一个虚拟距离,可以通过算法快速找到节点,对吗?

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

4

2 回答 2

20

正如 cHao 所说,网络的分布式特性意味着节点需要将他们的 ID 和他们的联系方式发布给他们与之交谈的其他节点。没有将 ID 映射到联系信息的中心位置,因此每个节点必须在其自己的路由表中为网络上的节点子集保留此映射。

Kademlia 路由表的结构使得节点对靠近它们的网络有详细的了解,而在更远的地方则以指数方式减少知识。

使用按位异或来衡量 ID 之间的名义距离具有以下优点:对于给定的目标 ID,没有两个 ID 到目标的距离可以相同。

想象一个简单的例子,其中 ID 在 00 到 63 的范围内。如果 Kademlia 使用例如纯数学差异作为距离的度量,15 和 35 到 25 的距离将是相同的 - 两者的距离都是 10。使用 XOR, 15 和 25 之间的距离是 22,而 25 和 35 之间的距离是 58。

这样,可以明确计算出与目标 ID 最接近的 k 个 ID 组。

常数 k 在 Kademlia 中有几个用途,但它主要是复制因子。换句话说,一条数据存储在离数据ID最近的k个节点上。

查找过程旨在返回一组 k 节点(在每个节点上存储数据之前)或返回单个数据(从在查找迭代期间保存它的第一个节点)。

因此,纯 Kademlia 并不最适合仅查找单个节点,因此我不确定您的问题是否过于相关。如果您确实想使用 Kademlia 查找单个节点,则可能值得修改查找过程以在任何节点返回目标节点的联系详细信息时尽早完成(与查找提前完成的方式相同,如果目标值过程中发现)。

于 2012-02-16T11:30:27.750 回答
9

由于网络是分布式的,根据定义,没有一个ID->地址映射的主表。节点不必(通常也不必)知道所有其他节点。“找到”一个节点的过程基本上是询问与目标“最接近”的已知节点,而不是直接询问目标节点,而是询问哪些节点距离目标更近。该查询的结果为您提供下一组要查询的节点,并且该过程重复 - 因为节点将返回比它更接近的结果,所以每次迭代都倾向于找到越来越接近目标的节点,直到您最终到达一个可以说“哦,节点 X?他就在那边”的节点。

至少我是这么理解的。

于 2012-02-16T05:40:24.137 回答