2017-07-26 127 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個冗餘節點。在閱讀我應該以同樣的方式進行。 –