ipfs系统的节点查找有两个需求:
- 第一找到其他节点地址
- 第二找到存储有特定数据的节点
IPFS路由层数据结构使用的是S/Kademlia和Coral技术的分布式松散哈希表(DSHT),IPFS的DSHT结构会根据所存数据的大小值进行区分:小的值(等于或小于1KB)直接存储在DHT上,更大的值,DHT只存储值索引,这个索引就是一个对等节点的NodeId,该对等节点可以提供对该类型值的具体服务
IPFS DHT的数据存储是根据数据的大小进行的: - 小于1KB的数据直接存储到DHT上面
- 大于1KB的数据在DHT中存储的是节点ID
IPFS的路由层需要实现三种基本的功能:内容路由,节点路由和数据存储。集成这些功能的接口降低了系统的耦合度,可以让开发者根据业务需求进行底层自定义的同时也不会影响系统其它部分的正常工作。
1. 表示能够根据某一个key,当前节点能够根据该key找到对应的value的存储位置,并且根据需要,决定是否将该信息以广播的方式告知最近的IPFS节点。相当于我(自己的IPFS节点)记录了某一个key对应的内容的存储路径,并根据情况广播给其他节点,告诉别人我这个节点知道关于该key的路由信息。声明这个节点提供的数据
2. 表示,根据某一个key可以获取那些知道该key的路由信息的节点信息,并且可以限定最多获取的节点信息数量。
3. 表示可以根据节点的ID来获取关于该节点的网路服务信息,这个地方的key表示IPFS节点的ID,返回的信息是关于该节点的网络层数据,比如开放的端口号,提供服务的协议类型等信息。
4. 表示路由层能够缓存关于key的具体内容,而不只是关于key的存储路径,并且将该内容广播到离key最近的路由节点上。其他路由表收到该信息后应该保存该信息到自己的路由表中。直接在DHT中存储小的元数据(1KB)
5. 根据给定的key获取直接存储在路由表中的与该key对应的内容。从DHT获取元数据
6. 表示一个定时功能,定时更新路由表的信息,因为这是一个去中心化的路由协议,所以节点的上线下线信息需要路由表定时来同步和更新。