IPFS(InterPlanetary File System)研究报告

介绍

IPFS(InterPlanetary File System)是一种新的点对点超媒体协议,它的目标是为了补充(甚至是取代)目前统治互联网的超文本传输协议(http),使得互联网更快、更安全、更开放。胡安(Juan Benet)在2015年提出了IPFS,并在Y Combinator 项目中成立了Protocol Labs公司致力于IPFS的推广。

传统的基于HTTP协议的问题在于:现在当你进入某个网站时,你的浏览器需要直接连接到这个网站的服务器,会在服务器与浏览器之间传输很多静态文件,由于这些服务器可能会位于非常遥远的地方,这种方式也会消耗大量的带宽。更糟糕的是如果连接到这个服务器中间的某个路由器被切断,那么这个这个网站将无法访问。 
另外,因为HTTP是中心化的结构,很容易导致DDoS攻击。

IPFS提出了内容寻址的技术来解决上面出现的问题,在这个方案中,内容与服务器分离,可以在离用户非常近的地方储存和托管。内容寻址还可以校验数据,解决了数据被篡改而产生的信任问题。一旦内容被下载到本地,即可以被无限期保存,也可以为其它网络节点提供服务,节省网络带宽,可以在网络条件欠佳的地区带来极大好处。它杜绝了DDoS攻击,并且可能保存一些重要公共数据,避免网络终止运营带来的数据丢失问题。

核心技术

IPFS是构建在几项目前非常成熟的技术基础之上,它可以被认为是一个BitTorrent Swarm在一个Git Repository中交换数据,提供了一个高吞吐量内容寻址的块存储模型。它不存在单点问题,节点之间也不需要互相信任。

在IPFS中的文件层次模型从下向上如下:

文件块-->文件-->文件夹-->版本

每层对象都可以独立寻址。

首先对于小于256k的文件进行hash,使用DHT(分布式hash表)提供hash与文件块地址的映射,这样可以通过一个作为地址的hash值直接寻址并下载这个文件。

对于大于256k的文件来说,可以将这个文件划分成256k大小的数据块,并用这些数据块的hash值构建一个Merkle DAG(有向无环图),选择Merkle DAG的根hash值作为文件的地址。通过这个hash可以先下载其所有块的hash列表,再分别下载对应的文件块组建成文件。

文件夹的构建方式与上面类似。 
多个文件与文件夹构成版本概念。 
核心理念将所有数据通过一个Merkle DAG进行建模。

详细协议栈分为以下几个部分 
      1.身份标识 
       通过S/Kademlia算法生成一个公钥和私钥对,节点的标识NodeId=hash(公钥),节点互相连接时先交换公钥,然后检查:NodeId?=hash(公钥) 
在传输数据时会通过公钥进行签名,保证点到点传输的安全性。

2.网络 
       传输层可以使用任何协议,如浏览器的WebRTC或者uTP。 
可靠性,使用uTP 或者SCTP提供可靠性,即使底层的网络无法提供。 
使用ICE NAT 提供可连接性。 
完整性,消息的完整性使用checksum进行校验。 
认证,使用HMAC和发送者的公钥认证用户。 
节点可以根据其支持的传输协议有多个地址,如: 
/ip4/10.20.30.40/sctp/1234/ 
/ip4/5.6.7.8/tcp/5678/ip4/1.2.3.4/sctp/1234/

3.路由 
       路由可以提供节点与数据的寻址,主要功能如下:

  • 通过节点ID找到其可连接的网络地址,
  • 广播节点可以提供服务的数据
  • 获取保存特定文件的节点列表

4.数据块交换-BitSwap Protocol 
      与BitTorrent相似,每个节点都有want_list和一个have_list,不同的是加入了交易市场的概念,使用了加密货币技术(开发中)鼓励节点保存更多冗余较少的数据。

5.所有的数据构成 Merkle DAG 
      所有的数据以其hash作为标识,可以防止被节点恶意篡改,消除重复数据块。可以被加密。 
文件可以通过其hash值直接寻址,也可以根据其在文件夹中的位置进行相对寻址。如对于foo/bar/baz中的baz文件,可以使用以下路径获取 
/ipfs//bar/baz 
/ipfs//baz 
/ipfs//

6.文件  

IPFS与git的文件组织模型非常类似,它定义了一系列object用来在Merkle DAG的基础上构建版本化的文件系统。 
这些object如下:

  • block: 可变长度的数据块
  • list: block或者其它list构成的列表结构
  • tree: block、list或者其它tree构成的树形结构
  • commit: tree的历史版本快照

7.IPNS 
      在IPFS中所有的数据都是不可变的,对于构建的网络服务来说,一旦服务的内容发生改变,之前发布的地址就失效了,为了解决这个问题,IPFS构建了一个InterPlanetary Name Space, 提供类似于DNS的服务,它本质上是在DHT上设置了一个动态Merkle DAG指针。它的地址以/ipns开始。

应用IPFS

  • 作为全局的文件系统使用可以直接挂载到本地文件系统上的/ipfs和/ipns目录下
  • 作为个人备份文件夹,自动进行版本发布与写备份
  • 作为一个加密文件或数据分享系统
  • 对所有软件进行版本控制
  • 作为一个虚拟机的根文件系统
  • 作为hypervisor虚拟机的启动文件系统
  • 作为一个数据库, 应用可以直接读写Merkle - DAG数据模型,获取IPFS提供的版本、缓存和分布式功能
  • 作为一个在线的交流平台
  • 作为一个大文件完整性验证的CDN,不需要SSL
  • 作为一个web CDN
  • 作为一个重要数据的发布网络,链接从不会挂掉

参考

IPFS官网 :https://ipfs.io/docs/

IPFS:替代HTTP分布式网络协议 :http://www.infoq.com/cn/articles/ipfs

分享到: