锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / Darwin服务器 / Darwin概念之服务器架构
服务方向
软件开发
办公财务MIS
股票
设备监控
网页信息采集及控制
多媒体
软件开发培训
流媒体开发
Java 安卓移动开发
Java Web开发
HTML5培训
iOS培训
网站前端开发
VC++
C++游戏开发培训
C#软件
C语言(Linux)
ASP.NET网站开发(C#)
C#软件+ASP.NET网站
SOCKET网络通信开发
COMOLE和ActiveX开发
C++(Linux)
汇编和破解
驱动开发
SkinMagicVC++换肤
MicroStation二次开发
计算机英语翻译
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

Darwin服务器架构


流媒体服务器是由一个父进程构成的,这个父进程分叉出一个子进程,该子进程就是核心服务器。父进程会等待子进程的退出。如果子进程错误退出,则父进程就会分叉出一个新的子进程。

核心服务器的作用是充当网络客户和服务器模块的接口,其中网络客户使用RTP和RTSP协议来发送请求和接收响应,而服务器模块则负责处理请求和向客户端发送数据包。核心服务器通过创建四种类型的线程来完成自己的工作,具体如下:

  • 服务器自己拥有的主线程(Main Thread)。这个线程负责检查服务器是否需要关闭,记录状态信息,或者打印统计信息。
  • 空闲任务线程(Idle Task Thread)。空闲任务线程管理一个周期性的任务队列。该任务队列有两种类型:套接口任务。
  • 事件线程(Event Thread)。事件线程负责侦听套接口事件,比如收到RTSP请求和RTP数据包,然后把事件传递给任务线程。
  • 一个或者多个任务(Task)线程。任务线程从事件线程中接收RTSP和RTP请求,然后把请求传递到恰当的服务器模块进行处理,把数据包发送给客户端。缺省情况下,核心服务器为每一个处理器创建一个任务线程。

图 1-1 总结了客户端,核心服务器的线程,和服务器模块之间的关系。


图 1-1 服务器架构

Server architecture

由于服务器很大程度上是异步的,所以需要为不同的事件提供一个通讯机制。举例来说,当某个用于RTSP连接的套接口得到数据时,需要通知某些组件,数据才能被处理。Task(任务)对象就是执行这种通讯的一般性的机制。

每一个Task对象都有两个主要的方法:即Signal和Run。服务器调用Signal方法来把一个事件发送给Task对象,而Run方法则用来为Task对象指定处理事件的时机。

每个Task对象的目标都是用小的非阻塞的时间片来实现服务器的功能。Run是一个纯虚函数,当Task对象有事件需要处理时被调用。在Run函数的内部,Task对象可以调用GetEvents函数来接收当前的和先前已经用信号通知过的事件,并自动使该事件退出队列。Run函数是永远不可重入的:如果一个Task对象在其Run函数中调用GetEvents函数,然后在Run函数完成之前又发出信号,则该Run函数只有在当前的函数实例退出之后,才能(因为那个新的事件)再次被调用。事实上,Task对象的Run函数会被反复调用,直到该对象的所有事件全部被GetEvents函数清除掉为止。

这个事件触发任务的核心概念被集成到几乎每一个流媒体服务器的子系统中。举例来说,一个Task对象可能和一个套接口(Socket)对象相关联。如果Socket对象得到一个事件(通过select()通知,或者通过Mac OS X的时间队列),则相应的Task对象就会得到信号通知。在这种情况下,Run函数的函数体中就会包含相应的代码,来处理在该Socket对象上接收到的任何事件。

Task对象使得流媒体服务器用单独一个线程来运行所有连接的做法成为可能,这正是流媒体服务器在单处理器系统上的缺省设置。

这个部分包含以下内容:

模块

协议

数据

应用程序和工具

源代码的组织

模块

流媒体服务器使用模块来响应各种请求及完成任务。有三种类型的模块:

内容管理模块

内容管理模块负责管理与媒体源相关的RTSP请求和响应,比如一个文件或者一个广播。每个模块负责解释客户的请求,读取和解析它们的支持文件或者网络源,并且以RTSP和RTP的方式进行响应。在某些情况下,比如流化mp3的模块,使用的则是HTTP。
QTSSFileModule,QTSSReflectorModule,QTSSRelayModule,和QTSSMP3StreamingModule都是内容管理模块。

服务器支持模块

服务器支持模块执行服务器数据的收集和记录功能。服务器模块包括QTSSErrorLogModule, QTSSAccessLogModule,QTSSWebStatsModule,QTSSWebDebugModule, QTSSAdminModule,和QTSSPOSIXFileSystemModule。

访问控制模块

访问控制模块提供鉴权和授权功能,以及操作URL路径提供支持。
访问控制模块包括QTSSAccessModule,QTSSHomeDirectoryModule,QTSSHttpFileModule,和QTSSSpamDefenseModule。

协议

流媒体服务器支持下面的协议:

  • 基于TCP之上的RTSP。实时流媒体协议(Real Time Streaming Protocol,即RTSP)是一个客户-服务器多媒体表示控制协议,其设计目的是为了实现IP网络流媒体的有效分发。RTSP为诸如RTP这样的单点传输和多点传输协议的握手,以及与文件格式无关的编解码器的选择提供了基本条件。它既可以应用于具有大量观众的场合,也可以应用于只有一个观众的媒体点播场合。RFC 2326定义了RTSP的IETF标准。
  • 基于UDP的RTP。实时传输协议(Realtime Transport Protocol,即RTP)为多媒体数据流定义数据包的格式。很多标准协议都用到RTP协议,比如用于流媒体的RTSP协议,和用于多点传输的SDP协议。它为RTSP和SDP提供数据的分发格式。RFC 1889定义了RTP的IETF建议标准。
  • 基于苹果电脑的可靠UDP(Reliable UDP)协议的RTP。如果一个RTP客户发出相应的请求,则服务器可以使用可靠UDP的格式来发送RTP包。可靠UDP定义了一系列对服务品质的增强,比如提高拥挤控制调整方法,重新传输,和服务器瘦化算法(thinning server algorithm),这些增强使服务器在数据包丢失和网络拥挤的情况下,向RTP客户提供优质RTP流的能力得到提升。
  • HTTP中的RTSP/RTP(通道式)。防火墙通常不允许私有IP网络的用户接收QuickTime内容。在私有网络中,通常会对HTTP代理服务器进行配置,使用户只能间接访问英特网。为了能够把内容分发到这一类客户,QuickTime 4.1支持用HTTP的请求和响应的方式来代替RTSP和RTP进行数据传送,这使得防火墙后面的接收者可以通过HTTP代理服务器访问到QuickTime分发的内容。
  • RTSP之上的RTP(TCP之上的RTP)。某些防火墙的设计,和其它环境可能会要求服务器使用不同的方式把数据发送给客户。RFC 2326允许把目的地为同一控制端点的RTSP数据包打包为一个更底层的协议数据单元(protocol data unint,即PDU),然后封装在TCP流中,或者和RTP和RTCP数据包交织在一起。采用交织的方式会使客户和服务器的操作变得更为复杂,增加额外的负担,因此只有当TCP中携带RTSP的情况下,才使用这种方法。RTP数据包的封装方式如下:首先是一个ASCII的美元符号($);接着是一个字节的通道标识符(在传输头中定义,使用的是交织过的参数);然后是被包装的二进制数据的长度,这是一个二进制的按网络字节顺序排列的双字节整数;紧接下来是流数据,没有CRLF,但是包含一个上层协议头。每一个$块包含一个且只有一个RTP包。在使用RTP进行传输时,服务器也会在TCP连接之上把RTCP消息进行编织。缺省情况下,RTCP数据包会在高于RTP通道的第一个可用通道进行发送。客户可以显式地在其它通道上请求RTCP数据包,通过在传输头中的编织参数中指定两个通道就可以实现。当有两个或者两个以上的流被编织时,RTCP用来进行各个流的同步。当网络配置需要时,这也提供了一种基于TCP控制连接建立RTP/RTCP数据包通道,并在可能的情况下将它们传送到UDP上的便利方法。

此外,下面的模块实现了HTTP的支持:

  • QTSSAdminModule
  • QTSSMP3StreamingModule
  • QTSSWebStatsModule
  • QTSSHTTPStreamingModule
  • QTSSRefMovieModule
  • QTSSWebStats
  • QTSSWebDebugModule

数据

当一个模块需要访问客户请求的RTSP报头时,可以通过QTSS.h这个API头文件中定义的请求对象来访问相应的请求信息。举例来说,RTSPRequestInterface类实现了API字典元素,这些元素可以通过API来进行访问。名称是以“Interface”结尾的对象,比如RTSPRequestInterface,RTSPSessionInterface,和QTSServerInterface,则用于实现模块的API。
下面是重要的接口类:

  • QTSServerInterface — 这是内部数据的存储对象,在API中标识为QTSS_ServerObject。在API中的每一个QTSS_ServerAttributes都在基类中声明和实现。
  • RTSPSessionInterace — 这是内部数据的存储对象,在API中标识为qtssRTSPSessionObjectType。在API中的每一个QTSS_RTSPSessionAttributes都在基类中声明和实现。
  • RTPSessionInterface — 这是内部数据的存储对象,在API中标识为QTSS_ClientSessionObject。在API中的每一个QTSS_ClientSessionAttributes都在基类中声明和实现。
  • RTSPRequestInterface — 这是内部数据的存储对象,在API中标识为QTSS_RTSPRequestObject。在API中的每一个QTSS_RTSPRequestAttributes都在基类中声明和实现。

图 1-2 显示在服务器中的对象是如何互相引用的。


图 1-2 服务器对象数据模型

Server object data model

服务器对象中有一个预置信息字典。服务器内部有一个模块列表,列表中的每一个模块都有一个字典,用于存放自己的预置信息。服务器中还有一个RTP客户会话的列表,每一个会话都可能有一个RTSP会话以及一个或多个RTP媒体流。通过API来遍历服务器中所有活跃的会话和流是有可能的。

  • QTServer是一个核心服务器对象,这个对象的一部分可以通过API和QTSServerInterface基类来进行访问。
  • Dictionary是一种把键值对实现为对象数据的数据存储类。由API定义的所有服务器对象都是从这个基类继承下来的。
  • Module是管理模块的类。每个模块的实例负责装载,初始化,以及执行一个静态或者动态的API模块。
  • RTSP和RTP会话。流的读写是由会话通过一个流对象来管理的。RTSP会话在RTSPSession::Run方法中会调用每个模块中注册过的RTSP角色(Role)。被调用的API模块角色有QTSS_RTSPFilter_Role,QTSS_RTSPRoute_Role,QTSS_RTSPAuthenticate_Role, QTSS_RTSPAuthorize_Role,QTSS_RTSPPreProcessor_Role,QTSS_RTSPRequest_Role, QTSS_RTSPPostProcessor_Role,和QTSS_RTSPSessionClosingRole。RTSP会话还会调用注册为QTSS_RTSPIncomingData_Role角色的模块。RTP会话除了处理数据的读写之外,还调用下面的角色:QTSS_RTPSendPackets_Role,QTSS_RTCPProcess_Role,和QTSS_ClientSessionClosing_Role。如果需要更多关于角色的信息,请参见“Darwin模块角色”部分。

应用程序和工具

苹果电脑在提供流媒体服务器的同时还提供下面的应用程序和工具:

  • PlayListBroadcaster
  • MP3Broadcaster
  • StreamingProxy(仅在POSIX和Mac OS X平台上提供)
  • QTFileTools(仅在POSIX和Mac OS X平台上提供,不做维护)。
  • WebAdmin
  • qtpasswd

PlayListBroadcaster

PlayListBroadcaster用来播放QuickTime Broadcaster录制完成的电影。

MP3Broadcaster

MP3Broadcaster用来广播MP3文件,和现场直播一样。

StreamingProxy

仅在POSIX和Mac OS X平台上提供。

QTFileTools

QTFileTools是一些基于QTFile库开发的电影查看工具。这些工具包括:

  • QTBroadcaster。这个工具要求给定一个目标IP地址,一个拥有一个或者多个线索轨道(hint track)ID的电影源,以及一个初始化端口。通过这个工具,被线索轨道引用的每一个数据包都可以被广播到指定的IP地址。
  • QTFileInfo。使用这个工具需要给定一个电影源。通过这个工具可以显示指定电影的名称,创建日期,以及修改日期。如果电影中的轨道是线索轨道,则它也可以显示RTP字节总数和数据包总数,平均的位率和数据包尺寸,以及数据报头在流中的百分比。
  • QTFileTest。使用这个工具需要给定一个电影源。通过这个工具可以解析电影头原子(Movie Header Atom),并跟踪和显示输出信息。
  • QTRTPGent。这个工具要求给定一个具有线索轨道的电影源。它可以显示每一个线索轨道样本中含有的多少数据包,并且将RTP数据包写入到名为track.cache的文件中。
  • QTRTPFileTest。这个工具要求给定一个具有线索轨道ID的电影源。它可以显示每个数据包的RTP头信息(包括TransmitTime,Cookie,SeqNum,和TimeStamp)。
  • QTSampleLister。这个工具要求给定一个电影源和一个轨道ID。它可以显示指定轨道的媒体数目,媒体时间,数据偏移量,以及轨道中每个样本的尺寸。
  • QTSDPGen。这个工具要求给定一个包含一个或者多个电影源的列表。它可以显示列表中每个电影包含的所有线索轨道的SDP信息。通过 -f 选项,可以把SDP信息保存在moviename.sdp文件中,该文件和电影源位于同一个目录。
  • QTTrackInfo。这个工具要求给定一个电影源,一个样本表原子类型(stco,stsc,stsz,或者stts)以及一个轨道ID。它可以显示指定轨道的样本表原子的信息。

作为例子,下面的命令显示ID为3的轨道中的样本表的大块数据的偏移量:

./QTTrackInfo -T stco /movies/mystery/.mov 3 

WebAdmin

WebAdmin是一个基于Perl的web服务器。将浏览器连接到这个服务器上,就可以对流媒体服务器进行管理。

qtpasswd

qtpasswd程序用于产生访问控制用的密码文件。

源代码的组织

流媒体服务器的源代码全部用C++编写的,并且普遍使用到诸如继承和多态这样的面向对象的概念。每一对.h / .cpp文件对应一个C++类,并且文件名和类名是相互匹配的,这个规则几乎没有例外。流媒体服务器的源代码按下面的方式进行组织:

  • “Server.tproj”
  • “CommonUtilitiesLib”
  • “QTFileLib”
  • “APICommonCode”
  • “APIModules”
  • “RTSPClientLib”
  • “RTCPUtilitiesLib”
  • “APIStubLib”
  • “HTTPUtilitiesLib”

Server.tproj

这个目录包含核心服务器(core server)的代码,可以分成三个子系统:

  • 服务器内核。这个子系统中的类都有一个QTSS前缀。QTSServer负责处理服务器的启动和关闭。QTSServerInterface负责保存服务器全局变量,以及收集服务器的各种统计信息。QTSSPrefs是存储服务器偏好设定的地方。QTSSModule,QTSSModuleInterface,和QTSSCallbacks类的唯一目的就是支持QTSS的模块API。
  • RTSP子系统。这些类负责解析和处理RTSP请求,以及实现QTSS模块API的RTSP部分。其中的几个类直接对应QTSS API的一些元素(比如,RTSPRequestInterface类就是对应于QTSS_RTSPRequestObject对象)。每个RTSP TCP连接都有一个RTSP会话对象与之相对应。RTSPSession对象是一个Task对象,负责处理与RTSP相关的事件。
  • RTP子系统。这些类处理媒体数据的发送。RTPSession对象包含与所有RTSP会话ID相关联的数据。每个RTPSession都是一个Task对象,可以接受核心服务器的调度来进行RTP数据包的发送。RTPStream对象代表一个单独的RTP流,一个RTPSession对象可以和任何数目的RTPStream对象相关联。这两个对象实现了QTSS模块API中的针对RTP的部分。

CommonUtilitiesLib

这个目录含有一个工具箱,包括线程管理,数据结构,网络,和文本解析工具。Darwin流媒体服务器及其相关工具通过这些类对类似或者相同的任务进行抽象,以减少重复代码;这些类的封装简化了较高层次的代码;借助这些类还分离了专用于不同平台的代码。下面是对目录下的各个类的简短描述:

  • OS类。这些类在时间,条件变量,互斥锁,和线程方面提供了专用于不同平台的代码抽象。这些类包括OS,OSCond,OSMutex,OSThread,和OSFileSource;数据结构则包括OSQueue,OSHashTable,OSHeap,和OSRef。
  • 套接口类(Sockets)。这些类为TCP和UDP网络通讯方面提供了专用于不同平台的代码抽象。通常情况下,套接口类是异步的(或者说是非阻塞的),可以发送事件给Task对象。这些类有:EventContext,Socket,UDPSocket,UDPDemuxer,UDPSocketPool,TCPSocket,和TCPListenerSocket。
  • 解析工具。这些类负责解析和格式化文本。包括StringParser,StringFormatter,StrPtrLen,和StringTranslator。
  • Task(任务):这些类实现了服务器的异步事件机制。

QTFileLib

流媒体服务器的一个主要特性就是它能够将索引完成(hinted)的QuickTime电影文件通过RTSP和RTP协议提供给客户。这个目录包含QTFile库的源代码,包括负责解析索引完成的QuickTime文件的代码。服务器的RTPFileModule通过调用QTFile库来从索引过的QuickTime文件中取得数据包和元数据。QTFile库可以解析下面几种文件类型:.mov,.mp4(.mov的一种修改版本),和.3gpp(.mov的一种修改版本)。

APICommonCode

这个目录包含与API相关的类的源代码,比如moduletils,或者诸如记录文件的管理这样的公共模块函数。

APIModules

这个目录包含流媒体服务器模块目录,每个模块都有一个目录。

RTSPClientLib

这个目录包含实现RTSP客户端的源代码,这些代码可以用于连接服务器,只要该连接协议被支持。

RTCPUtilitiesLib

这个目录包含解析RTCP请求的源代码。

APIStubLib

这个目录包含API的定义和支持文件。

HTTPUtilitiesLib

这个目录包含解析HTTP请求的源代码。

友情链接
版权所有 Copyright(c)2004-2015 锐英源软件
公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768
地址:郑州市文化路47号院1号楼4层(47-1楼位于文化路和红专路十字路口东北角,郑州大学工学院招待所南边,工学院科技报告厅西边。)