Hyper Text Transfer Protocol(超文本传输协议)
http 特点
1、简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
2、灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
3.无连接:无连接的含义是限制每次连接只处理一个请求。
4.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大另一方面,在服务器不需要先前信息时它的应答就较快。
5、支持B/S及C/S模式。
引入ipfs网络的原因
ipfs网络
星际文件系统(InterPlanetary File System). IPFS 是一个分布式的P2Pweb, 点到点超媒体协议.
P2P:在P2P网络中,每个节点既可以从其他节点得到服务,也可以向其他节点提供服务。这样,庞大的终端资源被利用起来,一举解决了C/S模式中的两个弊端。 P2P将文件分割为小的块, 从多个服务器同时下载, 速度非常快.
IPFS提供了文件的历史版本回溯功能(就像git版本控制工具一样), 可以很容易的查看文件的历史版本, 数据可以得到永久保存
ipfs工作过程
分布式散列表(DHT)被广泛用于协调和维护关于对等系统的元数据。比如,MainlineDHT 是一个去中心化哈希表,他可追踪查找所有的对等节点。是实现分布式存储和下载的关键技术,现已广泛应用在P2P网络中,例如迅雷的BitTorrent下载技术。
1.1哈希
哈希算法简单来说可以看成一个函数,y=f(x)。这里,x就是原本的信息的摘要,我们称之为键(key);而y就是经过加密之后的信息的代号,也就是哈希值。这个函数有一些特殊的性质:
(1)无论x有多复杂,根据其某些特征生成的y都是固定长度的。
(2)当x发生微小的变化时,y值都会与之前完全不同。
(3)无法通过哈希值倒推原信息。也可以说明了哈希运算的不可逆性。
所以有机会破解吗?
不错,确实存在理论上破解的可能。但我们要明确一些前提条件:比特币网络里,每个区块的哈希是利用了SHA256算法,有64位哈希值,也就是说理论上总共存在2的256次方个哈希,基本上破解可能是0
1.2哈希表
哈希表用来存放键值对的。我们需要将文件和哈希成对存储以方便查找。
而传统的哈希扩容的代价是很大的。为了解决节点变动的问题,1997年麻省理工的Karger等人发明了一致性哈希,这才真正让分布式存储进入到了一个真正可以规模化应用的阶段。,而之所以IPFS会更加偏好公网固定IP,就是因为固定IP不会改变在哈希环中的位置,进而不会造成因节点变动而产生的额外网络负载。这也是矿场收益会更高且更加稳定的原因之一。
技术参考:http://mini.itunes123.com/a/20180812031704354/2/
1.3分布式哈希算法
这种分布式网络不需要中心节点服务器,而是每个客户端负责一个小范围的路由,并负责存储一小部分数据,从而实现整个DHT网络的寻址和存储。DHT网络还在于关键字最接近的节点上复制备份冗余信息,避免了单一节点失效问题。形象地,我们可以把整个DHT网络想象成一个大城市,那么每个客户端,就好比城市里各个角落的地图碎片,上面绘制了附近区域的地形情况,把这些地图碎片汇总后,整个城市的全貌也就出来了。
通过DHT数据结构它把KEY 和 VALUE用某种方式对应起来。使用hash()函数把一个KEY值映射到一个index上:hash(KEY) = index。这样就可以把一个KEY值同某个index对应起来。然后把与这个KEY值对应的VALUE存储到index所标记的存储空间中。这样,每次想要查找KEY所对应的VALUE值时,只需要做一次hash()运算就可以找到了。以上就是寻址过程。
各种DHT算法:https://www.jianshu.com/p/a7a1c25f11a4?from=timeline&isappinstalled=0
1.4基于DHT的 IPFS的工作原理
每个文件及其其包含的所有数据块,都会转换为一个散列字符串,称为哈希指纹。每个节点维护一张DHT(分布式哈希表),包含相应数据块与目标节点的对应映射关系。整个哈希表被组织成二叉树,平均查询联系节点的复杂度是O(log2N)。
基于内容寻址而非域名寻址。只需要通过文件或数据块的哈希值,IPFS便可自动在全网节点中找到拥有这些数据块的节点,并从节点上拉去数据。
IPFS使用一个叫IPNS的分布式命名系统,将难于记忆的数据哈希值映射为易于记忆的字符串。这可以类比于域名与IP地址的映射关系。
相同数据内容被赋予唯一的哈希指纹,通过哈希指纹的对比即可判断数据块是否一致。
2.1BT
2.1.1 torrent文件的原理:
A)这个文件(文件夹)中数据的SHA1值,占据了torrent文件的绝大部分空间。B)一般制作torrent文件时,还会要指定一个或者多个Tracker的地址,比如http://www.a.com:8080/announce这种地址。相当于记录了一个问询服务器的地址。
C)文件或者文件夹内每个文件的名字,方便下载文件时,磁盘上直接命名好跟原始数据一样的目录结构、文件名。
D)其它一些辅助和可扩展的信息,比如可以配置一个P2SP的http地址辅助下载,比如制作软件的名字、备注……。
E)上面信息生成后,torrent会把这些信息再进行一次Hash,生成一个新的SHA1值,作为torrent的HASH值,也就是我们经常看到的下载软件里面对这个种子命名的一个唯一的hash值,是torrent的唯一标记。
2.1.2 BT是如何通过.torrent开始进行下载的
A)下载软件拿到.torrent文件后,先进行打开,读取里面的这些信息,载入内存。
B)torrent中有Tracker的地址,下载软件拿到后,会去跟Tracker进行通讯,告诉Tracker:我要下载这个文件(通过hash值作为标记); Tracker收到请求后,会记录这个客户端的公网IP(记录这个人在下载这个文件),同时呢,会返回给他:我这边还知道哪些人也在下载这个文件,一般是会返回许多个IP。下载过程中,协议要求你必须5分钟跟tracker通讯一次,如果太久不通讯,tracker就认为你下线了,会把你从节点列表中删除的。
C)客户端拿到了一堆IP后,就开始挨个去尝试连接,连上后就开始互相通讯了。比如告诉对方,我有哪些分块,问问对方有哪些,然后把我有的给对方;让对方把他有的某一块给我,这样就你来我往开始了下载。当然,如果此时没别人在线,那就只能没速度了。
节点不仅可从其他节点拉取所需数据,同时也可将该新数据存储在自己节点,供其他节点下载。
2.2 BitSwap
IPFS 中的BitSwap协议受到BitTorrent 的启发,通过对等节点间交换数据块来分发数据的。
与BT类似, 每个节点寻找自己需要的数据块集合(wangt_list),同时也提供已有的数据块集合作交换(have_list)。但与BT不同的是,BitSwap不局限于一个torrent中的数据块。BitSwap协议中存在一个永久市场,这个市场包含各个节点所拥有的所有块数据,而不管这些数据块来自于哪个文件。
2.3 区别
A.使用 BitTorrent 下载必须使用种子文件,将下载内容的所有地址放到这个种子文件中,才能下载。而 IPFS 使用 DAG 数据结构存储数据,下载任何文件时只需知道一个 hash 地址即可。
B.IPFS 的部分实现参考了分布式版本管理工具 git 的实现,因而它可以存储内容的多个版本,而 BitTorrent 是不支持这个功能的。
C.BitTorrent 下载必须使用种子文件,客户端只能下载种子文件内的内容,而 IPFS可以下载毫不相关的任何文件,于是 IPFS 内部的资源调度子模块 BitSwap 可以更高效地调度,预下载内容,从而提高下载效率。
D.使用 IPFS 存储文件夹时,文件夹树形结构中的每个节点都有一个唯一的 hash, 因为可以只下载文件夹中的指定内容而无需下载整个文件夹。 BitTorrent 不支持这个功能。
E.BitTorrent 只是一个 download system, 而 IPFS 是一个 filesystem,意味着你可以将 IPFS mount 到你的本地电脑然后当磁盘一样操作。
节点本身使用类似git的版本控制系统,来管理本地文件与数据块。这既保证了数据块的去冗余,又提供了可追溯的历史版本。
3.1Git
从根本上来讲 Git 是一套内容寻址 (content-addressable) 文件系统,并在此之上提供了一个版本控制系统的用户界面,它是一个非常强大且易用的工具.
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
3.2Git 和ipfs
具有git等分布式版本控制系统的特性:提供上传下载文件等管理功能、能跟踪文件版本的变化且自动删除重复的文件。对同一个文件修改,提交到ipfs后产生的是新的文件,旧的文件还会存在,这样,在ipfs库里就记录了两个版本(旧版和新版),记录了多个版本,自然就方便不同的版本的切换。
通常开发团队人员协作开发,都需要使用一种版本控制软件,比如svn ,git等,git有个最大的好处,不像svn,是c/s架构,s端(服务端)出现问题,那么意味着svn就不能用了,git呢,每个开发者的电脑即是客户端也是服务器,就不存在单点故障的问题(服务器出现故障就不能访问的问题),同时,版本化还有一个好处就是自动去重,比如有两个目录,a和b ,a目录里有文件a1 b目录里也有a1 ,在ipfs只会记录一个a1.
自验证文件系统是由David Mazieres和他的导师M. Frans Kaashoek在其博士论文中提出的。 SFS(Self-Certifying File System)是为了设计一套整个互联网共用的文件系统,全球的SFS系统都在同一个命名空间下。在SFS中,分享文件会变得十分简单,只需要提供文件名就行了。任何人都能像Web一样,搭建起SFS服务器,同时任何一个客户端都能连接网络中任何一个服务器。
安全性
SFS除非明确指明允许匿名访问,用户如果需要读取,修改,删除或者对文件进行任何篡改,都需要提供正确的密钥。
可扩展性
无论用户是希望以密码认证读取到个人文件,或者是浏览公共服务器上的内容,SFS都应该能很好兼容。在新服务器的部署上,SFS必须要尽可能简单方便。
用户验证
自验证的路径名,能帮助用户验证服务器的身份,而用户验证模块则是帮助服务器验证哪些用户是合法的。SFS把用户身份验证与文件系统分开。外部软件可以根据服务器的需求来设计协议验证用户。
密钥撤销机制
有些时候服务器的私钥可能会被泄漏,那么原有的自验证文件路径可能会错误地定位到恶意攻击者设置的服务器。为了避免这种情况发生,SFS提供了两种机制来控制:
密钥撤销指令和HostID阻塞。 密钥撤销指令只能由文件服务器的拥有者发送,它的发送目标是全部的用户。
细节:https://github.com/ChainBook/IPFS-For-Chinese/issues/10