有没有已知的方法可以在不使用专用中央服务器的情况下找到对等方呢?
例如:如果我的对等方断开并重新连接到互联网,但每次都获得新的IP地址,而我想在不设置专用服务器以注册的情况下连接到它们。
我正在考虑使用对等方的电子邮件地址定期发送连接对等方清单,并带有某种时间码,从而避免使用专用服务器。如果在尝试所有先前已知的对等方地址后无法连接到任何对等方,则会退回到此方法。但优先考虑现有的查找对等方模型。
有没有已知的方法可以在不使用专用中央服务器的情况下找到对等方呢?
例如:如果我的对等方断开并重新连接到互联网,但每次都获得新的IP地址,而我想在不设置专用服务器以注册的情况下连接到它们。
我正在考虑使用对等方的电子邮件地址定期发送连接对等方清单,并带有某种时间码,从而避免使用专用服务器。如果在尝试所有先前已知的对等方地址后无法连接到任何对等方,则会退回到此方法。但优先考虑现有的查找对等方模型。
要发现更多的对等节点就必须知道至少一个初始对等节点,这是无法避免的。 完全的P2P协议,例如Gnutella或Gnutella2,或者更简单的Overnet(因Storm Worm而出名),都是基于每个客户端有一个启动列表来连接几个对等节点。这些可以从基于Web的自动追踪器上获得。当委派文件搜索时,客户端将通过向其他对等节点请求更多地址来发现整个网络或其中一部分。
如果你真的不能够拥有任何形式的集中资源,则最好的办法是通过广播消息和最终IP地址扫描来找到第一个对等节点。第一种方法很好,但在至少98%的情况下不会产生任何结果。后一种方法显然是滥用互联网,并且在大多数国家都是非法的。
我真的建议重新考虑是否需要某种形式的中心化跟踪器。它可以是一个简单的PHP脚本,托管在Web服务器上(今天的Gnutella网络由十到二十个这样的脚本支持,由甚至彼此不认识的人托管)。这比电子邮件要轻量级得多(至少由于垃圾邮件过滤器等原因,电子邮件不起作用)。
在内部网络中的同行之间,可以向已知端口发送广播UDP消息,要求同行回报。
虽然这个问题很老,但我一直在思考这个问题,所以会加入我的两分钱。简而言之,如果节点知道至少一个有效的对等节点,则不需要中央服务器。新节点必须由任何当前成员添加到网络中(例如,被邀请或节点生成另一个节点,具体取决于应用程序)。
假设:
代理跟踪对等节点;此地址簿的大小以及如何管理条目将取决于系统的性质;例如,对等方连接的时间有多长,如果对等方使用稳定的地址
代理与其他对等方共享对等方信息
相对于频率节点连接到网络以更新其地址簿的情况,至少有些代理保持可用状态(或节点具有稳定的地址)
除了对等方地址之外,还跟踪可用性信息(这里有许多选项,具体取决于您的系统。例如:对等方是否具有稳定的地址,上次出现时间,某些可用性指标,内容/服务类型信息,如果已知,则为地址有效期)
新代理初始化为至少一个有效对等节点(不必是中心节点,可以是任何有效节点)
如果存在恶意对等方,则需要信任机制
当对等方上线时,它会查询其对等方表以发现哪些是活动的,并可能删除已过期的动态地址。节点交换对等方信息并可能自己链接。此对等发现/交换可以继续一定数量的跳或通过随机漫步,直到对等列表足够大和/或质量。
还有更多细节:
节点连接并根据节点地址更改的频率共享对等方信息,因此地址簿不会过时,并且节点不会因为没有它的前任对等方在其最后已知的地址处可用而断开连接
节点可能需要限制它们接受的对等方数量,以避免围绕最稳定的节点集中化的趋势。
节点应该选择它们保留的对等方;即更有可能交换数据的对等方(例如基于历史的权重)
节点链接可以是对称的或非对称的,具体取决于应用程序
以下是我脑海中的三种方式,不过你总是需要一个中央服务器来启动连接,除非你采用第三种选项。
在您的示例中,仍然需要某种形式的中央服务器来注册对等方;协议是唯一的区别。
[编辑].
简单来说,还有另一种方法,如下所示。
经过反思,我认为我会指定一组同行作为集群控制器,并使用动态DNS服务使其他同行能够发现集群控制器。
选择一个动态DNS提供商,我将其称为myc.ath.cx(我使用http://www.dyndns.com/)。
每个同行都必须能够成为集群控制器。集群控制器将包含所有已连接的其他同行的列表。
启动同行时,它会查找myc.ath.cx并尝试连接。如果在一段时间内无法建立连接,比如30秒,则它将接管DNS条目的注册。
任何希望发现其他同行的同行都可以简单地查询myc.ath.cx,并提供列表。
所有同行都负责定期下载同行列表,以防需要集群控制器。
集群控制器将定期查询DNS条目-如果它的IP地址已更改,则它知道它不再是集群控制器-因此它将联系当前具有DNS条目的集群控制器,并提供其已知主机列表。
集群控制器将定期联系列表中的主机,以确保它们仍然有效。如果建立一个专门用于跟踪其他P2P系统在线对等方的P2P系统,会怎么样呢?
这样,我们就可以将为任何新P2P系统查找对等方的问题简化为仅查找“主”P2P系统的对等方,这将为您提供所需使用系统的在线对等方的地址...
你的发送电子邮件的方法确实使用了专用服务器,准确地说是对等方的电子邮件服务器。
大致上来说,如果不使用某种专用存储或服务器(虽然电子邮件方法间接地使用了),我认为这是不可能的,除非你能够描述你的同行所使用的互联网连接方式。
基本上,如果你有一组X个同行,他们连接了Y时间,然后离线了Z时间... 本质上,你可以构建一个概率方程,来计算你最后联系的同行集合仍然可用的可能性;当该概率趋近于1(对于上述给定的X、Y和Z),你就可以在不使用存储的情况下维持点对点网络。
也许更符合精神的做法是,不要使用“专用中央服务器”,而是使用简单的在线免费服务来指定同行列表。建立一个雅虎小组或类似的东西;客户端可以自动查找并获取同行地址以查询一组同行;客户端可以编码身份验证以发布到该组,并定期发布其IP地址,以便其他人可以请求已知活动同行的集合。
如果你想变得非常狡猾,你可以开始使用基本的隐写术方法来隐藏节点位置信息。例如,搜索“blah”在谷歌上,找到结果列表中第一个没有受到保护(没有CAPTCHA)的留言板网站;找到第三个(或其他)以“Indubitably”(或其他)开头的帖子,并找到那里第一条消息的标题,那里就是一个节点的IP地址。如果这不起作用,就继续搜索下一个搜索词。
但这很狡猾。 :-)
你能否重复使用一个已有的专用服务器来实现这个目的?
我特别考虑了使用动态DNS为每个节点进行注册,但如果你愿意做得更麻烦一些,也可以共享一个已知的Hotmail账户或Google文档等。