回顾
星际文件系统是一种点对点的分布式文件存储系统。IPFs的愿景是构建一个全球范围的分布式网络,以取代传统的中心化式服务器模式。所有IPFs节点组成一个分布式网络,每个节点都可以存储文件。用户可以使用DHT(distributed hash)从网络中构建IPFs表、分布式hash表(distributed hash Table)来获取文件,从而实现新一代完全去中心化的网络,旨在取代现有的万维网。IPFs具有DHT组网、文件存储、bitswap文件交换等功能。
文件存储和文件交换的技术细节可以通过之前的tweet了解。今天,让我们来理解这个文件系统的“基础”——网络模块。
初步了解IPFs网络
IPFs是一个开源项目。要实现其构建全球分布式网络的目标,首先必须解决不同国家和地区的节点连接问题。
首先看一下IPFs网络的配置,如下图所示。红色框中的Swarm是IPFs监控的网络地址,IPFs支持IPv4和IPv6协议,默认情况下支持quic协议。
*Quic协议最早由Google提出,并已提交给IETF,成为正式的网络规范。与TCP相比,quic网络传输协议的传输速度更快。
IPFs节点启动后,日志如下图所示。您可以看到IPFs节点监视以下网络地址,包括本地、局域网、广域网地址,**是/P2P电路地址。
问题是,为什么我们需要监控这么多地址?
这是因为IPFs是一个开源项目。为了连接世界各地的节点,必须解决各种网络环境下的节点连接问题。
听本地地址,这样多个IPFs节点可以在本地启动,并且可以用这个地址连接,听局域网地址,这样多个IPFs节点可以在内网启动,并且可以用这个局域网地址连接,听广域网地址,这样就可以在公网中启动多个IPFs节点,并将它们连接到这个广域网地址。
通过上述方法,解决了大多数网络环境下IPFs节点的网络连接问题
两个节点位于同一主机上:通过127.0.0.1地址连接
同一内网中的两个节点:通过局域网地址连接
两个节点都有公网地址:通过公网地址连接
内网一节点,公网一节点:内网节点通过公网节点的公网地址连接
这里有个问题。如果两个节点在两个不同的intranet环境中,由于NAT设备的存在,NAT设备可能是对称的。对称NAT设备不能被穿透。因此,IPFs提供了中继来解决不同intranet环境中节点的连接问题。上述监听/P2P电路地址就是为了解决这个问题。对于不同intranet环境中的两个节点,IPFs提供了中继,解决了不能直接连接到intranet环境的节点可以通过配置中继节点来连接的问题。
到目前为止,IPFs已经解决了在不同网络环境中建立节点间连接的问题。让我们看看IPFs是如何构建一个大规模的分布式节点网络来连接世界上不同地区的所有节点的。
IPFs网络建设
IPFs网络建设过程可分为两个阶段
引导阶段
在IPFs节点启动之前,它需要配置它的引导节点。配置文件中的相关配置如下图所示。引导配置配置IPFs节点在启动时需要连接的所有种子节点的列表。这些节点的地址列表信息是默认值。如果需要构建IPFs专用网络,可以将其修改为自己的种子节点列表(以QM开头的字符串是IPFs)node ID)。默认情况下提供的种子节点是具有公共网络地址的所有节点。当IPFs节点启动时,首先连接到seed节点,然后通过seed节点发现IPFs网络中的更多节点进行连接,即DHT组网阶段。
DHT的网络化阶段
IPFs节点成功连接到seed节点后,通过DHT查找其他节点。有关DHT的详细说明,请参阅本文“libp2p中的DHT和位交换”。
在找到其他节点后,它们会尝试连接,成功连接的节点将被添加到节点列表中,以便它们可以直接与节点通信。考虑到世界上IPFs节点的规模很大,每个节点不可能与其他节点保持长期的连接,因此每个节点的连接数量是有限的。一般每个节点的连接数小于1000(IP),如果一个未连接的节点需要通信,可以通过DHT找到该节点的地址,然后连接该节点进行通信,从而形成一个大规模的分布式节点网络。
我们可以通过一个例子来说明上述过程。下图是常见的网络拓扑。有三个网络连接到因特网。IPFs node1部署在具有公共IP的服务器上,外部可以直接访问该节点。IPFs node2和IPFs node3部署在对称NAT设备后面,外部无法访问节点。
在上述网络架构中,公网中的IPFs node1作为种子节点。首先启动种子节点,然后将IPFs node2、node3、node4和node5的种子节点配置为IPFs node1。启动后,首先连接IPFs node1。连接成功后,通过DHT找到其他节点,**分别连接。对于IPFs,IPFs node1是connected node1,连接到它的节点地址列表如下图所示。由于IPFs node2、node3、node4和node5都在NAT设备后面,因此IPFs node1的节点列表中这些节点的端口是NAT设备映射的端口(本地启动的默认IP FS端口是4001)。
对于IPFs node3,其节点地址列表中IPFs node1的地址是公网地址。由于IPFs node3和IPFs node2位于NAT设备后面,不能直接连接,因此IPFs node2的地址是一个中继地址。IPFs节点1充当中继节点。当IPFs node3向IPFs node2发送消息时,它通过IPFs node1转发消息。中继地址的格式如下:
中继节点地址/P2P电路/P2P/目标节点ID
在IPFs node3的节点地址列表中,IPFs node4和IPFs node5的地址都是LAN地址,完成了公网节点和NAT设备后面的LAN节点的组网过程。
总结
以上是IPFs网络的建设过程。为了便于描述,本文仅以几个IPFs节点为例。
事实上,这种IPFs的组网方式也能很好地支持超大规模节点的组网。当节点规模较大(上万个节点)时,设置几十个节点作为种子节点,通过DHT组网可以完成上万个甚至更多节点的组网。此时,每个节点的长连接数保持在数百个,如果后续节点之间的通信还没有通过DHT建立,可以根据节点ID查询该节点的地址信息(地址列表,包括所有公网和局域网地址),然后通过地址连接节点,**完成通信过程。
这种IPFs网络的构建方式对于分布式系统也是非常值得学习和借鉴的。
关于作者
姚文浩是数据网格实验室bitxmesh团队的数据平台架构师
文章标题:如何构建IPFs网络?
文章链接:https://www.btchangqing.cn/189295.html
更新时间:2021年02月03日
本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。