2006年11月12日
最近看的几个开源项目的印象

不是专业的评价,就像读书笔记吧:

1、Azureus(http://azureus.sourceforge.net):这是java版的betorrent,最新版本2.4.0.2。从网上直接下载的源代码是没法构建的,所用的库没有在包里面。可以到:http://azureus.cvs.sourceforge.net/azureus/这个地方去找。对我们研究的意义主要在于参考其算法。

2、Shareaza(http://www.shareaza.com/):这是C++版的,他最大特点就是集成了对多个流行P2P文件格式的支持,有了它可以下载电驴、.torrent等,目前版本是2.2.1.0。对: EDonkey2000, Gnutella, BitTorrent 及 Gnutella2 (G2) 都支持,界面也很酷,支持换肤。大家可以直接下载源代码构建(ide环境是.net)。

3、icecast(http://www.icecast.org):给人感觉比较简单,主要实现了对mp3的网络播放,可用于构建网络电台。

4、P2P Networking Theory(http://cis.poly.edu/~ross/p2pTheory/):这是几个大学的一些P2P领域的学者一起搞得,叫:P2P Networking理论,我觉得最大的价值是,在上面可以找到一些论文。

5、theora(http://www.theora.org/):就目前了解来看,他是干了这么一件事情:“Free Video Compression ”即:免费的视频压缩算法,可以下载库文件(c写的),目前支持:“A year after getting import and export support for theora, Cinelerra now has distributed theora encoding support, which makes theora content creation much faster.”即:对分布式编码有支持,这是很有意义的。

6、PeerCast(http://www.peercast.org/):“PeerCast is a simple, free way to listen to radio and watch video on the Internet. It uses P2P technology to let anyone become a broadcaster without the costs of traditional streaming. This means you get to hear and watch stations not normally found on commercially funded sites. ”简单的讲,就是一个p2p的可以用于网络电台的流媒体软件。能够穿越防火墙、Nat等。源代码获取,需要使用“Subversion”(这个东西设计出来是替换cvs的,确实不错,有空研究下,可以到“http://www.subversion.org.cn/svnbook/”看使用说明),地址:svn://peercast.org/peercast/tags(好像要选择下,不然会搞下来好几个版本的代码),也可以找我要。

7、FreeCast(http://www.freecast.org/): “FreeCast is a Java application which allows peer-to-peer streaming. It makes possible a stream broadcast to a large number of listeners from a simple DSL connection.”java编写的P2P在流媒体的应用,下载:http://download.freecast.org/,有源代码,可以研究研究。

8、ActlabTV(http://actlab.tv/):这个页面有介绍http://actlab.tv/technology.htm

9、TrevBus(http://www.trevbus.org):是作者在做工程学位论文时开发的,“Trevbus will enable content streamers and others to pool their unused bandwidth so content streams can be sent to a large audience”。软件需求说明:http://www.trevbus.org/SRS.html,软件设计文档:http://www.trevbus.org/SDD.html,理论基础?:http://www.trevbus.org/thesis.html

10、Stream2Stream(http://s2s.sourceforge.net/):java语言开发的P2P流媒体系统,“Stream-2-Stream implements multicast+, a next generation streaming protocol. Multicast+ is more efficient and requires less bandwidth than direct streaming (e.g. shoutcast/icecast). Stream-2-Stream (abbreviated "s2s" or "S2S") stations have no user limit; stations can be set up without paying a fortune for bandwidth. Stream-2-Stream saves bandwidth by passing streams from one peer to another through multicast and unicast p2p, rather than everyone getting a stream from one central server (Shoutcast/Icecast). ”更多:http://s2s.sourceforge.net/about.php

11、P2Pradio(http://p2p-radio.sourceforge.net):java语言开发的P2P音视频服务和客户端系统,“P2P-Radio can distribute audio streams in the MP3 and Ogg Vorbis formats and video streams in the NSV format over the Internet. This is done in a peer-to-peer way. The broadcaster doesn’t need to send the stream to every single listener, because the listeners distribute it among themselves.”,好像用于学习很不错,好像是学生的一个学期论文。详细介绍:http://p2p-radio.sourceforge.net/about.php.en

12、Nodezilla(http://evl.sourceforge.net) :这是一个由java编写的安全的、分布的并且高容错的路由系统。他的主要目标就是,为分布式应用(聊天、高清晰视频多播、文件共享、安全文件存储)提供底层。目前构建的应用有:Anonymous File sharing, Hierarchical Multimedia Streaming, Digital photo sharing with selected friends, Distributed BitTorrentStore Database, User driven storage/retrieval of objects. 详细请见:http://evl.sourceforge.net/whatis.html#whatis

2006年08月25日

CoolStreaming/DONet: A Data-Driven Overlay Network for Efficient Live Media Streaming [Xinyan Zhang¤, Jiangchuan Liuy, Bo Liz, and Tak-Shing Peter Yum¤]

1、DONet : There are three key modules: (1) membership manager,which helps the node maintain a partial view of other overlay nodes; (2) partnership manager, which establishes and maintains the partnership with other nodes;(3) scheduler, which schedules the transmission of video data.

2、消息结构 :each message is a 4-tuple <seq num, id, num partner, time to live> last update time>,
seq num is a sequence number of the message,
id is the node’s identifier,
num partner is its current number of partners,
time to live records the remaining valid time of the message.
last update time is the local time of the last update for the entry.
3、SCAM 出自: A. J. Ganesh, A.-M. Kermarrec, and L. Massoulie, “Peer-to-peer membership management for gossip-based protocols,” IEEE Transactions on Computers, 52(2), Feb. 2003.

4、问题: fig2 中,除源节点外各个节点之间都有上传与下载的关系吗?

5、异构网络问题:For a homogenous and static network, a simple round-robin scheduler may work well, but for a dynamic and heterogeneous network, a more intelligent scheduler is necessary.

6、Fig. 3. Scheduling algorithm at a DONet node.  算法暂时未能理解,节点调度算法

7、currently, we adopted the TCP-Friendly Rate Control (TFRC) protocol [31], as in many other systems. 出自: M. Handley, S. Floyd, J. Pahdye, and J. Widmer, “TCP Friendly Rate Control (TFRC): Protocol Specification,” RFC 3448, January 2003.

8、page 6-7 公式 1-8 不甚理解

9、理解 partner 与 node 的区别

10、PERFORMANCE EVALUATION  [A:Performance under Stable Environment; B:Performance under Dynamic Environment; C:Comparison with Tree-based Overlay]

11、树型模式:基于网状模型的退化吗?

12、未完

2006年03月17日

转CSDN   JXTA技术与应用发展 

作者: 务实
Thursday, October 9 2003 2:57 PM 

—————————————————————————–


1、  概述
2、  JXTA的设计目标及有关概念
3、  JXTA协议
4、  JXTA应用与发展


—————————————————————————–


一、概述
 
 
美国Sun公司自从1995年向世界推出了Java语言以来,每年都会在Java领域里推出新的技
术,从JavaCard、J2ME到J2EE、JINI、JavaTV,推动了Java技术的发展和应用。在最近
几次的旧金山的JavaOne会议中,JXTA是该公司向业界推出的较新技术。该技术的目的是
为P2P的网络应用开发提供一个统一的平台,而且为了鼓励和支持该技术的发展,JXTA项
目采用了开放源码的方式,因此吸引了大量业界人士参与到JXTA技术的研究与应用当
中,JXTA Community(www.jxta.org)就是人气很旺的一个Java技术研究开发的网站。

JXTA最早起源于2000年的夏天,现在大家把JXTA看成是P2P的平台,JXTA的目标是要解决
几个技术与商业上的难题。第一是解决众多P2P系统互不相通的问题。2000年,是P2P突
飞猛进的高潮年,但高潮背后却是许多小公司用自己的封闭系统试图在Internet上圈一
块地。Sun认为,只有互通才能真正发挥出P2P的优势,就好像IM(Instant Messaging),
能互连的人越多,越有价值。所以Sun决定出面发布一个平台,使所有P2P系统都能连接
起来,只有Sun这样位置中立、但在技术上有雄存实力被大家认可的公司才有希望做成这
一平台。

JXTA的另外一个目的就是找寻一套数量最少、概念最简单的系统构成的“积木”。如果
成功,这几块积木就会是今后大家构架信息系统的基本模块,从而帮助人们摆脱像
Windows或TCP/IP这样的传统软件带来的包袱。Java、Jini和JXTA像是J的三部曲,Java
取自著名咖啡产地名,Jini是genie(精灵) 的谐音,而JXTA则是Juxtapose的缩写。当时
BillJoy用grep把所有J打头的英文词找出来,juxtapose跃然纸上,很是巧妙。既表现了
P2P或肩并肩的意义,又说明JXTA不局限于P2P。但JXTA与众不同,它是由一系列网络协
议构成的,用任何语言都可以实现,并不只限于Java,只有彻底独立于操作系统、网络
传输技术以及程序设计语言,才真正达到了跨平台,而这样的技术,最容易受到业界的
认同。

JXTA是项目创始人、Sun首席科学家BillJoy二十多年酝酿的结晶,“JXTA技术是网络编
程和计算的平台,用以解决现代分布计算尤其是点对点(P2P)计算中出现的问题。”JXTA
研究项目,将提供使用户更便捷地访问连接在互联网上的个人电脑资源的新框架,从而
进一步拓展互联网的空间。同时JXTA也是Sun的ONE互联网战略的延续,并且将更积极的
姿态与Microsoft的.Net战略和Hailstorm计划一争高低。Joy指出,JXTA可能是Sun One
平台最简单的一部分,而不是打算将它变成象微软的.Net那样复杂的东西,而且JXTA也
将是开放源代码的团体;有别于而微软的Passport和Hailstorm技术都是申请专利的专有
技术,Sun希望通过公开JXTA源代码的方式,成为微软最有力的竞争对手,在公开源代码
的领域中,Linux和Apache是卓越的成功典范,Sun也希望JXTA能铸造新的成功。

JXTA技术提供了基础性的机制解决当前分布计算应用中面临的问题,实现新一代统一、
安全、互操作以及异构的应用。目前它支持基于Java技术的平台和系统。而将来JATX技
术将不受到内存的限制而支持更多小型移动设备。JXTA通过Java技术和XML数据表达的结
合,提供了强大的功能使得垂直应用得以交互,并且可以克服目前P2P软件中的限制。同
时,通过小型、简单、便于开发的构造模块,JXTA将使开发者从建立各自框架的复杂工
作得以解放,可以潜心关注于建设各类新颖、创造性的、分布式计算应用。


二、JXTA 的设计目标及有关概念
 
 
一)P2P技术

P2P即Peer to Peer,称为对等连接或对等网络,P2P技术主要指由硬件形成连接后的信息
控制技术,其代表形式是软件;P2P并不是一个新的概念,因特网上的许多核心协议本身
就是P2P的应用程序,因特网的发展过程也说明了这一点,我们可以通过下述特性来描述
P2P:

Peer知道其他Peer的存在。
Peer在一个虚拟的网络中运行。
Peer同时具有Client和Server的特点。
多个Peer可以组成为一个Peer组。
从因特网的发展来看,目前已经完全有可能开发新的P2P应用程序来补充和取代现有的集
中式应用程序,文件共享程序和聊天程序的成功已经吸引了许多程序员加入P2P程序的开
发。而且随着技术的发展,P2P所面临的安全、控制和网络使用的问题将逐步解决。P2P
系统可以提供如下功能:

Peer的独立控制能力—-用户将变得非常强大,可以创建自己的组和虚拟网络,而且可
以非常容易地发布自己的资源。
可靠性—-P2P系统是任何人都可以获得的可靠系统。
扩展性—-P2P系统的用户数量可以急剧膨胀,可以与最大的集中式系统媲美。
性能—-各种资源之间可以协同工作来有效地解决问题。
P2P是一种基于互联网环境的新的应用型技术,主要为软件技术,P2P网络应用发展可能
要涉及到4个方面关键技术:

1) 对于互联网上众多计算机,P2P应用比其他应用要更多考虑那些低端PC的互联,它们
不具备服务器那样强的联网能力,同时对于以往的P2P应用技术,现在的硬件环境已经更
为复杂,这样在通信基础方面,P2P必须提供在现有硬件逻辑和底层通信协议上的端到端
定位(寻址)和握手技术,建立稳定的连接。涉及的技术有IP地址解析、NAT路由及防火
墙。 

2) 在应用层面上,如果两个Peer分别代表两家不同的公司,而且它们已经通过互联网建
立连接,那么一方的信息就必须为另一方所识别,所以当前互联网上关于数据描述和交
换的协议,如XML、SOAP、UDDI等都是一个完善的P2P软件所要考虑的。 

3) 有通信就要有安全保障,加密技术是必须要考虑的。 

4) 其他需考虑的有如何设置中心服务器,如何控制网络规模等。

与P2P相关技术,有许多其他的技术被称做P2P,或者与P2P相关,或者可以被当作P2P使
用,主要是以下几方面内容:

JINI技术;
软件代理(Agent)技术;
JXTA的竞争者(Gnutella和Freenet等);
Web Services技术。
 
二)JXTA设计目标及层次结构

1、JXTA设计目标

首先,JXTA是为了构建P2P网络而制订的一组协议,是处理构建P2P网络所碰到的问题的
解决方法,JXTA标准协议规范介绍如下:

    “JXTA由六个协议组成,这些协议是专为特定的、分布式的、对等的网络计算而设
计的。使用这些协议,Peer可以互相合作来建立自我组织、自我管理的对等组,而不必
关心它们在网络中所处的位置(在网络边缘或者防火墙的后面),并且也不需要集中的管
理机构。”

   因此JXTA的核心是六个协议,其次,JXTA是P2P应用程序开发的运行平台;目前JXTA
首先推出了基于Java的参考实现,提供了支持六个协议的Java API,JXTA还将推出包括C
语言在内的其他编程语言的API,JXTA在设计时有如下几个目标:

操作系统无关
语言无关
为P2P应用提供服务和基础
    从本质上讲,JXTA的目标是希望在任何设备,从台式机到PDA、汽车、洗衣机等设备
都可以支持P2P编程。这里有几个概念上的目标,它们包括:

使用组来组织Peer并且在组内提供服务和应用的环境。
组可以使用认证和验证方式来控制组内的访问权限。
通过网络来发布关于Peer和网络资源的信息。
通过系统来发布各种请求。    
提供一个基础平台,供Peer之间做路由和通信。在防火墙或者其他障碍后面的Peer之间
的通信也是这个目标中很关键的一部分。
提供一种机制允许Peer之间可以彼此监视状态和资源。
    除此之外还有一些其他目标,例如加密、支持不同的通信协议、易用性、稳定性和
性能等,所有这些目标在设计JXTA协议和最初的Java API时,都被考虑到,另外,开发
人员和Sun公司的管理者还考虑了以下目标:

系统应该允许任何设备直接加入到JXTA网络中去。
系统应该允许ISP对网络上的Peer进行集中管理。
系统应该支持数字产品版权的管理,例如购买的软件、音乐CD、电影等。
封装和抽象一些特定的核心功能,以便产生出商业方面的应用。
从上面列出的目标可以看出两点,首先要让企业觉得使用JXTA可以使自己对系统进行控
制,原因在于大部分P2P系统没有集中式的管理,所以在应用中不受企业的欢迎;其次,
对于硬件或者软件提供商来说,JXTA系统需要能够创造出利润。

    根据以上这些目标,JXTA被设计成企业可以接受的、容易维护的、健壮的,并且能
够满足任何P2P应用的概念。
 
2、JXTA的层次结构

JXTA由三层组成,如图1所示。第一层是JXTA核心层,它包含了服务所需要的核心功能;
第二层是服务层,它提供了访问JXTA协议的接口;第三层是应用层,它使用服务来访问
JXTA网络和JXTA提供的功能。这样的设计和一个标准的操作系统比较相似,标准的操作
系统包括核心操作系统、服务和应用程序。

JXTA                                              Sun JXTA
Applications     JXTA Community Applications      Applications JXTA
                                                               Shell
JXTA                                          Sun JXTA         ——-
Services         JXTA Community Services      Services         Peer
                                                               Commands
JXTA       Peer Groups   Peer Pipes   Peer Monitoring     
Core                        Security
                  Any Peer on the Expanded Web

                       图1 JXTA的层次结构

各层的说明如下所示:

核心层(JXTA Core):这一层封装了最根本的东西,包括Peer、对等组、Peer发现、Peer
通信、Peer监视和相关的安全原语。
服务层(JXTA Services):这一层包括对于P2P网络不是必需的、但很通用的功能,如查
找、共享、索引、代码缓存和内容缓存的机制。
应用层(JXTA Application):这一层包括了应用JXTA服务开发出来的完整的P2P应用程
序,例如myJXTA,JXTA-CAD等应用程序。

三)JXTA有关概念

  在JXTA网络中,有一些概念是需要熟悉和理解的,它们是从JXTA协议中提出的一系列
的专有名词。

  1、Peer(对等机)

  Peer是一个虚拟的通信点。在一台计算机或者设备上可以有很多个Peer,一个Peer并
不是一个用户,因为一个用户可以有多个Peer,同一个设备上也可以有多个Peer(在测试
的时候经常用到)。因为Peer不等同于用户,所以需要将用户和Peer抽象出来并分离开。

  Peer与特定的网络服务联系得很紧,在JXTA的参考实现中,Peer可以使用网络提供的
基本服务,例如rendezvous(集合点服务),router(路由服务),gateway(网关服务)等,
这些基本服务又可以提供搜索和通信服务,一般来说,并不是所有的Peer都使用这些服
务,它们只使用这些服务的一部分。

  2、PeerGroup(对等组)

  对等组是一种组织Peer并且发布组内的特定服务的方式。对等组可以被创建、加入和
退出,在一个组里还可以更新一个组成员的关系,由于一些原因,对等组需要对成员关
系进行一些限制,例如为了通信的安全、隐私的考虑等。这里使用一种协议来认证,它
专门收集信息并判断其是否符合成员关系的要求。

 对等组为应用程序提供了一种环境,例如对某个话题感兴趣的Peer可以组成一个组,并
且在组内使用一个聊天服务来讨论。这样,聊天的信息就会限制在那些加入到这个组内
的成员之间。并且,对于想加入到这个组的Peer,可以使用成员ID来进行认证;没有这
个ID的Peer不能够加人到组内,也就不能够使用组内的聊天服务,也可以把对等组看成
一个虚拟的私人网络VPN,一个VPN只允许几个计算机之间互相交流,而不允许因特网上
其他的成员加入,由于VPN使用了加密的方式,对于偷听者他们不能够理解组内的谈话,
对等组也可以限制Peer的加入,同样也可以对谈话消息加密。

  3、Endpoint(端点)

 在JXTA应用中,端点是最基本的通信方法。一个端点就是实现了特定通信协议的Peer的
地址。一个Peer可以有多个端点,这样可以通过不同的协议来与其他Peer通信。

 端点不一定要是物理地址,端点可以允许物理地址发生变化。端点的一个简单例子 就
是一个IP地址加上一个端口。通过使用这些值,可以打开一个流并且与目标Peer通信。
然而,JXTA在流的基础之上又放置了一层,称之为Pipe(管道)。这样,不是将一个流连
接到一个地址,而是把一个管道连接到端点上。端点和管道的好处在于,不用去关心
Peer所使用的真正的地址和协议是什么。使用抽象出来的端点和管道,可以为创建P2P应
用提供强大的功能并降低复杂性。由于管道使用通信协议来连接,端点描述了协议和连
接的所需要的信息。因此端点可以描述HTTP、TCP、BEEP以及其他可以支持的通信协议。

 一个Peer可以支持一个或者多个端点。通过使用多种协议,Peer可以提供更有效率的方
法。也就是说,如果两个Peer都在防火墙的后面,可以直接通过它们的TCP端点来通信;
如果两个Peer要穿过防火墙去通信,则需要使用HTTP的端点。

 4、Pipe(管道)

 管道是Peer之间的虚拟通道,通常,我们认为对等通信是单个的通信连接,但是也并不
是总是这样的,因为防火墙和其他障碍的存在,许多Peer并不能直接连接,这时,管道
更像一个在多种通信协议之上的虚拟层,可以通过起网关作用的Peer对通信提供中继支
持。

 管道是JXTA最基本、最重要的特性,它提供了一种很好的方案,使得Peer在大多数网络
情况下都可以通信,而不用去管防火墙或者其他的障碍,即使你不知道另外一个Peer的
位置以及它所使用的协议等信息,通过管道仍然可以与之通信;管道作为一种抽象的方
法,隐藏了一些细节,比如在多个连接的时候可能会有多个Peer参与进去,管道也可以
重新定位,找到原来的Peer。在JXTA的参考实现中,有几种常用到的管道,它们是:

单向异步—-这种管道只用来做单向通信。管道是异步的,消息到达时可能不是顺序
的。这是JXTA平台上最基本的一种类型的管道。
同步的请求/应答—-所有发出的信息都会收到一个应答消息,消息到达的顺序是按照它
们发送时候的顺序。
成批发送—-用来发送大量的数据。
流传送—-通过流可以更有效地传送诸如声音、视频等大量的数据。
双向—-它是两个单向异步管道的组合。    
单向同步—-所有发出的信息都会收到一个应答消息,消息到达的顺序是按照它们发送
时候的顺序。
单向可靠安全的管道—-所有发出的信息都会收到一个应答消息,并且这些消息都是加
密的。
管道还可以分成以下两种类型:

点到点类型—-点到点的管道连接两个不同的Peer。可以使用多个起网关作用的Peer来
创建连接。
传播类型—-将一个Peer连接到多个目标Peer。
    现有的JXTA参考实现已经提供了单向异步管道、单向可靠安全管道和双向的管
道。    JXTA和传统的网络是非常不同的,大多数网络协议或者没有地址,或者有一个
固定的地址,而JXTA抽象出一个概念叫做端点,用来作为地址。一个Peer可以有多个端
点,Peer可以通过一种或者多种协议例如TCP、HTTP等进行通信,所以可以使用多个端
点,JXTA使用多种传输协议的目的是为了在与其他Peer通信时可以选择最好的方式。如
果一个Peer在企业的防火墙的后面,可以使用HTYP来与防火墙之外的Peer通信,还可以
使用TCP来与防火墙内局域网内部的Peer通信,通过灵活使用多个传输端口,对特定的
Peer使用特定的协议,以得到最好的速度和响应。

 5、AdvertiSement(广告)

     一个广告就是一个XML文档,它用来描述JXTA的消息、Peer、对等组或者服务等。
广告都遵守编码、标签和内容的标准,广告用来交换JXTA网络上可以获得的任何信息。
例如,一个Peer创建了名称为“MyChat”的对等组后,就可以使用IP多播方式把广告发
布到本地的JXTA网络;也就说,子网中的每一个Peer都会收到一份广告的副本,此外广
告还会被发送到集合点去。

    Peer使用一种叫做集合点(Rendezvous)的特殊Peer来发现网络上其他地方的广告。
集合点Peer可以存储广告并且支持搜索。Peer可以使用对等组的名字或者其他属性来搜
寻该对等组广告。有了对等组的广告,其他的Peer就可以使用广告中的XML来实例化并加
入到“MyChat”这个对等组中。一旦成为对等组的成员之后,Pear可以使用对等组的环
境所提供的服务。

    广告实际上是P2P网络中的“名片”,P2P网络中的任何资源,包括Peer、对等组、
管道等都可以用广告来描述,目前是在P2P网络中标志资源,并且可以相互找到; 大多
数JXTA广告的编码是使用UTF-8,它是对Unicode的一种ASCII编码方式,UTF-8使用的是8
位编码,Unicode使用的是16位编码,因此可以节省一半的空间,只有在消息体中间可能
会使用到完全的Unicode编码,在消息体里可以指定使用Unicode或者其他的字符集作为
编码方式。

6、Message(消息)

    在JXTA中,有两种方式来处理消息。一种是使用XML格式,数据都遵循XML标准被包
装到消息里;另外一种是使用二进制格式。尽管希望对所有的JXTA消息都使用XML格式,
可是由于大量的消息需要传送,使用XML格式的消息会导致效率较低,而且由于消息通常
是在程序之间传送的,所以可以规范的消息内容使用二进制的格式;对于其他的仍然采
用XML格式。

    在一个XML协议中使用二进制消息看起来似乎不太合理,但事实上使用二进制消息,
除了可以得到紧凑的格式之外还有很多其他优点。首先数据可以使用一些标准技术进行
压缩,对文本等数据的压缩可以节省大量的传输时间;另外,许多消息本身就是二进制
的格式,例如文件共享程序中共享的文档可能就是二进制的,因此可以直接使用二进制
的格式;还有一个问题就是加密,为了加密可以把数据转化成为二进制,然后直接使用
二进制的消息来传输。

7、Rendezvous Peer(集合点)    

    一个集合点首先是一个Peer,而且是一个能够处理来自其他Peer请求的Peer。集合
点也可以将请求委托给其他Peer,当然那些Peer也必须是集合点。使用集合点的一个主
要目的就是为了方便在本地网络之外搜索广告。集合点通常拥有更多资源,并且可以存
储大量的有关它周围Peer的信息。

    集合点也可以作为搜索的传递者。集合点可以转发发现请求到其他的集合点(原集合
点通过与其他Peer的广告交互而得到了被转发集合点的信息)。每一个集合点如果本身没
有被请求的信息它都会转发该请求。
 
                    Peer3             防火墙
                      *          *      *       TCP
               IP多播 * TCP   *    HTTP * 返回45678的结果    
     通过TCP返回结果  *    *            * 
Peer2—————Peer1  返回45678  集合点4———-Peer8
        IP多播              的结果      *
                                 TCP    *       TCP
                                 请求   *  返回567的结果
                                      集合点5
                                     *     *
                                   *         *
                               Peer6        Peer7

                    图2 通过集合点进行Peer搜索的过程

   图2说明了一个典型搜索过程。远程搜索从Peer1开始,它首先通过IP多播(IP 
Multicast)询问本地的Peer2和Peer3,Peer2和Peer3很可能和Peerl处于同一个局域网
内,所以很快收到了搜索请求。接下来,如果Peer2和Peer3没有所搜索的特定资源,搜
索将通过集合点进行,Peer1会向它的集合点Peer发出搜索请求,如果该集合点Peer也没
有所需的广告信息,该集合点Peer会向它所知道的集合点Peer发出搜索请求。需要注意
的是,除了和提出查询请求的Peer处于同一局域网内的Peer收到查询请求外,在局域网
外只有集合点才会收到查询请求。

    IP多播(IP Muhicast)是一个一到多的消息传输协议。IP多播用来发送数据的副本到
一组地址。在P2P应用程序中,IP多播有两个好处。首先,因为多播使用一个组地址而不
是使用IP地址,一个Peer可以在不知道接收者地址的情况下发送消息。这样做的结果是
在多播网络中的所有Peer都可以响应发出请求的Peer,将有关查询的结果信息、甚至是
自己的IP地址(用于与请求Peer直接通信)发送回去。

    IP多播的第二个好处是减少使用带宽。因为所有的Peer都可以看到一个单一的消
息,没有必要向每一个Peer发送消息的一个副本。当发送大量的数据到一组Peer时,这
一点是非常重要的。使用多播的一个缺点是一些防火墙和路由器会阻塞多播的消息。在
因特网提供商之间通过因特网主干网可以支持多播消息,不过这种服务是需要额外付钱
的。还存在其他IP多播的障碍,比如个人防火墙、子网路由器。这就是为什么JXTA不是
仅仅支持IP多播的原因。一般情况下,只要在防火墙后能够支持多播对于大多数的P2P网
络就足够了。你可以这样来利用本地的多播,先将消息发送到每一个网络的某一个特定
的Peer上,然后该Peer又通过本地的多播将消息发送给本地的Peer。

    只有集合点允许进行超出局域网的搜索。一个Peer可以选择成为一个集合点,但这
不是必须的,作为集合点好的一面是集合点可以缓存的形式保留从其他集合点得到的查
询结果的副本;不好的一面是,该Peer将占用很多的内存和带宽。由于请求数量可能很
多并且大量的广告数据会消耗很多的计算机资源,在这种情况下我们可以选择将计算机
作为专用的集合点。集合点同时可以作为企业内部网的网关和路由器,其效果和使用传
统的路由器是一致的。在每一个子网内也需要使用一个集合点,是否选择使用专用的集
合点Peer取决于安全性的要求和使用的P2P应用的范围。P2P网络的拓扑结构需要通过多
个的例子来进行测试并且需要定期监控。特别要注意的是:当P2P网络的服务在大量Peer
上存有副本时,P2P网络的效率更高。有些时候并不是额外的集合点就可以提高网络的效
率。

    当一个Peer在搜索广告时或者是其他服务使用集合点机制来路由消息时,集合点才
被使用,因此一个Peer对集合点的需要不是持续的;为了能够更好地发挥作用,一个连
接到因特网的集合点最好尽可能地暴露给网络上的多个Peer,在防火墙内把所有的Peer
都配置为集合点不一定能够发挥很大的作用。

8、RouterPeer(路由Peer)

    JXTA中的一个路由Peer是一个支持Peer端点协议的Peer,不是所有的Peer都需要实
现该协议,因为和传统的网络路由器一样,我们只需要少数几个路由器去支持一个大网
络,JXTA路由器和传统的路由器非常相像,最主要的区别是P2P不是非常固定并且包括了
很多非静态地址。

    9、GatewayPeer(网关Peer)

    JXTA中的一个网关Peer是一个作为通信中继的Peer。网关Peer和集合点的不同之处
在于,网关是用来在Peer间传递消息,而集合点是用来传递请求的,网关Peer就像是无
线电转发器或者说是Peer间的一个中介,它传递消息,因为有防火墙、NAT设备和代理服
务器的存在,网关对网络的连通具有决定性的作用,网关可以存储消息,并且等待希望
得到这些消息的接收者来收集它们。

    网关的存在是因为因特网非常混乱。混乱的原因是有各种各样的用于防止Peer间通
过公用访问方法通信的安全保障和障碍物,另一个原因是各个Peer所支持的协议是不同
的,一些Peer可能使用TCP,另一些可能使用HTTP。在无线情况下,我们需要使用无线应
用协议(WAP),网关尽可能多地支持这些协议,因此它可以作为不同类型协议间的中介,
JXTA目前支持TCP和HTTP,不过对其他协议的支持正在开发中。

    在因特网上网关是与大多数安全机制交互的关键,防火墙、代理服务器和NAT设备是
主要的安全屏障。

    Peer1
          *   TCP管道
因特网       *
               网关对等机2
                          * 
防火墙或NAT的边界            *
——————————–*————————
    局域网                         *            HTTP管道
                                      *
                                       Peer3
                              
                 图3 通过网关对等机进行Peer间的通信

图3说明网关Peer2是怎样作为Peer1和Peer3之间的交互接口的。网关将从Peer1来的TCP
消息转换成HTTP消息传递给Peer3。当消息从Peer1发出时,是通过TCP发往网关Peer2,
网关Peer2存储了这个消息,直到Peer3向它发出获得消息的HTTP请求。
 
 三、JXTA协议
 
 
有六个协议构成了JXTA的核心,JXTA通过这六个协议来完成Peer之间的通信,彼此之间
的资源的发布和发现,信息的传递和路由,协议本身并不是应用程序,需要添加更多的
代码来开发有用的应用,协议隐藏了很多细节,这样使得编写JXTA应用程序比从空白开
发P2P应用要容易得多。

    JXTA在JXTA协议规范中定义了它的协议。此规范描述了Peer间如何通信和交互,它
并未描述实现的细节或如何编写P2P应用程序,下面是JXTA协议的列表,其中包含了协议
名称的首字母缩略词,这六个协议如图4所示。

      Peer Discovery             Pipe Binding             Peer Information
        Protocol                   Protocol   

                            Peer Resolver Protocol

                    Peer Endpoint           Rendezvous
                      Protocol               Protocol

                              图4 JXTA的核心协议 

    1、对等机发现协议Peer Discovery Protocol(PDP):主要用来发布自己的广告信
息,并且从其他Peer处获得广告。PDP允许一个Peer发现其他Peer的广告(包括Peer广
告、对等组广告、服务广告,或者是管道广告)。该协议通过指定一种广告类型(如
Peer、对等组)、一个XML标签名、一个匹配这个XML标签所表示数据的字符串来定义查
询。它使用Peer Resolver Protocol来发送和传播搜索广告的请求。

    2、管道绑定协议Pipe Binding Protocol(PBP):允许Peer之间建立虚拟的通信通
道。

该协议首要关注的是通过Peer端点路由协议提供的路由连接Peer。它使用Peer 
Resolver  Protocol来发送和传播搜索广告的请求。

    3、对等机信息协议Peer Information Protocol(PIP):用来获得其他Peer的状态信
息,包括更新时间、状态等等。该协议有时被用做ping命令,有时被用来获得一个Peer
的基本状态信息,PIP消息的正文是自由格式的,它允许询问特定的Peer信息。此外,这
种能力可以被扩展以提供控制能力,它使用Peer Resolver Protocol来发送和传播搜索
广告的请求。

    4、对等机解析协议Peer Resolver Protocol(PRP):允许Peer发送更一般的请求,
并可以接收到该请求的回应;同时可以将请求分发到组内的一个或者多个匹配的处理
器,Peer解析协议是一个基础通信协议,它按照一种请求/响应格式来进行,要使用这个
协议,需要提供一个查询的Peer和一个包含能被目标Peer理解的XML请求消息,该协议被
用来支持JXTA中的其他协议(PDP、PBP和PIP),而且允许传播查询,例如,如果一个Peer
收到一个查询并且不知道答案,解析协议就会将该查询发送给别的Peer。

    5、端点路由协议Peer Endpoint Protocol(PEP):通过该协议Peer以发送消息的形
式获得一条路由路径。它使用Peer间的网关来建立一条包含一个或多个适合建立管道的
管道协议组成的通路。管道绑定协议借助此Peer列表来建立Peer间的路由。一般情况下
传统的路由器和DNS服务器会因为防火墙、代理服务器和NAT设备等原因而无法建立连
接,而端点路由协议通过寻找网关来穿越诸如防火墙等障碍来建立连接。端点路由协议
还可以同时帮助相互不支持对方使用协议的Peer进行通信。例如,如果你连接支持TCP的
Peer-A和只支持HTTP的Peer-B,端点路由协议既可以选择一个可以支持此传输的网关,
又可以选择多个并且相互协议兼容的一组网关。

    6、集合点协议Rendezvous Protocol(RVP):通过该协议Peer可以对一个服务订阅或
者被订阅。集合点协议负责在JXTA对等组内传播消息,它为Peer在组内接收和发送消息
并且控制消息如何传播定义了一个基本的协议。

    从编写P2P应用程序的角度而言,可以简单地划分上述协议的主要用途:

Peer Discovery—-搜索资源
Peer Resolver—-一般查询服务
Peer Information—-监控
Pipe Binding—-可寻址的消息传递
Rendezvous—-消息传播
PeerEndpoint—-路由

四、JXTA的应用与发展
 
 
一)JXTA的应用

1、即时通信和文件共享(myJXTA)

myJXTA是在J2SE平台上的一个JXTA演示程序,主要为展示JXTA项目和P2P的一些概念,它
提供了一些功能,诸如安全的一对一的交谈、组内的交谈、组内文档的共享、搜索和下
载等。myJXTA使用JXTA平台的核心服务,完成发现组、加入组和创建组的功能;还有在
两个Peer 间创建连接,完成一对一的交谈;或者在组内建立连接,完成组内的交谈以及
组内文件的搜索和下载。该程序的主要目的是未了展示基于JXTA协议的P2P的工作方式。

2、网络游戏(Chess)

    JXTA技术已在许多游戏应用方面得到了展示,一个互动式的国际象棋比赛的应用程
序使用JXTA来传递两个棋手间的对奕过程,并将它展现给观众,国际象棋游戏和“tic-
tac-toe"游戏都可以用来展示JXTA在小型设备上的应用,一个游戏者可以创建一个新的
JXTAPeer组并邀请全世界其他游戏者加入他的游戏,当然也可以限制他人进入他的游戏
组。

3、协同工作

JXTA技术已经展示它在协同工作应用程序中的能力。用JXTA开发出来的集成开发环境可
以允许一个以上的开发者同时开发一个软件程序;另外一个协作式的JXTA应用程序允许
几个人同时编辑同一个电子数据表。其他JXTA项目中开发的合作开发工具包则利用了
JXTA进行会话、共享浏览和文件共享。

    由于具有通话功能,JXTA技术在合作开发中拥有这样一个优点:一个应用程序的开
发不需依赖于服务器或其他中央管理系统。JXTA处理新发现的节点,并保证路线通畅,
在用户和交互式应用程序间交换消息。

4、聊天程序

JXTA非常适合编写聊天程序,而且可以有多种实现方法,包括完全的集中式、代理方式
到完全非集中式。而且一个非常有意思的情况是,用JXTA来实现一个集中式的聊天程序
非常困难,而实现完全非集中式的聊天程序反而简单,因为JXTA平台本身已经完全解决
了底层Peer之间的发现和通信问题。在现有的JXTA项目中已经有许多聊天程序的例子,
包括myJXTA应用程序(原先称为InstantP2P)、JXTA shell中的Talk命令、HotWire应用程
序和其他几个编程指南。

5、JXTA 社区

JXTA是一个开放源代码的项目,它是由JXTA社区http://www.jxta.org在推动发展。在这
个站点上可以获取最新的JXTA文档和程序代码,而且你可以注册并加入到正在进行中的
JXTA项目,参与并推动项目的进展;这些项目分类存放,为用户展示了JXTA各方面的功
能;此外,站点上还有邮件列表,都是JXTA开发人员和P2P参与者就感兴趣的问题的讨
论。

二)JXTA的发展

1、各种语言的实现

目前JXTA只有Java的实现版本,以至于大家谈到JXTA都认为它是用Java开发的一套P2P框
架,而忽略了JXTA的实质只是一套独立于各种平台和语言的协议。因此在各种语言上实
现JXTA成为一项非常重要的工作。只有这样,因特网上的用各种各样语言实现的应用软
件就可以只需改写网络部分的代码而转换到JXTA平台上来。这不但大大地节省了工作
量,而且将会吸引大量因为各种原因无法采用Java语言的软件加入到JXTA中来,从而大
大促进JXTA协议的发展。现在正在进行的其他语言的实现有C,Perl,Python,
Smalltalk等等,显然这还远远不够,也许我们将来需要看到用Pascal,VB,C#实现的版
本。

2、各种平台的实现

跨平台,这是Java已经实现了的目标,但是并不表示JXTA就无事可做,一个真正的P2P网
络不仅仅是包括PC这个大家目前已经熟悉的设备,它还应该包含各种现在以及将来能够
连到因特网上的设备。头一个目标显然是PDA和手机这种移动设备,JXTA for J2ME以及
PocketJxta都已经在进行中,而且已经可以使用;但是,我们还要考虑到将来的各种设
备,这其中主要是各种各样的嵌人式设备。如果这些设备都运行JXTA平台,那么我们将
看到一个真正的P2P世界。

3、各种应用

有好的应用,一个平台是不可能流行起来的。目前在jxta.org上登记的应用开发项目有
多个,相比现实世界中的各种网络软件的数目,这个数字实在是很小。目前的JXTA应用
主要集中在即时通信和文件共享上面,这似乎成了P2P的代名词。但是如果只局限于这些
应用,JXTA的应用范围将会很有限。

4、Service

Service在JXTA中扮演着极其重要的角色,所有JXTA协议的实现都是以Service的形式存
在着的。除了几个核心服务外,目前JXTA上有多个关于Service的项目正在开展着,从某
种程度上来说,Service比Application更重要;如果没有好的Service,也就产生不了多
少好的应用,在这些进行中的Service中,Search是其中关键的环节,在没有中心服务器
的P2P网络中,如何有效地进行查找成为一个关键问题,与此同时,还需做到尽可能地减
少占用的带宽。

作者:务实,多年从事J2EE网站及应用系统项目的开发和应用。

作者:吴枫 李世… 文章来源:微软亚洲研究院网络多媒体组

一、 流媒体系统及其发展趋势

  所谓流媒体是指用户通过网络或者特定数字信道边下载边播放多媒体数据的一种工作方式。流媒体应用的一个最大的好处是用户不需要花费很长时间将多媒体数据全部下载到本地后才能播放,而仅需将起始几秒的数据先下载到本地的缓冲区中就可以开始播放,后面收到的数据会源源不断输入到该缓冲区,从而维持播放的连续性,因此流媒体播放器通常只是在开始时有一些时延。流媒体系统要比下载播放系统复杂得多,所以需要将多媒体的编解码和传输技术很好地结合在一起,才能确保用户在复杂的网络环境下也能得到较稳定的播放质量。

  多媒体数据在传输前必须要先经过编码器有效地压缩成码流,以减少对网络资源的占用率。目前常用的视频编码器有MPEG-2、MPEG-4、H.261、H.263、H.264、Window
Media视频编码器和Real System视频编码器等;音频编码器有MP3、MPEG AAC、Window Media
音频编码器和AMR等;图像编码器有JPEG和JPEG2000等。多媒体编码器所生成的码流只包含了解码该码流所必需的信息,它不包含媒体间的同步、随机访问等系统信息,因此编码后的多媒体数据还要被组织成为具有特定系统格式的多媒体文件用于流媒体传输或者是存入磁盘中,目前常用的文件格式有MPEG-2系统,MP4,微软公司的ASF,Real的文件格式,QuickTime的文件格式以及用于3G无线服务的3GPP和3GPP2等等。

  当流媒体在实时应用中(如现场流媒体广播),根据当前的网络状况和用户的终端参数,多媒体数据是一边被编码一边被流媒体服务器传输给用户。而在其他的非实时应用中,多媒体数据可以被事先编码生成多媒体文件,存储在磁盘阵列中。当提供多媒体服务时,流媒体服务器直接读取这些文件传输给用户,这样服务方式对设备的要求较低。目前许多流媒体服务属于后一种方式,这样就要求流媒体服务器具有一定的机制来适应网络状况和用户设备。

  目前码流自适应这一模块主要采用的方法有:将多媒体文件中的视频码流转换为一个特定码率和图像尺寸的码流;或者把同一段视频内容编码生成多个具有不同码率和图像尺寸的码流,然后自适应选择一个最合适的码流传输给用户。生成的码流还需要进一步打包成为特定网络传输协议的数据包用于网络传输,由于现在许多网络并不能保证传输的数据能够及时并完全正确地被用户收到,传输的数据包可能需要加前向纠错编码(FEC)来保护,经过这些处理后多媒体数据就可以通过网络传输给用户,目前常用的传输协议有RTP/RTCP、HTTP和MMS。

  用户收到传输的数据后,如果存在丢包或者是比特出错,错误恢复处理会根据附加的纠错数据来恢复传输错误。如果还不能恢复传输错误,用户端可以向服务器发出重传请求,在解码开始前重新传输丢失的包。恢复后的多媒体数据将由解码器解码得到重构的多媒体数据,由于容错保护和数据重传可能不能恢复所有的错误数据,错误掩藏模块可以利用重构的多媒体数据的相关性来掩盖这些错误,最后这些数据就播放给用户。

  通常流媒体系统中的服务器和用户间并不是单向通信,如前面提到的重传请求。事实上,用户端会传递给服务器许多反馈信息,如终端设备的能力和网络连接速度会传给服务器的码流自适应模块来调整码流,在实时应用中这些信息还可能传给编码器;用户端的丢包率、数据包收到的时间信息和用户缓冲区状态等信息也会传递给服务器来估计当前的网络状况,从而控制码流的自适应和数据的发送策略。从上面的描述来看,实际上流媒体系统在多媒体信息处理中是一个非常复杂的系统,目前市面上主要的产品有微软公司的Windows
Media, Real公司的Real System和苹果公司的QuickTime,其中Windows Media系统的市场占有率最大。

  这篇文章主要集中讨论流媒体的发展趋势和出现的新的服务和技术。早期的流媒体系统常用在互联网上传输一些低质量的多媒体信息,但是随着网络技术的发展,一些高质量的流媒体应用已经开始出现,如IPTV将向用户传输标清甚至高清的电视节目。另外,随着无线网络和各种各样手持设备的出现,无线流媒体的应用也变得越来越重要。并且由于很多现代家庭中既有高端的PC和电视,又有多种功能的手机,PDA,便携式媒体播放器,流媒体也将在家庭娱乐和数据共享上一显身手。针对这些应用的需求,流媒体技术本身也在迅速地变革和发展,例如利用一些高效的编码技术和传输技术提高流媒体系统性能;发展新的标准扩展流媒体技术到各种不同的网络和设备;在流媒体系统中增加更多的新功能来满足应用的需要。

  二、 流媒体新服务
  本章将讨论流媒体系统的一些新的应用和服务。
  1. IPTV

  据国际电信联盟ITU在2004年9月的一份报告指出,全球的宽带用户已经在去年底首度突破
1亿大关,其中中国电信的宽带用户就超过了1千万,用户的主要接入方式是ADSL和以太网线,其实际的连接速率可以达到1Mbit/s。而且随着高性能的编码技术的采用,如H.264和最新的Windows
Media视频编码器,800kbit/s的视频流就可以接近或达到DVD质量。

  在这种情况下,扩展流媒体技术用来提供电视服务也就顺理成章了。IPTV,也叫交互式网络电视,就是利用流媒体技术通过宽带网络传输数字电视信号给用户,这种应用有效地将电视、电讯和PC三个领域结合在一起,具有很强的发展前景。IPTV可以采用两种不同的方式提供用户电视服务,组播或者广播方式和视频点播(VOD)方式。一个明显的优势是IPTV是基于现在互联网的方式来实现服务器和用户终端的连接,因此很容易同时提供现有的互联网的服务,将电视服务和互联网浏览,电子邮件,以及多种在线信息咨询、娱乐、教育及商务功能结合在一起。

  2. 无线流媒体
  2.5G、3G以及超3G无线网络的发展也使得流媒体技术可以被用到无线终端设备上,目前中国联通公司提供CDMA
1x,用户网络带宽最多可以达到100kbit/s,这已经足够提供QCIF大小的流媒体服务;而且随着3G无线网络的应用,用户的网络带宽可以达到384kbit/s。另一方面,手机设备运算能力越来越强,存储空间越来越大,不用说SMART
Phone和Pocket PC等高端手机,就是一般的中档手机,如Nokia 6610,也能实现基本的H.264的软件解码。

  面向无线网络的流媒体应用对当前的编码和传输技术提出了更大的挑战,首先,相对于有线网络而言,无线网络状况更不稳定,除去网络流量所造成的传输速率的波动外,手持设备的移动速度和所在位置也会严重地影响到传输速率,因此高效的可自适应的编码技术至关重要。其次,无线信道的环境也要比有线信道恶劣的多,数据的误码率也要高许多,而高压缩的码流对传输错误非常敏感,还会造成错误向后面的图像扩散,因此无线流媒体在信源和信道编码上需要很好的容错技术。尽管手机设备的运算能力越来越强,但是由于它是由电池供电的,因此编解码处理不能太复杂,并且最好能够根据用户设备的电池来调整流媒体的接收和处理,能源管理技术也是移动流媒体的一个研究热点。

  3. 电子家庭

  现代家庭中的越来越多的设备可以用来采集,接收,发送和播放多媒体数据。如人们可以通过电视来收看电视节目,通过PC机在互联网上欣赏流媒体节目,通过自己的数字相机和摄像机来拍摄图像和视频,通过手机和其他手持设备来发送彩信,通过汽车的音响系统来欣赏音乐和广播。并且家庭中的网络连接也是多样化的,如电视连接有线电视网,PC机连接着互联网,手机连接着无线网络,而且这些设备也能在家里通过蓝牙或者802.11无线网连接在一起。

  所有这些设备所收到的多媒体数据如何在家庭网络和设备间共享,为流媒体的发展提供了一个更大的舞台,真正实现一种无所不在、随心所至的多媒体服务,让多媒体真正地像液体一样自由流动起来。流媒体在家庭网络应用中的关键是如何使多媒体数据能够适应不同的设备的能力,如在电视和PC机中播放的视频的大小可能是标清甚至是高清,但是同样的内容就可能需要经过流媒体系统有效的转换才能成为最适合在手持设备上播放的媒体。
三、 流媒体新技术

  这章我们将讨论高效的视频编码、可伸缩的视频编码和P2P技术,它们都能极大地改进当前流媒体系统的性能。


  1. 高效的编码技术


  流媒体系统中的多媒体数据要通过网络来传输给用户,高效的编码技术可以极大地降低流媒体系统对网络带宽的要求。目前标准化和商业化的视频编码技术都是基于运动补偿和DCT变换的,从早期的MPEG-1和H.261,到最新的MPEG-4
AVC/H.264和Windows
Media视频编码器都采用了这个框架。在这个框架中,运动估计和补偿模块用来消除相邻图像间的冗余信息,熵编码模块用来消除编码信号的冗余性,变换量化模块根据人的视觉系统对视频信号的细微变化的不敏感性丢失部分信息,从而提高压缩比。


  在这个编码框架下,过去十多年的时间内编码技术取得了很大的发展,事实上,最新MPEG-4
AVC/H.264标准的编码效率要比MPEG-1提高了4倍左右,除去更精细的运动补偿和基于上下文的熵编码外,帧内预测,多参考帧的预测,环路滤波和率失真优化技术也极大地提高了该标准的性能。


  2. 可伸缩性编码技术


  在前面两章中我们也讨论过,在流媒体应用中需要解决的一个基本问题是网络带宽的波动,不同的人在不同的时刻使用互联网和无线网络时,得到的数据传输率存在着很大的差异;甚至同一个人在同一个时刻,哪怕是在传输同一个视频流,实际的数据传输率也会存在较大的波动。目前在流媒体系统中所用的编码技术都是生成固定码率的码流,它们很难适应如此复杂的网络带宽的波动。一个有效的方法是采用可伸缩性的视频编码,MPEG-4和H.263标准中就包含了分层的可伸缩性的视频编码,它们提供一定的适应网络带宽变化的能力,但是在流媒体应用中人们更期望视频编码技术能提供精细的码流可伸缩性,MPEG-4
FGS就是一种这样的编码技术,目前MPEG-21可伸缩视频编码组正在研究两套编码方案:高效的FGS编码方案和3D小波编码方案。

  3.
多媒体标准技术


  多媒体编码标准在流媒体里是至关重要的。一方面标准的制定和执行确保不同厂家和服务商之间可以互通互联,另一方面标准里的知识产权也是商家必争之处。掌握了标准里的知识产权,在竞争的时候就有很大的主动权。所以很多商家乃至政府部门都在全力推出自己的知识产权到各种国际标准里去,甚至打造自己的产业或国家标准。


  4. 对等网络技术(P2P)


  P2P是当前互联网上较热门的技术,已应用到网络文件共享和Napster的MP3下载。其基本思想是通过P2P技术,除了和服务器外,每个用户可以共享他的文件或信息给其他用户。


  P2P技术也可以应用到流媒体,每个流媒体用户也是一个P2P中的一个节点,在目前的流媒体系统中用户之间是没有任何联系的,但是采用P2P技术后,用户可以根据他们的网络状态和设备能力与一个或几个用户建立连接来分享数据,这种连接能减少服务器的负担和提高每个用户的视频质量。P2P技术在流媒体应用中特别适用于一些热门事件,即使是大量的用户同时访问流媒体服务器,也不会造成服务器因负载过重而瘫痪。此外,对于多人的多媒体实时通信,P2P技术也会对网络状况和音视频质量带来很大改进。


  P2P技术如果与可伸缩性视频编码技术结合将能极大地提高每个用户所接收的视频质量。由于可伸缩性码流的可加性,媒体数据不用全部传输给每个用户,而是把它们分散传输给每个用户,再通过用户间的连接,每个用户就可以得到合在一起的媒体数据。即使每个用户与服务器的连接带宽是有限的,应用P2P技术,每个用户依然可以通过流媒体系统享受高质量的多媒体服务。


  四、结束语


  流媒体的发展正处在一个酝酿着突变的阶段。无论从应用、服务和技术,都将会产生一系列重大的突破。在流媒体的领域里,重点不应是只放在几个孤立的关键技术上,而是应该把流媒体当作一个系统工程,编码、传输、分享、网络以及设备都是互相联系的一个整体。怎么能在这样一个系统里,最有效地将流媒体以一种最适合用户终端设备的形式传送给用户,并且不增加服务器和网络负担,可能是能否在流媒体领域的竞争中立于不败之地的根本。

2006年03月16日

P2P流媒体网络的异构问题    转自 龙门客栈
                            David.Zhu    2006/1/3
1.P2P传输网络中的守恒定律
   为方便下面的描述,我们首先引入一些记号:
   N                              :   参与P2P网络的在线总人数
   Media_BitRate          :   流媒体的码流(单位:Kbps)
   Source_UpBandwith :   媒体源的上行带宽
   Peer_AvrUpBandwith:  普通节点的上行带宽
   Control Bandwidth    :  两节点间的控制带宽
   r                                :  数据冗余率
   根据总输入等于总输出,我们有如下的等式:
   Source_UpBandwith+N*(Peer_AvrUpBandwith)=N*(1+r)*Media_BitRate
  对于Source_UpBandwith和Media_BitRate一般会根据应用的需要有所限制,
  这里我们做如下假设:Source_UpBandwith=5Mbps=5120Kbps
                     Media_BitRate=450Kbps
                     r=2%
 
2.目前的网络状况及给P2P带来的挑战
    这里我们考虑的对象主要是ADSL接入用户,国内不同ISP提供的ADSL是不同的,
  一般是512Kbps的上行带宽,1Mbps的下行带宽,但实际可用的上行大约为350Kbps,
  下行大约为700Kbps左右,但有些接入带宽可能好些有些也可能比这个更糟糕。
   如果考虑上行为350Kbps的接入,那么基本上一个5M的媒体源只可能支持22个左右的
   节点,同时,上行带宽中还有一部分用于控制负荷,且350Kbps也只是可用的最大带宽,
   所以异构网络给P2P流媒体网络的扩展性带来的极大的挑战,而在同构网络例如教育网
   和局域网中就不会有这个问题,其上行带宽一般可以大于600Kbps,所以其支持的节点
   数量从理论上来说是无穷大的。

3.解决途径
    为解决上述问题有两个途径:增大源的带宽,通过类似CDN的网络来扩大源的带宽,但
  这个方法代价很高,且只能有限地增大网络容量,并不能保证容量达到1万,10万级的规模。
     另外一个解决的办法就是依靠网络的异构来解决其自身带来的问题,但这个解决只能有
  一个概率的质量保证,没有一个可靠的保证,无法用于高稳定的商用。

ACE是个很有用的开放源代码的C++网络编程开发包,利用它比直接用API更有利于代码的健壮性,可移植性,并相对简单。
估计大家刚接触ACE时,都有一定难度,说不定就半途放弃了,这是我学ACE两天中的总结,基本上不成文,但我想研究到ACE的你一定会明白下文的意思。

我的系统环境是:Win2k pro(sp4)、VC6.0 (sp5)

过一阵,我的主页上要开论坛,并设VC专区,欢迎大家上去交流
http://www.liufei.com


一、ACE官方主页:http://www.cs.wustl.edu/~schmidt/ACE.html
    下载地址:http://deuce.doc.wustl.edu/Download.html
   
    我下载的是Latest Beta Kit中的ACE.zip(Latest Release中的压缩包好像有问题,我有WinRAR3.30解压缩报错)

二、解压缩后放在D盘
    D:\ACE_wrappers

三、在D:\ACE_wrappers\ace目录下新建文件config.h加入一行
    #include ace/config-win32.h
   
四、编译:用VC6.0打开D:\ACE_wrappers\ace\ace.dsw
    左侧显示    ACE DLL classes
               ACE LIB classes
    或1、从菜单上选择“编译”,“放置可远行配置”,选择你需要的工程配置
        “编译”,“重建全部”(或任一,如ACE DLL – Win32 MFC Debug)
        此过程可能持续半小时至一个小时不等
    或2、从菜单上选择“编译”,“批构建”,选择你需要的工程配置
        此过程可能持续二至四个钟头
       
    产生的.lib文件位于D:\ACE_wrappers\ace\下,
    产生的.dll文件位于D:\ACE_wrappers\bin\下
   
   
    同样打开ace_static.dsw
    编译
    ACEs.lib
    ACEsd.lib
    ACE_RMCasts.lib
    ACE_RMCastsd.lib
    TMCasts.lib
    TMCastsd.lib

    ACE生成的dll和lib文件的命名规则:(d = debug,s = static)

    debug – aced.lib、debug+static – acesd.lib、release – ace.lib、 release+static – aces.lib


五、样例程序的编译
    用VC打开D:\ACE_wrappers\tests\tests.dsw
    “编译”,“批构建”
   
六、自写程序的工程配置
   
    中篇:ACE程序员教程.pdf中的样例程序:
    网址:http://www.cs.wustl.edu/~schmidt/ACE_wrappers/docs/tutorials/guide-tutorials.html
   
    将网页上的原代码复制到一新建文件,并命名为server.cpp
    用VC打开,编译,重建全部,弹出对话框,“This build command require …“,点”是“
   
    会出现以下错误
   
    如果有“Cannot open include file: ace/SOCK_Acceptor.h: No such file or directory”
    工程-设置-C/C++: Preprocessor,附加包含路径:D:/ACE_wrappers
   
    如果有“ You must link against multi-threaded libraries when using ACE (check your project settings)”
    工程-设置-C/C++: Code Generation – Use run-time library : Debug Multithreaded Dll
   
    如果有“error C2065: ACE_ERROR : undeclared identifier”
            error C2065: ACE_DEBUG : undeclared identifier
    #include ace/Log_Msg.h

    error C4716: ace_main_i : must return a value
        在main中加入
            return 0;
   
    “error LNK2001: unresolved external symbol __declspec(dllimport) int __cdecl”
    工程-设置-Link-Input: 对象/库模块:添加aced.lib                         附加库路径:D:\ACE_wrappers\ace
                       
   
                       
    编译client中遇到的问题
    1、error C2039: sprintf : is not a member of ACE_OS
       
        #include ace/OS_NS_stdio.h
       
    2、error C2039: strlen : is not a member of ACE_OS
   
        #include ace/OS_NS_string.h
    3、error C2059: syntax error : ?
        错误在这一句:  ACE_DEBUG((LM_DEBUG,?Usage egX <hostname> <port_number>\n?));
        将?改为
       
    4、无法找到动态链接库aced.dll于指定的路径
        为系统变量PATH加上D:\ACE_wrappers\bin
       
       
       
    静态包含:
       工程-设置-C/C++-预处理程序定义中加入 ,ACE_AS_STATIC_LIBS
      
      
例1server编译后生成
    server.exe 16K  serverd.exe 97K     servers.exe 124K serversd.exe 669K
    (servers.exe较适合发布)
   
例2 client编译后生成
    client.exe 16K  clientd.exe 97K     clients.exe 124K clientsd.exe 669K
   (clients.exe较适合发布)
   
    测试 clients 127.0.0.1 1919
        servers 1919

http://www.cublog.cn/u/3553/showart.php?id=54676

ACE接受器模式下客户端连接退出的处理

如果在Windows环境下利用MFC中CAsynSocket的recv函数返回是否0可以及时知道客户端连接情况 .

利用ACE接受器模式构造通信服务器时,由于控制反展的特性,在客户端,断线,客户端当机等非正常断开情况下,ACE_Svc_Handle的handle_input()函数不会被回调,从而无法触发handle_close()函数的的调用,多线程环境下造成了内存泄露,同时服务端也无法实时知道客户端连线情况.

经几个朋友研究,采用了如下解决方法:

一:双向通信

则只需要判断send_n()函数返回值,windows下0,Unix下SIGPIPE信号(-1).捕捉这两个信号,处理为return -1,从而触发handle_close()函数的调用实现和正常退出时候一致的清理工作

很奇怪的是为何ACE没有将这两个错误返回信号定义成为一个宏?

二:单向通信

1、心跳协议处理,客户端定时向服务器发送心跳协议,服务器可在输入事件登记最后一次接受数据的时间。

2、然后向reactor登记一个定时器,应用里保存该句柄最后一次成功接受数据的时间,定时器返回时,判断当前时间和最后一次成功的时间是否超过规定的时间,如果超过,服务器认为对端已经掉线了,直接close掉该句柄。由于极端情况的存在,例如定时间隔内多次连接退出的情况,所以需要将句柄和时间对应起来记录才能确保程序健壮性

3. 加入单向通信中的处理,尤其是SIGPIPE,否则UNIX默认将进程退出

感谢huihoo的

http://www.cublog.cn/u/3553/showart.php?id=53243

ACE_Reactor实现原理,因这边文章把复杂的东西说简单了,很喜欢这种风格,就把它贴上来了,对于新学者其实也很有研究价值

复杂的东西归于简单化思考,其实是很好理解的

来源:宇星软件园     

大半年前买了本ACEC++NPv2,翻了一下感觉满篇理论概念,没有看下去,然后这半年继续实现了些网络程序,前几天再次捧起这本书,先用两天时间囫囵吞枣、一目十行的粗览了一遍,结合自己之前的网络编程经验,感觉到一些共鸣,又再慢慢的进行仔细的阅读,写下自己的阅读体会。

()主要针对ACE_Reactor(反应器、反应堆)

首先,先介绍一下我项目中自己写的一个网络编程库,对比一下,可以很好理解这个ACE_Reactor

我的这个库,代码主要跨Linux/Win32平台,因为没有需要,没在其他平台测试过。这个库没有涉及UI部分,只是用来编写服务器端,或者Linux/Win32的控制台程序。先拿两个类来对比ACE_Reactor

// 回调函数
typedef void (*pfn_sock_event_t)(socket_t* sock, int err, void* param);

// 非阻塞式 socket
class socket_t
{
public:

    …

    // 创建时,加到 socket_manager_t 管理
    bool create(…)
    {
        …
        socket_manager_t::add(this, …);
    }
   
    // attach
时,加到 socket_manager_t 管理
    bool attach(SOCKET s, …)
    {
        …
        socket_manager_t::add(this, …);
    }
   
    //
关闭时从 socket_manager_t 移除
    void close()
    {
        …
        socket_manager_t::remove(this, …);
    }
   
    //
设置回调函数
    void set_callback(
            pfn_sock_event_t on_recv = 0,
            pfn_sock_event_t on_send = 0,
            pfn_sock_event_t on_accept = 0,
            pfn_sock_event_t on_close = 0,
            pfn_sock_event_t on_connect = 0,
            pfn_sock_event_t on_except = 0
            );
    …
   
protected:
    SOCKET m_sock;
   
    pfn_sock_event_t m_on_recv,
    pfn_sock_event_t m_on_send,
    pfn_sock_event_t m_on_accept,
    pfn_sock_event_t m_on_close,
    pfn_sock_event_t m_on_connect,
    pfn_sock_event_t m_on_except
    …
};

// socket_manager_t
//
拥有一个 sockets 数组或列表,统一一次性进行 select()
class socket_manager_t
{
public:
    …

    static void add(socket_t* s, …)
    {
        //
加入到 m_socks
    }
   
    static void remove(socket_t* s, …)
    {
        //
m_socks 移除
    }
   
    //
一次性对 m_socks 中所有的 socket 进行 select()
    static void poll()
    {
        int sck_cnt = m_socks.size();
        …
       
        for (i = 0; i < (sck – 1) / FD_SETSIZE + 1; ++i)
        {
            for (j = 0 ;j < FD_SETSIZE; ++j)
            {
                socket_t* sck = m_socks[idx];
               
                if (…) FD_SET(sck->m_sock, fdWrite, …);
                if (…) FD_SET(sck->m_sock, fdRead, …);
               
                …
            }
           
            if (select(…) <= 0) continue;
           
            for (j = 0 ;j < FD_SETSIZE; ++j)
            {
                socket_t* sck = m_socks[idx];
               
                if (FD_ISSET(sck->m_sock, …), …)
                     if (sck->m_on_connect) sck->m_on_connect(sck, …);
               
                if (FD_ISSET(sck->m_sock, …), …)
                     if (sck->m_on_close) sck->m_on_close(sck, …);
               
                if (FD_ISSET(sck->m_sock, …), …)
                     if (sck->m_on_accept) sck->m_on_accept(sck, …);
               
                if (FD_ISSET(sck->m_sock, …), …)
                     if (sck->m_on_recv) sck->m_on_recv(sck, …);
               
                if (FD_ISSET(sck->m_sock, …), …)
                     if (sck->m_on_send) sck->m_on_send(sck, …);
               
                …
            }
        }
        …
    }
   
    …
   
protected:
    …

    vector<socket_t*> m_socks; 
};

最后,在 main() 中,或者一个独立的线程中,循环执行 socket_manager_t::poll()

void main()
{
   …
  
   while (!dead_event)
   {
        …
        socket_manager_t::poll();
        …
   }
  
   …
}

简单解说一下:
socket_t::create()
或者 socket_t::attach() 时登记自己到 socket_manager_t 中,由 socket_manager_t::poll()对所有的socket进行select(),触发及分派socket_t::on_recv()/socket_t::on_send()/socket_t::on_accept()等事件。

好,开始涉及ACE_Reactor

功能上,可以等价的认为,上面的 socket_manager_t 就类似是 ACE_Rector,主要作用就是事件触发中心、事件反应器、事件监控器、事件分派器等。

就像上面的 socket 一样,各种 ACE_Event_Handler 及其派生物类,都像 socket_t::create()那样,有个向触发中心登记本身的动作,对于 ACE_Event_Handler 来说,是由程序员明显的调用 ACE_Rector register(…),而 ACE_Event_Handler 本身就有 handle_input()/handle_output() 等虚拟函数,作为回调调用,就像上面的 socket_t::on_recv/socket_t::on_send… 一样。加入到 ACE_Rector 中的各种 ACE_Event_Handler,由 ACE_Rector 调用其他的事件查询/监听方式进行统一监控(比如 socket select()Win32 特有的 WSAEventSelect() ),当有事件在 ACE_Event_Handler 上发生时,调用它的 handle_input()/handle_output()等虚拟函数。

ACE_Event_Handler 进行 ACE_Rector::register() 时,指定 READ_MASK/WRITE_MASK 等自己感兴趣的事件,handle_input()等回调被调用时返回适当的值,以指示 ACE_Rector 取消或继续监控自己。

至于 ACE_Event_Handler 还有个 handle_except() 的虚拟回调函数,跟 socket_t::on_except() 差不多。

ACE_Event_Handler 还有个 handle_timeout() 的虚拟回调,讲解一下。在我的程序中,曾经做过一个


//
回调函数
typedef void (*pfn_timer_event_t)(timer_t* tm, void* param);

class timer_t 
{
   …
  
   timer_t(pfn_timer_event_t pfn, void* param, uint32 timeout_usecs)
   {
     m_start_tick = util_t::sys_tick();
        timer_manager_t::add(this);
        …
   }
  
   bool is_timeout(uint32 cur_tick)
   {
        return (cur_tick – m_start_tick >= m_timeout_usecs);
   }
  
   void process()
   {
     if (m_pfn) m_pfn(this, m_param);
   }
 
 protected; 
   pfn_timer_event_t m_pfn;
   void* m_param;
   uint32 m_start_tick;
   uint32 m_timeout_usecs;
};

class timer_manager_t
{
    …
   
    void add(timer_t* tm)
    {
        //
加入到 m_timers
        …
    }
   
    void poll()
    {
        uint32 cur_tick = util_t::sys_tick();
       
        for (int i = 0; i < m_timers.size(); ++i)
        {
            if (m_timers[i]->is_timeout(cur_tick))
            {
                //
超时,触发 timer_t 的事件
                m_timers[i]->process();
                …
            }
            …
        }
    }
   
   
    vector<timer_t> m_timers;
};

在上面的那个 main,或者一个线程中,比如

void main()
{
   …
  
   while (!dead_event)
   {
        …
        socket_manager_t::poll();
        timer_manager_t::poll();
        …
   }
  
   …
}

而现在,ACE_Reactor 只不过把这个 timer_manager_t 的功能一起集成进去而已。


最后声明一下,我还没具体看 ACE 的源代码,只是暂时从 <<ACEC++NPv2>> 的讲解上,字面上根据自己的经历大概理解一下 ACE_Reactor,如果有什么错误,后期再改正。本文不打算成为什么学术指南,只作为个人经验参考。

后面的 ACE_Server_Config/ACE_Module/ACE_Task 等等,我粗览过一遍,而我的一个网络服务器程序,前期只是个login server的模块,后期因为业务需要,增加了多种server接口,以及增加了多服务器支持等,扩充维护的经历使我更能体会ACE这些动态配置、模块合作的设计安排。如果有时间,我会再结合自己的经验教训,继续写下自己的心得体会。

小飞驴的网站 http://www.flyingdonkey.com/  马维达 C++网络编程 卷二 译者

http://www.flyingdonkey.com/cgi-bin/LB5000MX/leoboard.cgi

WeiZone 我们的社区 http://www.weizone.com/forumdisplay.php?fid=22&page=1 ACE网络通讯编程版

LoveUnix技术论坛 http://www.loveunix.com/viewthread.php?tid=29276

hxh(贺星河)的专栏  http://blog.csdn.net/hxhbluestar/category/25379.aspx  ACE网络编程

ACE自适配通信环境讨论 http://www.huihoo.org/chat/ace_20030702.html


[ACE技术论文集]一.ACE自适配通信环境:用于开发通信软件的面向对象网络编程工具包
ACE程序入口函数替换机制分析
[ACE技术论文集]二 包装外观(Wrapper Facade):用于在类中封装函数的结构型模式
精华帖标志
[ACE技术论文集]三 IPC SAP:用于高效、可移植和灵活的网络编程的C++包装
[ACE技术论文集]四 ACE轻量级OS并发机制的OO封装 
[ACE技术论文集]五 C/C++线程专有存储:用于访问“per-Thread”状态的对象行为模式 

ACE的类结构图[pdf文档]

ACE自适配通信环境

Douglas C. Schmidt


一、ACE综述

  ACE自适配通信环境(ADAPTIVE Communication Environment)是可以自由使用、开放源码的面向对象(OO)框架(Framework),在其中实现了许多用于并发通信软件的核心模式。ACE提供了一组丰富的可复用C++ Wrapper Facade(包装外观)和框架组件,可跨越多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态(重)配置、并发执行和同步,等等。

ACE的目标用户是高性能和实时通信服务和应用的开发者。它简化了使用进程间通信、事件多路分离、显式动态链接和并发的OO网络应用和服务的开发。此外,通过服务在运行时与应用的动态链接,ACE还使系统的配置和重配置得以自动化。

ACE正在进行持续的改进。Riverace公司(http://www.riverace.com)采用开放源码商业模式对ACE进行商业支持。此外,ACE开发组的许多成员目前正在进行The ACE ORB(TAO,http://www.cs.wustl.edu/~schmidt/TAO.html)的开发工作。

二、使用ACE的好处

使用ACE的好处有:

l       增强可移植性:在ACE组件的帮助下,很容易在一种OS平台上编写并发网络应用,然后快速地将它们移植到各种其他的OS平台上。而且,因为ACE是开放源码的自由软件,你无需担心被锁定在特定的操作系统平台或编译器上。

l       更好的软件质量:ACE的设计使用了许多可提高软件质量的关键模式,这些质量因素包括通信软件灵活性、可扩展性、可复用性和模块性。

l       更高的效率和可预测性:ACE经仔细设计,支持广泛的应用服务质量(QoS)需求,包括延迟敏感应用的低响应等待时间、高带宽应用的高性能,以及实时应用的可预测性。

l       更容易转换到标准的高级中间件:TAO使用了ACE提供的可复用组件和模式。它是CORBA的开发源码、遵循标准的实现,并为高性能和实时系统作了优化。为此,ACE和TAO被设计为能良好地协同工作,以提供全面的中间件解决方案。

三、ACE的结构和功能

下图显示了ACE中的关键组件以及它们的层次关系:



图中的结构和各层的组成部分描述如下。

四、ACE OS适配层

该层直接位于用C写成的本地OS API之上。它提供轻型的类POSIX OS适配层,将ACE中的其他层及组件和以下与OS API相关联的平台专有特性屏蔽开来:

l       并发和同步:ACE的适配层封装了用于多线程、多进程和同步的OS API。

l       进程间通信(IPC)和共享内存:ACE的适配层封装了用于本地和远地IPC、以及共享内存的OS API。

l       事件多路分离机制:ACE的适配层封装了用于对基于I/O、定时器、信号和同步的事件进行同步和异步多路分离的OS API。

l       显式动态链接:ACE的适配层封装了用于显式动态链接的OS API。显式动态链接允许在安装时或运行时对应用服务进行配置。

l       文件系统机制:ACE的适配层封装了用于操作文件和目录的OS文件系统API。

ACE OS适配层的可移植性使得ACE可运行在许多操作系统上。ACE已在广泛的OS平台上进行了移植和测试,包括Win32(也就是,在Intel和Alpha平台,使用MSVC++、Borland C++ Builder和IBM Visual Age的WinNT 3.5.x、4.x、2000、Win95/98和WinCE)、Mac OS X、大多数版本的UNIX(例如,SPARC和Intel上的Solaris 1.x和2.x、SGI IRIX 5.x和6.x、DG/UX、HP-UX 9.x、10.x和11.x、DEC/Compaq UNIX 3.x和4.x、AIX 3.x和4.x、UnixWare、SCO,以及可自由使用的UNIX实现,比如Debian Linux 2.x、RedHat Linux 5.2、6.x和7.x、FreeBSD和NetBSD)、实时操作系统(比如,LynxOS、VxWorks、Chorus ClassiX 4.0、QnX Neutrino、RTEMS和PSoS)、MVS OpenEdition和CRAY UNICOS。

由于ACE的OS适配层所提供的抽象,所有这些平台使用同一棵代码树。这样的设计极大地增强了ACE的可移植性和可维护性。此外,还有Java版本的ACE可用(http://www.cs.wustl.edu/~eea1/JACE.html)。

五、OS接口的C++ Wrapper Facade

可以直接在ACE OS适配层之上编写高度可移植的C++应用。但是,大多数ACE开发者使用的是上图中所示的C++ Wrapper Facade层。通过提供类型安全的C++接口(这些接口封装并增强本地的OS并发、通信、内存管理、事件多路分离、动态链接和文件系统API),ACE Wrapper Facade简化了应用的开发。应用可以通过有选择地继承、聚合和/或实例化下面的组件来组合和使用这些包装:

l       并发和同步组件:ACE对像互斥体和信号量这样的本地OS多线程和多进程机制进行抽象,以创建高级的OO并发抽象,像主动对象(Active Object)和多态期货(Polymorphic Future)。

l       IPC和文件系统组件:ACE C++包装对本地和/或远地IPC机制进行封装,比如socket、TLI、UNIX FIFO和STREAM管道,以及Win32命名管道。此外,ACE C++包装还封装了OS文件系统API。

l       内存管理组件:ACE内存管理组件为管理进程间共享内存和进程内堆内存的动态分配和释放提供了灵活和可扩展的抽象。

ACE C++包装提供了许多与ACE OS适配层一样的特性。但是,这些特性是采用C++类和对象、而不是独立的C函数来构造的。这样的OO包装有助于减少正确地学习和使用ACE所需的努力。

例如,C++的使用提高了应用的健壮性,因为C++包装是强类型的。所以,编译器可在编译时、而不是运行时检测类型系统违例。相反,不到运行时,不可能检测像socket或文件系统I/O这样的C一级OS API的类型系统违例。

ACE采用了许多技术来降低或消除额外的性能开销。例如,ACE大量地使用C++内联来消除额外的方法调用开销;这样的开销可由OS适配层和C++包装所提供的额外的类型安全和抽象层次带来。此外,对于性能要求很高的包装,比如socket和文件I/O的send/recv方法,ACE会避免使用虚函数。

六、框架

ACE还含有一个高级的网络编程框架,集成并增强了较低层次的C++ Wrapper Facade。该框架支持将并发分布式服务动态配置进应用。ACE的框架部分包含以下组件:

l       事件多路分离组件:ACE Reactor(反应器)和Proactor(前摄器)是可扩展的面向对象多路分离器,它们分派应用特有的处理器,以响应多种类型的基于I/O、定时器、信号和同步的事件。

l       服务初始化组件:ACE Acceptor(接受器)和Connector(连接器)组件分别使主动和被动的初始化任务与初始化一旦完成后通信服务所执行的应用特有的任务去耦合。

l       服务配置组件:ACE Service Configurator(服务配置器)支持应用的配置,这些应用的服务可在安装时和/或运行时动态装配。

l       分层的流组件:ACE Stream组件简化了像用户级协议栈这样的由分层服务组成的通信软件应用的开发。

l       ORB适配器组件:通过ORB适配器,ACE可以与单线程和多线程CORBA实现进行无缝集成。

ACE框架组件便利了通信软件的开发,它们无需修改、重编译、重链接,或频繁地重启运行中的应用,就可被更新和扩展。在ACE中,这样的灵活性是通过结合以下要素来获得的:(1)C++语言特性,比如模板、继承和动态绑定,(2)设计模式,比如抽象工厂、策略和服务配置器,以及(3)OS机制,比如显式动态链接和多线程。

七、分布式服务和组件

除了OS适配层、C++ Wrapper Facade和框架组件,ACE还提供了包装成自包含组件的标准分布式服务库。尽管这些服务组件并不是ACE框架库的严格组成部分,它们在ACE中扮演了两种角色:

1.       分解出可复用分布式应用的“积木”:这些服务组件提供通用的分布式应用任务的可复用实现,比如名字服务、事件路由、日志、时间同步和网络锁定。

2.       演示ACE组件的常见用例:这些分布式服务还演示了怎样用像Reactor、Service Configurator、Acceptor和Connector、Active Object,以及IPC包装这样的ACE组件来有效地开发灵活、高效和可靠的通信软件。

八、高级分布式计算中间件组件

即使使用像ACE这样的通信框架,开发健壮、可扩展和高效的通信应用仍富有挑战性。特别是,开发者必须掌握许多复杂的OS和通信的概念,比如:

l       网络寻址和服务标识。

l       表示转换,比如加密、压缩和在异种终端系统间的字节序转换。

l       进程和线程的创建和同步。

l       本地和远地进程间通信(IPC)机制的系统调用和库例程。

通过采用像CORBA、DCOM或Java RMI这样的高级分布式计算中间件,可以降低开发通信应用的复杂性。高级分布式计算中间件驻留在客户端和服务器之间,可自动完成分布式应用开发的许多麻烦而易错的方面,包括:

l       认证、授权和数据安全。

l       服务定位和绑定。

l       服务注册和启用。

l       事件多路分离和分派。

l       在像TCP这样的面向字节流的通信协议之上实现消息帧。

l       涉及网络字节序和参数整编(marshaling)的表示转换问题。

为给通信软件的开发者提供这些特性,在ACE中绑定了下面的高级中间件应用:

1.       The ACE ORB(TAO):TAO是使用ACE提供的框架组件和模式构建的CORBA实时实现,包含有网络接口、OS、通信协议和CORBA中间件组件等特性。TAO基于标准的OMG CORBA参考模型,并进行了增强的设计,以克服传统的用于高性能和实时应用的ORB的缺点。TAO像ACE一样,也是可自由使用的开放源码软件。

2.       JAWS:JAWS是高性能、自适配的Web服务器,使用ACE提供的框架组件和模式构建。JAWS被构造成“框架的框架”。JAWS的总体框架含有以下组件和框架:事件多路分派器、并发策略、I/O策略、协议管道、协议处理器和缓存虚拟文件系统。每个框架都被构造成一组协作对象,通过组合和扩展ACE中的组件来实现。JAWS也是可自由使用的开放源码软件。

九、主页

ACE的主页为:http://www.cs.wustl.edu/~schmidt/ACE.html,在这里可获得最新版本的ACE以及其他相关资源。


 =======================================

网络通信

ACE

参考网站:http://www.c’>http://www.c’>http://www.c’>http://www.cs.wustl.edu/~schmidt/ACE.html

C++库的代表,超重量级的网络通信开发框架。ACE自适配通信环境(Adaptive Communication Environment)是可以自由使用、开放源代码的面向对象框架,在其中实现了许多用于并发通信软件的核心模式。ACE提供了一组丰富的可复用C++包装外观(Wrapper Facade)和框架组件,可跨越多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态(重)配置、并发执行和同步,等等。

StreamModule

参考网站:http://www.omnifarious.org/StrMod/’>http://www.omnifarious.org/StrMod/

设计用于简化编写分布式程序的库。尝试着使得编写处理异步行为的程序更容易,而不是用同步的外壳包起异步的本质。

SimpleSocket

参考网站:http://home.hetnet.nl/~lcbokkers/simsock.htm

这个类库让编写基于socket的客户/服务器程序更加容易。

A Stream Socket API for C++

参考网站:http://www.pcs.cnu.edu/’>http://www.pcs.cnu.edu/~dgame/sockets/socketsC++/sockets.html

又一个对Socket的封装库。

2006年03月15日

来自PPSky  作者:王彦  时间:2006-03-07  出处:电子工程专辑


在经过长时间的纸上谈兵之后,中国的IPTV市场目前已经进入发展的实质性阶段。网通和电信分别在哈尔滨和上海开展了大规模的试验,而且网通正在试图把这项业务进一步扩展到北京。然而与运营商急不可耐的迫切心情相比,专家们仍然怀疑一些技术问题可能会阻碍IPTV的发展。

上海贝尔阿尔卡特公司的副总裁汪莹曾指出,网络支撑能力不足是IPTV发展的一个瓶颈问题。目前IPTV的实现方式主要有两种:实时广播和点播节目。与之分别对应的是集中的中央源广播或者通过内容服务器VoD点播方式来实现的两种IPTV架构。前者对于互联网格式要采用多播的方法,不如广播的经济性高,而后者则可能在用户数量突发增长的情况下造成网络瘫痪。

不过,借助P2P流媒体方式,上述问题也许可以得到妥善解决。“P2P无疑将开创网络媒体的新时代。”中国科学院研究员侯自强指出,“特别是利用基于P2P技术的对等广播(Peercasting),即P2P流媒体,用户能够以P2P方式即时欣赏网络流媒体。”

P2P方式的兴起源于Napster掀起的MP3免费下载浪潮,第一代的P2P主要通过中央服务器进行管理,在被强行关闭后这种模式也走到了尽头;其后又经历了没有中央服务器的分布式P2P时代以及采用分布服务器的混合型P2P时代。

“P2P流媒体类似P2P共享下载,但不需要全部下载。用户只需下载一小段内容,然后通过互换来减轻服务器压力。”侯自强介绍说。它能够实现电视视频信号的网络传播。同时针对播出内容设定的门槛也可降低:不能在电视台播出的内容可以直接通过网络直播。另外,大型企业也可以利用该技术实现高质量的网络会议。

英国广播公司(BBC)在2005年8月已经开始推广利用P2P技术来实现“柔性电视”,以此来克服带宽不足而无法支持许多人同时在线点播IPTV的技术挑战。BBC也成为传统电视节目运营商涉足新兴广播的榜样。

P2P流媒体技术还从其他技术中获得发展的源动力。这从在日本东京举行的网格计算技术展(Grid World 2005)中可以得到印证。IBM、Sky Perfect Communication、Utagoe等公司在这届大会上分别演示了其基于网格技术的最新P2P技术。

IBM的P2G(Peer to Group)同目前流行的P2P技术的最大不同是,它将以单一用户所扮演的分布式服务器架构发展成由一定的用户组为单位的分布式服务器。此外,这项技术还具有如下功能:按用户组内的终端数量来分配并传送MPEG4编码数据,然后由各接收终端交换数据并复原为原来的视频数据。这样当作为中继服务器的个人电脑发生故障时,可以减小其影响。

在中国,下一代网络(CNGI)工作组的专家们也已将P2P作为一个重要的实验内容,纳入了正在进行中的CNGI应用试验。作为CNGI专家组的一名成员,中兴通讯数据产品技术总监宋军表示:“P2P是非常有潜力的应用。” 的确,侯自强指出:“P2P已经占据中国互联网46%的数据交换内容。这标志着互联网已经开始由集中走向分布的演化。”

P2P的高速发展使得在CNGI中传统的通信模式面临着挑战。如何识别和控制P2P流以及如何实行版权保护,现在成为企业网络管理员和接入运营商的烦恼。侯自强认为,需要并行发展具有分布管理能力的CNGI,利用互联网作为基层承载网,在其应用层上建立智能结点重叠网支持P2P应用和提供分布式管理,解决QoS、可靠性、安全性问题。与电信业发展具有集中控制的下一代网络的思路不同,这是一种分布式的控制,保持了互联网分布自治的特性。

智能结点重叠网络采用分布管理模式,在网络关键部位设置智能结点,用来监视周围网络上的资源分布和带宽利用率、传输延时、路由走向、流量模式和分布、中断和故障以及病毒感染流行情况等。智能结点之间交换这些信息,进一步实现监视和控制,并提供即时响应。

与互联网静态地将应用和数据分配到指定位置的具体设备中不同,智能结点重叠网可以动态分配计算能力并根据需要将其储存在需要的地方。这样就可以按照用户的需要将其放置在最佳地理位置上。

许多业内人士都将P2P流媒体业务称作是下一个伟大的事物,然而,阻碍这种技术发展的现实障碍却是安全性问题。下一代IPv6网络将能够解决这个问题——通过提供足够的IP地址,实名化的有序管理将会进一步推动这种技术的发展。