在进行 bep44 实现时,我使用定义的 kademlia 算法来找到给定哈希 id 的最近的好节点。
使用我的程序,我go run main.go -put "Hello World!" -kname mykey -salt foobar2 -b public
得到了存储超过一百个节点的值(好)。
现在,当我连续多次运行它时,put 请求写入的 ip 集相交很差。
这是一个问题,因为当我尝试执行 get 请求时,查询的 ips 集与 put 集不相交,因此找不到该值。
在我的测试中,我使用公共 dht 引导节点
"router.utorrent.com:6881",
"router.bittorrent.com:6881",
"dht.transmissionbt.com:6881",
当我查询节点时,我选择了 8 个最近的节点 ( nodes := s.ClosestGoodNodes(8, msg.InfoHash())
),在递归遍历后,它们通常最终出现在一个 ~1K 查询列表中。
据我了解,考虑到表的状态,在 dht 表中存储信息哈希的地址是确定性的。当我进行连续查询时,我希望表格确实会改变,但不会改变那么多。
存储节点集不相交是如何发生的?