实现 p2p 消息广播网络的技术现状如何?

5
我知道通过快速谷歌搜索可以得到大量结果,这个主题的文献非常丰富,这正是问题所在。在可能的解决方案宇宙中,我不确定哪一个是最好的、最新的选择,适合我的特定需求。
我正在尝试在互联网上实现一个P2P网络,唯一的功能就是向在线节点广播消息。为了连接到网络,您必须能够指向现有的IP地址。当你这样做时,你会发现一些同行,并与他们保持活动连接。然后你可以向每个其他节点发送消息。没有直接的通信,每个发送的消息都会被其他人接收。我希望这个网络尽可能地高效,并在UDP之上工作。
有哪些最先进的算法名称,可以解决这个特定形状的问题?

如果您进行广播,则可以在不需要知道各个IP地址的情况下命中局域网上的每个主机。 - Ron Maupin
哦,我的意思是针对一个应用程序。想象一下一个移动游戏。我希望用户能够在不涉及中央服务器的情况下广播他们的移动。 - MaiaVictor
现在,我有点困惑。你的意思是只想向玩家单播数据包吗?广播会发送到局域网上的每个主机。单播会发送到特定的主机,而多播会发送到已订阅多播组的一组主机。看起来你可能需要使用多播,然后每个玩家主机都会监听发送到多播组的数据包,这样就不会影响局域网上的其他主机了。 - Ron Maupin
也许我们由于术语而谈论了不同的事情。我对网络知之甚少(因此提出这个问题),我只知道我要解决的问题。我想创建一个应用程序,当打开时,将连接到运行相同应用程序的计算机网络。然后它将能够发送消息,每个其他节点都会收到 - 这就是我所说的“广播”。我正在谈论我的应用程序的高级需求(广播消息,没有中央服务器需要维护/支付 - 想象一下游戏),并寻求关键字/资源以开始寻找解决方案。没有局域网。 - MaiaVictor
1
我给你们一些资料。如果你想作为一个团队来做这个,正确的术语是多播。你的应用程序应该加入多播组,它可以在多播组内发送和接收消息,而不会打扰那些没有参与多播组的主机。多播是一种选择性的广播形式。广播会中断每个主机必须处理消息。在多播中,你只会打断已订阅多播组的主机。这避免了需要一个中央服务器的需求,但如果你希望也可以使用中央服务器。 - Ron Maupin
现在您已经添加了要求该工作在互联网上运行,因此您已经排除了使用广播或组播的可能性,因为这两者都无法在互联网上工作。您将需要一个中央服务器来处理注册等事项。 - Ron Maupin
2个回答

8
如果您想了解建立去中心化P2P架构的概念,可以查看Dat Foundation,他们提供了一个模块生态系统,用于在互联网上进行P2P数据共享,例如Hypercore(原始P2P流)和Hyperdrive(在超级核心之上的文件传输)。 他们有一些关于技术概念、挑战以及如何解决这些问题的良好文档。
P2P设计中的一些挑战:
  • NAT路由器和防火墙:通过实现NAT穿透和UDP打洞来克服(参见:ZeroTier的NAT穿透状态)。
  • 发现节点:Dat项目使用Gossiping作为一种有效的方式,让一组节点在网络上相互发现,并使用简单的(protobuf)线路协议进行通信(参见:HyperdiscoveryHypercore Protocol)。
  • P2P数据通信/同步:Hypercore在每个节点上实现了仅追加日志,并使用Merkle树来聚合和去重来自其他节点的数据块以正确的顺序同步数据。

Dat项目支持TCP、UDP、WebRTC和BittorrentDHT。

请阅读一些它们的规范文档,以深入了解这些概念和协议设计:


我刚刚添加了更多关于可行的点对点技术以及在移动设备上使用Dat项目开发去中心化视频应用的信息:A: 在Android上使用WebView进行点对点视频/音频聊天 - Arnold Schrijver
1
嗨,有趣的阅读,特别是ZeroTier的文章很有趣(尽管我猜几乎每个曾经设计过P2P网络的人都不太喜欢与NAT一起工作)。您能更新Dats Github的链接吗?它们似乎已经不可用了。@Arnold Schrijver - j3141592653589793238
嗨,@j3141592653589793238,抱歉回复晚了,但是答案已经更新了 :) - Arnold Schrijver

4
在互联网上,通过覆盖网络广播单个消息是相当简单的。您加入该网络,构建一个随机或结构化的邻居路由表,向邻居传递消息,他们与他们的邻居执行相同操作,但减少一些修剪以避免转发循环。
复杂性来自各种不同的网络中存在的附加限制和要求。例如:在匿名设置中存在信任问题,延迟优化,优化高带宽流数据等(p2p辅助实时视频广播)。

我很高兴听到这很简单,但有些复杂的问题对我来说并不明显。你是指随机路由表;具体是怎样的呢?每个节点如何保持同行列表?为此,“入口节点”必须拥有所有节点的列表,对吗?如果您有任何链接/关键字,那将非常有帮助。无论如何,感谢您的回答! - MaiaVictor
有用的关键词可输入 Google 学术搜索引擎: "覆盖网络","结构化覆盖网络","小世界","路由表","邻居列表","引导程序"。通常来说,引导程序和路由表维护是消息传播的独立问题。你需要逐步构建 P2P(对等)算法。 - the8472
怎么实现呢?这是一个简单的Node.js p2p广播网络实现: https://github.com/will123195/p2p-broadcast - Will

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接