这是个很好的问题。用一句话来概况就是libp2p是一个模块化的协议系统,它的规范和程序库可以用来开发p2p网络应用程序。
对等节点基础
对于我们对libp2p在上面的概要描述有很多内容需要进一步解释,我们先从最后提到的一点开始,“p2p网络应用程序”。你现在正在这里阅读这篇文章,很可能你正在进行p2p系统的开发,而且正需要寻求帮助,亦或者这是你第一次来探索p2p网络的世界。不论是那种情况,我们都应该先花一分钟时间来定义一下我们的术语,我们有一些术语你可以前往shared vocabulary进行查看。
P2p网络是一种所有参与者能够或多或少的在平等地位的基础上进行直接通讯的网络。这并不是意味着所有节点都是相同的,他们在整个网络中可能有着不同的角色。可是,p2p网络定义的一个重要特征是没有servers 和clients,severs 和 clinets 是client / server model的特征。
因为p2p网络的定义非常的广泛,现在许多已经建立的系统都属于p2p的范畴。最突出的例子就是文件共享系统bittorrent, 还有更多的最近激增的区款链网络系统。
Libp2p能解决什么问题?
虽然P2p网络比client/server 模型有很多优点,但是它仍有很多挑战需要我们认真思考和在实践中进行克服。我们在建立IPFS的时候,我们是通过模块化的解决方案来处理这些挑战的,这样说为啥现在有了libp2p。现在libp2p已经从IPFS独立出来了, 它不再需要或依赖IPFS,现今有很多项目都是用libp2p作为他们的网络传输层。我们可以一起利用我们现在积累的经验解决这些基础性问题,这对整个开发者生态系统和整个世界上的用户都有益处。这里我将会简单罗列出libp2p所宣称的主要问题领域(2019年之前)。这些范围一直在增长,所以如果随着时间的推移他们有所变化,你也不要感到吃惊。我们将尽最大努力保持这些内容是最新的,但是如果你发现有些内容缺失或者有其他想法可以改善这些文档,请联系我们,让我们知道(reach out to let us know)。
传输
libp2p的基础是传输层,它是负责与其他节点进行传送和接收数据。现今有很多方法通过网络进行数据传输,甚至包括现在正在开发和设计的方式。Libp2p提供了简单的接口用于适应现存的或未来的协议,这使得libp2p应用程序可以运行在许多不同的网络环境中。
身份
在整个世界有数十亿的设备进行着网络连接,知道你正在跟谁说话是进行安全可靠通讯的关键。Libp2p使用公钥密码学(public key cryptography)作为节点身份认证的基础,公钥密码学可以提供两个基本特征。第一,它给全球每一个节点指定一个唯一的名字,也就是节点ID。第二,节点ID允许任何人通过检索公钥进行节点身份认证,这使得节点之间能够安全的通信。
安全
最基本的需求是我们能够在节点之间安全的发送和接收数据,那就意味着我们能够相信我们正在通信的节点的身份,并且没有第三方能够读到我们谈话信息和修改他们。
Libp2p支持传输层模块提供的通过升级通讯连接使其变成安全加密通道连接。这个过程非常灵活,还可以支持多种加密通讯方法。当前默认的是 secio,对 TLS 1.3 的支持正在开发。
节点路由
当你想发送消息到其他节点,你需要两个关键信息:他们的节点ID和一种在网络上定位他们的方法以至于能够与他们建立连接。
我们的很多例子只有我们想要连接节点的ID,我们还需要一个用来发现他们的网络地址的方法。节点路由是利用其它节点的信息来发现节点地址的过程。
在一个节点路由系统中,一个节点如果知道我们所需节点的地址,它会发送给我们,否则它会把我们的查询信息发送给它认为最有可能知道答案的其它节点。随着我们联系越来越多的节点,我们不仅增加了我们查找所需节点的机会,而且更完善了我们的路由表视图,这使得我们能够回答来自其它节点的查询。
目前libp2p中稳定的对等节点路由实现使用一个分布式哈希表,使用Kademlia路由算法迭代路由请求,使其逐渐接近所期望的对等节点ID。
内容发现
在一些系统中,相比于知道正在跟谁通讯,我们更关心他们能够向我们提供什么。例如,我们想获得一些特定数据,但是我们并不关心我们是从哪里获得的因为我们能够验证这些数据的完整性。
Libp2p基于这个目的提供了内容路由接口( content routing interface),现在稳定版本的实现使用的也是与节点路由相似的基于 Kademlia 的DHT算法。
消息、发布与订阅
发送消息到其他节点是P2P系统的核心, 发布和订阅是一种向特定人群发送他们所感兴趣的消息的一种非常有用的模式。
Libp2p定义了发布与订阅接口,用于向所有订阅了特定主题的节点发送相应的消息。当前稳定的接口实现有两种:floodsub使用起来非常简单,但是效率不高,它使用的是network flooding策略。 gossipsub定义了一个可扩展的gossip协议。episub目前也正在积极的开发中,它是对gossipsub进行了扩展,这是为単源组播和少数固定源向大量客户端广播进行优化的。