C# 对等分散网络-向所有对等方发送消息

C# 对等分散网络-向所有对等方发送消息,c#,.net,http,networking,p2p,C#,.net,Http,Networking,P2p,我需要创建一个文件共享点对点网络(没有中央服务器) 我读了很多关于这个话题的信息。要求是确保网络中的每个对等点都保留一个其他对等点的完整列表以及网络上所有文件的完整列表 我知道这不是最好的方法,但这是一个要求,所以。。。另一个(我认为很奇怪)要求是对等方之间的通信应该通过HTTP协议和JSON序列化来实现 这意味着每个对等点都将充当web服务器,并且还可以连接到其他对等点 因此,我想知道一种很好的方法,可以将消息从一个对等点传递到所有其他对等点,而不需要一个对等点直接连接到其他对等点(连接太多)

我需要创建一个文件共享点对点网络(没有中央服务器)

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

我知道这不是最好的方法,但这是一个要求,所以。。。另一个(我认为很奇怪)要求是对等方之间的通信应该通过HTTP协议和JSON序列化来实现

这意味着每个对等点都将充当web服务器,并且还可以连接到其他对等点

因此,我想知道一种很好的方法,可以将消息从一个对等点传递到所有其他对等点,而不需要一个对等点直接连接到其他对等点(连接太多)


我一直在寻找一种方法,以某种方式将消息路由到几个级别,这样通信量就会有所分布。据我所知,我可以连接到网络上的任何对等方,我可以在消息发送之前有效地构建一条路由,然后告诉一些对等方重新路由它。但是我怎么才能找到最好的路线呢?如果有一个被窃听的对等方无法重新路由消息,会发生什么

编辑:如果我没有说清楚,我很抱歉。消息应该由网络上的所有对等方接收,而不仅仅是一个目标


编辑2:你可以想象我作为一个网络服务器想要做什么。他们应该能够保存分布的数据(不是问题的一部分),但他们每个人都需要知道网络上有哪些可用资源(哈希表)。客户端可以在其中一台服务器上上传内容(不管是哪台)。当这种情况发生时,所有其他人都需要知道此更改以更新其哈希表。如果新服务器加入网络,同样适用。我的问题是如何在没有单个服务器连接到所有其他服务器的情况下传播此消息,这显然会在单个服务器上产生大量流量。

我认为您的问题分为两个部分:

没有中央服务器

现在流行的p2p实体是僵尸网络,它有C&C服务器,也使用HTTP。他们倾向于通过使用某种算法生成域名来利用DNS。你需要一些东西来种子/引导这个过程,否则p2p平台将无法启动。进化可以通过传播来完成,也就是说,节点可以从中心位置获取初始列表,然后随着他们从查询其他节点中了解更多信息(即获取更多响应),构建DHT

对于没有中央服务器的p2p网络,您可以执行本地网络扫描或使用zeroconf协议的实现,例如。这里的限制是,您不能超出本地网络。例如,假设您想在LAN之外进行多播,您将尝试访问哪些IP/范围

向所有对等方发送消息

这不能保证成功,因为您不知道在给定的时间点哪些对等点处于活动状态,并且没有一个对等点拥有DHT的完整副本。洪水通常是实现这一目标的方式。你可以采取这种策略,但不要指望得到回音。您可以在搜索时使用相同的策略,您实际上希望返回答案。如果您只想达到(比如说)5级以上,只需包含一个具有哈希/id的计数器,对等方在其上传播消息之前递减,并在计数器达到0时停止


这个项目的一大障碍是NAT。因此,不仅对等方需要相互了解外部IP和端口。如果您在局域网内,这不是什么大问题。

是否要求每个节点都了解所有其他节点?若然,原因为何?大多数p2p系统只知道网络的一部分,然后他们必须要求其他节点帮助发现他们想要的节点(例如,包含名称与搜索字符串匹配的文件的节点)。是的,这是一项要求。我知道这很奇怪。如果你不让每个节点连接到网络上的每个其他节点,那么当一个节点加入(或离开)网络时,在消息传播和所有节点更新其本地节点列表之前会发生什么?当节点同时加入和离开网络(特别是高速率)时,我可以看出这会导致问题。如果节点列表中某个时间点包含一个脱机的节点,这不是问题。这也是HTTP的问题,因为我无法保持与节点的持续开放连接,必须实施某种ping机制来定期清除脱机节点。“我一直在寻找一种方法,以某种方式将消息路由到几个级别,这样通信量将在某种程度上分布”,你的意思是,即使每个节点都可以直接联系其目标,流量也会在几个节点之间跳跃吗?是的,我将使用一些初始对等点列表来访问网络。别担心纳特。我将确保只有当客户端能够监听外部世界的端口时(如果没有NAT或upnp可以打开端口),它们才能充当对等方。另外,我们的目标是能够在每个同龄人身上保存完整的列表。但要做到这一点,当有变化时,我需要将它们传播到所有的对等方。我将研究查询泛洪问题,但问题是我不会有到其他节点的开放持久连接(因为它是HTTP),我将能够连接到任何我想要的对等方。我更新了我的问题,并提供了更多的解释。谢谢你的帮助如果你没有持久的联系也没关系。客户端不可能保持与所有对等方的开放连接。每个对等方都可以懒洋洋地/定期地检查其对等方列表(如果它们仍然活着)。查询泛洪是一种更有效的处理方法,因为每个对等方都可以查询对等方的一个子集,如果一个对等方必须对所有人进行解释,那么速度会非常慢。在这种查询泛洪策略中,对等方发送