大家好,又见面了,我是你们的朋友全栈君。
P2P = Peer to Peer
现在P2P也有很多不同架构,以下是常见的一些P2P架构
纯P2P架构
- 没有总是在线的服务器
- 任意端系统之间直接通信
- 对等方之间可以间断连接并可 以改变IP地址
例子:
-
文件分发
-
流媒体
-
VoIP
复杂应用纯P2P无法实现
P2P: 集中式目录
Napster公司首先设计,由中央集中服务器管理
- 当对等方启动时,它通知目录 服务器以下信息
-
IP地址
-
可供共享的对象名称
- Alice查询文件“Hey Jude” 3) Alice 向Bob请求文件
通过架构我们可以看到一些问题
集中式目录问题
- 单点故障
- 性能瓶颈
- 侵犯版权
文件传输是分散的, 但是定位内容的过 程是高度集中的
Gnutella(使用洪泛法查询)
类似于广播,范围有限,发出请求后,能响应的服务器回应
-
全分布
-
没有集中式服务器
-
公共域协议
-
许多Gnutella客户机实现Gnutella协议
覆盖网络:
-
如果对等方X和Y维护了一条TCP连接,则说X和Y之间有一条边
-
所有活跃的对等方和边组成覆盖网络
-
边不是物理通信链路
-
给定对等方连接的覆盖网络路径中的节点少于10个,即TTL小于10
查询报文在已有的TCP连接上发送
对等方转发报文
QueryHit 报文按反向路径传送
Gnutella: 加入对等方
-
加入对等方X必须发现在Gnutella网络中的其他对等方:使用对等方列表 。
-
X试图与该列表上的对等方建立一条TCP连接,直到与Y创建一条连接。
-
向Y发送一个Ping报文;Y转发该Ping报文。
-
所有的对等方接收Ping报文并响应一个Pong报 文。
-
X接收到许多Pong报文。然后能同某些其他对等 方建立TCP连接。
Gnutella: 对等方离开
-
主动离开:离开接点的所有对等方都会刷新自身 的激活对等方列表,并开始与列表中的新的对等 方建立连接
-
断网:发送信息的时候对等方没有响应,则表明对 等方离开,节点刷新自身的激活对等方列表,并开 始与列表中的新的对等方建立连接
KaZaA
纯P2P的改进,超级节点技术
-
每个对等方要不被指派 为组长,要不被指派给一个组长
-
对等方和组长之间建立 TCP连接
-
组长之间建立TCP连接
-
-
组长维护它的子对等方 共享的内容
过程:
- 每个文件有文件的散列码标识
- 客户机送向组长发送关键词的查询
- 组长响应匹配
- 逐项匹配:
- 元数据
- 散列值
- IP地址
- 如果组长转发查询给其他组长则其他组长响应匹 配
- 客户端选择要下载的文件
特点:
-
请求排队:限制对等方并行上载数量,新的请求进行排队。
-
激励优先权:根据不同的上载下载比例优先服务贡献大者。
-
并行下载:将一个文件分成若干段,从多个对等方并行下载。
P2P文件分发:BitTorrent
-
BitTorrent是一种用于文件分发的流行P2P协议。
-
参与一个特定文件分发的所有对等方的集合被称为一个洪流 (torrent)。
-
一个洪流中的对等方彼此下载等长度的文件块(chunk),典型 块长度为256KB。
追踪器tracker服务器
P2P文件分发流程
- 对等方加入 torrent:
- 没有文件块,但会随着时间流逝从其它对等方处累积文件 块
- 在tracker处注册,取得对等方列表,连到所有对等方的 一个子集(邻居)
- 在下载的同时给其它对等方上传文件块
- 对等方可能改变和其交换文件块的对象
- 对等方会不断进入或者离开
- 一旦某对等方下载完了整个文件,它可以离开(自 私)或者继续留在torrent系统里(无私)
BitTorrent:请求、发送
请求文件块
-
在任何给定的时刻,不同的对等方拥有不同的文件块子集
-
每个对等方会周期性的询 问其它每个它连接的对等方当前所拥有的文件块列 表
-
对等方将请求下载最稀缺的文件块
**发送文件块: tit-for-**tat(一报还一报)
-
Alice发送文件块的对象是 所有邻居中向自己发送速率 最快的4个
-
其它邻居被阻塞
-
每10秒重新计算速率
-
-
每30秒,随机选择一个其 他邻居,发送文件块
DHT(分布式Hash表)
DHT: 一个分布式的P2P数据库
- 数据库由许多(key,value)((键, 值)) 对构成。例如:
- key: 社保号; value: 人名
- key: 电影名称; value: IP地址
- 所有(key, value) 对被分发到成千上万的对等方用户群中
- 一个对等方利用key来查询DHT
- DHT返回与之匹配的value
- 对等方还可以插入(key, value)对
怎样把键值分配给对等方?
核心问题:
- 分配 (key, value) 对给各对等方
基本思想:
- 把每个key转化成一个整数
- 给每个对等方分配一个整数标识符
- 把 (key,value) 对分配给标识符离key最近的 那个对等方
DHT 标识符
- 给每个对等方分配一个[0,2n-1]之间的整数标识符,n为某给定值.
- 每个标识符由 n 比特构成.
- 需要每个key也在同样的范围内
- 为得到整数key,将原key做hash
- 例如*,* key = hash(“Led Zeppelin IV”)
- 这就是为什么叫做分布式hash表的原因
将key分配给对等方
规则:把key分配给具有最邻近ID的对等方.
- 为方便起见: 最临近被定义为该key的直接后继 (immediate successor )
- 例如:
- n=4; peers: 1,3,4,5,8,10,12,14;
- key = 13, then successor peer = 14
- key = 15, then successor peer = 1
环形DHT
-
每个对等方仅和其直接后继和直接前任( predecessor)联系.
-
“覆盖网络”
当有N个对等方时,为找 到负责的键,发送消息数 量的负责度是O(N)
带捷径的环形DHT
-
每个对等方知晓直接前任、后继以及捷径方的IP
-
本例中,将消息数从6减至2
-
DHT可以设计为每个对等方的邻居和每个请求的报文数均为O(log N)
对等方扰动
- 对等方可能进入或者离去
- 对等方需要知晓它后面两个后继的地址
- 每个对等方周期性的ping这两个后继以 检查它们的存活性
- 如果直接后继离开了,则选择它的下一 个后继作为直接后继
例如: peer 5离开
- peer 4检测到5的离开,将8当作其直接后继,并且问 8它的直接后继是谁(10),然后将10当作其第二后继。
- 如果编号为13的peer要加入怎么办? 后续还有很多问题,篇幅有限,感兴趣可以下来了解。
希望你能通过这篇文章了解到现在网络上常见的几个P2P的模式。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150729.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...