分布式哈希表 DHT
分布式哈希表 DHT
Chord 协议
基于一致性哈希,维护一个类似于双向链表的环,节点可以加入,传递数据,退出
加入:
- 任何一个新来的节点(假设叫 A),需要先跟 DHT 中已有的任一节点(假设叫 B)建立连接
- A 随机生成一个散列值作为自己的 ID(对于足够大的散列值空间,ID 相同的概率忽略不计)
- A 通过跟 B 进行查询,找到自己这个 ID 在环上的接头人。也就是——找到自己这个 ID 对应的“继任”(假设叫 C)与“前任”(假设叫 D),找到自己的前继和后继节点
- A 需要跟 C 和 D 进行一系列互动,使得自己成为 C 的前任,以及 D 的继任
Kad
Kad 采用某种算法把 key 映射到一个二叉树,每一个 key 都是这个二叉树的叶子, 在映射之前,先做一下预处理。 1. 先把 key 以二进制形式表示。 2. 把每一个 key 缩短为它的 最短唯一前缀 每个叶子都唯一对应某个二进制前缀,便于采用异或求节点间距离 以某个节点作为视角进行子树的拆分后需要维护一个 K 桶(路由表里有K个元素)用来记录子树中的K个节点
加入:
- 任何一个新来的节点(假设叫 A),需要先跟 DHT 中已有的任一节点(假设叫 B)建立连接
- A 随机生成一个散列值作为自己的 ID(对于足够大的散列值空间,ID 相同的概率忽略不计)
- A 向 B 发起一个查询请求(协议类型 FIND_NODE),请求的 ID 是自己(通俗地说,就是查询自己)
- B 收到该请求之后,(如前面所说)会先把 A 的 ID 加入自己的某个 K 桶中。 然后,根据 FIND_NODE 协议的约定,B 会找到K个最接近 A 的节点返回给A
- A 收到这 K 个节点的 ID 之后,(仅仅根据这批 ID 的值)就可以开始初始化自己的 K 桶
- 然后 A 会继续向刚刚拿到的这批节点发送查询请求(协议类型 FIND_NODE),如此往复(递归),直至 A 建立了足够详细的路由表
BEP-09 协议
这个协议可以在我们得到了很多 peer 的地址信息的基础上进行种子BT文件的下载,通过 BEP-09 协议与对方握手建立 TCP 连接来进行资源的下载,将每个分块下载完成之后计算 sha1 值看是否相同