国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Darwin服務器架構(重要)

2019-11-11 02:24:55
字體:
來源:轉載
供稿:網友

流媒體服務器是由一個父進程構成的,這個父進程分叉出一個子進程,該子進程就是核心服務器。父進程會等待子進程的退出。如果子進程錯誤退出,則父進程就會分叉出一個新的子進程。

核心服務器的作用是充當網絡客戶和服務器模塊的接口,其中網絡客戶使用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的支持:

QTSSAdminModuleQTSSMP3StreamingModuleQTSSWebStatsModuleQTSSHTTPStreamingModuleQTSSRefMovieModuleQTSSWebStatsQTSSWebDebugModule

數據

當一個模塊需要訪問客戶請求的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模塊角色”部分。

應用程序和工具

蘋果電腦在提供流媒體服務器的同時還提供下面的應用程序和工具:

PlayListBroadcasterMP3BroadcasterStreamingProxy(僅在POSIX和Mac OS X平臺上提供)QTFileTools(僅在POSIX和Mac OS X平臺上提供,不做維護)。WebAdminqtpasswd

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請求的源代碼。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大英县| 梁河县| 荃湾区| 铜山县| 穆棱市| 漠河县| 麦盖提县| 平顶山市| 新平| 镇坪县| 图们市| 麻江县| 惠安县| 三门峡市| 宁远县| 孟津县| 汽车| 额敏县| 兴宁市| 仪征市| 华宁县| 新昌县| 甘洛县| 台安县| 南阳市| 城固县| 西丰县| 台前县| 汉阴县| 罗平县| 云林县| 于都县| 大田县| 顺昌县| 万荣县| 大荔县| 仲巴县| 博客| 略阳县| 永胜县| 武隆县|