IPFS 到底是怎么工作的?

简介

我们知道,一个存储服务,最基本的功能就是存和取。IPFS 中提供了这两种语义,那就是 add 和 get 操作。
在 IPFS 系统中执行 add 操作,就是执行了一次存操作,放在网络的概念里,就是“上传”操作。而 get 就更好理解了,就是取操作,在网络世界里,也叫 “下载”。

IPFS 号称点对点无中心化文件系统,没有单点故障,也就是文件一旦被“上传”到 IPFS 网络中,就会被永久保存。而要想下载一个本地没有的文件,只要 IPFS 网络中有,简单的执行 get 就很快能下载到数据。那么 add 操作的背后到底做了什么?get 又是怎么获取数据的?

这就是本文要探究的主题!

先来看一下 add 和 get 的基本操作过程


当一个 IPFS 节点执行 add 操作时,它会把文件进行分块 block,通过构建一个 Merkle 树根节点,来把每个子块节点都连接起来,每个 block 都会用一个唯一的 Cid 进行标识。

block 数据会被保存到本地的 blockstore 中。但是需要注意的是,除此之外,block 数据并不会立刻主动上传到 IPFS 网络中(也即,与其连接的 peers 节点中)。除非,某 peer 节点曾经请求过该 block 数据。

add 执行逻辑如下图所示:

理解这一点非常重要,因为,我们很容易会把 IPFS 想象成一个会自动备份数据的分布式数据库,就像传统的冗余备份机制一样。实际上,IPFS 并不会这样做。这是由 IPFS 在公网环境中运行和传统分布式数据库在私有网络中运行的场景要求不一样所导致的。作为互联网基础设施,这种设计不仅减少网络带宽占用,还能为网络提供可靠、恒久的数据保存机制。

现在就来来了解一下 get 操作背后的原理,先看下图:

上图展示了 ipfs 执行 get 命令的执行流程。

对于当前节点来说,所有与其连接的 peers 节点会构成一个 swarm 网络。

当本地节点发出一个 get 请求时,它首先会从本地的 blockstore 中查找请求的数据,如果没有找到,它便会向 swarm 网络发出请求,通过 DHT Routing 找到拥有该数据的节点,一旦找到一个拥有所请求数据的节点,该节点会把数据反馈回来。然后,本地节点会把收到的 block 数据缓存一份到本地的 blockstore 中,这样,整个网络中就相当于多了一份原数据的拷贝。当有更多的节点都请求该数据的时候,就变得更加容易,而由于越来越多的节点都存有该数据,数据就变得几乎不可丢失。

这也就是 IPFS 网络能够永久保存数据的原理,只要有任何一个 IPFS 节点拥有某数据,这个数据就可以被全网所获取。

那么,执行 IPFS 的 add 命令之后,为什么直接访问 ipfs.io 网关就能获取到数据呢?

比如,在浏览器中打开类似 https://ipfs.io/ipfs/QmR4WZy1rfXX868yFsTcqHun5y61c1jh2oQhDqWD97FEM2 这样的网站地址,就能直接访问到刚才我们添加的数据!

原理是这样的:

IPFS 网关,即 ipfs.io,实际上扮演的是一个 IPFS 节点的作用,当我们打开上述网站的时候,其实就是向 IPFS 网关发出了一次请求,IPFS 网关会代理我们(因为我们不是 IPFS 节点,我们只是浏览器而已)向拥有这个数据的 Peer 节点(就是我们本地节点)发出 get 请求,一旦获取到数据,网关会先自己缓存一份,然后把请求到的数据通过 HTTP 协议转发给我们!

也就是说,任何一台机器,只要打开浏览器,都能通过上述地址访问到我们刚才执行 add 命令时添加的数据。一旦 IPFS 网关第一次缓存节点数据之后,再次请求时,它就无需再向原节点请求数据了,只要 Hash 值没有变化,就可以直接把之前缓存的数据返回给浏览器。

当然,这个缓存的数据是有时效的,通常是一周左右就会失效。这个是由 ipfs daemon 内置的默认时效所设定。因为作为网关节点,其磁盘容量也是有限的,不可能无限保存所有的数据,采用缓存时效机制不仅能解决资源访问问题,还能避免数据膨胀给节点带了的负担,当越来越多的机器加入 IPFS 网络并且承担网关的作用,那么数据时效的概率就会大大降低。

更多细节

实际上,Peer 节点在执行 add 命令时,还会广播自己拥有的块信息。同时,它还会维护一个该 swarm 网络中所有已发给当前节点的 block 请求列表,一旦 add 命令都添加的数据满足请求列表,就会向对应节点主动发送数据,并更新该列表。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356

推荐阅读更多精彩内容