dht原理
dht是P2P网络(结构化P2P)核心路由算法,主要是利用一致性hash,把节点和资源都表示成一个hash值,放入到这个大的hash环中,每个节点负责路由靠近它的资源。
一.重要概念:
1.node
负责P2P路由信息,P2P网络的组网就是它来负责
2.peer
负责管理资源,生成种子文件,发布资源信息
3.nodeid
节点的唯一标识,是一个160bit的hash值
4.infohash
资源的唯一标识,也是一个160bit的hash值,其和nodeid使用同一个算法
5.距离
距离是两个hash值进行异或(XOR)操作后的值,值越小,距离越近
节点和资源的距离: nodeid XOR infohash
两个节点之间的距离:nodeid1 xor nodeid2
6.种子文件
对某个资源的描述文件,种子文件包括了资源的infohash(160bit)、资源所在机器(nodeId IP PORT)、离资源所在机器最近的N个机器(nodeid IP PORT)列表
二.典型场景描述:
1.新节点加入网络
新安装的P2P客户端是一个孤立的节点,和其他节点都无联系,怎么加入P2P网络呢?需要有一个种子文件,种子文件中有多个该P2P网络中的node信息,
根据种子文件中的节点列表,连接到P2P网络,并获取路由信息,获取最靠近本新节点的节点列表
2.发布资源
a.生成资源的Infohash
b.查找和infohash距离最近的N个Node,向这N个node广播新资源信息,告诉这些节点,我有某某资源
----- 节点生成了资源,不过其路由信息不在这个节点上(也不在离这个节点的最近的M节点上),而是在和资源infohash最近的N个node上
3.查找某个资源并下载
a.找到最靠近资源的N个node(使用nodeid xor infohash来计算距离远近)
b.向这些node发送资源查询信息,如果有这个资源的详细信息,就返回给客户端,否则返回离资源更近的node列表给客户端
c.直到查询到资源提供者信息,如果没查到信息,且没有更近的node了,那就说明这个资源没有提供者
d.找到node信息(nodeid,ip,port)后,向这个node请求资源