繁体   English   中英

DHT如何运作?

[英]How does DHT work?

我从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 ,但维基说:

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

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

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

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

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

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

由于诸如不可靠节点之类的现实限制,实际DHT实现的故障率等不提供任意长度的PUT(<uint8[]>, <uint8[]>)操作。

例:

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

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

正如您所看到的,与更通用的关联数组相比,它实际上是一个专门的非对称接口。 IP地址始终从PUT发送方的源地址派生,即无法明确设置。 并且GET返回一个列表而不是单个值,因此它实现了MultiMapMap<List> ,如果你想这样看。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM