目录
- [0 引言](#0 引言)
- [1 C/S 模式 VS P2P模式](#1 C/S 模式 VS P2P模式)
- [2 P2P 概述](#2 P2P 概述)
-
- [2.1 纯P2P架构](#2.1 纯P2P架构)
- [2.2 非结构化P2P和结构化(DHT)P2P](#2.2 非结构化P2P和结构化(DHT)P2P)
-
- [2.2.1 非结构化P2P](#2.2.1 非结构化P2P)
- [2.2.1 结构化P2P](#2.2.1 结构化P2P)
- [2.3 P2P需要解决的问题及解决方案](#2.3 P2P需要解决的问题及解决方案)
-
- [2.3.1 集中式目录](#2.3.1 集中式目录)
- [2.3.2 完全分布式](#2.3.2 完全分布式)
- [2.3.3 混合体](#2.3.3 混合体)
0 引言
之前介绍的都是 C/S 模式,但是 C/S 模式存在很多缺点,客户端都需要通过服务器获取服务。
1 C/S 模式 VS P2P模式
C/S模式(Client/Server模式)和P2P模式(Peer-to-Peer模式)是两种常见的计算机网络架构。它们在设计和功能上存在一些区别,下面是它们的优缺点和区别:
- C/S模式(Client/Server模式)
优点:
中心化管理:C/S模式中,服务器负责管理和控制整个系统,可以集中管理和维护资源,提高网络的安全性和可靠性。
高性能:服务器可以专注于处理数据和请求,分担了客户端的负担,可以提供更高的性能和响应速度。
数据一致性:服务器拥有数据的权威性,可以确保数据的一致性和完整性。
缺点:单点故障:C/S模式中,服务器是中心节点,如果服务器发生故障或宕机,整个系统将无法正常工作。
扩展性限制:C/S模式下,服务器承担大部分的计算和存储任务,当用户数量增加或数据规模扩大时,服务器的负载可能会过大,限制了系统的可扩展性。
高成本:C/S模式需要专门的服务器来支持,这增加了系统的成本和复杂性。
- P2P模式(Peer-to-Peer模式)
优点:
去中心化:P2P模式中,每台计算机都可以充当客户端和服务器,节点之间平等地共享资源和服务,不存在单点故障。
高度可扩展:P2P模式下,系统的性能和存储容量可以随着节点的增加而线性扩展,更适合大规模分布式环境。
灵活性:P2P模式不依赖于中心服务器,节点之间可以直接通信和交换数据,提高了网络的灵活性和自主性。
缺点:安全性风险:P2P模式下,节点之间直接通信,可能存在安全风险和数据泄露的风险,需要采取额外的安全措施来保护系统和数据。
网络负载:P2P模式中,每个节点都要承担一部分计算和存储任务,当节点数量庞大时,可能导致网络负载过大,影响系统性能。
数据一致性:P2P模式下,节点之间的数据一致性较难保证,需要采取一致性协议和机制来解决数据同步和冲突问题。
综上所述,C/S模式适用于需要集中管理和控制的系统,强调安全性和数据一致性 ;而P2P模式适用于去中心化、可扩展性要求较高的系统,强调灵活性和可扩展性。选择哪种模式取决于具体的应用需求和系统规模。
使用一张思维导图总结一下:
- 在文件分发应用中,C/S 和 P2P 的比较
首先思考一个问题 :从一台服务器分发文件(大小为F)到N个peer需要多少时间?
Peer节点上下载能力(upload、download)是有限的资源
1) 使用C/S模式分析该问题:客户端都是通过服务器获取文件,所以客户端的上载能力不是影响因素,主要取决于服务器的上载能力Us。
- 服务器必须顺序传输(上载)N个文件拷贝(速度是:NF/Us)
- 每个客户端必须下载一个文件拷贝。(下载速度是:F/dmin)
当客户端比较少的时候,客户端的下载能力是瓶颈;
但是客户端数量很多时,服务器的上载能力是瓶颈;
2) 使用P2P模式分析该问题:
首先看一个例子,清楚P2P是如何运作的
如下图所示:随着用户(Peer)数量的增加,请求节点数量增加,同时提供服务的节点数量也在增加,所以文件分发的时间不会增长的很快。C/S模式几乎是线性增长。
2 P2P 概述
2.1 纯P2P架构
2.2 非结构化P2P和结构化(DHT)P2P
2.2.1 非结构化P2P
非结构化P2P 是指没有明确定义的网络拓扑结构的P2P系统。在非结构化P2P中,节点之间的连接是随机建立的,节点可以自由地加入和离开网络。这种模式下,节点通常通过广播或查询路由表来查找其他节点,并在节点之间直接进行通信和资源共享。非结构化P2P适用于小规模的P2P网络,例如点对点文件共享或实时通信应用。
以下是一些非结构化的P2P网络的例子:
- Gnutella :Gnutella是一个著名的非结构化P2P协议,它允许节点直接连接和通信,节点之间通过洪泛式传播查询消息来进行资源搜索。
- FastTrack:FastTrack是用于文件共享的非结构化P2P协议,被用于诸如KaZaA和Morpheus等应用程序中。它通过广播查询消息和使用缓存来实现文件搜索和资源发现。
- BitTorrent:BitTorrent是一种混合的P2P协议,它既具有非结构化的特点,又包含了一些结构化的元素。BitTorrent网络中的节点通过Tracker服务器进行资源发现,并通过分片和对等交换来实现高效的文件传输。
- eDonkey网络:eDonkey网络也是一个非结构化的P2P网络,用于文件共享。它使用了一种称为"Kademlia"的分布式哈希表(DHT)来管理节点和文件的索引信息。
2.2.1 结构化P2P
- 结构化P2P 使用分布式哈希表 (Distributed Hash Table,DHT)来管理节点之间的连接和资源分配。DHT是一种分布式存储系统,将键值对映射到网络中的节点上,并提供高效的查找和存储功能。
- 在结构化P2P中,节点按照一定的规则组织成结构化的网络拓扑,例如环形或树形结构。这种模式下,节点可以根据键的哈希值来定位存储该键值对的节点,并通过路由表进行高效的查找。结构化P2P适用于大规模的P2P网络,例如分布式存储系统或区块链技术。
以下是一些结构化的P2P网络的例子:
- Chord :Chord是一种常用的结构化P2P协议,它使用一致性哈希算法来管理节点和文件的分布。Chord网络中的节点按照哈希值的顺序排列成一个环,节点可以通过查找后继节点的方式进行路由和资源发现。
- CAN :CAN(Content-Addressable Network)是一种基于网格结构的结构化P2P网络,将网络空间划分为多个维度,每个节点负责管理一个或多个区域。CAN网络使用坐标系统来定位和路由文件。
- Kademlia :Kademlia是一种用于分布式哈希表(DHT)的结构化P2P协议,它通过XOR距离度量来管理节点和数据的分布。Kademlia网络中的节点通过路由表来维护对其他节点的引用,实现高效的路由和资源查找。
- Pastry :Pastry是一种用于构建大规模结构化P2P网络的协议,它使用类似于Chord的一致性哈希算法来定位和路由节点。Pastry网络中的节点通过路由表来管理对其他节点的引用。
2.3 P2P需要解决的问题及解决方案
- P2P面临的两大问题:
- 如何定位所需资源
- 如何处理对等方的加入与离开
- 可能的解决方案:
- 集中式目录
- 完全分布式
- 混合体
2.3.1 集中式目录
有一个集中式目录服务器,每个节点上线时,需要在集中式目录服务器注册,告诉它自己上线了(下线也是同理)。所以集中式目录服务器就知道了每个节点的上线信息以及资源信息。
集中式目录存在的问题:
- 单点故障:目录服务器故障,就全部瘫痪
- 性能瓶颈
- 侵犯版权
2.3.2 完全分布式
- Gnutella 是一种完全分布式 的非结构化 P2P 协议。它是在 2000 年左右开发的,旨在实现点对点文件共享。Gnutella 网络中的节点相互连接,没有中心服务器或中心节点。每个节点都可以作为文件的资源提供者和请求者。
- 在 Gnutella 中,节点通过广播消息来发现其他节点 ,并建立直接连接以进行文件搜索和下载。当一个节点搜索某个文件时,它会向相邻节点发送查询消息,然后逐级传播到整个网络 。当某个节点拥有所需文件时,它可以响应查询消息并将文件直接发送给请求者。
- Gnutella 的非结构化特性 使得它适用于小规模的 P2P 文件共享 。节点可以自由地加入和离开网络,网络拓扑结构没有严格的规定。这种灵活性使得 Gnutella 在一定程度上能够应对节点的动态变化和网络的不稳定性。
需要注意的是,Gnutella 是一种早期的 P2P 协议,由于其非结构化的特点,它可能在大规模网络环境下面临一些挑战,如搜索效率和扩展性。随着时间的推移,结构化的 P2P 系统如 BitTorrent 和基于 DHT 的协议逐渐取代了 Gnutella,在大规模网络中更为常见。
Gnutella的协议
2.3.3 混合体
组长与组长之间通过完全分布式P2P传输,组长和组员通过集中式目录P2P传输。所以混合体就很好理解了,就是上面两种方法的结合模式。