P2P系统的索引:信息到节点位置(IP地址+端口号)的映射
在文件共享(如电驴中):利用索引动态跟踪节点所共享的文件的位置、节点需要告诉索引它拥有哪些文件、节点搜索索引从而获知能够得到哪些文件
在即时消息(如QQ中):索引负责将用户名映射到位置、当用户开启IM应用时需要通知索引它的位置、节点检索索引确定用户的IP地址
  • 集中式索引:
内容和文件传输是分布式的,但是内容定位是高度集中式的。节点加入时,通知中央服务器IP地址、内容
缺点:单点失效问题、性能瓶颈、版权问题
  • 洪泛式查询: Query flooding
完全分布式架构。每个节点对它共享的文件进行索引,且只对它共享的文件进行索引
节点X与Y之间如果有TCP连接,那么构成一个边(虚拟链路),所有的活动节点和边构成覆盖网络(overlay network),每个结点邻居数一般少于10个
查询消息通过已有的TCP连接发送,如果查询未命中则节点转发查询消息、如果查询命中则利用反向路径发回查询节点
  • 层次式覆盖网络
介于集中式索引和洪泛查询之间的方法。每个节点或者是一个超级节点,或者被分配一个超级节点
超级节点负责跟踪子节点的内容。节点和超级节点间、某些超级节点对间维持TCP连接。
 
一、即时通信
以Skype为例说明,其使用私有应用层协议,以下为大致原理
本质上是P2P的:用户/节点对之间直接通信
采用层次式覆盖网络架构,分布在超级节点上的索引负责维护用户名与IP地址间的映射
 
二、文件分发
BitTorrent协议是一种用于文件分发的P2P协议
参与一个特定文件分发的所有节点集合被称为一个洪流(torrent)。在一个洪流中的节点彼此下载等长度的文件块(Chunk),典型的块长度为256KB。
每个洪流具有一个基础设施结点,称为追踪器(tracker),当一个节点加入某洪流时,它向追踪器注册自己,并周期性地通知追踪器它仍在该洪流中。
追踪器跟踪正参与在洪流中的节点。当一个新的节点加入该洪流时,追踪器随机地从参与节点集合中选择一部分,并将这些节点IP地址发送给它 。节点收到这张节点列表后,会试图与该列表上的所有节点创建并行的TCP 连接。
所有和其成功地创建了TCP 连接的节点称为临近节点,临近节点是随时间而波动的。
节点通过TCP连接周期性地询问每个邻近节点它们所具有的Chunk列表。每有一个不同的邻居,就获得一个块列表。随后节点将通过TCP连接,对当前还没有的Chunk发出请求 。当它下载Chunk时,也为其他邻居上载Chunk。
最稀缺优先(rarest first) 技术:针对自身没有的块在邻居中决定最稀缺的块(即邻居中副本数量最少的块),并首先请求那些最稀
缺的块。这样,最稀缺块得到更为迅速的重新分发,每个Chunk在洪流中的副本数量可以得到均衡。
节点会对于每个邻居持续地测量接收到比特的速率,并确定以最高速率流入的4个邻居节点,它只会向正在向其发送Chunk且速率最快的4个邻居发送Chunk,每10秒重新评估top 4;每过30 秒,她也要随机地选择另外一个邻居发送Chunk,这样新加入的节点也能得到Chunk。
一且某节点获得了整个文件,它也许(自私地)离开洪流,或(大公无私地)留在该洪流中并继续向其他节点上载Chunk。
 
三、分布式散列表DHT
DHT是一种分布式数据库,其为每一个节点(对等方)分配一个n比特标识符,标识符是0~2^n范围内的整数。
通过散列函数把每个键映射成标识符范围内的一个整数。
  • 存储
存储键值对时,如果初始键的散列值等于某个节点的标识符,则将该键存在这个节点;否则存在最邻近右继节点;
若初始键的散列值大于所有节点的标识符,则使用模2^n规则,在具有最小标识符的节点存储键值对。
  • 查询
为了查询键值对,可以把节点组成环形DHT
节点组成抽象逻辑网,在覆盖网络中的链路不是物理链路,而仅是节点对之间的虚拟联络(该网存在于由物理链路、路由器和主机组成的“底层”计算机网络之上)
假如每个节点只知道直接后继和直接前驱,为了找到负责的键,在最差的情况下DHT中的所有N个结点将必须绕环转发该报文,在平均情况下需要发送N/2条报文。
因此可以该环形覆盖网络为基础,增加捷径,使每个节点不仅联系它的直接后继和直接前任,而且联系分布在环上的少量捷径节点,当某节点接收到一条查询一个键的报文时,它向最接近该键的邻居(后继邻居或捷径邻居之一)转发该报文。
  • 节点离开
每个节点都知道自己的第一个后继节点和第二个后继节点的标识符和IP地址,并周期性的要求它们证明自己还活着(例如发送ping并要求回应)
如果某节点的第一个后继节点离开了,它可以直接把第二个后继节点改成第一个,再向其询问下一个后继节点的标识符和IP地址。
  • 节点加入:
假如一个标识符为13的节点要加入该DHT,在加入时,它仅知道节点1存在于该DHT之中。
节点13将先要向节点1发送一条报文,问它的前任和后继是什么。该报文将通过DHT到达节点12,而它认识到自已将是13的前任节点,并且它的当前后继节点15将成为13的后继节点。
节点12向节点13发送它的前任和后继信息。
节点13此时能够加入DHT,标识它的后继节点为节点15,并通知节点12将其直接后继改为13 。
 
