IPFS 原理与实践 (18):IPFS 底层基础 2.1.2

阅读数:5 2019 年 12 月 21 日 18:51

IPFS原理与实践(18):IPFS底层基础 2.1.2

(Coral DSHT)

内容简介
这是一部从实现原理和工程实践两个维度深入讲解 IPFS 和 Filecoin 的著作。作者是中文社区内非常有影响力的三位 IPFS/Filecoin 布道者,本书得到了 IPFS&FileCoin 创始人以及 IPFS 官方(协议实验室)的高度认可和强烈推荐。
为 * 大化满足读者需求,书中不仅介绍 IPFS 技术细节、区块链相关知识、Filecoin 项目技术细节,还加入了大量作者们在开发中的经验和技巧。为了适配当下及未来较长时间内读者的实际使用环境,书中所有案例都是基于生态链中较新的软件开发工具和前沿的软件开发技术编写的。
本书分为三大部分:
第一部分 基础篇(第 1 章)
全面介绍了 IPFS 的源起,概念、优势和应用领域,旨在帮助读者了解 IPFS 相关基础背景知识,从宏观层面认识 IPFS 技术所具有的创新性。
第二部分 原理篇(第 2~5 章)
旨在帮助读者深入理解 IPFS 和 Filecoin 的运行原理与工作机制。首先深入分析了分布式哈希表、块交换协议、版本控制、自验证文件系统 Merkle DAG 和 Merkle Tree 等底层基础知识,然后对 IPFS 协议栈中包含的 7 层子协议了进行了剖析,接着解析了 Multi-Format、libp2p、IPLD 三大 IPFS 核心模块,最后用了一整章的篇幅详细剖析了 Filecoin 项目。
第三部分 实战篇(第 6~8 章)
以工程化的方式,从基础至进阶,介绍了 IPFS 技术的实际使用,包括安装、配置、交互、入网、API、内容发布、数据保存、私网搭建等内容,之后通过两个不同风格的实际项目案例向读者展示了基于不同语言所实现的 IPFS 协议栈的使用方法。

Coral 协议是在 2004 年,由纽约大学的 Michael Freedman、Eric Freudenthal 和 David Nazieres 发明的一套内容分发网络系统(Content Delivery Network)。CDN 的设计是为了避开互联网传输瓶颈,并且降低内容供应服务器的网络压力,使得内容能更快速、更稳定地传递给客户端。CDN 的基本思想是在网络部署一些节点服务器,并且建立一套虚拟网络。网络中节点服务器之间实时更新连接信息、延时信息、用户距离参数等,然后将用户的请求重定向到最适合的节点服务器上。这样做有诸多好处,首先,通过节点服务器中转,用户访问网页的速度大大提高了;其次,节点服务器会缓存内容服务器的查询信息,那么也降低了内容服务器的网络负载;最后,内容服务器有可能出现暂时的离线,那么用户同样能通过节点服务器中的缓存读取。

Coral DSHT 则是 Coral CDN 最核心的部件之一。我们在 2.1.1 节中阐述过,Kademlia 协议使用的是 XOR 距离,即信息永远是存储在 XOR 距离最近的节点中。而这并没有考虑实际网络的情况,例如节点之间的延时、数据的位置。这样会浪费大量网络带宽和存储空间。Coral 解决了这个问题,不同于经典的 DHT 方式,Coral 首先对所有的节点评估连接情况,然后根据循环时间(Round-Trip Time)划分为几个等级(Coral 中是 3 层),L2(<20ms)、L1(<60ms)、L0(其他)。Coral 还提供了两个操作接口,put 和 get,用于添加和查找一个键值对,以确定从哪一个等级的 DSHT 中查询。后面我们会详细描述它是如何实现的。

Coral DSHT(Distributed Sloppy hash table)适用于软状态的键值对检索,也就是同一个 Key 可能会保存多个 Value。这种机制能把给定的 Key 映射到网络中的 Coral 服务器地址。比如,使用 DSHT 来查询距离用户较近的域名服务器;查询拥有特定网站缓存信息的服务器;定位周围的节点来最小化请求延时。

  1. 索引机制和分层

Coral 对路由表的处理也比较特殊,每一个 Coral 节点根据它们的延时特性放在不同的 DSHT 中。同一个 DSHT 的节点被称为一个集群(Cluster),每个集群有一个最大延时时间,称为集群直径(Diameter)。而整个系统会预先设定一个直径,称为等级(Level)。在每个等级划分下,每个节点都会是某一个 DSHT 的成员。一组节点只有满足两两直径小于第 i 个等级的极限时,它们才能成为一个集群。在 Coral 中,将 DSHT 分成了三层,Level-2 对应两两延时小于 20 毫秒,Level-1 对应两两延时小于 60 毫秒,Level-0 对应其他的全部节点。Coral 在询问时,也会优先请求等级更高、相应时间更短的节点。如果失败了,才会在下一级节点中请求。这样的设计不但降低了查询的延时,也更可能优先获得临近节点的返回数据。

  1. 基于键值对的路由层

Coral 的键值对与 Kademlia 一样,都是由 SHA-1 哈希计算得来的,有 160bit。每个节点的 ID 是由它的 IP 地址通过 SHA-1 运算出来的。我们在此可以通过 Put 指令保存一个 <Key, Value> 对,用来表明 Key 和 Value 是接近的;也可以通过 Get 指令,来查询对于同一个 Key,节点的远近顺序如何。具体的计算方法和路由方法与在 2.1.1 节中讲的 Kademlia 协议是一样的。

  1. Sloppy 存储

在 Kademlia 协议中,数据会直接保存到 XOR 更近的节点。但实际情况是,如果某些数据非常热门,其他节点也会大量查询,会因此造成拥塞,我们称作 Hot-Spot;同时,一个缓存键值对存储了过多的值,我们称其为 Tree-saturation。Sloppy 存储就是希望规避这两种情况发生。

每一个 Coral 节点定义有两种异常状态,Full 和 Loaded。Full 状态定义为:在当前节点 R,已经存在 L 个 <Key, Value> 对使得 Key=k,并且这 L 个键值对的生存周期都大于新值的 1/2。Loaded 状态定义为:对于给定的 Key=k,在过去的一分钟里已经收到超过特定次请求。

那么 Coral 在执行存储操作的时候分为两步进行。

第 1 步为前向查询,Coral 会持续迭代查找距离 Key 更近的节点 ID,这一点和 Kademlia 协议完全一样。每一个节点返回两个信息,其一,该节点是否加载,其二,对于该 Key,这一节点存储有几个 Value,每一个 Value 的实效时间是多长。客户端根据接收到的这些信息决定这些节点是否可以存储新的值。前向查询的过程会一直继续,直到客户端找到一个距离 Key 值最近的可连接节点。如果对某个节点查询异常,这一节点将不再继续迭代查询。可连接节点将被逐一压进堆栈里。

第 2 步为反向查询,客户端从第 1 步中得到了可以存放的节点列表。那么按照距离 Key 从近到远的顺序,依次尝试添加 <Key, Value> 对到这些节点。如果操作失败,比如在此时有其他节点也进行了插入,这一节点成为 FULL 状态,那么客户端将放弃存储这一节点,将其从堆栈内弹出,并尝试下一个节点,直到被成功存储。

取回的操作其实是存放操作的逆过程,在此不赘述。

IPFS原理与实践(18):IPFS底层基础 2.1.2

购书地址 https://item.jd.com/12665074.html?dist=jd

评论

发布