P2P应用
纯P2P架构
- 没有(或极少)一直运行额服务器
- 任意端系统都可以直接通信
- 利用peer的服务能力
- Peer节点间歇上网,每次IP地址都有可能变化
例子:
- 文件分发
- 流媒体
- VoIP
文件分发:C/S vs P2P
问题:从一台服务器分发文件(大小F)到N个Peer需要多少时间
- Peer节点上下载能力是有限的资源
文件分发时间:C/S模式
- 服务器传输:都是由服务器发送给peer,服务器必须顺序传输(上载)N个文件拷贝:
- 发送一个copy: F / u s F/u_s F/us
- 发送N个copy: N F / u s NF/u_s NF/us
- 客户端:每个客户端必须下载一个文件拷贝
- d m i n = d_{min} = dmin=客户端最小的下载速度
- 下载带宽最小的客户端下载的时间: F / d m i n F/d_{min} F/dmin
- 采用C/S方法将一个F大小的文件分发给N个客户端耗时: D c / s D_{c/s} Dc/s ≥ \geq ≥ max{NF/ u s u_s us,F/ d m i n d_{min} dmin}
文件分发时间:P2P模式
- 服务器传输:最少需要上载一份拷贝
- 发送一个拷贝的时间:F/ u s u_s us
- 客户端:每个客户端必须下载一个拷贝
- 最小下载带宽客户单耗时:F/ d m i n d_{min} dmin
- 客户端:所有客户端总体下载量NF:
- 最大上载带宽是: u s u_s us + ∑ \sum ∑ u i u_i ui
- 除了服务器可以上载,其他所有的peer节点都可以上载
- 采用P2P方法将一个F大小的文件分发给N个客户端耗时: D p 2 p D_{p2p} Dp2p ≥ \geq ≥ max{F/ u s u_s us,NF/( u s u_s us+ ∑ u i \sum u_i ∑ui)}
- 分子随着N线性变化,每个节点需要下载,整体下载量随着N增大;分母也是如此,随着peer节点的增多,每个peer也带了服务能力
P2P文件共享
例子
- Alice在其笔记本电脑上 运行P2P客户端程序
- 间歇性地连接到 Internet,每次从其 ISP得到新的IP地址
- 请求"双截棍.MP3"
- 应用程序显示其他有" 双截棍.MP3" 拷贝的对 等方
- Alice选择其中一个对等方, 如Bob.
- 文件从Bob's PC传送到 Alice的笔记本上:HTTP
- 当Alice下载时,其他用户也 可以从Alice处下载
- Alice的对等方既是一个Web 客户端,也是一个瞬时Web 服务器
所有的对等方都是服务器 = 可扩展性好
P2P:集中式目录
最初的"Napster"设计就是这个架构
- 当对等方连接时,它告知中心服务器:
- IP地址
- 内容
- Alice查询 "双截棍 .MP3" ,服务器返回Bob拥有这个文件
- Alice从Bob处请求文件
P2P:集中式目录中存在的问题
- 单点故障
- 性能瓶颈
- 侵犯版权
文件传输是分散的,而定位内容是高度集中的
查询洪泛:Gnutella
- 全分布式
- 没有中心服务器
- 开放文件共享协议
- 许多Gnutella 客户端实现了Gnutella 协议
- 类似HTTP有许多的浏览器
覆盖网络:图
- 如果X和Y之间有一个TCP连接,则二者之间存在一条边
- 所有活动的对等方和边就是覆盖网络
- 边并不是物理链路
- 给定一个对等方,通常所连接的节点少于 10 个
Gnutella:协议
- 在已有的TCP连接上发送查询报文
- 对等方转发查询报文
- 以反方向返回查询命中报文
可拓展性:限制范围的洪泛查询
Gnutella:对等方加入
- 对等方X必须首先发现某些已经覆盖在网络中的其他对等方:使用可用对等方列表
- 自己维持一张对等方列表(经常开机的对等方的IP)
- 联系维持列表二Gnutella结点
- X接着试图与该列表上的对等方建立TCP连接,直到与某个对等方Y建立连接
- X向Y发送一个Ping报文,Y转发该Ping报文
- 所有收到Ping报文的对等方以Ping报文格式响应
- IP地址,共享文件的数量及总字节数
- X收到许多Ping报文然后它能建立其他TCP连接
利用不匀称性:KaZaA
- 每个对等方要么是一个组长,要么隶属与一个组长
- 对等方与其组长之间有TCP连接
- 组长对之间有TCP连接
- 组长跟踪其所有的孩子的内容
- 组长与其他组长联系
- 转发查询到其他组长
- 获得其他组长的数据拷贝
KaZaA:查询
- 每个文件有一个散列标识码和一个描述符
- 客户端向其组长发送关键字查询
- 组长用匹配进行相应:
- 对每个匹配:元数据、散列标识码和IP地址
- 如果组长将查询转发给其他组长,其他组长也以匹配进行相应
- 客户端选择要下载的文件
- 向拥有文件的对等方发送一个带散列标识码的HTTP请求
P2P文件分发:BitTorrent
- 文件被分为一个个块256KB
- 网路中的这些peers发送接收文件块,相互服务
Peer加入torrent:
- 一开始没有块,但是将会通过其他节点处理积累文件块
- 向跟踪服务器注册,获得peer节点列表,和部分peer节点构成邻居关系("连接")
- 当peer下载时,该peer可以同时向其他节点提供上载服务
- Peer可能会变换用于交换块的peer节点
- 扰动churn:peer节点可能会上线或者下线
- 一旦一个peer拥有整个文件,它会(自私的)离开或者保留(利他主义)在torrent中
BitTorrent:请求,发送文件块
请求块:
- 在任何给定时间,不同peer节点拥有一个文件块的子集
- 周期性的,Alice节点向邻居询问他们拥有哪些块的信息
- Alice向peer节点请求他希望的块,稀缺的块
发送块:一报还一报 tit-for-tat
- Alice向4个peer发送块,这些块向他自己提供最大带宽的服务
- 其他peer被Alice阻塞(将不会从Alice处获得服务)
- 每10秒重新评估一次:前4位
- 每隔30秒,随机选择其他peer节点,向这个节点发送块
- "优化疏通"这个节点
- 新选择的节点可以加入这个top 4