我已经在这个主题上回顾了许多文档,但是有些东西不完全清楚。例如位洪流文件(http://www.bittorrent.org/beps/bep_0005.html)指出在洪流kademlia路由表上实现find节点
路由表被细分成“桶”,每个覆盖的空间的一部分 。一个空表有一个ID为 min = 0,max = 2^160的桶。当具有ID“N”的节点插入到 表中时,它被放置在具有最大= N <最大的桶内。 空表只有一个存储桶,因此任何节点都必须适合它。每个 存储桶只能存放八个K节点,然后才能变为“满”。 当一个桶充满已知的好节点时,除非我们自己的节点ID落入该桶的范围内,否则不会再添加更多节点 。在那个 的情况下,该桶被两个新桶替换,每个桶都有旧桶的 范围的一半,旧桶的节点分配到两个新桶中的 。对于只有一个 存储桶的新表格,整个存储桶始终会分成两个新存储桶,分别覆盖 ,范围为0..2^159和2^159..2^160。
它与其他有关kademlia路由表的文档有所不同,其中桶根据节点id的位前缀排列,但还有另一个令人困惑的事情。当我们回复“查找节点”请求时,我们必须使用XOR操作找到8个最接近请求节点的节点。我看到一些实现只是通过执行异或操作的路由表中的每个项目,因此找到了8个最接近的项目。在我看来,CPU太浪费了。
一切都已在桶中。即使我们使用torrent文档系统的建议,我们也可以更快地找到可能包含请求节点ID的桶,只需枚举桶并检查桶上的最小和最大数量即可。然后潜在的那个桶应该包含关闭的节点,但它们是最接近最近的节点,而不是XOR最近的节点(据我所知),这有点不同,但有点相似。
我跑了一个简单的测试,使用从0到99的数字,我想找到8个XOR最接近的数字,他们在寻找的数字附近但不是靠近它。现在,考虑我们的桶,我想有可能桶中的所有节点ID都是最小的异常。所以,举例来说,如果我们拿这个桶,从左边和右边一个拿一个,然后搜索XOR最接近的节点id,我们将找到我们正在寻找的东西,并且没有必要通过路由中的所有节点表。
我是对的还是我错过了什么?
经过一些测试我发现我以前的答案实际上是不正确的,更新它以反映正确和经过测试的算法。 – the8472