如何估算P2P网络中的节点总数?

时间:2016-02-19 06:52:00

标签: algorithm p2p

我创建了一个没有主节点的p2p网络。如何统计总活动节点?精确度不是关键,但轻量级和性能很重要。

目前我正在考虑两种方法,它们都有很大的缺点......

  1. 每个节点都有一个随机数作为其ID。每个节点都有一个巨大的比特数组,最初只有索引== ID的比特为1,其他比特为0.每个节点用已知对等体交换它的比特数组。使用位OR将节点的位阵列与对等端合并。随着此过程的进行,最终每个节点应具有相似的位阵列,并且数字1表示网络中的节点数。优点是这可以并行和随时间进行。在查询时,响应可以非常快(因为结果已经存在)。缺点:a)。难以处理已经消失的节点。 B)。如果有数百万个节点,则位数组太大。

  2. 像BFS这样的东西。从初始节点,它询问所有已知对等体连接了多少节点。然后将所有响应求和为待探测网络的总大小。这是一种递归方法。如果节点已经收到这样的查询,它将忽略来自其他节点的更多相同查询。就像BFS一样。缺点是这很不可能是不准确的。查看BFS树,对于每个节点,它可能是单点故障,这导致该节点的所有查询都丢失。考虑从节点A初始化查询,查询连接的对等体B& C. B&然后,C将查询扩展到他们连接的网络。由于某些原因C失败并且无法响应A.然后,所有从C接收的直接或间接查询的节点都不会被计算。这个问题可能发生在网络的任何节点上,并且可能导致最小的不准确性或大的不准确性,如上述方法,可能是网络的50%。

  3. 知道如何实际估算P2P网络中的总节点吗?

2 个答案:

答案 0 :(得分:2)

没有完美的方法。如果一个关键部分上的某个节点存在片状(经常向下和向上),那么由于这个原因很可能会错过网络的一部分,并且不知道该部分有多大。即使假设网络连接良好,也很难给出正确的计数,因为在算法运行时网络状态可能会发生变化。

您可能不希望采用第二种方法,因为您更加重视接近起点的节点,就像您说的那样。

然而,这是对第一种方法的不同看法,即以一定的精度为代价来消除位数组太长。

这个想法非常相似,但不是必须计算所有节点(你的id必须是唯一且相当连续的)和一个非常大的位数组,你可以有随机id(每台机器选择一个随机的32/64位id )而不是通过布隆过滤器和计数器传递的位数组。 bloom过滤器类似于数组,因为它可以说id是否尚未插入。然而,它的空间效率更高。缺点是,虽然它有100%的召回率(如果过滤器说id不在那里,它确实不存在)它没有100%的精度(过滤器可能会说id已被插入,但实际上它是不是)。对于算法,这意味着您确保避免重复计数(好),但根据插入的顺序,您可能会错过某些节点。

算法的其余部分是相同的。首先插入自己的id并将计数器设置为1.将状态发送给所有对等体。当您收到状态时,请检查您的ID是否已经插入,如果没有插入,请添加1并将状态发送给所有同伴。如果您具有不同计数的相同布隆过滤器状态,请选择较大的布隆过滤器状态(因为我们确定没有重复计数)。最终状态会收敛,这就是你的答案。

Here's关于布隆过滤器如何工作的链接。

答案 1 :(得分:1)

如果你有DHT或类似的覆盖网络(你可能会做什么,你还有什么打算使用纯粹的分布式网络?),你可以通过查看小子空间中ID的分布来估计它的大小。 ID空间。你的方法基本上是准确的,所以它们最终是不切实际的。仅查看ID空间的一部分并得出关于其余部分的结论通常显然不准确,它仅在ID是随机的情况下才有效,并且如果您知道足够的节点,则可以调用大数定律。如果您保留适当的路由表,您可以在本地进行此估计,但如果您的查询允许,您可以决定请求接近某个随机生成的ID的节点,现在您有两个可以平均的估计值(但这是一个昂贵的技巧) 。有很多论文关于使其对某些攻击更具弹性,在高流失的情况下更准确,并且使用实际的估算公式。