4

我熟悉分布式哈希表 (DHT) 的工作原理。是否可以编写将数据存储到现有 DHT(例如 Kademlia 或 Mainline DHT)的程序?是否有一个简单的“Hello World”类型的程序可以显示最简单的方法?

4

2 回答 2

4

DHT 最好的问候世界是'ping'在 Bittorrent 的 DHT 上发送一个引导节点。步骤是:

  1. KRPC PING消息进行 Bencode 。
  2. 通过UDP将其发送引导节点
  3. 等待回复。

这些是我在开始实施自己的 DHT 之前刚刚采取的步骤。

于 2012-03-09T14:26:25.490 回答
3

这个问题可能已经过时了,但无论如何。

如前所述,对现有 DHT 说“Hello”的最简单方法是向ping其中一个 DHT 节点发送消息。让我们考虑基于 Kademlia 的 Mainline DHT (MDHT)。

router.bittorrent.com在 port的地址上有一个引导服务器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 协议的更多信息,请参阅本文档。(请注意,该协议与原始 Kademlia 协议略有不同。)

于 2014-01-19T17:10:43.010 回答