IPFS+CloudFlare=ServerLessWebPage
IPFS,这个2018年诞生出来的小东西,似乎掀起了一阵热潮,然后被忘性极大的互联网吃瓜群众所抛弃,但不得不说这个东西可玩度非常高。
IPFS是什么
网上一大堆文绉绉气昂昂极富学术气息的营销号整天吹嘘着ipfs是跨时代下一时代的比特币,我只能说呵呵,真的想要了解ipfs是什么的,建议左转维基百科或百度百科。
抄一下wikipedia上的介绍:
(InterPlanetary File System,缩写IPFS)是一个旨在创建持久且分布式存储和共享文件的网络传输协议。它是一种内容可寻址的对等超媒体分发协议。在IPFS网络中的节点将构成一个分布式文件系统。
其实按我的话来说,ipfs就是一个神奇的东西,你放上去一个文件,就会立刻被瓜分成数个文件碎片,每一台运行着ipfs的电脑和矿机就会争先恐后来抢夺你的碎片,并且抢到的人就会获得系统的奖励,而你却一分钱也不用付出.
是不是听起来很神奇?对的,你没有付出任何东西,别人却能获得奖励,而且你既满足储存文件的需求,储存你文件的人也能得到金钱.这种机制,叫做FileCoin.
你可以把它想象成Bittorrent+BitCoin的结合物,实际上他就是这样的.当然不完全是,但核心理念就是这样的.只不过,BitCoin付出的是算力,而FileCoin付出的是硬盘.
IPFS的主要目标是取代HTTP,说是取代,那刚开始就必须兼容,所以目前ipfs可以通过官网ipfs.io获取.
工作原理
与bt下载类似,我们需要先介绍BT.
Bittorrent:分布式哈希表技术
先来一个故事
很久很久以前,有一位老头,叫做刘XX。
他是一位很有资格的老师,为了顽固学生们的学习效果,他发送给所有学生一部视频:
(注:老刘的带宽是8Mbps,即最大带宽1MB/s,每一个学生的带宽也是8Mbps)
我们假设有5位学生需要这部视频,则可以画这样一幅图:
这只视频是88.8MB
大小,按照这样的速度,同学需要花费1024*88.8MB/(204.8kb/s)=444s
即7分钟24秒
这还往往只是最理想状况.现在,我们来假设一下现象的出现:
- 由于视频过于好看,引起广泛关注.现在有200个同学要求下载.则单个人下载完需要17760s即296min也就是约5h!
- 刘老师觉得单个视频教学质量不够好,决定上传一个8880GB的超大视频.(下载时间大于一天)
- 几个同学与刘老师搞好了关系,刘老师给他们较高的下载速度,导致带宽分配不均匀,没有关系的学生下载速度更慢了.(百度网盘既视感)
- 由于刘老师给的视频过于激烈,在下载了一段时间后,FBI
open the door!
敲上门来带走了刘老师,视频被查封了!!!(下载速度0)
可是,学习是必须的,这可怎么办呢???
这时….
刘老师突然想起来,为什么不让每一个学生互相连接,贡献自己已经下好的部分,以来获得最大的下载速度呢??
请注意,在上述下载中,每一个人都没有充分利用自己的最大带宽,对不对?
那,解决办法就来了:
P2P:
以256KB为一包,我们就可获得356块文件
回到下载界面,我们看到,所有人都与其他人获得连接,那么,连接完成后:
(为了方便观察,我们将不必要的连接全部去掉)
现在,我们重新开始下载:
我们假设,A1下载了第一块,A2下载了第二块…
两秒后,所有人手上都拥有了一块文件:
接下来,在不影响下载的情况下,A1与A2交换下载好的部分,同时与A3、A4、A5交换
看到了吗,所有人都得到了更高的速度,所有人的带宽都得到了最充分的利用,包括原先看起来毫无用处的上传带宽。
接着4秒后,所有的贡献分块都下载好了,而每一个人都从文件发布者身上又得到新的文件碎片。
所以,这种情况回一直持续下去,直到每一个人都下载完成,每一个人都只需下载149秒即2分29秒!相对于单点时间大大减少!
人数多&文件大 问题
现在,我们来假设第一个问题,200人下载怎么办?
我们可以明白,人数越多,文件交换越密集,对不对?
显然会见的,这个问题显得异常白痴,可以体会的是,在最佳条件下,每个人的带宽都达到了最大,如果每个人都下载了不同的分块,同时每个人都在贡献。
那么,每个人的下载速度,根本不会受到很大影响。
这对于传统下载(http/https/ftp)不同,传统下载仅仅由一台服务器贡献,人数多对于这台服务器压力极大。
但是,在这个环境里,服务器不仅仅是一台,而且,每当加入一个人,每一个人都可以当作服务器,这样,下载速度反而会大大提升。
反而文件很大是个硬梗,不过相对于传统下载,这种下载方式还是有一定能力解决这个问题的。
回到这里
IPFS的原理
ipfs的世界有个东西叫做cid,大概类似于这样一串: QmZCvMHrE56VqsejmG53xd9bW4RZjtFpLz46QMQjA81orL
,前面的 Qm
是固定的,后面是SHA256密钥.cid又分为用户密钥和文件密钥,这个暂时不讨论.SHA256强度目前看来基本不会碰撞,毕竟64位十六进制的字符串,能实现16^64个文件的存储,也就是1.1579208923731619542357098500869e+77个id,有生之年能看到它碰撞也不是一件容易的事情
上传
如同BT,在短短几秒内,需要分享的文件被分块完毕,但此时,文件还是乖乖的窝在硬盘里,没有分享出去.
当有任何一个人试图获取资源时,你的ipfs会联系距离最近的节点,询问他们有没有意愿存东西.请注意此处的 距离
,这可不是物理距离,而是逻辑距离.
节点大都都会很高兴的同意,当然有些节点可能就是混口饭吃不想存,于是这些节点就会帮你联系离他最近的节点要不要,直到所有碎片瓜分完毕.这种算法,像极了DHT.
几分钟内,全球数个硬盘里就会出现你的文件的碎片,只要一声令下,这些文件就会调出.
此时,纵使文件发布者下线,文件照样流传.重复上传的文件,拆碎后被校验到与存在的文件相同则不会被上传.
上传完毕,文件就会拥有自己的id,也称为指纹,取回这些文件则需要id.
下载
你可以通过客户端下载,这个下载方式和btDHT其实原理是一样的;当然IPFS为了向下兼容http,自己也有网关,不过网关由于是公开的,一方面是速度,另一方面是已经引起了G||F||\/\/の注意,目前并不推荐使用网关下载,当然对于一些小文件比如网页和图片,这些都是随意的。
IPFS的作用
与一些网盘相反,ipfs反而非常鼓励你往里面塞东西,越多越好,但是作为个人网盘并不适合,一方面ipfs的资源会随着下载的人越多,缓存的机器也会越多,速度更快,私人文件反而速度不佳;另一方面ipfs一旦上传,任何人包括你自己永远无法彻底删除这些文件,即使你在ipfs客户端删除了你分享的文件,这些文件仍然会得到传播。所以ipfs其实可以作为公开下载,甚至是图床,网页托管等等。
在中国,ipfs实际上并没有得到很大的限制,分享文件和下载文件其实很容易做到,麻烦的只是不能从ipfs网关获取罢了。
下面是我放在ipfs上的一张图片,即使我下线,这个文件依旧流传于网络之间。
但是,ipfs反感在网关下载大文件,因为这样会造成不必要的带宽浪费,下载大文件请使用ipfs客户端+ipfs伴侣
搭建无服务器网页
很多人网页放在Github+CloudFlare,其实换个思路,为什么不用IPFS+CloudFlare呢?
开始吧!
下载ipfs
官网因为自带网关已经封锁了,请自带梯子访问。
写html
请注意,在ipfs上写网页时,请尽量不要使用外链,对于js和css请直接写在网页中,图片请使用base64或上传至ipfs后使用相对链接。
上传
点击添加按钮,上传
接下来,重点来了!
ipfs分享文件有两种方式,是ipfs和ipns,前者采用文件hash辨别文件,文件内容一旦改变,原来的链接无法更新,链接格式为 https://ipfs.io/ipfs/QmZCvMHrE56VqsejmG53xd9bW4RZjtFpLz46QMQjA81orL
;后者采用用户id辨别,内容允许更新,但是用户在线时间过短会导致无法同步,并且有可能暴露用户信息,后者格式为: https://ipfs.io/ipfs/QmQQKZphgJdEGhTp18NRvVdSJ3RJArRst2keKk3tZvmfPz?filename=index.html
.
如果你只是单个文件网页,此处比较建议使用ipfs,ipns可能离线时间过长导致无法下载。具体看个人所好。
ipfs链接获取:点击 ···
,选择复制哈希,在前面加上网关域名即可。
ipns连接获取:点击 ···
,选择分享,复制链接即可。
在善用技术上网的前提下访问 https://ipfs.io/ipfs/QmZCvMHrE56VqsejmG53xd9bW4RZjtFpLz46QMQjA81orL
显示目标界面
请注意,每次上传后一定要先访问一遍资源,否则文件是不会上传到ipfs服务器的!
CloudFlare设置
不知道为什么CloudFlare的ipfs服务器有点问题,使用官方说明一直爆404 page not found,官方地址在这里https://www.cloudflare.com/distributed-web-gateway/ 反正我是折腾失败了。
↑以上为放屁,现在来讲一下怎么正确绑定:
dnslink绑定
这个方法无论你的dns服务商在哪都能绑定,只不过不在CloudFlare托管的用户要多一步。
1.将需要绑定的域名,以CNAME形式指向 www.cloudflare-ipfs.com
,比如我需要让 showtime.cyfan.top
成为ipfs出口,则这么设置。
2.使用txt记录绑定ipfs hash,新建txt记录,名字是 _dnslink.yourwebsite
一定要加上yourwebsite!比如我绑定的是 showtime.cyfan.top
,则名称一行填上 _dnslink.showtime
!接着内容是 dnslink=/ipfs/
后面接上hash,比如showtimehtml的hash是: QmWAvNck7QBhUAYAEgBFvbvvsMxDC9s55NXVJXeJTjTM1Y
则大概这么填:
3.如果你本来就是托管在CloudFlare上的,到此为止就可以了,如果不是托管在Cloudflare上,类似dnspod\alicdn之类的,那还要获取证书,进入https://www.cloudflare.com/distributed-web-gateway/ 拉到最底下
输入域名,获取证书即可。
但问题是,www.cloudflare-ipfs.com
已经被dns污染了,你用cname绑定是无法正常访问的啦!所以只能用Workers绕路啦!
JSProxy反代ipfs.io
老办法,Workersjsproxy反向代理ipfs网关,解决
其他的用处
我在Github上看了很多奇奇怪怪的用法,有的拿来做博客,有的拿来做网盘,有的拿来做图床,欸,真的是脑洞大开,幸好ipfs经得起折腾,越折腾他们赚的越多
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!