我已经审查了一些关于此主题的文件,但有些不太清楚。例如BitTorrent文档(http://www.bittorrent.org/beps/bep_0005.html)中提到:
路由表被细分为“桶”,每个桶覆盖空间的一部分。一个空表只有一个ID范围为 min=0,max=2^160 的桶。当插入一个ID为“N”的节点到表中时,它被放置在具有min ≤ N < max的桶内。每个桶最多只能容纳K个节点,目前为8个,超过则为“满”。当桶中存在已知良好节点时,不允许添加更多节点,除非我们自己的节点ID落在桶的范围之内。在这种情况下,该桶将被替换为两个新的桶,每个桶的大小是旧桶的一半,并且来自旧桶的节点将分配给这两个新桶。对于只有一个桶的新表格,满桶总是分裂成涵盖范围0..2^159和2^159..2^160的两个新桶。
这与其他关于Kademlia路由表的文件有些不同,其中桶按照节点ID的位前缀排序,但还有另一件令人困惑的事情。当我们回复“查找节点”请求时,我们必须使用XOR操作找到8个最接近请求节点的节点。我看到一些实现只是遍历路由表中的每个项执行XOR操作,从而查找8个最接近的项。这对CPU来说似乎太浪费了。
所有东西都已经在桶里了。即使我们使用BitTorrent文档建议的系统,我们也可以更快地找到可能包含所需节点ID的桶,只需枚举桶并检查其上的最小和最大数字即可。然后,该桶可能应该包含最接近的节点,但它们是值最接近的节点而不是XOR最接近的节点(据我理解),尽管两者有些相似但还是有些不同。
我运行了一个简单的测试,使用从0到99的数字,想要找到8个XOR最接近的数字,它们靠近所寻找的数字,但不是紧挨着的。现在,考虑到我们的桶,我猜所有桶中的节点ID都是最接近的,只有少数例外。因此,例如,如果我们取出这个桶中的左侧和右侧各一个,并搜索XOR最接近的节点ID,我们将找到我们要查找的内容,没有必要遍历路由表中的所有节点。
我是正确的还是遗漏了什么?
路由表被细分为“桶”,每个桶覆盖空间的一部分。一个空表只有一个ID范围为 min=0,max=2^160 的桶。当插入一个ID为“N”的节点到表中时,它被放置在具有min ≤ N < max的桶内。每个桶最多只能容纳K个节点,目前为8个,超过则为“满”。当桶中存在已知良好节点时,不允许添加更多节点,除非我们自己的节点ID落在桶的范围之内。在这种情况下,该桶将被替换为两个新的桶,每个桶的大小是旧桶的一半,并且来自旧桶的节点将分配给这两个新桶。对于只有一个桶的新表格,满桶总是分裂成涵盖范围0..2^159和2^159..2^160的两个新桶。
这与其他关于Kademlia路由表的文件有些不同,其中桶按照节点ID的位前缀排序,但还有另一件令人困惑的事情。当我们回复“查找节点”请求时,我们必须使用XOR操作找到8个最接近请求节点的节点。我看到一些实现只是遍历路由表中的每个项执行XOR操作,从而查找8个最接近的项。这对CPU来说似乎太浪费了。
所有东西都已经在桶里了。即使我们使用BitTorrent文档建议的系统,我们也可以更快地找到可能包含所需节点ID的桶,只需枚举桶并检查其上的最小和最大数字即可。然后,该桶可能应该包含最接近的节点,但它们是值最接近的节点而不是XOR最接近的节点(据我理解),尽管两者有些相似但还是有些不同。
我运行了一个简单的测试,使用从0到99的数字,想要找到8个XOR最接近的数字,它们靠近所寻找的数字,但不是紧挨着的。现在,考虑到我们的桶,我猜所有桶中的节点ID都是最接近的,只有少数例外。因此,例如,如果我们取出这个桶中的左侧和右侧各一个,并搜索XOR最接近的节点ID,我们将找到我们要查找的内容,没有必要遍历路由表中的所有节点。
我是正确的还是遗漏了什么?