P2P
对等网络(Peer-to-Peer Networks)是分布式系统和计算机网络相结合的产物,在应用领域和学术界获得了广泛的重视和成功,被称为“改变Internet的一代网络技术”。
- peer指网络结点,在行为上是自由的——任意加入、退出,不受其它结点限制,匿名;在功能上是平等的——不管实际能力的差异;在连接上是互联的——直接/间接,任两结点可建立逻辑链接,对应物理网上的一条IP路径。
- 充分利用网络带宽、节点资源,提高工作效率。
P2P是一种分布式网络,网络的参与者共享它们所拥有的一部分硬件资源(处理能力、存储能力、网络连接能力、打印机等),这些共享资源需要由网络提供服务和内容,能被其他对等节点(Peer)直接访问而无需经过中间实体。在此网络中的参与者既是资源提供者,又是资源获取者。
分布式哈希表(DHT)算法
- 将内容索引抽象为<K,V>对
- K是内容关键字的Hash摘要,K = Hash(key)
- V是存放内容的实际位置,比如节点IP地址等
- 所有的<K,V>对组成一张大的Hash表,该表存储了所有内容的信息。
- 每个节点都随机生成一个标识(ID),把Hash表分割成许多小块,按特定规则(即K和节点ID之间的映射关系),分布到网络中去,节点按这个规则在应用层上形成一个结构化的重叠网络。
- 给定查询内容的K值,根据K和节点ID之间的映射关系在重叠网络上找到相应的V值,从而获得存储文件的节点IP地址
定位(Locating)
节点ID和其存放的<K,V>对中的K存在着映射关系,因此可以由K获得存放该<K,V>对的节点ID。
路由(Routing)
在覆盖网上根据节点ID进行路由,将查询消息最终发送到目的节点。每个节点需要得到其邻近节点的路由信息,包括节点ID、IP等。
网络拓扑
- 拓补结构由节点ID和其存放的<K,V>对中的K之间的映射关系决定。
- 拓扑动态变化,需要处理节点加入/退出/失效的情况。
在重叠网上节点始终由节点ID标识,并且根据ID进行路由
Chord算法
其核心思想就是要解决在P2P应用中遇到的基本问题:如何在P2P网络中找到存有特定数据的节点。
Chord使用一致性哈希作为哈希算法,在Chord协议中将其规定为SHA-1。
- 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最近的节点
Chord:简单查询过程
每个节点仅维护其后继节点ID、IP地址等信息
查询消息通过后继节点指针在圆环上传递
直到查询消息中包含的K落在某节点ID和它的后继节点ID之间
速度太慢 O(N),N为网络中节点数
Chord:网络波动(Churn)
Churn由节点的加入、退出或者失效所引起
每个节点都周期性地运行探测协议来检测新加入节点或退出/失效节点,从而更新自己的指针表和指向后继节点的指针
Chord:节点加入
新节点N事先知道某个或者某些节点,并且通过这些节点初始化自己的指针表,也就是说,新节点N将要求已知的系统中某节点为它查找指针表中的各个表项
在其他节点运行探测协议后,新节点N将被反映到相关节点的指针表和后继节点指针中
新结点N的第一个后继结点将其维护的小于N节点的ID的所有K交给该节点维护
Chord:节点退出/失效
当Chord中某个节点M退出/失效时,所有在指针表中包含M的节点将相应指针指向节点M的后继节点,即大于M节点ID的第一个有效节点。
为了保证节点M的退出/失效不影响系统中正在进行的查询过程,每个Chord节点都维护一张包括r个最近后继节点的后继列表。如果某个节点注意到它的后继节点失效了,它就用其后继列表中第一个正常节点替换失效节点
Chord:拓扑失配问题
O(LogN)逻辑跳数,但是每一逻辑跳可能跨越多个自治域,甚至是多个国家的网络
覆盖网络与物理网络脱节
实际的寻路时延较大
Chord:小结
算法简单
负载平衡:所有的节点以同等的概率分担系统负荷,从而避免某些节点负载过大
可扩展:查询过程的通信开销和节点维护的状态随着系统总节点数增加成对数关系(O (log N)数量级)
可用性:要求节点根据网络变化动态更新查询表,能够及时恢复路由关系,使得查询可靠地进行。
缺点:拓扑失配问题
Chord与Pastry比较
比较 | Chord | Pastry |
---|---|---|
拓扑结构 | 节点ID分布在单向环形空间 | 节点ID分布在单向环形空间,并且表示为以2b为基的数 |
路由查询消息 | 通过后继节点指针或者指针表找到K的后继节点 | 比较K和节点ID的前缀,下一跳节点的ID具有更长的前缀或者在数值上更接近K。 |
节点维护状态 | 后继节点指针或者指针表:O(logn) | 叶子节点集、邻居节点集:2b或者22b。路由表:log2bN 2b |
路由性能 | logN | log2 bN |
稳健性 | 维护r个最近的后继节点 | 只有在只有在 |