2017-07-26 193 views
2

给定目标ID x ... 19x,让我们考虑程序运行递归查询,建立一个表格,一旦没有更多的节点留下询问,它会发现最接近的结果节点小于8的情况。搜索给定的目标,如何扩大搜索范围?

我怎样才能扩大搜索范围,使表返回至少8个节点的任何给定的ID?

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

如果是这样,在编程方面,如何增加/减少以这种形式给出的ID“afe0 ...”?

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

+1

对* find_node *查询的响应应该包含应答者知道的K = 8个最接近的节点。所以它唯一的可能性就是少了一点,就是DHT中总共有8个节点以下,或者只能得到严重破坏实施的响应。 – Encombe

+0

是的,我同意,但我目前强化了规则,当我执行一个bep44获取请求时将节点添加到我的表中。 –

+1

好的,处理BEP44是一个不同的问题。要查看与查询节点相距最近的8个节点,可以将目标设置为查询的节点ID,但这样做有可能触发对eclipse攻击的一些保护。因此,我建议将目标设置为'(查询节点ID)异或(0x0000000C 0F0F0F0F 0F0F0F0F 0F0F0F0F 0F0F0F0F)'而不是。 – Encombe

回答

1

我认为这个问题是不平凡的,因为异或距离。你真正想要的是“好吧,你已经给了我你知道的1..N最远的节点,现在告诉我关于N + 1..M”。目前没有DHT查询。

而这个问题并没有映射到任何单一的查询,你可能会问你的结果集单个节点。

我跑了一点点的模拟测试“问其自己的节点ID 8日,最远的节点”的方针和这里的结果

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,而不是我们不知道的下一个最接近的节点然而。

正确的解决方案是构建一个临时路由表,以便它的主桶覆盖您感兴趣的目标键,然后逐渐填充主桶和其邻居(并根据需要分割它们),直到您拥有了您有足够的符合BEP-44标准的触点。

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

+0

的目标ID来阻止。我看到问题更多的是我想要扫描的问题,耗尽更多节点,构建更强大的桌子的看法。因为现在,对于多个相同的顺序查询(没有在//中尝试),距离(目标,最接近的[0])非常不稳定。也许,把它降低到一个门槛,我可以给我更稳定的结果。但要耗尽更多的节点,我需要问一个不同的ID,否则使用相同的引导(播种机),我应该收到相同的结果(+/-少数节点)。所以我需要让它走向不同的方向,对吧? –

+0

我对不起,我不是很精确,它的小盒子。 –

+0

没关系,我会简单地得到最接近的,测试写它,然后如果我没有足够的,我会在目标上应用一个转变,以目标一组新的节点,建立其表,测试编写最接近的新节点,重复直到我正确写下了第n个冗余节点。在阅读我应该以同样的方式进行。 –