介绍:
瑞波的PeerFinder的大部分工作都受到Gnutella早期工作的启发:
Revised Gnutella Ping Pong Scheme
By Christopher Rohrs and Vincent Falco
Gnutella 0.6 Protocol:
2.2.2 Ping (0x00)
2.2.3 Pong (0x01)
2.2.4 Use of Ping and Pong messages
2.2.4.1 A simple pong caching scheme
2.2.4.2 Other pong caching schemes
该瑞波支付网络组成的集合同时运行 Rippled软件。每个对等体都维护多个传出连接和可选的到其他对等体的连接。这些连接通过公共互联网和私人局域网进行。该网络定义了完全连接的有向节点图。同行向其他连接的同伴发送和接收消息。这种位于公共和私人互联网之上的对等网络形成覆盖网络。
引导:
当一个对等端联机时,它需要一组IP地址来连接,以便在称为自举的过程中获得初始进入叠加层的权限。一旦他们建立了这些出站对等连接的初始集合,他们需要获得额外的地址来建立更多的出站对等连接,直到达到所需的限制。此外,他们需要一种机制来将其IP地址通告给覆盖层中的新的或现有的对等体,以便他们可以接收入站连接,达到一定的限制。最后,他们需要一种机制来提供入站连接请求和一组备用IP地址,以便在已达到期望的最大入站连接数时进行尝试。
PeerFinder是一个独立模块,提供这些服务以及一些额外的覆盖网络管理服务,如固定插槽和群集插槽。
功能:
PeerFinder有如下责任
1.保持一组适用于引导到对等覆盖层的端点地址,并按相对本地观察效用进行排序。
2.发送和接收协议消息以发现端点地址。
3.将端点地址提供给需要它们的新对等点。
4.保持与配置的一组固定对等体的连接。
5.对对等连接消耗的各种插槽施加限制。
6.启动到端点地址的传出连接尝试,以维护覆盖连接和固定的对等策略。
7.验证通告入站连接插槽的邻居的连接。
8.防止重复的连接和自我连接。
概念:
Manager
这Manager是一个应用程序单例,它提供了与PeerFinder交互的主要接口。
Autoconnect
PeerFinder的自动连接功能会自动使用从各种来源获悉的地址建立传出连接,这些来源包括配置文件,域名查找的结果以及从叠加层自身收到的消息。
Callback
PeerFinder是一个隔离的代码模块,具有很少的外部依赖性。要执行特定于套接字的活动(例如建立传出连接或向连接的对等方发送消息),Manager将使用一个称为Callback。该接口的一个实例执行实际所需的操作,使PeerFinder独立于调用代码。
Config
该Config结构定义了PeerFinder的操作参数。一些值来自配置文件,而另一些则通过调整启发式来计算。这些字段如下所示:
autoConnect
一个标志,指示是否启用自动连接功能。
wantIncoming
指示对等体是否需要入站连接的标志。当此标志被关闭时,对等方不会在Endpoint消息中宣传自己。
listeningPort
为对等连接创建侦听套接字时使用的端口号。
maxPeers
允许的最大数量的活动对等连接。这包括入站和出站连接,但不包括固定和集群对等。这个值有一个实现定义的楼层。
outPeers
启用自动连接功能时PeerFinder将维护的自动出站连接的数量。该值是以分数精度计算的,作为maxPeers实现定义的楼层的实现定义的百分比。PeerFinder的实例使用程序启动时生成的统一随机数向上或向下舍入小数部分。这允许以小数精度控制覆盖网络的出口,确保所有入站网络连接时隙不被消耗(这将使新参与者难以进入网络)。
liveCache
Livecache通过对等覆盖保存最近以端点消息形式接收到的中继IP地址。对等方在打开入站连接时隙时定期向其邻居广播端点消息。Peers将这些消息存储在Livecache中,并周期性地向其邻居转发他们的Livecache中的一些随机条目,并为每个转发的条目增加跳数。
用于向邻居发送一组端点消息的算法从每次发送的所有可用跳数中均匀地选择。这可以确保每个对等体在每次迭代中都会看到一些条目最远的跳跃。其结果是扩大对等方的视野,即覆盖端点可见。这旨在强制覆盖层变得高度连接,并在每次建立连接时减小网络直径。
当对等方首次接收到一个源自邻居的端点消息(由跳数零标识)时,它通过发起到该远程IP地址的外向连接来对该邻居执行传入连接测试结合端点消息中公布的端口。如果测试失败,则该对等体认为其邻居防火墙(有意或由于错误配置)并且不再转发该对等端的端点消息。这可以防止低质量的不可连接的地址登录到高速缓存中。如果传入的连接测试通过,则对等体将其存储在缓存中并将其转发给其他对等体之前,使用连接上显示的远程地址填充Endpoint消息。
Livecache条目快速过期。由于对方在不再有可用的入站时隙时停止发布广告,因此其地址将在不再被其他同行分发后立即停止。Livecache条目很可能会导致成功建立连接并获取活动的出站时隙。将其与Bootcache地址进行比较,这些地址很可能可以连接,但不太可能具有空闲插槽。
由于Livecache中的条目是短暂的,因此它们不会在数据库中的启动时持久保存。由于随着时间的推移终端消息从覆盖层收到,Livecache会不断更新并过期。
Bootcache
该Bootcache存储IP为获得初始连接有用的地址。每个地址都与以下元数据相关联:
Valence
表示成功连续连接尝试次数为正数的有符号整数,以及连续尝试失败次数为负时的连续尝试次数。如果出站连接尝试到相应的IP地址未能完成握手,则Valence数重置为负值。这种苛刻的惩罚旨在防止流行的服务器永远保持在所有对等数据库中排名最高的服务器。
当为了建立传出连接而从引导缓存中选择地址时,地址按照Valence的降序排列。Bootcache是持久的。在程序运行期间,条目会在相应的SQLite数据库中定期插入和更新。当 启动波动时,访问和加载现有的Bootcache数据库数据以加速引导进程。
Bootcache中令人满意的条目是已知具有较高正常运行时间并且通常连接尝试成功的服务器的地址。但是,这些服务器不一定具有可用的入站连接插槽。但是,可以肯定的是,这些服务器将拥有充足的Livecache,因为它们将在其高正常运行时间内转向覆盖的核心。当连接的服务器已满时,它将从Livecache中返回一些新地址,并正常关闭连接。来自Livecache的地址很可能具有入站连接插槽并且可以连接。
为了安全起见,在本地观察所有有助于Bootcache条目排名的信息。PeerFinder永远不会信任外部信息来源。
Slot
每个可以参与对等覆盖的TCP / IP套接字占用一个Slot。Slot具有与它们相关的属性和状态:
State (Slot)
插槽状态表示当它通过用于建立对等连接的业务逻辑时的连接的当前阶段。
accept
接受状态是通过在侦听套接字上接受传入连接请求而产生的初始状态。远程IP地址和端口是已知的,并且预计接下来会握手。
connect
连接状态是主动建立出站连接尝试时使用的初始状态。所需的远程IP地址和端口是已知的。
connected
当出站连接尝试成功时,它将转到连接状态。握手开始但尚未完成。
active
当处于“已接受”或“已连接”状态的连接完成握手过程时,状态变为“活动”,并且根据属性提供一个插槽。如果握手完成时没有可用的插槽,则套接字将优雅地关闭。
closing
关闭状态代表正在关闭的过程中连接的套接字。
Properties (Slot)
时隙属性可以被组合并且不是相互排斥的。
入站
入站插槽是已接受传入连接请求的套接字的条件。没有入站的连接按照定义出站。
Fixed
Fixed插槽是到由IP地址标识的已知对等端的期望连接,通常在配置文件中手动输入。出于建立出站连接的目的,对等体也具有关联的端口号,尽管只检查IP地址以确定固定对等体是否已经连接。Fixed槽不计入连接限制。
Cluster
集群插槽是已完成握手阶段的连接,其公钥与通常在配置文件中手动输入的已知公钥匹配,或通过来自其他受信任对等方的叠加消息学习。群集插槽不计入连接限制。
Superpeer(即将发布)
Superpeer插槽是一个到对等体的连接,它可以接受传入连接,满足某些资源可用性要求(如带宽,CPU和存储容量),并在覆盖层中运行全双工。不是超级同伴的连接按照定义离开。叶插槽是到对等端的连接,不会将覆盖消息路由到其他对等端,并且在叠加层中以部分半双工方式操作。
固定插槽
固定插槽通过IP地址进行标识,并在管理器初始化期间进行设置,通常由配置文件进行设置。逻辑将始终向当前未连接的每个固定插槽发出连接尝试。如果我们从地址部分(没有端口)匹配固定插槽地址的端点接收到入站连接,则认为固定插槽已连接。
集群插槽
集群插槽由公钥标识,并在管理器初始化期间设置,或者在从可信连接覆盖层收到消息时发现。
算法
连接策略
所述连接策略应用的配置设置以建立期望的出站连接。它定期运行,并通过一系列阶段进行,每个阶段保持不变,直到满足条件
阶段1:固定插槽
当活动固定连接的数量低于配置中指定的固定连接的数量时,将调用此阶段,并且满足以下条件之一:
有合格的固定地址可以尝试
任何出站连接尝试正在进行中
每个固定地址都与一个重试定时器相关联。在固定连接失败时,计时器被重置,以便地址在一段时间内不被尝试,该时间根据预定的顺序增加到某个最大值,当前设置为重试之间约一小时。如果我们当前没有连接或尝试该地址,并且其重试计时器已过期,则认为固定地址符合条件。
PeerFinder在继续建立到外部对等点的传出连接之前,尽最大努力完全连接到配置文件中指定的固定地址。这个安全特性有助于在接受来自网络的不可信数据之前,首先使自己与一组可信任的对等方建立自己的关系。
第2阶段:Livecache
当阶段1未激活,启用自动连接并且活动出站连接数低于所需数量时,将调用Livecache。阶段依然活跃,同时:
Livecache有地址可以尝试
任何出站连接尝试正在进行中
PeerFinder尽最大努力在Livecache中耗尽地址,然后再转到Bootcache,因为Livecache地址很可能是可连接的(因为它们在最后一分钟内已知在线),并且极有可能具有开放时隙用于传入连接(因为对等方只有在Livecache开放时才在自己的Livecache中宣传自己)。
阶段3:Bootcache
当阶段1和阶段2未激活时启用Bootcache,启用自动连接,并且活动出站连接的数量低于所需数量。阶段依然活跃,同时:
缓存中有最近未尝试过的地址。
Bootcache中的条目是排名靠前的,高度可连接的地址比其他地方更受欢迎。尝试连接到Bootcache地址的连接很可能会成功,但不太可能产生活动连接,因为对等方可能没有空闲插槽。在远程节点关闭连接之前,它将从其Livecache发送一些地址,以帮助新的对等节点联机获取连接。