BitTorrent使用Kademlia DHT来产生一个分布式跟踪器。
在BitTorrent中,其键是洪流标识符而其值是当前参与洪流的所有节点的IP地址,
一个新到达的BitTorrent节点通过用某洪流标识符来查询DHT,确定负责该标识符(即在洪流中跟踪节点)的节点。在找到该节点后,到达的节点能够向它查询在洪流中的其他节点列表。

计算机网络-应用层(5)P2P应用的更多相关文章

  1. [计算机网络-应用层] P2P应用

    首先我们要先来区分一下下面的几种体系结构: CS:Client/Server 客户-服务器结构BS:Browser/Server  浏览器-服务器结构 P2P:Peer to Peer 对等结构 BS ...

  2. [计算机网络-应用层] HTTP协议

    1.HTTP概况 Web的应用层协议是超文本传输协议(HTTP),它是Web的核心. HTTP由两部分程序实现:一个客户机程序和一个服务器程序,它们运行在不同的端系统中,通过交换HTTP报文进行对话. ...

  3. 计算机网络-应用层之HTTP协议

    1.概念 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写:HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等). ...

  4. 计算机网络-应用层(4)DNS协议

    域名系统(Domain Name System, DNS):一个分层的由DNS服务器实现的分布式数据库+一个使得主机能够查询分布式数据库的应用层协议 DNS服务器通常是运行BIND (Berkeley ...

  5. 计算机网络应用层之cookie

    一.生活中的cookie 无论你知不知道Cookie是什么,在你的生活中,肯定有使用过它.还记得你使用浏览器浏览网页时,当你要登陆时,网页上有一个记住密码或自动登陆的选项,当你选择时,你就使用了Coo ...

  6. [计算机网络-应用层] DNS:因特网的目录服务

    我们知道有两种方式可以识别主机:通过主机名或者IP地址.人们喜欢便于记忆的主机名标识,而路由器则喜欢定长的.有着层次结构的IP地址.为了折中这些不同的偏好,我们需要一种能进行主机名到IP地址转换的目录 ...

  7. [计算机网络-应用层] FTP协议

    文件传输协议:FTP 如下图所示:用户通过一个FTP用户代理与FTP交互.该用户首先提供远程主机的主机名,使本地主机的FTP客户机进程建立一个到远程主机FTP服务器进程的TCP连接.然后,该用户提供用 ...

  8. 计算机网络-应用层(3)Email应用

    因特网电子邮箱系统主要由用户代理(user agent) .邮件服务器(mail server) 和简单邮件传输协议(SMTP)组成   邮件服务器(Mail Server) 邮箱:存储发给该用户的E ...

  9. 计算机网络-应用层(2)FTP协议

    文件传输协议(FTP,File Transfer Protocol)是Internet上使用最广泛的文件传送协议.FTP提供交互式的访问,允许客户指明文件的类型与格式,并允许文件具有存取权限.它屏蔽了 ...

随机推荐

  1. matplotlib柱状图、面积图、直方图、散点图、极坐标图、箱型图

    一.柱状图 1.通过obj.plot() 柱状图用bar表示,可通过obj.plot(kind='bar')或者obj.plot.bar()生成:在柱状图中添加参数stacked=True,会形成堆叠 ...

  2. 基于MySql主从分离的代码层实现

    前言   该文是基于上篇<MySQL主从分离的实现>的代码层实现,所以本文配置的主数据库和从数据库的数据源都是在上篇博文中已经介绍了的. 动态选择数据源的配置   由于我们在写数据的时候需 ...

  3. PHP crypt() 函数

    定义和用法 crypt() 函数返回使用 DES.Blowfish 或 MD5 算法加密的字符串.高佣联盟 www.cgewang.com 在不同的操作系统上,该函数的行为不同,某些操作系统支持一种以 ...

  4. dp的本质

    什么是真正的dp?有什么特点?怎么来搞. 最近遇到了一些以前的题目发现没有好好的理解就直接写了 大多都是书上的算法并不是自己真正的理解. 1 关于背包 我总结一下 可能 有助于对模型的更快发现 01 ...

  5. Linux的VMWare中Centos7查看文件内容命令 (more-less-head-tail)

    一.More分页查看文件 more 命令类似 cat ,不过会以一页一页的形式显示,更方便使用者逐页阅读, 而最基本的指令就是按空白键(space)就往下一页显示, 按 b 键就会往回(back)一页 ...

  6. python 调用百度接口 做人脸识别

    操作步骤差不多,记得要在百度AIPI中的控制台中创建对应的工单 创建工单成功后 会生成两个key  这个两个key是要生成tokn 用 这里大家可以用 def函数 将token返回 供下面的接口使用 ...

  7. ios_中将UITextField输入框设置为密码形式

    1.通过XIB方式实现: 将UITextField中的secure选项勾中即可. 2.通过代码实现: UItextField * test = [ UItextField alloc] init ]; ...

  8. 社区版Intelij IDEA快速创建一个spring boot项目(找不到sping Initializer选项)

    首先作为一个初学spring boot的小白,在学习过程中肯定会遇到各种问题... So,问题出现:在我想快速创建spring boot项目时,却在新建列表中找不到sping Initializer这 ...

  9. JS click延迟解决方案

    click延迟解决方案     移动端click事件会有300ms的延迟,原因是移动端屏幕双击会缩放页面 1.禁止缩放功能 浏览器禁用默认双击缩放行为去掉300ms的点击延迟 user-scalabl ...

  10. Java 集合框架综述,这篇让你吃透!

    一.集合框架图 简化图: 说明:对于以上的框架图有如下几点说明 1.所有集合类都位于java.util包下.Java的集合类主要由两个接口派生而出:Collection和Map,Collection和 ...