3

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

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

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

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

4

1 回答 1

3

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

要回答您的第一个问题:

协议说这个[第一个]节点此时应该已经建立了它的路由表。但是此时我在环中没有任何其他节点,那么它是如何开始创建它的路由表的呢?

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

回答你的第二个问题:

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

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

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

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

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

希望有帮助。

于 2012-10-14T04:53:00.023 回答