问题
DHT网络的运作原理与实现
DHT全名为分布式哈希表(Distributed Hash Table),是将分布式技术与哈希表技术相互结合形成的分布式存储技术,这项技术的意义就是能将位于网络中的存储服务器统一起来,用一个特定的方式定位在该网络中存储的资源位置。
哈希表是常见的数据结构,通过特定的哈希算法计算出需要存储的资源的哈希值,并且根据将此哈希值作为索引,标记资源的位置,从而实现快速且精准的数据查询能力。相比于其他的存储方法,哈希表的优势在于,只需要知道目标资源的哈希值即可获取对应存储位置,拥有极高的读取效率,缺点在于需要更多的空间存储哈希表,并且该空间的大小与哈希算法有直接关系,算是一种空间换时间的优秀数据结构。
分布式哈希表其实并不是单指一个数据结构,而是一个网络,网络中存在许多节点,每个节点都担任分布式哈希表中的一部分存储功能,从而实现了将多个零散的存储空间整合为一个完整的存储空间。
如果需要通过DHT网络获取数据,则需要获得目标数据的索引,也就是哈希值,通过哈希值可以知道需要的数据存放在哈希表中的具体位置,知道具体位置即可通过请求对应的存储主机访问该资源。
根据这个过程,注意到两点:
- 需要知道资源对应的哈希值。
- 需要知道目标资源位于DHT网络中的哪一台主机
资源的哈希值作为资源的特征,在请求资源时应当知晓请求的具体是什么资源。而获取具体位置,考虑到分布式网络的动态性,可能会比较复杂。
一般的DHT网络中,每个节点都具有很强的稳定性,所以可以通过获取网络内全部节点来实现数据的定位。但是在Tox网络中,大部分节点都是一台随时可能上下线的个人PC,在这样强动态性的网络中,获取所有节点是不现实的,而是应当采用询问的方法来获取地址。
在Tox的DHT网络设计中存在相邻主机,这个相邻并不指的是物理距离上的相邻,而是DHT网络中位置的相邻,每个节点都会存储数个相邻节点,节点会认为他们存储的信息分别是自身负责的区段的左方和右方。
-----|-----相邻节点(左)-----|-----当前节点-----|-----相邻节点(右)-----|-----
当前节点需要访问不在自身负责区段的数据时,需要通过目标资源的哈希值计算出资源与自身的位置与方向,得到这个信息后,向对应的方向的相邻节点发出询问,如果相邻节点知道具体位置且位于自身负责区段,则直接返回URL;若不在自身负责区段,则根据提供的位置信息向下一个节点进行询问,递归这个过程从而获得资源的URL。