1. 首页
  2. 技术分享

IPFS底层技术Libp2p简介|点滴资讯

IPFS底层技术Libp2p简介|点滴资讯

 Go-ipfs

Ipfs的协议用go语言实现,ipfs协议的最新版本是v0.4.21

下载地址:https://github.com/ipfs/go-ipfs

源码阅读:

Go 主文件: https://github.com/ipfs/go-ipfs/blob/master/cmd/ipfs/main.go

命令行 : https://github.com/ipfs/go-ipfs/tree/master/core/commands

Bitswap协议:https://github.com/ipfs/go-ipfs/tree/master/exchange/bitswap

DHT(分布式哈希表): https://github.com/libp2p/go-libp2p-kad-dht

PubSub: https://github.com/libp2p/go-floodsub (该功能还没有纳入到IPFS协议的之功能里面,当前作为测试功能存在)

libp2p(网络层): https://github.com/libp2p/go-libp2p

 

  js-ipfs

IPFS协议js语言实现

Github主页:https://github.com/ipfs/js-ipfs

 

Libp2p协议模块:

协议实验室(Protocol Labs)为IPFS特意开发了几个模块。每个模块都可以理解为独立的项目。可以独立的运作。

IPFS查找数据的底层。Filecoin激励层。Libp2p(路由,网络,交换数据)网络层。IPLD命名系统定义数据。Multiformats负责身份的加密和数据的自我描述。

在协议实验室的主页上面,可以找到目前的五个个项目:

· IPFS:ipfs.io   Filecoin: filecoin.io  libp2p: libp2p.io   IPLD:ipld.io  Multiformats:multiformats.io

 

IPFS底层技术Libp2p简介|点滴资讯
Libp2p在网络中主要负责的是数据的传递功能,即路由,网络,交换等。Libp2p是一个模块化的网络堆栈,libp2p结合了各种传输和点对点协议。开发人员可以轻松的构建大型的p2p网络。是点对点传输协议的底层。实现去中心化的传输需求。

Libp2p从它的实质上说就是链接节点的。就是任意两个节点,不管在哪里,不管处于什么环境,运行什么操作系统不管是不是在NAT之后只要有物理上链接的可能性,libp2p都会帮你完成链接。Libp2p作为IPFS和Filecoin的网络层,IPFS里面的很多功能就是对libp2p的一个简单的抽象和封装。如股票很厉害的话完全可以基于libp2p这个库实现一个新的IPFS。

从路由、网络、交换来分:

 

IPFS底层技术Libp2p简介|点滴资讯
Libp2p里面包含以下模块:

Transports:传输层,TCP,uTP,QUIC,SCTP……

Discovery:网络发现层,mDNS,bootstrap,DNS,Kad……

Peer Routing: 节点路由,mDNS, KadDHT……

NAT Traversal: NAT穿越层……

Content Routing: 内容寻址……

IPFS底层技术Libp2p简介|点滴资讯
IPFS团队将各个模块可以做到几乎完全解耦合。

Libp2p的协议比较复杂,以往我们上网的方式是移动4G或者是wifi或者宽带,上网的方式是拨号。也可能是固定的公网ip。会有防火墙等。各种通讯协议以及网络设备的存在使得构建大规模的点对点网络变得复杂。IPFS团队将p2p网络的网络层从IPFS里面分离出来形成一个独立的项目libp2p。

Libp2p主要负责让每个网络模式之间能够顺利的传送数据。

Libp2p的功能主要是:发现节点、连接节点、发现数据、传输数据。

 

使用libp2p的一个节点可以与另一个节点进行通信并且可以使用不同的传输方式不同的通信协议进行通信。根据需求进行协商。

 

1、 libp2p的流程

(1) 运行 Libp2p 协议的节点在初始化之后需要通过各种方式发现更多的节点,比如 Bootstrap list、mDNS、DHT 等,这主要由发现模块(Discovery)负责与实现。

(2)当发现更多接点后,Libp2p 会把这些获取到的节点信息存储在分布式记录存储模块中,供以后方便使用。

(3) 当上层应用需要连接某个节点时,节点路由模块(Peer Routing)会找到多条不同的路径,连接管理模块(NAT Traversal)会对这些路径进行尝试连接。

