我需要创建文件共享对等网络(无中央服务器)。

我阅读了很多有关该主题的信息。要求是确保网络中的每个对等方都保留其他对等方的完整列表以及网络上所有文件的完整列表。

我知道这不是最好的方法,但是这是一个要求。...(我认为很奇怪)另一个要求是,对等体之间的通信应使用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和端口。如果您在局域网内,这不是什么大问题。

关于c# - 对等分散网络-给所有对等方的消息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9309749/

10-11 18:03