详解P2P技术

详解P2P技术P2P=PeertoPeer现在P2P也有很多不同架构,以下是常见的一些P2P架构纯P2P架构没有总是在线的服务器任意端系统之间直接通信对等方之间可以间断连接并可以改变IP地址例子:文件分发流媒体VoIP复杂应用纯P2P无法实现P2P:集中式目录Napster公司首先设计,由中央集中服务器管理当对等方启动时,它通知目录服务器以下信息IP地址可供共享的对象名称Alice查询文件“HeyJude”3)Al.

大家好,又见面了,我是你们的朋友全栈君。

P2P = Peer to Peer

现在P2P也有很多不同架构,以下是常见的一些P2P架构

纯P2P架构

  • 没有总是在线的服务器
  • 任意端系统之间直接通信
  • 对等方之间可以间断连接并可 以改变IP地址

例子:

  • 文件分发

  • 流媒体

  • VoIP

复杂应用纯P2P无法实现

详解P2P技术


P2P: 集中式目录

Napster公司首先设计,由中央集中服务器管理

详解P2P技术

  1. 当对等方启动时,它通知目录 服务器以下信息
  • IP地址

  • 可供共享的对象名称

  1. Alice查询文件“Hey Jude” 3) Alice 向Bob请求文件

通过架构我们可以看到一些问题

集中式目录问题

  • 单点故障
  • 性能瓶颈
  • 侵犯版权

文件传输是分散的, 但是定位内容的过 程是高度集中的

详解P2P技术


Gnutella(使用洪泛法查询)

类似于广播,范围有限,发出请求后,能响应的服务器回应

  • 全分布

  • 没有集中式服务器

  • 公共域协议

  • 许多Gnutella客户机实现Gnutella协议

覆盖网络:

  • 如果对等方X和Y维护了一条TCP连接,则说X和Y之间有一条边

  • 所有活跃的对等方和边组成覆盖网络

  • 边不是物理通信链路

  • 给定对等方连接的覆盖网络路径中的节点少于10个,即TTL小于10

详解P2P技术

查询报文在已有的TCP连接上发送

对等方转发报文

QueryHit 报文按反向路径传送

Gnutella: 加入对等方

  • 加入对等方X必须发现在Gnutella网络中的其他对等方:使用对等方列表 。

  • X试图与该列表上的对等方建立一条TCP连接,直到与Y创建一条连接。

  • 向Y发送一个Ping报文;Y转发该Ping报文。

  • 所有的对等方接收Ping报文并响应一个Pong报 文。

  • X接收到许多Pong报文。然后能同某些其他对等 方建立TCP连接。

Gnutella: 对等方离开

  • 主动离开:离开接点的所有对等方都会刷新自身 的激活对等方列表,并开始与列表中的新的对等 方建立连接

  • 断网:发送信息的时候对等方没有响应,则表明对 等方离开,节点刷新自身的激活对等方列表,并开 始与列表中的新的对等方建立连接


KaZaA

纯P2P的改进,超级节点技术

详解P2P技术

  • 每个对等方要不被指派 为组长,要不被指派给一个组长

    • 对等方和组长之间建立 TCP连接

    • 组长之间建立TCP连接

  • 组长维护它的子对等方 共享的内容

过程:

  • 每个文件有文件的散列码标识
  • 客户机送向组长发送关键词的查询
  • 组长响应匹配
  • 逐项匹配:
    • 元数据
    • 散列值
    • IP地址
  • 如果组长转发查询给其他组长则其他组长响应匹 配
  • 客户端选择要下载的文件

特点:

  • 请求排队:限制对等方并行上载数量,新的请求进行排队。

  • 激励优先权:根据不同的上载下载比例优先服务贡献大者。

  • 并行下载:将一个文件分成若干段,从多个对等方并行下载。


P2P文件分发:BitTorrent

详解P2P技术

  • BitTorrent是一种用于文件分发的流行P2P协议。

  • 参与一个特定文件分发的所有对等方的集合被称为一个洪流 (torrent)。

  • 一个洪流中的对等方彼此下载等长度的文件块(chunk),典型 块长度为256KB。

追踪器tracker服务器

详解P2P技术

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

详解P2P技术

  • 每个对等方仅和其直接后继和直接前任( predecessor)联系.

  • “覆盖网络”

当有N个对等方时,为找 到负责的键,发送消息数 量的负责度是O(N)

详解P2P技术

带捷径的环形DHT

  • 每个对等方知晓直接前任、后继以及捷径方的IP

  • 本例中,将消息数从6减至2

  • DHT可以设计为每个对等方的邻居和每个请求的报文数均为O(log N)

详解P2P技术

对等方扰动

详解P2P技术

  • 对等方可能进入或者离去
  • 对等方需要知晓它后面两个后继的地址
  • 每个对等方周期性的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账号...

(0)
blank

相关推荐

  • 综合应用WPF/WCF/WF/LINQ之二十八:代码生成器之DBMLToInfo

    综合应用WPF/WCF/WF/LINQ之二十八:代码生成器之DBMLToInfo

  • 一致性hash算法 java实现_信息的一致性

    一致性hash算法 java实现_信息的一致性介绍一致性Hash算法是实现负载均衡的一种策略,后续会写如何实现负载均衡一致哈希是一种特殊的哈希算法。在使用一致哈希算法后,哈希表槽位数(大小)的改变平均只需要对K/n个关键字重新映射,其中K是关键字的数量,n是槽位数量。然而在传统的哈希表中,添加或删除一个槽位的几乎需要对所有关键字进行重新映射。强哈希考虑到单服务器不能承载,因此使用了分布式架构,最初的算法为hash()modn,hash()通常取用户ID,n为节点数。此方法容易实现且能够满足运营要求。缺点是当单点发

  • Android中的layout_gravity和gravity的区别[通俗易懂]

    Android中的layout_gravity和gravity的区别[通俗易懂]在Android的布局中,除了padding和margin容易弄混之外,还有layout_gravity和gravity。按照字面意思来说,layout_gravity就是相对于layout来设置的。

  • 暑假训练赛第六场

    暑假训练赛第六场

  • 使用Sigar包获取操作系统信息[通俗易懂]

    使用Sigar包获取操作系统信息[通俗易懂]项目中的一个需求是获取操作系统的相关信息,可以收集的信息包括:1,CPU信息,包括基本信息(vendor、model、mhz、cacheSize)和统计信息(user、sys、idle、nice、wait)2,文件系统信息,包括Filesystem、Size、Used、Avail、Use%、Type3,事件信息,类似ServiceControlManager4,内存信息

    2022年10月28日
  • integer常量池在哪_java 常量池

    integer常量池在哪_java 常量池常量池java中存在字符串常量池,维护了所有String对象使用Strings=”zx”的时候是使用String.valueOf(“zx”)从常量池中找了个对象返回在使用new的时候是直接创建一个新的对象Integer中也有常量池其中缓存了-128到127之间的数字(一个字节八位大小)Integera=127与Integerb=127相等吗对于对象引用类型:==比较的是对象的内存地址。对于基本数据类型:==比较的是值。如果整型字面量的值在-128到127

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号