p2p - 在 Pastry P2P 网络中的节点创建路由表

标签 p2p dht

这个问题是关于在基于 Pastry 的 p2p 网络中的节点上创建路由表。

我正在尝试在单个 JVM 中模拟这种路由表创建方案。我似乎无法理解这些路由表是如何从第一个节点的加入点创建的。 我有 N 个独立节点,每个节点都有一个作为 SHA-1 哈希生成的 160 位 nodeId 和一个函数来确定这些节点之间的接近度。假设第一个节点启动环并加入它。协议(protocol)说这个节点应该在这个时候建立它的路由表。但是此时我在环中没有任何其他节点,那么它是如何开始创建它的路由表的呢?

当第 2 个节点希望加入环时,它向第 1 个节点发送加入消息(包含其 nodeID),该消息以跳数形式传递给第 2 个节点最近的可用邻居,该邻居已经存在于环中。这些跃点有助于为这个新的第二个节点创建路由表条目。同样,在没有足够数量的节点的情况下,如何创建所有这些条目?

我刚刚开始查看 FreePastry 实现以获取这些答案,但目前似乎不是很明显。如果有人可以在这里提供一些指示,那也会有很大的帮助。

最佳答案

无论怎么想,我对 Pastry 的理解都不完整,但足以构建一个或多或少的算法工作版本。也就是说,据我所知,我的实现功能正常。

回答你的第一个问题:

The protocol says that this [first] node should have had its routing tables set up at this time. But I do not have any other nodes in the ring at this point, so how does it even begin to create its routing tables?

我通过首先创建节点及其状态/路由表解决了这个问题。考虑一下,路由表只是有关网络中其他节点的信息。因为这是网络中唯一的节点,所以路由表是空的。我假设您有一些创建空路由表的方法?

回答你的第二个问题:

When the 2nd node wishes to join the ring, it sends a Join message(containing its nodeID) to the 1st node, which it passes around in hops to the closest available neighbor for this 2nd node, already existing in the ring. These hops contribute to the creation of routing table entries for this new 2nd node. Again, in the absence of sufficient number of nodes, how do all these entries get created?

你应该再看看the paper (PDF 警告!)描述 Pastry;它很好地解释了节点加入和退出集群的过程。

如果没记错的话,第二个节点发送的消息不仅包含它的节点 ID,而且实际上使用它的节点 ID 作为消息的键。消息的路由方式与网络中的任何其他消息一样,这可确保它快速到达 ID 最接近新加入节点 ID 的节点。消息经过的每个节点都将它们的状态表发送到新加入的节点,它用它来填充其状态表。本文解释了一些深入的逻辑,在使用信息填充状态表时考虑了信息的来源,我认为这种方式旨在降低计算成本,但在我的实现中,我忽略了这一点,因为它的实现成本会更高,而不是更低。

但是,要具体回答您的问题:第二个节点将向第一个节点发送加入消息。第一个节点将其状态表(空)发送到第二个节点。第二个节点将状态表的发送者(第一个节点)添加到它的状态表,然后将接收到的状态表中的适当节点添加到它自己的状态表(在这种情况下没有节点)。第一个节点将消息转发到 ID 更接近第二个节点 ID 的节点,但不存在这样的节点,因此消息被认为是“已传递”,并且两个节点都被认为是此时参与网络。

如果第三个节点加入并将加入消息路由到第二个节点,第二个节点将向第三个节点发送其状态表。然后,假设第三个节点的 ID 更接近第一个节点的 ID,第二个节点会将消息转发给第一个节点,第一个节点会将其状态表发送给第三个节点。第三个节点将根据这些接收到的状态表构建其状态表,此时它被认为参与了网络。

希望对您有所帮助。

关于p2p - 在 Pastry P2P 网络中的节点创建路由表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12852834/

相关文章:

p2p - 如何更新 DHT 中的条目

linux - 本地P2P库/协议(protocol)

testing - 测试 P2P 直播应用程序的最佳方式是什么?

security - 一种用于分布式或分散式声誉/信任的算法

bittorrent - Bittorrent 客户端中的 DHT 如何获取 "bootstrapped"?

hashtable - 分布式哈希表技术和比特币区 block 链有什么区别?

bittorrent - 是否允许在同一个 ip :port pair in Mainline DHT? 后面运行多个不同的 DHT 节点

flutter - WebRTC : not working on WIFI/works on Mobile Data

c - Transmission-daemon 只是停止通量

bittorrent - DHT中announce_peer的token