360 likes | 587 Views
DHT 网络的搜索技术. 哈尔滨理工大学网络信息中心 姚 亮. 主要内容. P2P 网络的分类 Hash 函数概述 DHT 原理 几种典型的 DHT 网络 总结. 1.P2P 网络分类. 非结构化 P2P 网络拓扑是任意的 内容的存储位置与网络拓扑无关 结构化 P2P 网络拓扑结构是有规律的 每个节点都随机生成一个标识 (ID) 内容的存储位置与网络拓扑相关 内容的存储位置与节点标识之间存在着映射关系. P2P 网络分类.
E N D
DHT网络的搜索技术 哈尔滨理工大学网络信息中心姚 亮
主要内容 • P2P网络的分类 • Hash函数概述 • DHT原理 • 几种典型的DHT网络 • 总结
1.P2P网络分类 • 非结构化P2P • 网络拓扑是任意的 • 内容的存储位置与网络拓扑无关 • 结构化P2P • 网络拓扑结构是有规律的 • 每个节点都随机生成一个标识(ID) • 内容的存储位置与网络拓扑相关 • 内容的存储位置与节点标识之间存在着映射关系
P2P网络分类 • 在结构化P2P网络中,内容一般使用内容索引来表示,内容索引包括key和value两部分,其中key是内容的关键字,value是存放内容的实际位置,因此内容索引也表示为<key, value>对 • 内容索引<夜宴, http://video.com.cn/yeyan.avi>表示电影夜宴可以从http://video.com.cn/yeyan.avi处获得
2.Hash函数概述 • Hash函数可以根据给定的一段任意长的消息计算出一个固定长度的比特串,通常称为消息摘要(MD:Message Digest),一般用于消息的完整性检验。 • Hash函数有以下特性: • 给定 P,易于计算出 MD(P) • 只给出 MD(P),几乎无法找出 P • 无法找到两条具有同样消息摘要的不同消息 • Hash函数 • MD5:消息摘要长度固定为128比特 • SHA-1:消息摘要长度固定为160比特
Hash函数应用于P2P的特性 • 唯一性:不同的输入明文,对应着不同的输出摘要 • 将节点IP地址的摘要作为节点ID,保证了节点ID在P2P环境下的唯一性 SHA-1(“202.38.64.1”) =24b92cb1d2b81a47472a93d06af3d85a42e463ea SHA-1(“202.38.64.2”) =e1d9b25dee874b0c51db4c4ba7c9ae2b766fbf27
3.DHT原理(1) • 将内容索引抽象为<K, V>对 • K是内容关键字的Hash摘要 • K = Hash(key) • V是存放内容的实际位置,例如节点IP地址等 • 所有的<K, V>对组成一张大的Hash表,因此该表存储了所有内容的信息 • 每个节点都随机生成一个标识(ID),把Hash表分割成许多小块,按特定规则(即K和节点ID之间的映射关系)分布到网络中去,节点按这个规则在应用层上形成一个结构化的重叠网络 • 给定查询内容的K值,可以根据K和节点ID之间的映射关系在重叠网络上找到相应的V值,从而获得存储文件的节点IP地址
DHT原理(2) k v 内容索引 内容 提取 K=Hash(key) 内容关键字key 内容存储位置等信息 value 内容索引 Hash表 电影、夜宴 K=hash(电影, 夜宴) V = http://video.com.cn/ yeyan.avi 电影 夜宴 http://video.com.cn/ yeyan.avi
K V K V K V K V K V DHT原理(3) k v 规则? N1 N32 N8 Chord、CAN、Tapestry、Pastry N48 N16 a. Hash表 b. 分布式Hash表 在许多情况下,节点ID为节点IP地址的Hash摘要
K V K V K V K V K V K V K V K V K V K V K V DHT原理(4) • 索引发布和内容定位 (K1,V1) C K1=Hash(xyz.mp3) V1=128.1.2.3 插入(K1,V1) 查询(K1) A 128.1.2.3 xyz.mp3 B
DHT原理(5) • 定位(Locating) • 节点ID和其存放的<K, V>对中的K存在着映射关系,因此可以由K获得存放该<K, V>对的节点ID • 路由(Routing) • 在重叠网上根据节点ID进行路由,将查询消息最终发送到目的节点。每个节点需要有到其邻近节点的路由信息,包括节点ID、IP等 • 网络拓扑 • 拓扑结构由节点ID和其存放的<K, V>对中的K之间的映射关系决定 • 拓扑动态变化,需要处理节点加入/退出/失效的情况 在重叠网上节点始终由节点ID标识,并且根据ID进行路由
4.Chord:概述 • Berkeley和MIT共同提出 • 采用环形拓扑(Chord环) • 应用程序接口 • Insert(K, V) • 将<K, V>对存放到节点ID为Successor(K)上 • Lookup(K) • 根据K查询相应的V • Update(K, new_V) • 根据K更新相应的V • Join(NID) • 节点加入 • Leave() • 节点主动退出
Chord:Hash表分布规则 • Hash算法SHA-1 • Hash节点IP地址->m位节点ID(表示为NID) • Hash内容关键字->m位K(表示为KID) • 节点按ID从小到大顺序排列在一个逻辑环上 • <K, V>存储在后继节点上 • Successor (K):从K开始顺时针方向距离K最近的节点 N1 K=hash (key)=54 ID=hash (IP)=14 N8 N56 N51 N14 N48 N21 N42 N38 N32 m=6
Chord:简单查询过程 • 每个节点仅维护其后继节点ID、IP地址等信息 • 查询消息通过后继节点指针在圆环上传递 • 直到查询消息中包含的K落在某节点ID和它的后继节点ID之间 • 速度太慢 O(N),N为网络中节点数 Lookup(K54) K54 N1 N8 N56 N56 N51 N14 N48 N21 N42 N38 N32 m=6
Chord:指针表 指针表 N8+1 N14 N8+2 N14 N56 N8+4 N14 N8+8 N21 N8+16 N32 N8+32 N42 节点S的第i个指针successor[n+2^(i-1)], 1≤i≤m
Chord:基于指针表的扩展查找过程 • 指针表中有O (log N)个节点 • 查询经过大约O (log N)跳 指针表 Lookup(K54) N8+1 N14 N8+2 N14 K54 N8+4 N14 N56 N8+8 N21 N8+16 N32 N8+32 N42 指针表 N42+1 N48 N42+2 N48 N42+4 N48 N42+8 N51 N42+16 N1 N42+32 N14
Chord:网络波动(Churn) • Churn由节点的加入、退出或者失效所引起 • 每个节点都周期性地运行探测协议来检测新加入节点或退出/失效节点,从而更新自己的指针表和指向后继节点的指针
Chord:节点加入 • 新节点N事先知道某个或者某些结点,并且通过这些节点初始化自己的指针表,也就是说,新节点N将要求已知的系统中某节点为它查找指针表中的各个表项 • 在其它节点运行探测协议后,新节点N将被反映到相关节点的指针表和后继节点指针中 • 新结点N的第一个后继结点将其维护的小于N节点的ID的所有K交给该节点维护;
Chord:节点退出/失效 • 当Chord中某个结点M退出/失效时,所有在指针表中包含该结点的结点将相应指针指向大于M结点ID的第一个有效结点即节点M的后继节点 • 为了保证节点M的退出/失效不影响系统中正在进行的查询过程,每个Chord节点都维护一张包括r个最近后继节点的后继列表。如果某个节点注意到它的后继节点失效了,它就用其后继列表中第一个正常节点替换失效节点
Chord:拓扑失配问题 • O(LogN)逻辑跳数,但是每一逻辑跳可能跨越多个自治域,甚至是多个国家的网络 • 重叠网络与物理网络脱节 • 实际的寻路时延较大
Chord:总结 • 算法简单 • 可扩展:查询过程的通信开销和节点维护的状态随着系统总节点数增加成对数关系(O (log N)数量级) • 存在拓扑失配问题
Pastry:概述 • 英国剑桥Microsoft研究院和Rice大学共同提出 • 考虑网络的本地性,解决物理网络和逻辑网络的拓扑失配的问题 • 基于应用层定义的邻近性度量,例如IP路由跳数、地理距离、往返延时等 • 节点ID分布采用环形结构
N0002 N3200 N0201 K3122 K0220 N3033 N0322 N3001 N2222 N1113 N2120 K1201 K2120 N1331 K1320 Pastry: Hash表分布规则 2m-1 0 • Hash算法SHA-1 • Hash节点IP地址->m位节点ID(表示为NID) • Hash内容关键字->m位K(表示为KID) • NID和KID是以2b为基的数,共有m/b个数位 • b是一个配置参数,一般为4 • 节点按ID从小到大顺序排列在一个逻辑环上 • <K, V>存储在NID与KID数值最接近的节点上 m=8 b=2
Pastry:节点维护状态表(1) • 路由表R • 路由表包括 log2b N (m/b)行,每行包括2b -1个表项 • 路由表第n行与节点ID的前n个数位相同,但是第n+1个数位不同,也称为n数位前缀相同 • 路由表中的每项包含节点ID,IP地址等 • 根据邻近性度量选择距离本节点近的节点 • 邻居节点集M • 邻居节点集包含|M|个在邻近性度量上最接近于本节点的节点,|M|为2b或者2X2b ,邻近性度量指的是物理上相邻节点 • 邻居节点集通常不用于路由查询消息,而是用来维护本地性 • 叶子节点集L • 叶子节点集包含|L|个节点ID最接近本节点的节点,也就是逻辑地址上的相邻节点,其中|L|/2个节点的ID大于本节点,|L|/2个ID小于本节点,|L|为2b或者2X2b
Pastry:节点维护状态表(2) b=2,因此节点ID的 基数为4 (16 bits) m=16 b=2 Node ID 10233102 节点ID最接近 本节点的节点 Leaf set < SMALLER LARGER > 10233033 10233021 10233120 10233122 10233001 10233000 10233230 10233232 Routing Table 02212102 1 22301203 31203203 0 11301233 12230203 13021022 10031203 10132102 2 10323302 10200230 10211302 10222302 3 当前节点的第n个数位 m/b行 10230322 10231000 10232121 3 10233001 1 10233232 第n行的前n个数 位与本节点相同 [ 相同前缀 下一数位 其它 ] 0 10233120 2 依据邻近性度量最 接近本节点的节点 Neighborhood set 每行2b-1个表项 没有合适节点 的表项为空 13021022 10200230 11301233 31301233 02212102 22301203 31203203 33213321
Pastry:查询过程 • 当一个K为D的查询消息到达节点A • 节点A首先看D是否在当前节点的叶子节点集中,如果是,则查询消息直接被转发到目的节点,也就是叶子节点集中节点ID与D数值最接近的那个节点(有可能就是当前节点),否则进行下一步 • 在路由表中查找与D具有更长相同前缀的表项,如果该表项不为空,则将查询消息直接转发到该节点,否则进行下一步 • 例如路由D= 0629的查询消息 • 5324 →0748 →0605 →0620 →0629 • 如果不存在这样的节点,当前节点将会从其维护的所有邻居节点集合中选择一个距离该键值最接近的节点作为转发目标 路由查询消息的逻辑跳数: O(log2b N)
lookup(K2120) Pastry:节点状态表和查询 Routing table • 节点路由表R中的每行与本节点具有相同的n数位长度前缀,但是下一个数位不同 • 例如,对于节点N0201: N-: N1???, N2???, N3??? N0: N00??, N01??, N03?? N02: N021?, N022?, N023? N020: N0200, N0202, N0203 • 当有多个节点时,根据邻近性度量选择最近的节点 • 维持了较好的本地性 m=8 2m-1 0 b=2 N0002 N0122 N3200 N0201 N0212 N0221 N3033 N0233 N0322 N3001 N2222 N1113 N2120 K2120 N2001
2.2.4 Pastry:节点加入(1) • 初始化状态表 • 新节点开始时知道一个根据邻近性度量接近自己的节点A • 节点A可以通过使用扩展环IP组播等机制自动定位,或者由系统管理员通过其它手段获得 • 新节点通过运行SHA-1算法计算自己的IP地址的摘要得到节点ID为X • 节点X向节点A发送join消息,Pastry将该消息路由到节点ID在数值上最接近X的节点Z • 接收到join消息的节点,包括A、Z,以及A到Z路径上所有的节点将发送它们的状态表给X,X检查这些信息,然后节点根据下面的过程初始化状态表: • 由于A与X在邻近性度量上接近,所以使用A的邻居节点集来初始化X的邻居节点集 • 由于Z的节点ID与X最相近,因此使用Z的叶子节点集来初始化X的叶子节点集 • X将join消息经过的第i个节点的路由表的第i行作为自己路由表的第i行 • Join消息经过的第i个节点与X的前i个数位相同 • 向其它相关节点通告自己的到来 • 新节点向邻居节点集、叶子节点集和路由表中的每个节点发送自己的状态,以更新这些节点的状态表
X知道 A (A与 X邻近) A 5324 路由消息到节点ID在数值上最接近X的节点 Join消息 B 0748 Z的叶子节点集 A0— ???? B1— 0??? C2— 06?? Z4— 062? C 0605 A邻居节点集 Z 0620 2.2.4 Pastry:节点加入(2) 节点加入 X 0629 0629’s routing table
2.2.4 Pastry:节点退出/失效 • 叶子节点集L中的节点退出机制:本地节点要求当前叶子节点集合L中的ID最大的节点或ID最小的节点把它的叶子节点集合L1发送过来,如果L1中存在L中没有的节点,则从中选择一个替代失效节点. • 除非|L|/2个节点同时失效,否恢复过程始终是有效的 • 失效检测:和叶子节点集中的节点周期性交互存活消息 • 路由表R中的节点退出机制:如果失效节点对应的表项为Rdl (第l行第d列) ,则联系同一行中的Ril, id所指向的存活节点并且获取该节点的Rdl表项,如果l行中没有存活节点,则从下一行选择一个节点 • 失效检测:和路由表中的节点联系(例如发送查询消息)如果无反应则检测到节点失效
Pastry:总结 • 逻辑网络路由跳数O(log2b N) • 路由表开销log2b N *(2b -1) • 路由本地性:状态表(路由表、邻居节点集、叶子节点集)中的表项选择在邻近性度量上与本节点相近的节点 • 稳健性:只有在|L|/2个叶子节点完全失效时才会路由失败
5.总结 • 今天给大家介绍了结构化p2p网络中的几种搜索技术,对比较了他们的性能,其实本来想给大家介绍BiTtorrent的DHT算法 --- Kademlia 协议原理,但目前有三个关键问题我还没有搞懂,目前还在研究中,再有就是它是一种改进了的DHT技术,所以一定要先介绍DHT,等搞明白了再和大家一起探讨,最后 谢谢大家!
P2P网络(overlay Network) Internet P2P重叠网 • P2P重叠网络构筑在已有的Internet基础设施网络之上,也称为应用层网络 返回