如果我们想开发纯P2P系统,我们应该设计路由覆盖网络。所有节点都将拥有像路由器一样的路由表。但即使在路由覆盖网络中,每个节点最初也应该知道至少一个现有节点(GUID、IP地址)。那么我们该如何确定这一点呢?我们是否应该像固定的集中式服务器那样永远保留“一个现有节点以便最初连接”?如果是这样,我认为这不是完全去中心化的方法。
您可以使用任播。这样,第一个其他客户端将会回答并可能发送这样的初始“客户端列表”。您的客户端可以连接到它们以获取更多列表。
经典地,我会实现一个组播到一个地址,并等待其他客户端的回答。
实际上,一切都归结于网络连接的概念。IP只是将数据包推送到未指定的路由器,直到到达特定地址。每个端点之间的“连接”仅存在于更高级别的软件层(包括处理TCP/IP时)。连接只是软件中用于理解谁是谁以及每个点如何处理数据等内容的数据。点对点网络覆盖层有效地分配这些数据,消除了每个对等方为在广泛范围内通信而创建大量连接的需要。这并不需要去中心化(只要点对点通信不是集中化的),系统中的辅助服务不一定会限制网络的范围或者使点对点网络变得集中化。
因此,回答你的问题,最初连接的位置并不重要,只要符合点对点的定义即可,不同的点对点服务将根据其服务设计来处理这个问题。
好的,我正在考虑为一个AI项目编写一种点对点协议,用于多种不同的服务,并且我想来这里看看是否能够得到一些关于如何建立初始连接的想法。
我已经发现了几种建立初始连接的方法:
1)您在互联网上拥有一个静态IP地址,用于分发其他节点的信息。这不好,因为: a)它是单点故障,服务可能会离线,从而防止任何新连接创建与节点的初始连接, b)IP地址可能会更改。这可以通过使用维护指向提供有关节点数据的服务位置的当前IP地址的域名来缓解,但是理论上黑客可以通过欺骗或ARP毒化、DNS攻击等方式来破坏这一点。
2)您可以强制用户提供另一个节点的初始IP地址或主机名,由用户自行查找主机名/IP地址/端口号。这很好,但如果有人发布虚假信息或他们无法在Google或其他搜索站点上找到节点,则显然是有缺陷的。
3) 你可以让同行在一个中央位置发布他们自己的存在,例如一组IRC频道或一组网站。除非它经过一个中央受信任的域,否则很难确定对等方的真实性。
4) 你可以使用某种类似于nmap的发现算法,在子网中搜索适当的协议。这种方法的问题是速度慢,而且很可能会引起防火墙等注意。
5) 这是3)的变体,你可以允许对等方在网站上广告自己的信息,然后不必在适当的位置(特定的网站或一组网站)查找信息,可以让谷歌的搜索算法找到它,并为您进行发现,但是您可以想象这可能需要几天时间才能使谷歌缓存带有对等方信息的网站数据。同样,您需要提供某种验证广告数据真实性的方式。
6) 如果您对一种独家的点对点网络感兴趣,该网络可以锁定某些人(例如,您可能想要一个文件共享网络,而不希望执法部门能够访问它,或者MPIAA),那么您可以使用2),然后设置一个推荐系统,在这个系统中,您需要求初始连接提供推荐人的IP地址,然后服务可以连接到推荐人的IP地址,并询问推荐人是否确实推荐了被推荐人。
目前我能想到的就是这些,但如果有人想到其他方法,我会非常感兴趣。