10月20日,在由晨雾科技主办的中国IPFS开发者沙龙上,晨雾科技的联合创始人徐潇,他带来了名为《libp2p详解》的主题演讲。
libp2p为什么重要呢?今年7月份,协议实验室将libp2p提升为一级项目,与IPFS和Filecoin比肩,libp2p还是IPFS与Filecoin的基础设施,也就是说它们的底层技术完全是基于libp2p实现的。而且,libp2p更是未来p2p应用、区块链和物联网的基础设施。它高度抽象了主流的传输协议,使得上层应用搭建时完全不必关注底层的具体实现最终实现跨环境、跨协议的设备互联。
徐潇的演讲聚焦于libp2p的实现原理与核心流程。他对libp2p中的核心组件在系统中的功能与实现细节一一做了介绍,并详细解读了libp2p初始化结点、拨号、监听、rpc和数据交换等核心流程。
以下内容为整理。
我主要为大家讲的是go的实现,它其实还有rust和JS实现。之所以只讲go,是因为go是它的第一个产品库,也是实现最全面的一个库。
一、libp2p概要
1、libp2p是什么?
libp2p就是帮助你链接节点的一个库。它的特性是什么?就是任意两个节点,不管在哪里,不管处于什么环境,不管运行什么操作系统,不管是不是在NAT之后,只要他们有物理上链接的可能性,那么libp2p就会帮你完成这个链接。
现在对于协议实验室来说,libp2p处于非常重要的一个模块,它是IPFS和filecoin的网络层。大家如果对它有很深的认识,就会发现IPFS里的很多功能就是对libp2p的一个简单抽象与包装。换句话说,如果你有一些新的想法,完全可以基于libp2p这个库实现一个新的IPFS。
libp2p是一个rpc框架。rpc过程指的是节点1想告诉节点2一些数据,我先序列化成字节流,能够在网络中传输,然后进入真正的传输层,节点2再反序列化拿到这个数据。其实libp2p还不是最底层的模块,它下面还有一个Multiformats的库,Multiformats提供各种功能的抽象层,并把这些功能抽象成一个统一的接口。
libp2p还是一个工具库。为什么这么说呢?因为我们平常在做软件开发的时候,不光要关注底层,比如tcp链接,还需要关注链接状态等信息。协议实验室通过他过去的一些经验,总结出了所有开发者基本都需要的一些功能,把它们放到了libp2p库里面,相当于完善了传输层。我简单列了一些,这些工具的功能主要包括链接复用、ID交换、中继、NAT穿越、dht发现、RTT统计等。
2、为什么要做libp2p?
之所以要做libp2p,是因为在做IPFS的时候,遇到了大量的异构设备,运行着不同的操作系统,网络环境非常复杂,比如在中国有各个NAT,还有某些场景下,可能用不了tcp链接,还有就是文件系统多样性,以及很可能需要协议变迁,比如比特币已经经历过很多次的协议变迁,每次都需要51%的节点支持。那么其实可以通过一种比较巧妙的方式来完成。
未来等IPv6出来以后,很可能是物联网、P2P应用、区块链的大爆发时期,尤其是物联网。所以协议实验室决定把他们遇到的问题全部抽象出来,做个libp2p的库,让其他开发者能够直接使用这个库,屏蔽掉所有问题,只关注业务逻辑即可。
3、libp2p目标及现状
libp2p的目标很远大,但是协议实验室现在只做到了一部分,不过已经可以基本满足使用了。我列出了libp2p的目标和现状,大家可以大致看一下。
二、libp2p原理
1、核心组件关系图
如下图所示,这是libp2p核心组件的关系图。
先简单介绍一下,第一层是接口层,最上面就是它帮我们实现的一些接口功能。然后就是host,这两个host是有互相继承关系的,routed的是basic的一个扩展实现。在libp2p中,一个host是一个节点,所以在IPFS中,都是以host为单位进行数据分发与传输的。接下来我慢慢来讲细节。
2、核心组件详解
transport
首先我要讲transport,它在应用层和传输层中间,看这个就知道其实很简单,之所以要把它封装起来,基于两个理由,一是现在世界上流行的传输协议可能只有这些,但协议是不断演进的。 二是我们平常去找ip地址,有个弊端就是没法指定协议。所以这个东西的核心就是把各个传输层全部抽象为一个统一的接口,只要匹配好接口就可以了。这也是为什么我们说开发p2p网络不用再关注底层传输协议的原因。
upgrader
接下来讲一下upgrader,我们知道传统的https协议中,底层是tcp,上面加了一个加密套接字层,其实这个加密套接字层就是upgrader,但是libp2p中,它的功能更多了一些,大概有四层,我会逐层讲解。
首先以tcp链接举例,我的一个原始链接,先经过filter,filter是一个地址过滤器,protector就是私网,IPFS也是通过它来实现的。Secure就是加密层,muxer是复用机制。
filter upgrader,这一层非常简单,它就是判断一个地址在不在我的黑白名单里面。
protector upgrader,这一层叫保护网络,其实也叫私有网络,因为它的运行原理就是你如果建了一个分布式应用,如果在私网下建,首先你要生成一个密钥,然后把这个密钥分发到所有的节点中,在每一个节点在初始化的时候,会用这个密钥对链接进行设定,设定了以后,在通信的时候,就会先互换一个随机数,再用这个随机数以及这个密钥来加密整个的传输信道。为什么叫私有网络呢,因为你没有这个密钥,根本就无法跟别人通信。
Secure upgrader,就是类似TLS的加密链接层。这一层目前使用的加密方式有两种,一个是对称加密,一个是非对称加密,非对称加密用来握手,对称加密用来加密信道。比如两个节点间的三次握手,第一次握手互换信息,比如你的公钥是多少,nonce是什么,还有我支持的非对称加密的列表和对称加密列表,以及我们支持的哈希方式列表。协商之后开始第二次握手,交换信息,包括临时密钥和签名信息,根据对方的公钥进行加密,对方用自己的私钥去解密就好。然后两个人之间已经协商出了可用的通信密钥。第三次握手其实是验证信息,验证对方有没有按照正确的方式生成。
Mux upgrader,它也叫链路复用器。顾名思义就是复用了同一个链路,在一个链路上面可以打开多个链接。
relay
再来讲一下中继transport,它对中国的部分场景还是非常有用的,主要是因为涉及到NAT的问题。中继的实现方案是这样一个框架图,底层是tcp链接,再监听,然后新的tcp链接进来并进行升级,得到了中继的一个流,如果中继是代理到这里就结束了。如果是末端节点,那么它把这个stream又抽象成了一个链接的概念,进而在监听器上面起了一个新的链接,叫中继链接,对中继链接进行升级,得到一个stream,就到业务逻辑了。中继很有意思的一点,不管中继listener监听到了多少物理链接,底层对应的都是一个物理链接,所以中继场景下的链接都是轻量级的。
peerinfo
再来讲一下peerinfo,它代表了一个节点的相关信息,它包含的内容就两点,一个是ID,ID是谁?就是我的名字,ID怎么来的?通过公钥,经过一次哈希得到的,也是一个节点的唯一标志。另外就是地址信息,我这个ID的具体地址是什么,包含3份信息,监听地址、观测地址、NAT映射地址。
peerstore
peer store的结构如上图,它类似于我们传统生活中的电话本、通信地址薄,会记录所有你知道的人的相关信息,比如说key book会记录一些公私钥的信息,metrics会记录链接的耗时时间,通过加权平均值的方式对这个节点进行评估。addr book就是地址的一个信息,默认的实现里面是一个带超时的地址信息,当然这个超时时间可以设为零。最后一个data store就是给地址打标签的意思。
swarm
swarm可以说是libp2p的一个核心,因为它才是真正的网络层。所有跟网络相关的东西全部在swarm里面,地址簿、链接、监听器都在这管理,它得有一个回调机制。让上层注册,当有一个新的stream进来以后,要调用一个相当于中转函数的概念。transport管理是说一个节点可以支持多种transport,dialer就是拨号器,不过它实际上有点复杂,同时我觉得也很厉害!感兴趣的朋友可以关注一下。它里面有三种拨号器,一个是同步拨号器,一个是后台限制拨号器,一个是有限制的拨号器,这三个拨号器会共同作用于整个拨号的过程。
然后讲一下NAT,这块可能大家都会比较关注,从目前实现方式来讲,NAT叫穿越不如叫映射。当下它的一个实现方式,就是我启动一个节点,先检查一下我附近的NAT设备运行的是什么协议,再获取到NAT的一个设备地址,然后对这个监听地址进行周期性的端口映射。但很可惜的是,目前只限于两种协议(Upnp、NAT-pmp)且在仅有一层NAT的时候有可能成功。美国的情况和中国的差异非常大,在美国,普通人的手机都能拿到公网ip地址。
host
最后说一下host,是我们操作的核心,一个host底下有这么几个部分组成,首先network,ID service就是我们身身份互换的一个功能,然后nat-manager就是刚刚我说的映射,conn-manager是链接管理。
3、核心流程详解
(此处流程比较复杂,如果没有技术背景且没有看过相关源码,可能难以理解;如有需要,可与徐潇团队联系。此处暂不阐述)
三、libp2p应用场景
应用场景这部分我简单讲一下,毕竟libp2p还处于不断的迭代中,现在还处于开发的阶段,目前基本上处于demo这样一个阶段的应用。
首先是物联网,我认为对于物联网场景来说, P2P链接是很重要的一环, ,比如, 安防场景下, 安防摄像头与手机之间,建立链接的话最好是直连,否则中央服务器的带宽撑不住,此时对于该场景来说, libp2p可以帮助其完成链路上的链接工作, 并额外完成了诸如NAT打洞(目前尚未实现, 但正在完善中), 流量及RTT统计, 长连接, 流式加密传输, 服务端主动与终端通信等工作.此外, libp2p也能适用于诸如车联网, 无人车等终端不断在各个网络间切换, 导致其ip信息不断变化的场景, 基于节点ID的链接方式及DHT路由发现机制, 可以有效屏蔽掉底层物理链接与上层逻辑的耦合度. 对于信息化时代的逐步到来与演进, 由个体产生的UGC内容在全网的占比将越来越多, 如何有效的将对的信息快速分发到对的人手里(如抖音与快手的关注视频, 直播平台的实时推流等), 同时降低中心化服务器的带宽压力, 将是未来发展的一条重要路线.
第二个就是区块链,已经有项目在利用libp2p作为它的底层,相当于分发层、调用层、传输层、网络层了。比如刚才多次提到filecoin,在“区块数据同步”、“文件传输”、“节点查找”等不少核心环节都使用了libp2p。还有Polkadot波卡链, 作为可能成为区块链3.0的开辟者, 并为了兼容现有的诸如eth以太坊等主链而采用的异构多链架构, 更要考虑终端设备的复杂场景, 因此其选择使用libp2p作为其底层传输层, 利用libp2p在各个模块的高度抽象带来的灵活性及可扩展性, 来避免现在及未来因区块链技术变迁导致的不兼容问题.
第三个是分布式聊天,就是我们通过ipfs网络互相之间发送聊天信息,也不用管对方链路到底是怎么样的,也不用管中央服务器。
第四个就是传输文件,IPFS就是用这个做的,所以这个应用性非常之广。
对LibP2P技术的小伙伴可以多了解一下,多进行踊跃的尝试,谢谢。