至此,IPFS解决了不同网络环境下的节点之间建立连接的问题,下面我们来看一下IPFS是如何构建大规模的分布式节点网络,将处于全世界的不同地区的各个节点连接起来的。 IPFS网络构建 IPFS网络构建的过程可以看作是两个阶段: ▲Bootstrap阶段 IPFS节点在启动之前需要配置它的Bootstrap节点,配置文件中相关配置如下图所示,Bootstrap配置中配置了IPFS节点启动时需要连接的所有种子节点列表,这些节点地址列表信息是默认的,如果需要搭建IPFS私有网络可以修改成自己的种子节点列表(Qm开头的字符串是IPFS的节点id)。默认提供的种子节点都是具有公网地址的节点,IPFS节点启动的时候首先连接该种子节点,后续通过该种子节点去发现IPFS网络中更多的节点,从而进行连接,也就是DHT组网阶段。 ▲DHT组网阶段 IPFS节点连接种子节点成功以后则去通过DHT去发现其他节点,关于DHT的详解可以看这篇文章《Libp2p中DHT和Bitswap详解》。 发现其他节点之后则尝试进行连接,连接成功的节点会加入到该节点的节点列表,以便后续可以直接与该节点通信,考虑到全世界的IPFS节点规模很大,不可能每个节点和其他节点保持长连接,所以对每个节点的连接数量做了限制,一般节点连接数量都在1千以下(IPFS配置文件中可以配置),对于没有连接的节点需要通信的话,可以通过DHT找到该节点地址,然后连接该节点进行通信,这样就构成了大规模的分布式节点网络。 我们可以通过一个示例展示上述过程。下图是一个常见的网络拓扑架构,有三个网络分别连接了Internet,IPFS node1部署在具有公网ip的服务器上,外部可以直接访问该节点,IPFS node2和IPFS node3都部署在对称型NAT设备后面,外部不能访问该节点。 在上面的网络架构下,处于公网的IPFS node1作为种子节点,种子节点最先启动,然后IPFS node2,node3,node4,node5的种子节点配置成IPFS node1,分别启动后首先连接IPFS node1,连接成功后通过DHT发现其他节点最后分别连接,对于IPFS node1,它连接的节点地址列表如下图所示,由于IPFS node2,node3,node4,node5均处于NAT设备后面,所以IPFS node1节点列表中这些节点的端口都是NAT设备映射后的端口(本地启动的IPFS端口默认是4001)。 对于IPFS node3来说,它的节点地址列表中,IPFS node1的地址是公网地址,由于IPFS node3和IPFS node2都处于NAT设备后面,不能直接连接,所以IPFS node2的地址是relay地址,IPFS node1节点作为relay节点,IPFS node3给IPFS node2发消息时通过IPFS node1转发,relay地址格式为: (责任编辑:admin) |