Kademlia 密钥用于标识节点和数据是什么意思?
What does it mean by Kademlia keys are used to identify nodes as well as data?
好的,我最近一直在阅读 articles and the paper 关于 Kademlia 的内容,以实现一个使用 kademlia dht 算法的简单 p2p 程序。那些论文说,Kademlia 节点中的那些 160 位密钥用于 识别两个节点 (节点 ID)和 数据 (哪个以元组的形式存储)。
我对 'both' 部分感到很困惑。
据我了解,Kademlia 二叉树中的每个节点都唯一地代表一个客户端(IP、端口),每个客户端都持有一个文件列表。
这是我理解的大致流程。
- 客户端 (.exe) 启动
- 创建节点组件
- 新创建的节点加入网络(引导)
- 发送find_node(filehash)到k-最近的节点
- 假设哈希是由名为 file1.txt
的哈希文件二进制文件生成的
- 每个接收到的节点在其不同的散列table中找到查询的文件散列
- 比如说,一个包含文件列表的哈希映射(文件哈希、文件位置)
- 重复步骤 4,5 直到找到节点(同时所有关联节点都在更新桶)
这个流程看起来还行吧?
另外,Kademlia的bootstrapping方法也让我很困惑。
创建节点时(用户执行程序),它似乎使用引导节点来填充存储桶。但是什么是引导节点?是不是另一个进程总是运行?如果引导节点关闭怎么办?
谁能帮助我更好地理解这个概念?
提前感谢您的帮助。
Does this flow look all right?
好像大体上是正确的,但是你的措辞不是很准确。
每个节点都有一个路由 table 用来组织它知道的邻居,还有另一个 table 用来组织其他人要求它存储的数据。节点有一个准随机 ID,用于确定它们在路由键空间中的位置。存储数据的密钥散列与任何特定节点 ID 不精确匹配,因此数据存储在 ID 最接近散列的节点上,由距离度量确定。这就是节点 ID 和密钥哈希用于两者的方式。
当您为数据(即find_value
)执行查找时,您向远程节点询问它们在路由中拥有的 k 最近邻居集 table,这将允许您找到特定目标键的 k-最近集合。相同的查询还要求远程节点 return 他们拥有的与该目标 ID 匹配的任何数据。
另一方面,当您执行 find_node
时,您只是向他们询问最近的邻居,而不是数据。这主要用于路由 table 不需要查找任何数据的维护。
这些是抽象操作,如果需要,实际实现可以将查找与数据检索分开,即首先执行 find_node
然后使用结果集执行一个或多个单独的 get
不涉及额外邻居查找的操作(类似于 store
操作)。
由于 kademlia 是基于 UDP 的,因此您不能真正提供任意 文件 ,因为这些文件很容易超过合理的 UDP 数据包大小。所以在实践中,kademlia 通常只是用作小二进制值(例如联系信息、public 键等)的散列 table。批量操作要么由其他协议从这些值引导执行,要么由 kademlia 论文中提到的操作之外的其他操作执行。
本文描述的只是路由算法的基本功能和最基本的键值存储。它是真空中的球形牛。实际实施通常需要额外的功能或解决 public 互联网上面临的安全性和可靠性问题。
But then what's bootstrapping node? Is it another process that's always running? What if the bootstrapping node gets turned off?
this question (by example of the bittorrent DHT)
中已涵盖
好的,我最近一直在阅读 articles and the paper 关于 Kademlia 的内容,以实现一个使用 kademlia dht 算法的简单 p2p 程序。那些论文说,Kademlia 节点中的那些 160 位密钥用于 识别两个节点 (节点 ID)和 数据 (哪个以元组的形式存储)。
我对 'both' 部分感到很困惑。
据我了解,Kademlia 二叉树中的每个节点都唯一地代表一个客户端(IP、端口),每个客户端都持有一个文件列表。
这是我理解的大致流程。
- 客户端 (.exe) 启动
- 创建节点组件
- 新创建的节点加入网络(引导)
- 发送find_node(filehash)到k-最近的节点
- 假设哈希是由名为 file1.txt 的哈希文件二进制文件生成的
- 每个接收到的节点在其不同的散列table中找到查询的文件散列
- 比如说,一个包含文件列表的哈希映射(文件哈希、文件位置)
- 重复步骤 4,5 直到找到节点(同时所有关联节点都在更新桶)
这个流程看起来还行吧?
另外,Kademlia的bootstrapping方法也让我很困惑。 创建节点时(用户执行程序),它似乎使用引导节点来填充存储桶。但是什么是引导节点?是不是另一个进程总是运行?如果引导节点关闭怎么办?
谁能帮助我更好地理解这个概念?
提前感谢您的帮助。
Does this flow look all right?
好像大体上是正确的,但是你的措辞不是很准确。
每个节点都有一个路由 table 用来组织它知道的邻居,还有另一个 table 用来组织其他人要求它存储的数据。节点有一个准随机 ID,用于确定它们在路由键空间中的位置。存储数据的密钥散列与任何特定节点 ID 不精确匹配,因此数据存储在 ID 最接近散列的节点上,由距离度量确定。这就是节点 ID 和密钥哈希用于两者的方式。
当您为数据(即find_value
)执行查找时,您向远程节点询问它们在路由中拥有的 k 最近邻居集 table,这将允许您找到特定目标键的 k-最近集合。相同的查询还要求远程节点 return 他们拥有的与该目标 ID 匹配的任何数据。
另一方面,当您执行 find_node
时,您只是向他们询问最近的邻居,而不是数据。这主要用于路由 table 不需要查找任何数据的维护。
这些是抽象操作,如果需要,实际实现可以将查找与数据检索分开,即首先执行 find_node
然后使用结果集执行一个或多个单独的 get
不涉及额外邻居查找的操作(类似于 store
操作)。
由于 kademlia 是基于 UDP 的,因此您不能真正提供任意 文件 ,因为这些文件很容易超过合理的 UDP 数据包大小。所以在实践中,kademlia 通常只是用作小二进制值(例如联系信息、public 键等)的散列 table。批量操作要么由其他协议从这些值引导执行,要么由 kademlia 论文中提到的操作之外的其他操作执行。
本文描述的只是路由算法的基本功能和最基本的键值存储。它是真空中的球形牛。实际实施通常需要额外的功能或解决 public 互联网上面临的安全性和可靠性问题。
But then what's bootstrapping node? Is it another process that's always running? What if the bootstrapping node gets turned off?
this question (by example of the bittorrent DHT)
中已涵盖