从今天开始我们聊一聊最近一直比较热门的 IPFS, 又叫星际文件系统(InterPlanetary File System), 通过这篇文章你会对 IPFS 的定义和整体架构有个初步的完整的认识。

IPFS 它是什么?

关于 IPFS 的理解,网上众说纷纭,很多人说它是区块链项目,也有人说它是分布式文件系统,还有人说它是矿机…

这里我们先抛开那些概念,首先我们看看IPFS官网(https://ipfs.io)对它的描述:

A peer-to-peer hypermedia protocol, to make the web faster, safer, and more open.

翻译过来是:一个点对点的超媒体协议,使得互联网更加快速,更加安全,更加开放.

提取一下句子的主谓宾, 你就能得到清晰,简明的定义: IPFS 是一个协议

这样理解起来很简单,但是有点抽象,根据信息论,要想消除一个事物的不确定性,减少信息熵,唯一的目的就是引入更多的信息,所以我们把定语还原:

IPFS 是一个__点对点__的__超媒体__协议。

IPFS 它要干什么?

这个我们还是从 IPFS 官网寻找答案:

IPFS aims to replace HTTP and build a better web for all of us.

这样看来 IPFS 协议诞生的目的是为了干掉 HTTP 协议,HTTP 协议出现到今天已经过去了半个多世纪,确实遇到一些瓶颈,并且 很少有一些设计能够增强整个 HTTP 网络或者为它带来新的功能。IPFS 的目标是就是取代 HTTP,重新建立一个完全去中心化,没有防火墙,没有政府监管,没有监控的 新的互联网世界。

IPFS VS HTTP

首先Http 是一种客户端-服务器的中心化访问模式,IPFS 是完全去中心化. http 是基于地址(主机ip)定位资源的,IPFS 是通过内容地址(Hash)定位资源 (具体的资源访问方式我们会在后面文章专门阐述)。

存储和访问

HTTP 是整文件存储,而 IPFS 是将文件切分成多个 chunk(文件碎片) 分散存储到多个节点,然后通过文件校验机制获取完整文件,这样使得文件的存储和访问更加高效 尤其是对于大文件来说,IPFS 的优势更加明显. 再者,在HTTP的文件系统中,存在大量的重复文件,而 IPFS 通过将文件切片之后,同一个切片只会保存一份, 大大提高文件碎片的重用性,节省存储空间。

传输

IPFS 传输高效,节约带宽资源,IPFS地址不是指的位置,而是直接指向资源,并确保这些数据都是来自最近的资源。 IPFS也会自动选择离你距离最近,带宽最流畅,存储速度最快,最可靠的节点来帮你存储数据,虽然你依然可以使用 HTTP + CDN 来使得服务器更靠近你, 但即使这样,可能最近的服务器还是离你有几百公里远,而且 CDN 的使用成本过高,只有少数大的互联网公司才用的起。

可靠性和持久性

HTTP 的可靠性就不用说了,你每天打开的那些 404 页面已经足够说明问题了。至于持久性,研究表明,现在一个网页的平均寿命是100天。人们每天都在删除历史数据。 IPFS 将会采用和Git类似的机制来记录文件的修改,保留多个数据版本,而不是每次修改后拷贝复制整个文件,并使用梅克尔树(Merkle DAG)来验证文件的完整性。 随着IPFS的缓存系统到位,默认情况下,很多可定期查看的内容完全可以脱机使用。

抵御DDoS攻击

HTTP 服务几乎是没有办法抵御攻击的,必须依赖硬件防火墙这些网络设备。因此一旦有人发起了 DDoS 攻击,将会大大降低 HTTP 服务的可用性。而 IPFS 是天然抗 DDoS 攻击的,因为发动 DDoS 攻击的前提是你必须先知道文件存储在那台服务器上,而 IPFS 的文件是分散存储到很多个节点上,这样就使得你无法定位你要攻击的 节点。

下面用个简单的表格来展示 IPFS 和 HTTP 的现状对比

VS HTTP IPFS
存储 存在大量的冗余数据 切分成 chunk 可去重,节省空间
带宽 需要大量的带宽资源 需要的带宽资源少,节省带宽
可靠性 容易丢失 可以保留多个数据版本
开放程度 中心化,掌握在少数机构手中(IBM,亚马逊,阿里云等服务器运营商) 完全去中心化,更开放

IPFS 整体架构

作为一个分布式的文件系统,IPFS 提供了一个支持部署和写入的平台,同时能够支持大文件的分发和版本管理;为了达到上述的目的, IPFS 协议被分成如下的几个子协议:(本次只是对各个协议做个简单的介绍,后期我专门对每个子协议做详细的介绍)

Identities(身份认证) 在 IPFS 网络中,所有的节点都通过唯一的 NodeId 进行标识,为了对抗女巫攻击(恶意创建多个节点),IPFS 内置了一个轻量级的 POW算法来生成节点 ID.
NetWork(网络) IPFS 可以使用任意的网络进行通信,它并没有假设自己一定运行在 IP 协议上,而是通过 multiaddr 的格式来表示目标地址和使用的协议,以此来兼容和扩展未来可能出现的其他网络协议。
Route(路由) IPFS 路由使用的是 DHT(分布式Hash表), 同时采用了 IPNS 来解析路由记录。
Exchange(数据交换) 在 IPFS 中,数据的分发和交换使用 BitSwap 协议,BitSwap 负责两件事情:向其他节点请求需要的 Block 以及为其他节点提供 Block, 对应使用的是, 这里借鉴的是 BitTorrent 技术,
MerkleDAG(文件存储) 这时 IPFS 文件系统的核心,是 IPFS 团队在 Git 文件系统的基础上进行了改进后的文件存储数据结构
Naming(命名) IPFS 使用了自我认证认文件系统-SFS,并在其基础上发明了IPNS,解决了 MerkleDAG 易变的命名的问题。
Application(应用) 用户可以在 IPFS 基础上构建应用

总结

本文对 IPFS 做了一整体的介绍,旨在让大家对 IPFS 有个整体的印象,它是一个点对点的超媒体协议,以及大概讲述了它是如何解决 HTTP 当前的一些痛点的, 后面会写系列文章对 IPFS 的各个子协议做专门的介绍.