我需要创建文件共享点对点网络(没有中央服务器)。
我阅读了很多关于该主题的信息。要求是确保网络中的每个对等点都保留其他对等点的完整列表和网络上所有文件的完整列表。
我知道这不是最好的方法,但它是一个要求,所以......另一个(在我看来很奇怪)要求是对等点之间的通信应该使用 HTTP 协议(protocol)和 JSON 序列化来实现。
这意味着每个对等点都将充当网络服务器,并且还可以通过某种方式连接到每个其他对等点。
因此,我想知道一种将消息从一个点传送到所有其他点的好方法,而无需一个点直接连接到其他点(连接太多)。
我一直在寻找一种方法,以某种方式将消息路由到几个级别,以便在一定程度上分散流量。正如我所知并且可以连接到网络上的任何对等点,我可以在发送消息之前有效地构建一条路由,然后告诉一些对等点重新路由它。但是我如何找出最佳路线呢?如果存在无法重新路由消息的有问题的对等点,会发生什么情况?
编辑:如果我没有说清楚,我很抱歉。该消息应该被网络上的所有对等点接收,而不仅仅是一个目标。
编辑 2: 您可以将我想做的事情想象成网络服务器网络。他们应该能够保存分布式数据(不是问题的一部分),但他们每个人都需要知道网络上有哪些资源可用(哈希表)。客户端可以在其中一台服务器上上传内容(无论是哪一台)。当发生这种情况时,所有其他人都需要知道此更改以更新他们的哈希表。如果新服务器加入网络,这同样适用。我的问题是如何在没有单个服务器连接到所有其他服务器的情况下传播此消息,这显然会在单个服务器上产生大量流量。
最佳答案
我看到您的问题分为两个部分:
没有中央服务器
如今流行的 p2p 实体是僵尸网络,它们有 C&C 服务器,也使用 HTTP。他们倾向于通过使用某种算法来生成域名来利用 DNS。您需要一些东西来播种/引导该过程,否则 p2p 平台将无法启动。进化可以通过传播来完成,也就是说,对等点可以从中央位置获得初始列表,然后随着他们从查询其他对等点了解更多信息(即获得更多响应)来构建 DHT。
对于没有中央服务器的 p2p 网络,您可以进行本地网络扫描或使用 zeroconf 协议(protocol)的实现,例如 SSPD .这里的限制是你不能超越你的本地网络。例如,假设您想在 LAN 之外进行多播,您将尝试到达哪些 IP/范围?
向所有同行发送消息
不能保证这会成功,因为您不知道在给定的时间点哪些节点处于事件状态,并且没有一个节点拥有 DHT 的完整副本。泛洪通常是实现这一点的方式。你可以采纳query flooding战略,但不要指望得到答复。您可以在搜索中使用相同的策略,您实际上需要返回答案。如果你只想超过 5 个级别,你只需包含一个带有哈希/id 的计数器,节点在传播消息之前递减,并在计数器达到 0 时停止。
这个项目的一大障碍是 NAT。因此,不仅对等点需要知道彼此的外部 IP 和端口。如果您在 LAN 中,这不是什么大问题。
关于c# - 点对点去中心化网络——向所有点发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9309749/