(4) 连接成功之后,上层应用将通过内容寻址模块(Content Routing)与连接节点进行内容交互,在底层通过传输模块(Transports)互相传递数据。

包括三个部分:

(1) 地址解析

(2)传输协议适配

(3)双方协商连接建立之后,libp2p 会首先进行双方协商,确定对方支持哪些功能。负责协商功能的是 identify 协议,它是内置在 libp2p 的基础协议,能够交换节点的公钥、本地监听地址等。协商完成后,连接两端的节点会找到共同支持的协议,并且初始化它们。初始化时会注册每种协议的 handler(回调函数),当有协议数据到达时,相应的 handler 就会被调用。由于多种传输协议会复用同一个底层连接,所以连接会被拆分成多个“流(Stream)”。

 

IPFS底层技术Libp2p简介|点滴资讯
Libp2p是一个RPC框架。Rpc过程指的是节点1与节点2通信,节点1想要告诉节点2一些数据,先序列化为字节流,能够在网络中传输。然后进入传输层,节点2在反序列化拿到这个数据。Libp2p还不是最底层的模块,最底层有一个Multiformats的库,提供各种功能的抽象层。而且把这些功能抽象成一个统一接口。Libp2p还是一个工具库,里面有一些开发者需要的基本功能,完善了传输层。这些工具基本上含有:包括链接复用、ID交换、中继、NAT穿越、dht发现、RTT统计等。

几个概念:

(1)NAT:见NAT解析

(2) 链接复用

(3) ID交换

(4) 中继

(5) DNT发现

(6) RTT统计

2、为什么需要libp2p

在做IPFS的时候,遇到了大量的异构设备,运行着不同的操作系统,网络环境非常复杂,比如在中国有各个NAT,还有某些场景下,可能用不了tcp链接,还有就是文件系统多样性,以及很可能需要协议变迁,比如比特币已经经历过很多次的协议变迁,每次都需要51%的节点支持。那么其实可以通过一种比较巧妙的方式来完成。

未来等IPv6出来以后,很可能是物联网、P2P应用、区块链的大爆发时期,尤其是物联网。所以协议实验室决定把他们遇到的问题全部抽象出来,做个libp2p的库,让其他开发者能够直接使用这个库,屏蔽掉所有问题,只关注业务逻辑即可。

3、libp2p目标及现状

libp2p的目标很远大,但是协议实验室现在只做到了一部分,不过已经可以基本满足使用了。

 

IPFS底层技术Libp2p简介|点滴资讯
4、libp2p的原理

 

IPFS底层技术Libp2p简介|点滴资讯
第一层是接口层,最上面就是它帮我们实现的一些接口功能。然后就是host,这两个host是有互相继承关系的,routed的是basic的一个扩展实现。在libp2p中,一个host是一个节点,所以在IPFS中,都是以host为单位进行数据分发与传输的。

核心组件详解:

 

IPFS底层技术Libp2p简介|点滴资讯
Transport在应用层和传输层中间,把它封装起来是为了1,流行的传输协议可能只有这些。2,为了找ip地址没有办法指定协议,将各个传输层全部抽象为一个统一的接口,只要匹配好接口即可。所以p2p网络不用在关注底层传输。

IPFS底层技术Libp2p简介|点滴资讯
 

Upgrader:https协议中,底层是tcp,上面加了一个加密的套接字层。其实这个加密套接字层就是upgrader,但是libp2p中,它的功能更多了一些,大概有四层,以tcp链接举例,我的一个原始链接,先经过filter,filter是一个地址过滤器,protector就是私网,IPFS也是通过它来实现的。Secure就是加密层,muxer是复用机制。

第一层filter upgrader:判断地址是否在黑白名单里面。

第二层protector upgrader:这一层网络保护也叫私有网络。建立一个分布式应用,若在私网下建立首先要生成一个密钥,然后把密钥分发到所有的节点中。

IPFS底层技术Libp2p简介|点滴资讯

原创文章,作者:jiang,如若转载,请注明出处:https://ipfsdrop.com/tech/ipfsdicengjishulibp2pjianjiediandizixun/

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

(+86)18301922335

在线咨询:点击这里给我发消息

邮件:haskell@freechains.cn

工作时间:7×24小时

QR code