4

我从 wiki 中获得了关于 DHT 的基本概念:

存储数据:

在 DHT 网络中,每个节点负责特定范围的key-space. 要将文件存储在 DHT 中,首先,hash the file's name to get the file's key; 其次,send a message put(key, file-content) to any node of the DHT消息将被转发到负责的节点,key该节点将存储该对(key, file-content)

获取数据:

从 DHT 获取文件时,首先对文件名进行哈希处理以获取key; 第二次向任何节点发送消息get(key),中继消息直到......

问题:

  1. 要存储文件,我们可以散列文件的名称以获取它key,但 wiki 说:

在现实世界中,密钥 k 可以是文件内容的散列而不是文件名的散列,以提供内容可寻址的存储,因此文件的重命名不会阻止用户找到它。

哈希文件的内容?我应该如何知道文件的内容?如果我已经知道文件的内容,那我为什么要在 DHT 中搜索它?

  1. 根据 wiki,每个参与节点都会腾出一些空间来存储文件。那么这是否意味着,如果我参与 DHT,我必须存储我负责的spare 10G disk space那些文件?key falls into the specific key-space

  2. 如果我确实应该腾出一些磁盘空间来存储这些文件,那么我应该如何将它们存储(key, file-content)在磁盘上?我的意思是,文件应该被安排到B-tree我的磁盘上吗?

  3. 当查询发生时,我的计算机如何响应?我假设首先检查queried key,如果在我的key-space,然后corresponding file在我的磁盘上找到 。正确的?

4

1 回答 1

1

DHT 只是一种算法。在其基础上,它提供分布式键值对 PUT 和 GET 操作。类似于在许多编程语言中发现的普通 Map 或关联数组。

由于不可信节点、故障率等现实世界的限制,实际的 DHT 实现不提供任意长度的PUT(<uint8[]>, <uint8[]>)操作。

例子:

例如,bittorrent 的 kademlia 实现提供了以下接口:

  • PUT(uint8[20], uint16)
  • GET(uint8[20]) -> List<Pair<IP, uint16>>其中列表仅代表实际数据的随机抽样子集

如您所见,与更通用的关联数组相比,它实际上是一个专门的非对称接口。IP 地址始终来自 PUT 发送者的源地址,即不能明确设置。并且 GET 返回一个列表而不是单个值,所以它实现了MultiMapor Map<List>,如果你想这样看的话。

在 bittorrent 的情况下,哈希用作内容描述符,其中拥有内容的对等方在 DHT 上宣布自己。如果有人想要文件,他们会在 DHT 上查找 IP/端口对,然后通过单独的协议联系对等方,然后下载数据。

但是 DHT 的其他用途也是可能的,即它们可以存储签名的结构化数据、类似推文的文本片段或其他任何东西。它始终取决于您的应用程序的需求。

它只是一个基本的构建块。

于 2014-11-25T10:25:58.510 回答