前段时间看了点关于P2P技术的资料,现在简单的整理写进自己的博客,对于更深入的学习会在后续的博客中更新总结。
这篇博客的主要内容如下:
1.P2P的定义及特点
2.P2P网络拓扑结构
3.P2P关键技术的初步理解
4.JXTA简介
一、首先了解P2P的定义及特点:
P2P,即Peer-To-Peer的缩写,意思就是伙伴对伙伴、对等、点到点的意思,应用到网络上就是对等网络、点对点传输网络。某些人对P2P给出了数学意义上的严格定义如下:
1.有某网络N,是架构在Internet之上的网络,满足Internet的所有基本特性。
2.在N网络中,存在两种基本的模式,一种行为定义为P,是生产资源(提供资源)的行为,另一种定义为C,是消费资源(接收资源)的行为。
3.组成N网络的所有结点之间是对等关系,且同时具备行为P和行为C。
4.在N网络中,各Peer之间以无中介的、对等的方式进行双向交换,以执行P和C的行为。
5.N网络依赖Peer的存在而存在,Peer可以自由的加入或退出。
6.当有Peer加入或退出时,N网络仍保持组织、结构等特性不变。
根据以上的定义可以从两个方面来解释P2P网络:
1.从网络概念来讲,P2P网络是一种用户之间通过某一个相同的网络应用程序联系起来,彼此之间可以相互访问、共享计算机资源的网络。
2.从应用上来说,P2P网络是一种不通过中央服务器而将一些独立的计算机资源组织起来,通过Internet运行于个人计算机上,以实现共享文件和资源的应用。
从以上对P2P的描述,可知P2P至少有以下三点特点:
1.P2P网络是对等互联的的网络,组成网络的结点之间是对等、伙伴式的关系。
2.P2P网络结点之间资源的传递是从一点到另一点的,每个结点既是资源的提供者同时也是资源的消费者。
3.P2P网络中的资源是依赖于结点的存在而存在的,且资源可以动态的加入或退出。
二、P2P网络拓扑结构:
在现实世界中,P2P不是作为一个独立的个体网络存在的,不需要人为的部署和专门的硬件组网,它是依赖于某个P2P应用系统自发的组成的网络,从Internet的角度来讲,P2P网络是叠加在底层通信网络的基础设施之上的重叠网络,是网络中的网络,是一个分布式的、具有互操作性的自组织系统。P2P网络的拓扑结构对P2P网络的特点、P2P网络的搜索机制、数据传输机制、结点发现以及充分利用并发挥P2P的功能有十分重要的作用。
那么什么是拓扑结构呢?
在计算机科学中,网络拓扑结构是指构成网络成员间特定的物理的、或逻辑的排列方式,直观上看,网络拓扑就是在计算机网络中传输媒体的互连的各种设备的物理布局,特别是计算机分布的位置及电缆如何通过它们。
常用拓扑结构图有星型、总线型、网状、环状、树型如下图所示:
对P2P网络而言,一般要构造一个非集中式的拓扑结构,在构造的过程中需要解决网络中的大量结点如何命名、组织以及确定结点的加入或离开方式、出错恢复等问题。
根据拓扑结构的关系可以将P2P网络拓扑结构分为四种:
1.集中式拓扑
2.全分布式结构化拓扑
3.全分布式非结构化拓扑
4.混合式拓扑
(一)、集中式P2P网络拓扑的原理
集中式P2P网络类似于一个抽象的“星型网络拓扑”,由一个中央服务以星状的形式与各客户机连接,但这种连接并不是物理上的星状拓扑,而是基于集中式P2P网络拓扑协议而形成的一个虚拟的星状结构。
在集中式P2P网络中,网络的主体有一个处于中心地位的索引目录服务器和连接到目录服务器的各结点客户机组成,目录服务器用来管理和组织P2P的各客户端结点。
在网络运行过程中,P2P结点向中央目录服务器注册关于自身的信息(名称、地址、资源和元数据等),但这些注册都分散的存储在各结点中而并非服务器上,查询结点根据目录服务器中的信息的查询来选择与定位其他对等结点并直接建立连接,而不必经过中央目录服务器进行。
(二)、全分布式结构化P2P的原理
全分布式结构化拓扑的P2P网络主要采用分布式散列表技术来组织网络中的结点。分布式散列表简称DHT,DHT是分布式计算系统中的一类,用来将一个关键值(key)的集合分散到所有的分布式系统中的结点上,并且可以有效地将信息转送到唯一一个拥有查询者提供的关键值的结点。分布式散列表通常是为了拥有极大结点数量的系统,而且系统结点常常会加入或离开而设计的。
通过DHT技术将广域范围内大量的结点共同形成并维护一个巨大散列表,散列表被分割成不连续的块,每个结点被分配给一个属于自己的散列块,并成为这个散列块的管理者。
DHT类结构能够自适应结点的动态加入或退出,有着良好的鲁棒性、结点ID分配的均匀性和自组织能力。
(三)、全分布式非结构化的P2P网络原理:
目前,大多数的P2P应用系统是非结构化拓扑结构,这种结构的覆盖网络一般采用完全随即图的组织方式,结点度数服从幂次法则,从而能够较快的发现目的结点。(幂次法则指的是个体的规模和其名次之间存在着幂次方的反比关系。)
采用非结构化的P2P系统,对网络动态变化有较好的容错能力,具有较好的可用性,同时支持复杂查询,采用这种结构的典型案例便是Gnutella,它采用了基于完全随机图的洪泛发现和随机转发机制,为了控制搜索消息的传输,通过TTL的减值来实现。
(四)、混合式P2P网络结构的原理:
在混合式P2P网络结构中,整个网络中的结点按能力不同区分为普通结点和超级结点两类,超级结点也叫搜索结点,它与其临近的若干普通及诶点之间构成一个小型的、自治的、基于集中式的P2P网络模式。
这种混合式的P2P拓扑结构在工作过程中,一般会选择一些性能较好的结点作为超级结点,当有结点加入或退出时,系统可以在各个搜索结点之间再次选取性能最优的结点或另外引入一新的性能最优的结点作为索引结点来保存整个网络中可以利用的搜索结点信息,并负责维护整个网络的结构。
三、下面是对P2P的关键技术的初步了解:
(一)、P2P网络搜索技术
P2P根本的思想就在于对等和共享,在P2P系统中,资源分散在各个结点之上,并且结点频繁地加入或退出,使得P2P系统及整个P2P系统的资源都处于不断变化之中,P2P要实现良好、高效、共享机制,就要解决资源的搜索和结点的返现问题。所谓P2P搜索技术,就是一种P2P资源的发现和定位技术。
P2P搜索技术与其结构是密切联系的,有什么样的P2P网络拓扑基本上也就决定了此网络拓扑下的搜索策略。
集中式搜索是基于一台或多台中央服务器来进行的。中央服务器负责协调或调度单独注册结点上的资源,中央服务器维持着P2P网络中的结点的源的中央目录,并协调结点间的交互。
结构化P2P网络的搜索:在结构化的P2P系统中,利用DHT机制来对P2P系统中的文件进行定位,一个文件与一个key值对应,key值一般通过对文件进行哈希得到,系统中的每个结点负责保存一定范围的keys,利用put(key,value)的功能进行结点的信息的发布,利用get(key)功能进行信息查询,通过这种机制可以对P2P网络中的文件进行定位。
非结构化P2P网络搜索:这种结构的搜索方法分为两类:盲目搜索和启发式搜索。盲目搜索通过在网络中传播查询信息并且把这些信息不断扩散给每个结点,通过这种泛洪方式来搜索想要的资源。启发式搜索在搜索过程中利用一些已有的信息来辅助查找过程。
混合式P2P网络搜索:这里的混合式P2P搜索技术并不是基于混合式P2P结构的搜索技术,而是运用两种或以上搜索技术进行混合搜索,主要算法:鸡尾酒搜索算法、模拟退火思想的混合搜索算法。
(二)、P2P的体系结构技术
1.动态变化:P2P系统需要一种动态成员的管理机制,专门进行用户加入、离开以及出错的管理。
2.平等的参与:对P2P网络中的任意两个结点而言,如何定义这种平等,如何保证它们之间的平等,如何让这种平等在动态的P2P网络中延续下去以及控制这种平等不被破坏。
3.分散与自治:解决结点在时间和空间上的分散性以及结点在没有中央控制器的前提下,它的运行、控制和管理。
4.角色的划分:在一个P2P系统中如何区分结点的不同功能,如何划分它们的角色。
(三)、P2P的内容存储技术
1.资源的标识:资源的类型包罗万象,如何标识资源的存在
2.资源的获取:复制和缓存
(四)、内容传输技术
P2P通信时需要解决的问题是如何连接其他的终端获得信息、资源和服务,另一个重要问题是如何建立稳定的连接
(五)、P2P的系统安全技术
在P2P网络中网络安全是特别重要的一项内容,其中主要包括如下几个方面:
1.密码系统
2.非公开密钥加密技术
3.公钥加密技术
4.数字签名
5.身份识别和身份认证
四、JXTA简介
JXTA是一个针对点对点计算的合作项目,它提供一套简单、便利的技术,可以在任何平台、任何地点和任何时间支持P2P计算,是为了构建P2P网络而定制的一组协议。
JXTA的层次结构
JXTA平台主要被分为3层,其分层结构如图:
上图所示的各个分层中,各层有不同的基本功能:
核心层(JXTA Core):这一层封装了最根本的东西,包括Peer、对等组、Peer发现、Peer通信、Peer监视和相关的安全原语。
服务层(JXTA Servers):这一层包括P2P网络不是必需的、但很通用的功能,如查找、共享、索引、代码缓存和内容的机制,以及认证、PKI服务等。
应用层(JXTA Application):这一层包括应用JXTA服务开发出来的完整的P2P应用程序。
至于JXTA的一些基本术语,可以在网上搜索《JXTA技术手册》参考。
JXTA协议分类
JXTA协议由6个为特定的、普及型的P2P网络计算设计的协议构成,分为两类:2个核心协议和4个标准服务协议
核心协议:对等体端点协议、对等体解析协议
标准服务协议:对等体发现协议、汇聚协议、对等体信息协议、管道绑定协议
本人对于JXTA的理解就是开发P2P应用程序的类库,但是它是与平台无关的,可以用Java,C++等语言实现P2P应用程序的开发。
JXTA的安装与开发
到http://download.java.net/jxta下载 jxse-doc-2.5.zip、jxse-lib-2.5.zip、jxse-src-2.5.zip、jxse-tutorials-src-2.5.zip这四个包,这四个包内容如下:
jxse-doc-2.5.zip:为JXTA的文档压缩包,是应用JXTA的API重要参考工具
jxse-lib-2.5.zip:是JXTA的类库,在进行JXTA开发时需要导入相应的Jar包
jxse-src-2.5.zip:是JXTA的源代码包
jxse-tutorials-src-2.5.zip:是JXTA的一个开发指导示例的源代码,包括JXTA开发的指导文档
JXTA的安装的安装过程就是导入JXTA开发包到具体的开发工程中的过程。
JXTA的Hello World程序运行如下:
public class HelloWorld_JXTA { public static void main(String[] args){ System.out.println("Starting JXTA..."); HelloWorld_JXTA ht = new HelloWorld_JXTA(); ht.startJXTA(); System.exit(0);//程序退出 } /** * 启动JXTA的方法 */ @SuppressWarnings("deprecation") public void startJXTA(){ //初始化一个结点组对象 PeerGroup pg = null; try{ pg = PeerGroupFactory.newNetPeerGroup(); }catch(PeerGroupException e){ System.out.println("Fatal error:group creation failure"); e.printStackTrace(); System.exit(1);//系统非正常退出 } System.out.println("Hello JXTA!"); //打印结点组的名称 System.out.println("Group name:"+pg.getPeerGroupName()); //打印ID System.out.println("Group ID:"+pg.getPeerGroupID().toString()); //打印节点名称 System.out.println("Peer name:"+pg.getPeerName()); //打印结点ID System.out.println("Peer ID:"+pg.getPeerID()); } }
第一次运行时要对JXTA的管理界面进行相关配置。
程序运行成功后,会在程序同目录下会出现一个.jxta的文件夹:
PlatformConfig文件:由JXTA的配置工具生成,是一个符合XML规范的文本文件。
Jxta.properties文件:定义了一些jxta的属性。
cm目录:本地的缓存文件,记录了发现的所有的PeerGroup。
pse目录:存放Peer用于安全认证的证书信息。
对于JXTA管理界面的相关设置,到目前为止我还没有完全设置成功,还在进一步的学习中。对P2P的相关总结先到这里,以后有更深入的学习与体会会及时的更新的自己的博客上。