IPFS世界的物流系统:libp2p

今天小编为大家介绍一下IPFS的另一个重要组件:libp2p,它负责把IPFS的文件块(详见本公众号之前的文章:IPFS数据之旅(二):名正才能传顺)从一个节点搬运到另一个节点,让上层应用不必关心复杂的网络细节,只需要像收发快递一样,填好收件人(目的节点ID)就可以了。

 

组成

 

按照libp2p官方文档,它主要包括如下几个模块:

IPFS世界的物流系统:libp2p_第1张图片

  • 节点路由:负责找到到达某个节点的可用路径,类似于我们开车时候用的导航软件

  • 连接管理:负责管理节点之间连接的创建、维护、销毁,它相当于libp2p的大脑

  • 分布式记录存储:负责记录节点相关的各种信息,便于连接管理和内容寻址

  • 节点发现:负责找到网络里面的可用节点

只有找到了足够多的节点,才能获得对整个IPFS网络的认识。故libp2p会在初始化之后不停地通过各种方式“结识”更多的节点,包括利用Bootstrap list、mDNS、DHT等。libp2p会把这些获取到的信息存储在分布式记录存储模块中,供以后查询之用。当上层应用需要连接某个节点时,节点路由模块会找到几种不同的路径供连接管理模块尝试(由于P2P网络本身的特性,节点之间的连接状况始终在动态变化,故不是所有路径都是可以成功连接的)。连接成功之后,libp2p会回调上层应用来处理产生的数据,类似于快递员喊你来取快递。

 

下面我们具体分析一下连接的建立过程,主要包括3个步骤,包括地址解析、传输层适配、协议能力协商。

地址解析

 

为了适应复杂的网络环境,libp2p支持多种不同的底层协议,包括TCP、QUIC、WebSocket、WebRTC等,甚至IPFS社区专门立了一个项目来标准化节点的地址——multiaddr。目前libp2p主要支持以下几种地址格式:

 

  • /ip4/123.11.22.33/tcp/4001/ipfs/QmNodeID: 这种格式跟传统的TCP网络里是一样的,直接可以解析出对应的IPv4地址和端口号;

  • /ipfs/QmNodeID: 这种只有节点ID的地址,需要节点路由模块找到节点对应的IP地址,然后再进行连接;

  • /dns4/ipfs.ipfsbit.com/tcp/443/wss/p2p-webrtc-star: 这种地址需要调用multiaddr-dns组件,把域名解析成IP地址,然后再进行连接;

  • /p2p-circuit/p2p/QmNodeID: 这种地址是relay地址,需要首先连接一个中间节点,才能连接到目的节点;

通过地址解析,libp2p能获知如何才能连接到目的节点,下一步就是尝试建立连接。

 

传输层适配

 

地址里面的

/tcp/quic/ws/p2p分别对应不同的传输层实现。libp2p定义了统一的传输层接口标准:

IPFS世界的物流系统:libp2p_第2张图片

libp2p会选择地址对应的transport,调用Dial函数尝试连接目的节点。

协议能力协商

 

连接建立之后,libp2p会首先进行协议能力协商,确定对端支持哪些功能。负责协商功能的是identify协议,它是内置在libp2p的基础协议,能够交换节点的公钥、本地监听地址、对端观察地址等。

 

协商后,连接两端的节点会找到共同支持的协议,并且初始化它们。初始化时会注册每种协议的handler(回调函数),当有协议数据到达时,相应的handler就会被调用。由于多种协议会复用同样的底层连接,所以连接会被拆分成多个“流(Stream)”。libp2p整体的网络层级关系如下:

IPFS世界的物流系统:libp2p_第3张图片

 

你可能感兴趣的:(IPFS世界的物流系统:libp2p)