搜索给定目标,如何扩大搜索范围?

时间:2017-07-26 08:55:50

标签: bittorrent dht kademlia

给定目标id x ... 19x,让我们考虑程序运行递归查询,构建一个表,一旦不再有节点进行询问,就会发现最接近的结果节点小于8的情况。

如何扩大搜索范围,以便表格为任何给定的ID返回至少8个节点?

我可以简单地获取目标ID(信息哈希)并搜索info_hash + 1 / info_hash-1吗?

如果是这样,在编程术语中,如何增加/减少以这种形式给出的id" afe0 ......" ?

如果没有,可以做些什么来达到那个数量的冗余节点?

1 个答案:

答案 0 :(得分:1)

我认为由于XOR距离问题,这个问题非常重要。你真正想要的是"好吧,你已经给了我你知道的1..N最远的节点,现在告诉我关于N + 1..M"。没有DHT查询。

此问题不会映射到您可以从结果集中询问单个节点的任何单个查询。

我运行了一些模拟来测试"向第8个最远的节点询问它自己的节点ID"方法和结果

t:1FBD4155 B667C234 90E0B021 FF837239 38FF5A2C
c:1FB6AC2D CA183942 6BE2B523 2BD998F7 0ACB59B2 d:000BED78 7C7FFB76 FB020502 D45AEACE 3234039E
c:1FADC99B D3CAC04B 9468220D D779F063 DB605C52 d:001088CE 65AD027F 0488922C 28FA825A E39F067E
c:1FAFDD9A 74CB2535 5256CF21 A9B0AB3A 7D6752D3 d:00129CCF C2ACE701 C2B67F00 5633D903 459808FF
c:1FA9B8DA 9940F605 272E0B72 8057B89B 259E9D6D d:0014F98F 2F273431 B7CEBB53 7FD4CAA2 1D61C741
c:1FA7B21D D2183104 3BC1CEC5 968FB208 A3B64A34 d:001AF348 647FF330 AB217EE4 690CC031 9B491018
c:1FA132B5 9F044131 A4C2FB18 11727030 D5912386 d:001C73E0 29638305 34224B39 EEF10209 ED6E79AA
c:1FA06A42 09653EDB CB913184 6C1FB8DD 39CD3661 d:001D2B17 BF02FCEF 5B7181A5 939CCAE4 01326C4D
c:1FA30C2F 7FA17089 BA5C85CA CDE555A1 74F6AD19 d:001E4D7A C9C6B2BD 2ABC35EB 32662798 4C09F735
expecting to find next
e:1F9DD0D4 B21795DC 82298E53 E594D647 0353F0C3 d:00209181 047057E8 12C93E72 1A17A47E 3BACAAEF
asking 1FA30C2F 7FA17089 BA5C85CA CDE555A1 74F6AD19 with its own ID
it returned
n:1FA30C2F 7FA17089 BA5C85CA CDE555A1 74F6AD19 d:001E4D7A C9C6B2BD 2ABC35EB 32662798 4C09F735
n:1FA132B5 9F044131 A4C2FB18 11727030 D5912386 d:001C73E0 29638305 34224B39 EEF10209 ED6E79AA
n:1FA06A42 09653EDB CB913184 6C1FB8DD 39CD3661 d:001D2B17 BF02FCEF 5B7181A5 939CCAE4 01326C4D
n:1FA7B21D D2183104 3BC1CEC5 968FB208 A3B64A34 d:001AF348 647FF330 AB217EE4 690CC031 9B491018
n:1FA9B8DA 9940F605 272E0B72 8057B89B 259E9D6D d:0014F98F 2F273431 B7CEBB53 7FD4CAA2 1D61C741
n:1FAFDD9A 74CB2535 5256CF21 A9B0AB3A 7D6752D3 d:00129CCF C2ACE701 C2B67F00 5633D903 459808FF
n:1FADC99B D3CAC04B 9468220D D779F063 DB605C52 d:001088CE 65AD027F 0488922C 28FA825A E39F067E
n:1FB6AC2D CA183942 6BE2B523 2BD998F7 0ACB59B2 d:000BED78 7C7FFB76 FB020502 D45AEACE 3234039E
n:1F8248F8 8CEA3B04 5196FFEE F9B4F6C1 3B3B2707 d:003F09AD 3A8DF930 C1764FCF 063784F8 03C47D2B
n:1F8F0556 D1B0BCBF 42D54567 825058D8 155BA5E4 d:00324403 67D77E8B D235F546 7DD32AE1 2DA4FFC8
n:1F8D9186 86C1AEFE A2C24C73 59F5A2F5 D4C2FA5E d:0030D0D3 30A66CCA 3222FC52 A676D0CC EC3DA072
n:1F8C71EF C8B0A12E 40B5233C 680D2373 A3D730A1 d:003130BA 7ED7631A D055931D 978E514A 9B286A8D
n:1F93C42A BA85A26C 184185B1 A79A6E60 253DBC2D d:002E857F 0CE26058 88A13590 58191C59 1DC2E601
n:1F96B634 A043FC17 616A549F F521E9F9 4F5600FD d:002BF761 16243E23 F18AE4BE 0AA29BC0 77A95AD1
n:1F953B74 8977DCE8 8636338B A2EC4ED2 14A83E35 d:00287A21 3F101EDC 16D683AA 5D6F3CEB 2C576419
n:1F9A39EF 59885496 ED794C02 49545D6C 92565959 d:002778BA EFEF96A2 7D99FC23 B6D72F55 AAA90375

65 failures in 1000 runs

请注意,这是查询节点返回16个联系人的时间。如果它仅返回8,则故障率变为~20%。而且这种失败率不是一个不相关的事件,它是由于共享前缀的工作方式而产生的集体行为,换句话说,只查询最接近的8个集合的其他节点可能不会显着提高机会。

很明显,问题在于目标自身的ID可能会被定位,以至于它恰好考虑了你已经访问过的所有那些节点,而不是接近自己的id而不是下一个我们不在的# 39;不知道。

正确的解决方案是构建一个临时路由表,使其家庭存储桶覆盖您感兴趣的目标密钥,然后逐步填充主存储桶及其邻居(并在需要时拆分它们),直到您拥有了有足够的符合BEP-44标准的联系人。

这是一种相当复杂的方法。通常回溯并询问您尚未询问目标ID的联系人应该为您提供超过8个最接近的节点,因为许多实现只分发超过8个联系人。