详解P2P技术

P2P = Peer to Peer

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

纯P2P架构

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

例子:

  • 文件分发
  • 流媒体

  • VoIP

复杂应用纯P2P无法实现


P2P: 集中式目录

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

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

  • 可供共享的对象名称

  1. 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的模式。

Default image
LIU
代码是躯体,思想是灵魂

Leave a Reply