我熟悉分布式哈希表(DHT)的工作原理。是否可以编写将数据存储到现有DHT的程序(例如Kademlia或Mainline DHT)?有一个简单的'Hello World'类型的程序会显示最简单的方法吗?
答案 0 :(得分:4)
DHT的最佳hello世界是将Bittorrent的DHT上的'ping'
发送到引导节点。步骤是:
答案 1 :(得分:2)
问题可能已经过时但无论如何。
如前所述,对现有DHT说“Hello”的最简单方法是向DHT节点之一发送ping
消息。让我们考虑基于Kademlia的Mainline DHT(MDHT)。
端口router.bittorrent.com
上的地址6881
上有一个引导服务器。您可以将此服务器视为永久在线的常规DHT节点。此外,您可以使用另一个节点,例如本地运行的torrent客户端,它使用DHT。
我在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
模块来对邮件进行编码和编码。
有关Mainline DHT协议的更多信息可以在this document中。 (请注意,该协议与原始Kademlia协议略有不同。)