IPFS的文件获取主要使用了分布式哈希表(DHT)技术。DHT是一种分布式存储方法。在不需要服务器的情况下,每个客户端负责一个小范围的路由,并负责存储一小部分数据,从而实现整个DHT网络的寻址和存储。

先验知识

用户在IPFS上传或者使用文件时,不再是基于位置的寻址,而是基于内容的寻址。也就是把“去哪找信息”的指令换成“想找什么内容”的指令。在互联网内,下载文件或者浏览信息需要一个IP地址或者域名,而在IPFS内,每个文件都有自己的哈希值,并且一个哈希值只对应一个文件。不存在一个文件有多个哈希值,或者多个哈希值对应同一个文件的问题。

因此,用户只需在IPFS内输入需要文件的哈希值,系统就会出现对应的文件。这些文件是分布存储的,所以只要有一个用户有对应的文件,就算部分节点罢工或者不在线,也不会影响文件的读取。

具体在IPFS系统种下载文件时,首先,需要矿工根据最终哈希数值搜索该哈希的索引结构,并下载下来。然后,用户就可以根据哈希索引搜索到文件所在的节点位置。用户将节点上的块下载下来之后,IPFS将根据哈希数组的顺序,把文件重新组合出来,用户就可以使用了。

具体过程

具体过程可以分为两步走:

第一步:找到内容的所在位置,主要采用DHT的方式进行;

第二步:获取内容,主要使用Bitswap协议从持有内容的节点上下载内容。

Step Ⅰ 查询内容位置

IPFS使用分布式哈希表(DHT)来搜索发现哪些节点拥有所需内容。 哈希表是键值数据库。 分布式哈希表是一种将哈希表分散在分布式网络中所有对等方的表。IPFS需要询问这些peer节点来查找内容。

IPFS使用libp2p工具完成DHT并处理对等连接和彼此对话。一旦知道了内容的位置(或更确切地说,哪个对等方正在存储构成要访问的内容的每个块),就可以再次使用DHT查找这些对等方的当前位置(路由)。 因此,为了获得内容,IPFS可能需要使用libp2p两次查询DHT。

Step Ⅱ 获取内容

当确定了内容的保存位置后就需要和该节点建立连接并进行获取(交换)。 为了向其他对等方请求块并向其他对等方发送块,IPFS当前使用一个名为Bitswap的模块。Bitswap允许连接到具有所需内容的一个或多个对等节点,将本地的需求列表(您感兴趣的所有块的列表)发送给他们,从而向本地传送发送需要的块。

这些块到达后,可以通过对它们的内容进行散列以获取CID并将它们与请求的CID进行比较来对其进行验证。 这些CID还可以使得本地根据需要对重复数据块进行重复数据删除。