点对点:寻找节点的方法

78

有没有已知的方法可以在不使用专用中央服务器的情况下找到对等方呢?

例如:如果我的对等方断开并重新连接到互联网,但每次都获得新的IP地址,而我想在不设置专用服务器以注册的情况下连接到它们。

我正在考虑使用对等方的电子邮件地址定期发送连接对等方清单,并带有某种时间码,从而避免使用专用服务器。如果在尝试所有先前已知的对等方地址后无法连接到任何对等方,则会退回到此方法。但优先考虑现有的查找对等方模型。

13个回答

54

要发现更多的对等节点就必须知道至少一个初始对等节点,这是无法避免的。 完全的P2P协议,例如Gnutella或Gnutella2,或者更简单的Overnet(因Storm Worm而出名),都是基于每个客户端有一个启动列表来连接几个对等节点。这些可以从基于Web的自动追踪器上获得。当委派文件搜索时,客户端将通过向其他对等节点请求更多地址来发现整个网络或其中一部分。

如果你真的不能够拥有任何形式的集中资源,则最好的办法是通过广播消息和最终IP地址扫描来找到第一个对等节点。第一种方法很好,但在至少98%的情况下不会产生任何结果。后一种方法显然是滥用互联网,并且在大多数国家都是非法的。

我真的建议重新考虑是否需要某种形式的中心化跟踪器。它可以是一个简单的PHP脚本,托管在Web服务器上(今天的Gnutella网络由十到二十个这样的脚本支持,由甚至彼此不认识的人托管)。这比电子邮件要轻量级得多(至少由于垃圾邮件过滤器等原因,电子邮件不起作用)。


1
现在常用的另一种方法是DNS种子(建立一个可扩展的DNS服务器)。实质上,DNS服务器将提供已知运行对等软件的地址。 - Hedde van der Heide

10
比特币QT客户端使用多种方法来查找节点,其中一些可能对你有用。 中本聪客户端节点发现 IRC不再使用,但可能是最容易实现的方法:
从版本0.6.x开始,比特币客户端默认不再使用IRC引导程序,从版本0.8.2开始完全删除了对IRC引导程序的支持。以下文档适用于大多数早期版本。除了学习和共享自己的地址外,节点还通过IRC频道了解其他节点地址。请参见irc.cpp。在学习了自己的地址后,节点将其地址编码为一个字符串,用作昵称。然后,它随机加入名为#bitcoin00至#bitcoin99之间的IRC频道。然后发出WHO命令。线程按照它们在频道中出现的顺序读取行并解码频道中其他节点的IP地址。它会一直这样做,直到节点关闭。当客户端从IRC发现一个地址时,它会将地址的时间戳设置为当前时间,但它使用了51分钟的“惩罚”,这意味着它看起来实际上是近一个小时前看到的。

9

在内部网络中的同行之间,可以向已知端口发送广播UDP消息,要求同行回报。


8
利用任何已经存在的论坛来发布数据。 想想秘密的IRC频道,将数据嵌入照片并发布到照片分享网站4chan? 任何允许您的应用程序登录并发布数据而无需验证码登录等的网站。

http://chatzilla.hacksrus.com/faq/#password

另一种策略可能是在数字货币交易中嵌入消息。选择一个便宜的硬币,比如DOGE或MOON coin。将钱包功能集成到您的应用程序中,这样您就可以在您的应用程序控制的地址之间来回发送微型交易。仍然需要支付矿工费,但这只是几分钱的零头。即使他们后来禁止向交易添加元数据,您也可以进行等价于MOON中IP地址的交易,并在MOON coin中使用虚荣地址为您的应用程序。因此,当一个新节点上线时,它知道要搜索区块链的内容——2daMOON%bootStr@pM3. SEND - 104.003021133 MOON IP = 104.3.21.133,这不是昂贵的建议。

5

虽然这个问题很老,但我一直在思考这个问题,所以会加入我的两分钱。简而言之,如果节点知道至少一个有效的对等节点,则不需要中央服务器。新节点必须由任何当前成员添加到网络中(例如,被邀请或节点生成另一个节点,具体取决于应用程序)。

假设:

  • 代理跟踪对等节点;此地址簿的大小以及如何管理条目将取决于系统的性质;例如,对等方连接的时间有多长,如果对等方使用稳定的地址

  • 代理与其他对等方共享对等方信息

  • 相对于频率节点连接到网络以更新其地址簿的情况,至少有些代理保持可用状态(或节点具有稳定的地址)

  • 除了对等方地址之外,还跟踪可用性信息(这里有许多选项,具体取决于您的系统。例如:对等方是否具有稳定的地址,上次出现时间,某些可用性指标,内容/服务类型信息,如果已知,则为地址有效期)

  • 新代理初始化为至少一个有效对等节点(不必是中心节点,可以是任何有效节点)

  • 如果存在恶意对等方,则需要信任机制

当对等方上线时,它会查询其对等方表以发现哪些是活动的,并可能删除已过期的动态地址。节点交换对等方信息并可能自己链接。此对等发现/交换可以继续一定数量的跳或通过随机漫步,直到对等列表足够大和/或质量。

还有更多细节:

  • 节点连接并根据节点地址更改的频率共享对等方信息,因此地址簿不会过时,并且节点不会因为没有它的前任对等方在其最后已知的地址处可用而断开连接

  • 节点可能需要限制它们接受的对等方数量,以避免围绕最稳定的节点集中化的趋势。

  • 节点应该选择它们保留的对等方;即更有可能交换数据的对等方(例如基于历史的权重)

  • 节点链接可以是对称的或非对称的,具体取决于应用程序


