介绍
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.路由
路由可以提供节点与数据的寻址,主要功能如下:
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如下:
7.IPNS
在IPFS中所有的数据都是不可变的,对于构建的网络服务来说,一旦服务的内容发生改变,之前发布的地址就失效了,为了解决这个问题,IPFS构建了一个InterPlanetary Name Space, 提供类似于DNS的服务,它本质上是在DHT上设置了一个动态Merkle DAG指针。它的地址以/ipns开始。
应用IPFS
参考
IPFS官网 :https://ipfs.io/docs/
IPFS:替代HTTP分布式网络协议 :http://www.infoq.com/cn/articles/ipfs