给定目标 id x...19x,让我们考虑程序运行递归查询,构建一个表,一旦没有更多节点可供查询,它会发现最近的结果节点小于 8 个的情况。
我怎样才能扩大搜索范围,以便表为任何给定的 id 返回至少 8 个节点?
我可以简单地获取目标 ID(信息哈希)并搜索 info_hash+1 / info_hash-1 吗?
如果是这样,在编程方面,如何增加/减少以“afe0 ...”形式给出的id?
如果没有,可以做些什么来达到冗余节点的数量?
给定目标 id x...19x,让我们考虑程序运行递归查询,构建一个表,一旦没有更多节点可供查询,它会发现最近的结果节点小于 8 个的情况。
我怎样才能扩大搜索范围,以便表为任何给定的 id 返回至少 8 个节点?
我可以简单地获取目标 ID(信息哈希)并搜索 info_hash+1 / info_hash-1 吗?
如果是这样,在编程方面,如何增加/减少以“afe0 ...”形式给出的id?
如果没有,可以做些什么来达到冗余节点的数量?
我认为由于 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-closest 集合的其他节点可能不会显着提高机会。
很明显,问题在于目标自己的 ID 可能被定位,因此它碰巧认为您已经访问过的所有节点都更接近于它自己的 id,而不是我们还不知道的下一个最近的节点。
正确的解决方案是构建一个有组织的临时路由表,使其主存储桶覆盖您感兴趣的目标键,然后逐步填充主存储桶及其邻居(并在需要时拆分它们),直到您拥有足够的 BEP -44 兼容的联系人。
这是一个相当复杂的方法。通常回溯和询问您尚未询问目标 ID 的联系人应该为您提供超过 8 个最近的节点,因为许多实现只是分发超过 8 个联系人。