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. Django学习路15_创建一个订单信息,并查询2020年\9月的信息都有哪些

    在 app5.models.py 中添加一个 Order 表 class Order(models.Model): o_num = models.CharField(max_length= 16 ,u ...

  2. PHP array_slice() 函数

    实例 从数组的第二个元素开始取出,并返回直到数组末端的所有元素: <?php$a=array("red","green","blue" ...

  3. Java线程知识:二、锁的简单使用

    锁的初步认识 说到锁,相信大家都不陌生,这是我们生活中非常常见的一种东西,它的形状也各式各样.在生活中,我们通常用锁来锁住房子的大门.装宠物的笼子.装衣服的衣柜.以及装着我们一些小秘密的小抽屉.... ...

  4. ABP使用Nginx代理导致租户ID(Abp.TenantId)丢失

    描述:ABP使用Nginx代理导致租户ID(Abp.TenantId)丢失,自定义header无效无法传递,导致租户选择认证失败.原因是因为 Nginx 过滤是“.”这符号. 解决: 1,先从代码人手 ...

  5. [转] SpringBoot返回json 数据以及数据封装

    作者:武哥     来源:武哥聊编程   https://mp.weixin.qq.com/s/QZk0sKxBX4QZiCTHQIA6pg 1. Spring Boot关于Json的知识点 在项目开 ...

  6. Spring学习总结(3)-了解Spring框架

    Spring的核心Jar包 在Spring4的官方文档里,提到了Sping的核心包是:spring-context,只要引用了这个jar包,就可以实现Spring90%的基础功能.maven引用如下: ...

  7. Spring MVC method POST no supported

    首先:一些隐含的知识点要知道 POST 的不支持对静态资源的访问[默认情况下是这样,个人不太了解,仅总结大概思路],如果是post 而响应的是个静态资源,则很多情况下出现这种错误 因此在使用POST应 ...

  8. 网络安全传输系统-sprint1传输子系统

    一.产品规划与设计 二.传输子系统 基本框架:(1)不带安全功能的传输系统 (2)安全加密功能 part1:基本传输子程序设计(不带安全加密功能) 客户端 服务器 int main(int argc, ...

  9. C++虚函数相关内容

    样例代码 class Base{public: Base(){}; virtual ~Base(){    //若没有设置为虚函数:如果有这样的指针Base *p=new Derived();声明,则 ...

  10. C++ Json工具--Jsoncpp用法简介

    文章目录 Json简介 用法简介 数据类型 C++代码示例 代码执行输出结果 JSON在线解析及格式化验证 - JSON.cn Json简介 JSON(JavaScript Object Notati ...