DHT是如何工作的?

4
我从维基百科上了解到DHT的基本概念:
存储数据:
在DHT网络中,每个节点都负责一个特定范围的键空间。要将文件存储在DHT中,首先需要将文件名哈希为文件的键;其次,向DHT的任何节点发送消息put(key, file-content),该消息将被转发到负责key的节点,并且该节点将存储对(key, file-content)。
获取数据:
从DHT获取文件时,首先将文件名哈希为key;其次,发送消息get(key)到任何节点,将消息中继直到...
问题:
1. 要存储文件,我们可以哈希文件名以获得其键,但维基百科说:
“在现实世界中,密钥k可能是文件内容的哈希,而不是文件名称的哈希,以提供内容寻址存储,这样文件的重命名不会阻止用户找到它。”
哈希文件内容?我怎么知道文件的内容?如果我已经知道文件的内容,那么为什么要在DHT中搜索它?
2. 根据维基百科的说法,每个参与节点都会留出一些空间来存储文件。那么这是否意味着,如果我参与DHT,我必须为那些落入我负责的特定键空间的文件留出10G磁盘空间?
3. 如果确实需要为这些文件留出一些磁盘空间,那么我应该如何在磁盘上存储这些(key, file-content)?我的意思是,文件是否应该被排列成B树或其他什么形式?
4. 当查询发生时,我的计算机如何响应?我假设,首先检查查询的键,如果在我的键空间中,则在我的磁盘上找到相应的文件。对吗?

2
考虑将您的帖子分开发布。1. 您不应该知道文件的内容,只需要知道哈希值。.torrent元文件还包含了种子中每个文件(实际上是每个片段)的哈希值。 - Dennis
我花了整整4个小时,从晚上到清晨,但我还是无法理解这件事。我猜DHT中存储的值是IP:端口对,具有双语义转发:首先找到响应另一台计算机地址存储的计算机,第二步是定位文件本身。太复杂了... - Brian Cannard
1个回答

3
一个DHT只是一个算法。在其基础上,它提供了分布式键值PUT和GET操作。类似于许多编程语言中普通的Map或关联数组。
由于现实世界的限制,例如不可信节点、故障率等,实际的DHT实现并不提供任意长度的PUT(<uint8[]>, <uint8[]>)操作。
例如,kademlia实现的bittorrent就提供了以下接口:
- PUT(uint8[20], uint16) - GET(uint8[20]) -> List<Pair<IP, uint16>> 其中列表仅表示实际数据的随机采样子集
正如您所看到的,与更通用的关联数组相比,它实际上是一种专门的非对称接口。IP地址始终来自PUT发送方的源地址,即不能显式设置。而GET返回列表而不是单个值,因此它实现了MultiMap或Map<List>,如果您想这样看的话。
在bittorrent的情况下,哈希用作内容描述符,具有内容的对等方会在DHT上宣布自己。如果有人想要文件,则在DHT上查找IP/Port对,然后通过单独的协议联系对等方,然后下载数据。
但是,DHT的其他用途也是可能的,例如它们可以存储签名、结构化数据、类似推文的文本片段或任何内容。这总是取决于您应用程序的需求。
它只是一个基本的构建块。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接