2011-05-25 93 views
4

我熟悉分佈式哈希表(DHT)的工作原理。是否可以編寫將數據存儲到現有DHT的程序(例如Kademlia或Mainline DHT)?有沒有一個簡單的'Hello World'類型的程序可以顯示最簡單的方法來做到這一點?現有DHT的Hello World

回答

4

對於DHT來說,最好的hello world將發送Bittorrent的DHT上的'ping'到引導節點。步驟如下:

  1. Bencode a KRPCPING消息。
  2. Send它在UDPbootstrap node
  3. Wait獲得答覆。

這些是我在開始研究自己的DHT實現之前所採取的步驟。

2

問題可能已經過時,但無論如何。

如上所述,對現有DHT說「你好」的最簡單方法是發送一個ping消息給其中一個DHT節點。讓我們考慮基於Kademlia的Mainline DHT(MDHT)。

端口6881上有地址爲router.bittorrent.com的引導程序服務器。您可以將此服務器視爲永久在線的常規DHT節點。另外,您可以使用另一個節點,例如本地運行使用DHT的torrent客戶端。

我寫一個小例子在Python:

import bencode 
import random 
import socket 


# Generate a 160-bit (20-byte) random node ID. 
my_id = ''.join([chr(random.randint(0, 255)) for _ in range(20)]) 

# Create ping query and bencode it. 
# "'y': 'q'" is for "query". 
# "'t': '0f'" is a transaction ID which will be echoed in the response. 
# "'q': 'ping'" is a query type. 
# "'a': {'id': my_id}" is arguments. In this case there is only one argument - 
# our node ID. 
ping_query = {'y': 'q', 
       't': '0f', 
       'q': 'ping', 
       'a': {'id': my_id}} 
ping_query_bencoded = bencode.bencode(ping_query) 

# Send a datagram to a server and recieve a response. 
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
s.sendto(ping_query_bencoded, 
     (socket.gethostbyname('router.bittorrent.com'), 6881)) 
r = s.recvfrom(1024) 

ping_response = bencode.bdecode(r[0]) 

print(ping_response) 

我使用bencode模塊bencode和bdecode消息。

有關Mainline DHT協議的更多信息可以在this document。 (請注意,該協議與原Kademlia協議略有不同。)