4

以下是我脑海中的三种方式,不过你总是需要一个中央服务器来启动连接,除非你采用第三种选项。

  • 维护已知对等方列表的中央服务器,具有保持活动状态的功能。
  • 一个或多个中央服务器维护一些公共资源,可以用于发现彼此的对等方,但一旦连接后,只要对等方保持连接(类似于BitTorrent),就不再需要中央服务器。也可以连接多个对等方。
  • 端口/IP扫描(强烈不建议)。

在您的示例中,仍然需要某种形式的中央服务器来注册对等方;协议是唯一的区别。


4
简单来说,没有中央服务器就无法做到这一点。
如果想要实现这个目标,只需要一个或多个中央服务器,无论是动态DNS还是其他方式。客户端需要一种方法来发现他们应该连接到哪里,唯一明智的方法是使用自己的服务器,在最简单的情况下,它只需要返回一个IP地址即可。
虚拟服务器每月约15美元,我认为这比试图使用或滥用别人的带宽要便宜得多。

[编辑].

简单来说,还有另一种方法,如下所示。

经过反思,我认为我会指定一组同行作为集群控制器,并使用动态DNS服务使其他同行能够发现集群控制器。

选择一个动态DNS提供商,我将其称为myc.ath.cx(我使用http://www.dyndns.com/)。

每个同行都必须能够成为集群控制器。集群控制器将包含所有已连接的其他同行的列表。

启动同行时,它会查找myc.ath.cx并尝试连接。如果在一段时间内无法建立连接,比如30秒,则它将接管DNS条目的注册。

任何希望发现其他同行的同行都可以简单地查询myc.ath.cx,并提供列表。

所有同行都负责定期下载同行列表,以防需要集群控制器。

集群控制器将定期查询DNS条目-如果它的IP地址已更改,则它知道它不再是集群控制器-因此它将联系当前具有DNS条目的集群控制器,并提供其已知主机列表。

集群控制器将定期联系列表中的主机,以确保它们仍然有效。

公正的评论 - 不过我认为我有一个更好的想法。 - Richard Harrison
不错的想法,对于大规模部署,您可能需要考虑限制节点数量,在这种情况下,需要一个包括适应性函数的清除算法来确定哪些节点应该保留。 - codeasone
2
一个非常酷的想法,尽管在我看来,这不应该按原样实施。根据你所描述的方式,DNS记录需要可由网络中的任何节点进行修改。在公开可用的网络中,这意味着任何一个恶意行为者都可以修改DNS名称下所有条目的内容,将其指向欺骗性网络,从而创建一个相当大的安全漏洞。 - user5739133

1

如果建立一个专门用于跟踪其他P2P系统在线对等方的P2P系统,会怎么样呢?

这样,我们就可以将为任何新P2P系统查找对等方的问题简化为仅查找“主”P2P系统的对等方,这将为您提供所需使用系统的在线对等方的地址...


1

你的发送电子邮件的方法确实使用了专用服务器,准确地说是对等方的电子邮件服务器。

大致上来说,如果不使用某种专用存储或服务器(虽然电子邮件方法间接地使用了),我认为这是不可能的,除非你能够描述你的同行所使用的互联网连接方式。

基本上,如果你有一组X个同行,他们连接了Y时间,然后离线了Z时间... 本质上,你可以构建一个概率方程,来计算你最后联系的同行集合仍然可用的可能性;当该概率趋近于1(对于上述给定的X、Y和Z),你就可以在不使用存储的情况下维持点对点网络。

也许更符合精神的做法是,不要使用“专用中央服务器”,而是使用简单的在线免费服务来指定同行列表。建立一个雅虎小组或类似的东西;客户端可以自动查找并获取同行地址以查询一组同行;客户端可以编码身份验证以发布到该组,并定期发布其IP地址,以便其他人可以请求已知活动同行的集合。

如果你想变得非常狡猾,你可以开始使用基本的隐写术方法来隐藏节点位置信息。例如,搜索“blah”在谷歌上,找到结果列表中第一个没有受到保护(没有CAPTCHA)的留言板网站;找到第三个(或其他)以“Indubitably”(或其他)开头的帖子,并找到那里第一条消息的标题,那里就是一个节点的IP地址。如果这不起作用,就继续搜索下一个搜索词。

但这很狡猾。 :-)


1
@McWafflesitx:虽然我是一个吹毛求疵的人,但我的“专用服务器”并不意味着提供一个专门用于加入对等方的服务器。利用Web服务或以不同方式使用现有服务器似乎更合适。 - Ande Turner

1

你能否重复使用一个已有的专用服务器来实现这个目的?

我特别考虑了使用动态DNS为每个节点进行注册,但如果你愿意做得更麻烦一些,也可以共享一个已知的Hotmail账户或Google文档等。


@Oddthinking: :) 我越使用SO,就越能意识到我有时可能非常不清楚。哈哈。我的想法是,当我的计算机连接时,它会将其IP地址发送到一组同行的电脑,并且这些同行只需检查他们的用户邮件以获取其他同行的IP地址清单。 - Ande Turner
诀窍在于,如果您可以从旧的IP地址列表中连接到一个对等节点,那么您甚至不需要使用电子邮件流程,因为单个对等节点可以向您提供对等节点列表。 如果找不到任何对等节点,则电子邮件将成为备选方案。 - Ande Turner

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