P2P 应用就是指具有 P2P 体系结构的网络应用。所谓 P2P 体系结构就是在这样的网络应用中,没有(或只有极少数的)固定的服务器,而绝大多数的交互都是使用对等方式(P2P 方式)进行的。
P2P应用的范围很广,例如,文件分发、实时音频或视频会议、数据库系统、网络服务支持(如 P2P 打车软件、P2P 理财等)。
在 P2P 文件共享的发展史上,出现过 3 种不同的技术路线(三代)。
第 1 代:中央服务器
典型代表是 Napster。集中定位,分散传输。
采用【中央服务器】的模式 —— 每个节点都需要先连接到中央服务器,然后才能查找到自己想要的文件在哪里。
最大缺点是可靠性差 —— 中央服务器成为整个 P2P 网络的【单点故障】。
第 2 代:消息洪泛
典型代表是 Gnutella 的早期版本。分散定位和分散传输。
采用【广播】的模式 —— 要找文件的时候,每个节点使用有限范围的洪泛法向自己相连的【所有节点】进行询问;被询问的节点如果不知道这个文件在哪里,就再次进行“广播”…如此往复,直至找到所需文件。
这种技术的最大缺点是 —— 会引发“广播风暴”并严重占用网络带宽,也会严重消耗节点的系统资源。即使在协议层面通过设置 TTL(time to live),限制查询过程只递归 N 轮,依然【无法】彻底解决此弊端。
第 3 代:分布式哈希表 DHT
分布式哈希表 DHT (distributed hash table),不但避免了第一代技术的【单点故障】,也避免了第二代技术的【广播风暴】。
3.1 DHT 的主要思想
- 每条文件索引被表示成一个(K, V)对,K 称为关键字,可以是文件名(或文件的其他描述信息)的哈希值,V 是实际存储文件的节点的 IP 地址(或节点的其他描述信息)。
- 所有的(K, V)对组成一张大的文件索引哈希表,只要输入目标文件的K值,就可以从这张表中查出所有存储该文件的节点地址。
- 将上面的大文件哈希表分割成很多局部小块,按照特定的规则把这些小块的局部哈希表分布到系统中的所有参与节点上,使得每个节点负责维护其中的一块。
- 节点查询文件时,只要把查询报文路由到相应的节点即可,该节点维护的哈希表分块中含有要查找的(K,V)对。
3.2 Chord 协议
第一批 DHT 协议有 Chord、CAN、Tapestry、Pastry。其中 Chord 的原理比较简单。
1)拓扑结构——环形
Chord 的拓扑结构是一致性哈希,一致性哈希是 DHT 的一种实现,避免在节点变化的时候出现的全部重新哈希的现象。
【todo】