2015年初,Internet Archive开始倡导分布式网络,新的Web将会变得速度更快,安全性更高,更可靠,并且更加持久。现在关于它的声音已经变得越来越清晰而又响亮。而IPFS就是在这种环境下出现的一个典型的开源代表。IPFS是点对点协议InterPlanetary File System的简称,它是一个面向全球的、点对点的分布式版本文件系统,试图将所有具有相同文件系统的计算设备连接在一起。IPFS这个项目其实很大,并不像大家想象的是一个东西,IPFS是由很多模块组成,每一个模块现在都已经独立成项目了,并且有自己的主页。让我们来简单看一下IPFS家族成员。
协议实验室的主页:https://protocol.ai/projects/
![](https://img.haomeiwen.com/i8926909/6a89da8698912ada.png)
IPFS团队在开发IPFS协议的时候,采用的是高度模块化的方式进行的。就像搭积木一样,将各个功能独立起来进行。当然这也是现在软件工程里面的基本要求,不过IPFS团队在此基础上更进一步,各个木块之间几乎完全解耦合。在《IPFS家族》这篇文章当中已经对这些项目模块进行了准确的概述,尤其是为ipfs节点集群部署管理提供了很权威的解读。
回到主题,现在来看尽管IPFS的开发还不十分成熟,但是不妨大胆前瞻的眺望一波:IPFS会取代HTTP(和其他一些组件一起)。虽然取代HTTP听起来很荒谬,但是我们应当看到HTTP已经很破旧了,继续长期甚至永远地使用HTTP才是更荒谬的事。所以我们应当应用当今计算机技术,着力解决分布式带来的诸多问题,为Web服务设计更好的协议。
一、HTTP的弊端
1.HTTP的高度中心化
本人已经进行了多年的web开发,基于HTTP协议的web开发是目前的标配,开发人员对于协议的请求方式、状态码都应该很熟了,很少有去思考1.0、1.1标准之下的该模式的诸多弊端。Web的本意是去中心化,但它却变得越来越中心化,80%的人依靠的是20%的中心服务,这已经是一个保守估计了。HTTP变成了一个脆弱的、高度集中的、无效的、过度依赖于骨干网的协议。像FBI、CIA这样的组织,只需要在几个点上拦截通信就可以大大方方的窥探监视。对政府来说,阻止网站访问这些高度集中化的资源变得容易。这也使通信容易遭受DDoS攻击而面临巨大的风险。
![](https://img.haomeiwen.com/i8926909/e727f945457e261f.png)
相反分布式的Web可以减少管理部门的干涉,恢复人们的网络自由,同时也会减少单点故障带来的风险。
2.HTTP效率不高
如果不是成规模的处理数据,将这些数据从中央数据中心分发仍然是非常昂贵的。IPFS可代替总是从数据中心获取内容的HTTP,如果将一个ISP网络上的每一台计算机变成流媒体CDN,这时会怎么样?例如,获取一段视频资源,就可以完全在ISP网络上下载,而不需要在Internet骨干网上经过大量的传输,从而大大减少数据传输的费用。
其实国内的有些应用软件已经实现了这种构想,比如迅雷和快播,基于P2P传输,将附近所需的资源直接传输到本机,而不需要一个中心存储库,大大降低了对网络资源的传输消耗。
3.HTTP与主干网的强耦合
强耦合就意味着低容错,必须要保证系统的全部正常才会整体正常,HTTP也是如此,若是主要的骨干被损坏,或者出现路由表失控,其后果可能是非常严重。Internet骨干网并不健全,其很容易被攻击,同时一些重要的光纤线路被切断时服务很容易遭受影响。
二、IPFS设计
1.IPFS的由来
IPFS的中文名是星际文件系统,由Juan Benet在2014年5月份发起,他毕业于斯坦福大学,在创建IPFS项目之前,他创办的第一家公司被雅虎收购。2015年,他创建的IPFS在YCombinator孵化竞赛中拿到了巨额的投资,同时成立了协议实验室。这个实验室团队由14位核心开发者以及社区中上百位代码贡献者组成的。
2.IPFS的理念
IPFS本质上是一种内容可寻址、版本化、点对点超媒体的分布式存储、传输协议,目标是补充甚至取代过去20年里使用的超文本媒体传输协议(HTTP),希望构建更快、更安全、更自由的互联网时代。我们每天上网使用APP刷朋友圈、微博都在使用HTTP协议,它基于TCP/IP的计算机应用层面,从服务器传输超文本数据到本地浏览器,本地浏览器或APP渲染后呈现给用户。基于这样的网络环境构成了CS或BS架构,最后注入BAT这样大型网络提供商。
IPFS从根本上改变了查找的方式,这是它最重要的特征。使用HTTP我们查找的是位置,而使用IPFS我们查找的是内容。举个栗子:在我的github服务器上运行着一个资源网站【https://yitaicloud.com】,遵照HTTP协议浏览器首先会查找服务器的位置(IP地址),随后向服务器索要文件的路径。这种体系下文件的位置取决于服务器管理者,而用户只能寄希望于文件没有被移动,并且服务器没有关闭。
IPFS的做法则是不再关心中心服务器的位置,也不考虑文件的名字和路径,只关注文件中可能出现的内容。把资源文件放到IPFS节点,它会得到一个新名QmXGTaGWTT1uUtfSb2sBAvArMEVLK4rQEcQg5bv7wwdzwU,是一个由文件内容计算出的加密哈希值。哈希值直接反映文件的内容,哪怕只修改1比特,哈希值也会完全不同。
IPFS是通用目的的基础架构,基本没有存储上的限制。大文件会被切分成小的分块,下载的时候可以从多个服务器同时获取。IPFS的网络是不固定的、细粒度的、分布式的网络,可以很好的适应内容分发网络(CDM)的要求。这样的设计可以很好的共享各类数据,包括图像、视频流、分布式数据库、整个操作系统、模块链、8英寸软盘的备份,还有最重要的——静态网站。
IPFS文件还可以抽象成特殊的IPFS目录,从而标注一个可读的文件名(透明的映射到IPFS哈希),在访问的时候会像HTTP一样获取一个目录索引。在IPFS上建立网站的流程和过去一样,而且把网站加入到IPFS节点的指令只需要一条指令:
ipfs add -r yoursitedirectory
网页间的连接不再需要人去维护,IPFS自带的查找可以解决。
3.IPFS的架构
IPFS至少有八层子协议栈,从上至下为身份、网络、路由、交换、对象、文件、命名、应用,每个协议栈各司其职,又互相搭配。
![](https://img.haomeiwen.com/i8926909/ebd038775794dbf0.png)
身份层和路由层,对等节点身份信息的生成以及路由规则是通过
Kademlia
协议生成制定(后面简称KAD协议),KAD协议实质是构建了一个分布式的松散Hash表,简称DHT,每个加入这个DHT网络的人都要生成自己的身份信息,然后才能通过这个身份信息去负责存储这个网络里的资源信息和其他成员的联系信息。按照我自己的理解,这就是一个入网的令牌,拿着这个令牌就可以在DHT网络中确定自己的ID。
网络层,这个比较核心,使用的LibP2P
可以支持任意传输层协议。NAT技术能让内网中的设备共用同一个外网IP,我们都体验过的家庭路由器就是这个原理。
交换层,是类似迅雷这样的BT工具。迅雷其实是模拟了P2P网络,并创建中心服务器,当服务器登记用户请求资源时,让请求同样资源的用户形成一个小集群swarm,在这里分享数据。这种方式有弊端,因为服务器是由迅雷统一维护,如果出现了故障、宕机时,下载操作无法进行。
对象层和文件层,它们管理的是IPFS上80%的数据结构,大部分数据对象都是以MerkleDag
的结构存在,这为内容寻址和去重提供了便利。文件层是一个新的数据结构,和DAG并列,采用Git一样的数据结构来支持版本快照。
命名层,具有自我验证的特性(当其他用户获取该对象时,使用指纹公钥进行验签,即验证所用的公钥是否与NodeId匹配,这验证了用户发布对象的真实性,同时也获取到了可变状态),并且加入了IPNS这个巧妙的设计来使得加密后的DAG对象名可定义,增强可阅读性。
最后是应用层,IPFS核心价值就在于上面运行的应用程序,我们可以利用它类似CDN的功能,在成本很低的带宽下,去获得想要的数据,从而提升整个应用程序的效率。
![](https://img.haomeiwen.com/i8926909/1f0528b0ddb29c79.png)
IPFS的团队在开发时,采用高度模块集成化的方式,像搭积木一样去开发整个项目。协议实验室团队2015年创立,到17年的时间里都在做IPLD、LibP2P、Multiformats这三个模块的开发,它们服务于IPFS底层,刚才所说的八层协议,其实每一层的实现都绑定在对应的模块下。
4.IPFS的运作流程
资源入网
前面已经提到了IPFS文件还可以抽象成特殊的IPFS目录,从而标注一个可读的文件名(透明的映射到IPFS哈希),在访问的时候会像HTTP一样获取一个目录索引。在IPFS上建立网站的流程和过去一样,而且把网站加入到IPFS节点的指令只需要一条指令:
ipfs add -r yoursitedirectory
网页间的连接不再需要人去维护,IPFS自带的查找可以解决。
数据关联
IPFS不会要求每一个节点都存储所有的内容,节点的所有者可以自由选择想要维持的数据。IPFS节点间的拷贝、存储和网站支援都很容易,只需要使用一条指令以及网站的哈希,例如:
ipfs pin add -r ***HashSite***
剩下的IPFS会搞定。如果IPFS得以普及,节点数达到一定规模,即使每个节点只存放一点点内容,所累计的空间、带宽和可靠性也远超HTTP能提供的。随之而来,分布式Web会变成地球上最快、最可靠、最大的数据仓库,人类知识也就再也不会湮灭,亚历山大图书馆永远不会倒塌。
IPNS
IPFS哈希只能用来表示不可变数据,因为一旦数据改变,哈希值也会改变。从某种意义上来说,这是保持数据持续性的好的设计。但是我们也需要一种方法来标记最新更新网站的哈希,这个方法我们称作IPNS。
IPFS哈希是网站通过哈希公钥生成的,相对的IPNS使用私钥来标记IPFS哈希的引用。如果以前用过比特币你应该很熟悉这种模式,比特币地址就是一种公钥哈希。由于IPNS功能还没有完成,如果上面的链接不能工作也请不要灰心。IPNS公钥指向的位置是可变的,公钥的值则是保持不变的。随着IPNS的引入,网站升级的问题可以顺利解决。
可读可变寻址
由于IPFS/IPNS的哈希值都是很长和难记的字符串,所以IPFS兼容了现存的域名系统(DNS),可以通过可读的链接访问IPFS/IPNS内容。使用方法是在nameserver上创建一个文本记录,插入网站的哈希值(如果手上有一个命令行终端,试一下这个:dig TXT ipfs.git.sexy)。访问http://ipfs.io/ipns/ipfs.git.sexy/可以观察到效果。
接下来IPFS还打算支持Namecoin。Namecoin从理论上完全实现了分布式Web的去中心化,整体的运行中不再需要中心化的授权。支持了Namecoin的IPFS不再需要ICANN、中心服务器,不受政治干涉,也无需授权证书。这听起来难以置信,但却是今天可以实现的技术。
最后的话
IPFS的野心有点大,想要各种区块链实现相互浏览,打造“星际区块链网络”,IPFS通过额外的不可更改性和数据永久性扩展了加密货币和其他区块链技术。不过 ,目前来说,这种想法是否能够经得起时间的考验还有待观察。
参考列表:
【戴嘉乐:详解IPFS的本质、技术架构以及应用】
【IPFS是什么?为什么说它将取代HTTP?】
【IPFS 中文白皮书】
网友评论