IPFS 0.5 对内容路由的改进之路由表的刷新过程

Filecoin社区
个人专栏
热度: 16620

为了保持路由表的准确并能反映网络总节点的真实状况,刷新这个动作是非常重要的。

在前面的文章中,我们介绍了在IPFS路由表中那些节点是如何被一个个加进表里的。符合标准的节点最终会被放到路由表中的一个个桶里。

并且在IPFS中,为了得到准确的路由信息,系统会周期性地刷新路由表,并将表中不再可连接,不再可通信的节点拿走。 

所以为了保持路由表的准确并能反映网络总节点的真实状况,刷新这个动作是非常重要的。那么路由表的刷新是如何工作的呢?

首先,系统会遍历表中所有的“桶”,从0号桶开始,只要该桶中包含至少一个节点就把它算在内,然后继续查看下一个桶,直到遍历到某个桶,它连一个节点都没有包含为止。

接下来系统对遍历所找到的每一个符合要求的桶都会在Kademlia空间中选一个随机地址,使该地址匹配这个桶,并找到K个最接近那个随机地址的的节点,以保证系统能把尽量多的节点装进这个桶。

这里所谓的“随机地址”意思是这样的:比如在第512号节点和1024号节点之间,我们随机选择出了第678号节点,就算这个节点实际并不存在,我们也认为678号这个地址为有效。

在这个过程中系统又是怎么找到K个最接近这个随机地址的节点的呢?IPFS的具体实现是这样的:

1 从路由表中找K个最接近随机地址X的节点放到查询队列中。

2 首先对查询队列总最接近随机地址X的节点发出Alpha(在go-ipfs中,Alpha值为10,但可以根据实现细节另行定义)个查询请求,问这个问题:“最接近地址X的K个节点都是谁?”

3 提问结束后,如果该节点能正常通信,会回复它所知道的K个节点。系统会将这K个节点加进查询队列,然后接着问查询队列中下一个最接近X的节点同样的问题,并同样将得到的节点加进查询队列。

4 这样重复执行上面的动作,直到当最接近X的Beta个节点都被成功询问过后(所谓的成功询问是指询问过程没有出现任何错误且网络通信一直正常)查询终止。注意:这里Beta是系统的参数,通常将其设为3。 

5 当查询终止后,找到K个最接近X的节点,检查它们是否仍然可连接且还在查询队列中,将它们从队列中移除并放回它们的原处。注意:在go-ipfs中,会向所有的K个节点发出提问。

前面我们曾经提到会从路由表中替换某些节点。那些节点是“可替换”的呢?在IPFS 0.5中,我们将一段时间内不再“有用”的节点定义为是可替换的。这段时间的计算方法为Log(1/K) * Log(1 - Alpha/K) * refreshPeriod。这其中Alpha是可被连接和查询的节点的数目。

此外,我们将“有用”定义为能在两倍时间内回复我们提问的节点,未来“可被替换”和“有用”定义很可能会随着网络的发展而发生变化。

我是IPFS/Filecoin社区发起人晓熙(加入社区,联系v号: liandaoxixi),IPFS/Filecoin是全球共识最大的去中心化存储项目,我会定期在社区分享专业的资讯,为IPFS/Filecoin爱好者建设一个共赢的学习社区。

参考链接:https://blog.ipfs.io/2020-07-20-dht-deep-dive/

声明:本文为入驻“MarsBit 专栏”作者作品,不代表MarsBit官方立场。
转载请联系网页底部:内容合作栏目,邮件进行授权。授权后转载时请注明出处、作者和本文链接。未经许可擅自转载本站文章,将追究相关法律责任,侵权必究。
提示:投资有风险,入市须谨慎,本资讯不作为投资理财建议。
免责声明:本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况,及遵守所在国家和地区的相关法律法规。