我想在互联网上创建一个 P2P 应用程序。什么是最好的,或者如果没有足够好的方法来自动发现分散网络中的其他节点?
3 回答
来自GNUnet项目(一个匿名的抗审查文件共享网络)的Grothoff 和 GauthierDickey研究了在没有任何中央主机列表的情况下引导 p2p 网络的问题。
他们发现,对于 Gnutella (Limewire) 网络,随机 ip 搜索平均需要 2500 次连接尝试才能找到对等点。
在论文中,他们提出了一种方法,可以将 Gnutella 所需的连接尝试次数减少到 817 次,而 E2DK 网络则减少到 51 次。
这是通过为每个 DNS 组织创建 p2p 用户的统计配置文件来实现的,这个小型(大约 100kb)发现数据库必须提前创建并与 p2p 客户端一起提供。
这是 P2P 的圣杯。真的没有什么神奇的解决方案——如果没有一个众所周知的点作为参考,节点是不可能发现其他节点的(嗯,你可以在局域网上使用广播,但不能在互联网上这样做)。P2P 文件共享往往通过让已知网站分发“起点”来进行发现,然后进一步的发现(我希望)可以来自询问节点他们知道哪些其他节点。
开始研究的一个好地方是分布式哈希表。
至于安全性,我认为该主题将出现在文献中的某个地方——我再次推荐维基百科。不存在的会被简单地处理:如果您无法联系 IP/端口,请不要将其保留在列表中,并且如果节点定期提供不存在的指针,请考虑取消优先级或将其从您的完整列出。
对于邪恶节点,这取决于您的用例,但假设您正在进行文件共享。如果您请求文件的一部分,请与多个节点检查文件部分的哈希应该是什么,然后通过哈希请求。如果邪恶节点为您提供了具有不同哈希的块,那么您可以再次取消优先级或忘记该节点。
分布式处理系统的工作方式略有不同:它们倾向于要求几个不相关的节点执行相同的工作,然后使用投票系统(可能再次使用散列)来确定邪恶是否在手。如果某个节点始终提供错误的结果,则会联系管理员或将 IP 从已知节点列表中删除。
好的,为了让两个对等方找到彼此,他们都必须知道一个共同的,比如说,调解员交换一次 IP。您可以在这种第一次握手中使用任何东西,同时能够从该“通道”进行写入和读取。即:DNS(您的知名域)、电子邮件、IRC、Twitter、Facebook、Dropbox 等。