编辑:如果我没有表述清楚,我很抱歉。消息应该被网络上的所有节点接收到,而不仅仅是一个目标。
编辑2:您可以将我想要做的看作是一个网络服务器。它们应该能够分布式地保存数据(不是问题的一部分),但它们中的每一个都需要知道网络上可用的资源(哈希表)。客户端可以在其中一个服务器上上传文件(无论哪个都可以)。当这种情况发生时,其他所有人都需要知道此更改以更新其哈希表。如果新服务器加入网络,则同样适用。我的问题是如何传播此消息,而不必连接到所有其他服务器的单个服务器,这显然会在单个服务器上产生大量流量。
编辑:如果我没有表述清楚,我很抱歉。消息应该被网络上的所有节点接收到,而不仅仅是一个目标。
编辑2:您可以将我想要做的看作是一个网络服务器。它们应该能够分布式地保存数据(不是问题的一部分),但它们中的每一个都需要知道网络上可用的资源(哈希表)。客户端可以在其中一个服务器上上传文件(无论哪个都可以)。当这种情况发生时,其他所有人都需要知道此更改以更新其哈希表。如果新服务器加入网络,则同样适用。我的问题是如何传播此消息,而不必连接到所有其他服务器的单个服务器,这显然会在单个服务器上产生大量流量。
我看到你的问题分为两个部分:
没有中央服务器
现在流行的P2P实体是僵尸网络,它们有C&C服务器,并且也使用HTTP。它们倾向于通过使用某种算法来生成域名来利用DNS。您需要一些东西来种子/引导该过程,否则P2P平台将无法启动。演化可以通过传播来完成,也就是说,同伴可以从中央位置获取初始列表,然后随着从查询其他同伴中学到更多信息而建立DHT(即获得更多的响应)。
对于没有中央服务器的P2P网络,您可以执行本地网络扫描或使用零配置协议的实现,例如SSPD。这里的限制是您无法超出本地网络。例如,假设您想要跨越局域网进行多播,您将尝试到达哪些IP地址/范围?
发送消息给所有同伴
这不保证成功,因为在特定时刻您不知道哪些同伴处于活动状态,并且没有单个同伴拥有完整副本的DHT。通常使用洪泛的方式实现此目的。您可以采用查询洪泛策略,但不要期望得到回应。您可以在搜索时使用相同的策略,其中您实际上想要回答。如果您只想到达过去的5个级别,那么只需将哈希/ ID与计数器一起包含在内,然后同伴在传播消息之前递减计数器,并在计数器达到0时停止。
这个项目的一个大障碍是NAT。因此,不仅对等方需要知道彼此的外部IP和端口。如果您在局域网中,则这不是很大的问题。