隨著(zhù)計算機網(wǎng)絡(luò )、視頻壓縮等關(guān)鍵技術(shù)的快速發(fā)展,網(wǎng)絡(luò )流媒體技術(shù)目前已成為繼文字和圖片之后,互聯(lián)網(wǎng)信息傳播的主要形式。通過(guò)網(wǎng)絡(luò )流媒體技術(shù),用戶(hù)可以方便地存取、查閱和播放網(wǎng)絡(luò )上的流媒體數據。如何從海量的網(wǎng)絡(luò )數據中快速發(fā)現流媒體數據,是進(jìn)行網(wǎng)絡(luò )視頻服務(wù)質(zhì)量監測、網(wǎng)絡(luò )流量統計、網(wǎng)絡(luò )視頻用戶(hù)行為分析及視頻內容監管等服務(wù)的前提和基礎。 網(wǎng)絡(luò )流媒體服務(wù)為應用層服務(wù),其數據傳輸主要采用專(zhuān)有應用層協(xié)議RTP/RTCP。因此,對網(wǎng)絡(luò )視頻數據流的發(fā)現首先是識別應用層協(xié)議。針對應用層協(xié)議的識別,文獻提出了一種以協(xié)議中出現頻率最高的字段作為特征串來(lái)識別協(xié)議的方法,且采用一個(gè)特征串來(lái)標識一種協(xié)議。文獻提出了基于簽名字串的方法來(lái)識別應用層協(xié)議,其主要針對的是P2P協(xié)議的范圍,且需要對整個(gè)報文通過(guò)匹配多個(gè)特征串來(lái)識別一種P2P協(xié)議,時(shí)間效率偏低。文獻提出了基于先分類(lèi)后分組的識別應用層協(xié)議及流量的方法,但此方法的本質(zhì)還是基于某些固定端口的,若對于通過(guò)隨機選擇端口而實(shí)現的應用層協(xié)議,此方法就缺乏準確性和靈活性。 本文通過(guò)分析網(wǎng)絡(luò )流媒體交互過(guò)程的特征,以應用層傳輸協(xié)議對應的關(guān)鍵特征字串為判斷依據,設計了一種基于Winpcap的網(wǎng)絡(luò )視頻流識別算法,實(shí)現了對網(wǎng)絡(luò )流媒體的發(fā)現,并通過(guò)實(shí)驗對本文設計的算法性能進(jìn)行了分析和驗證。 1 Winpeap簡(jiǎn)介 Winpcap是由伯克利分組捕獲庫派生而來(lái)的分組捕獲庫,它在Windows操作平臺上實(shí)現對底層包的截取過(guò)濾。 Winpcap是BPF模型和Libpcap函數庫在Windows平臺下網(wǎng)絡(luò )數據包捕獲和網(wǎng)絡(luò )狀態(tài)分析的一種體系結構,這個(gè)體系結構是由一個(gè)核心的包過(guò)濾驅動(dòng)程序,一個(gè)底層的動(dòng)態(tài)連接庫Packet.dll和一個(gè)高層的獨立于系統的函數庫Libpcap組成。底層的包捕獲驅動(dòng)程序實(shí)際為一個(gè)協(xié)議網(wǎng)絡(luò )驅動(dòng)程序,通過(guò)對NDIS中函數的調用為Windows 95/98/NT/2000提供一類(lèi)似于UNIX系統下Berkeley Packet Filter的捕獲和發(fā)送原始數據包的能力。Packet.dll是對這個(gè)BPF驅動(dòng)程序進(jìn)行訪(fǎng)問(wèn)的API接口,同時(shí)它有一套符合Libpcap接口(UNIX下的捕獲函數庫)的函數庫。 Winpcap包括三部分:第一個(gè)模塊NPF(NetgroupPacket Filter),是一個(gè)虛擬設備驅動(dòng)程序文件。它的功能是過(guò)濾數據包,并把這些數據包原封不動(dòng)地傳給用戶(hù)態(tài)模塊,這個(gè)過(guò)程中包括了一些操作系統特有的代碼。第二個(gè)模塊Packet.dll為Win32平臺提供了一個(gè)公共的接口。不同版本的Windows系統都有自己的內核模塊和用戶(hù)層模塊。Packet.dll用于解決這些不同。調用Packet.dll的程序可以運行在不同版本的windows平臺上,而無(wú)需重新編譯。第三個(gè)模塊wpcap.dll是不依賴(lài)于操作系統的,它提供了更加高層、抽象的函數。 Winpcap提供了一套標準的編程接口,與libpcap兼容,可使得原來(lái)許多UNIX平臺下的網(wǎng)絡(luò )分析工具快速移植過(guò)來(lái)便于開(kāi)發(fā)各種網(wǎng)絡(luò )分析工具,充分考慮了各種性能和效率的優(yōu)化,包括對于NPF內核層次上的過(guò)濾器支持,支持內核態(tài)的統計模式,提供了發(fā)送數據包的能力。 2 應用層協(xié)議RTP/RTCP RTP/RFCP是一種應用型的傳輸層協(xié)議,它沒(méi)有連接的概念,既可以建立在面向連接的底層協(xié)議上,又可以建立在面向無(wú)連接的底層協(xié)議上,因此RTP對傳輸層是獨立的。由于網(wǎng)絡(luò )流媒體的傳輸實(shí)時(shí)性要求較高,UDP的傳輸延時(shí)低于TCP,能與音頻和視頻流很好地匹配,所以,在實(shí)際應用中,RFP/RTCP/UDP是流媒體傳輸的主要協(xié)議,其結構如圖l所示。 實(shí)時(shí)傳輸協(xié)議RTP是為實(shí)時(shí)數據提供端到端傳遞服務(wù)的協(xié)議,能夠傳遞時(shí)間信息和實(shí)現流同步。但RTP本身并不能為按順序傳送數據包提供可靠的傳輸機制,也不提供流量控制或擁塞控制,它依靠RTP控制協(xié)議RTCP配合實(shí)現控制服務(wù)。在RTP會(huì )話(huà)期間,各參與者周期性地交互RTCP包,RFCP包中含有己發(fā)送的數據包的數量、丟失的數據包的數量等統計資料,會(huì )話(huà)方可以利用這些信息動(dòng)態(tài)地改變傳輸速率,甚至改變有效型。RTP數據包結構如圖2所示。 從圖2可以看出,RTP數據包由12個(gè)字節的固定RTP頭和不定長(cháng)的連續多媒體數據組成,其中的多媒體數據可以是壓縮后數據。 其中比較重要的幾個(gè)域及其意義如下: 版本(V):2b,此域定義了RTP的版本,此協(xié)議定義的版本是2。 填料(P):1b,填料可能用于某些具有固定長(cháng)度的加密算法,或者在底層數據單元中傳輸多個(gè)RTP包。 擴展(X):1b,若設置擴展比特,表示固定頭(僅)后面跟隨一個(gè)頭擴展。 CSRC計數(CC):4b,CSRC計數包含了跟在固定頭后面CSRC識別符的數目。 標志(M):1b,標志用來(lái)允許在比特流中標記重要的事件,如幀范圍。 負載類(lèi)型(PT):7b,此域定義了負載的格式,由具體應用決定其解釋。協(xié)議可以規定負載類(lèi)型碼和負載格式之間一個(gè)默認的匹配。其他的負載類(lèi)型碼可以通過(guò)非RTP方法動(dòng)態(tài)定義,RTP發(fā)射機在任意給定時(shí)間發(fā)出一個(gè)單獨的RTP負載類(lèi)型。 序列號(SN):16b,每發(fā)送一個(gè)RTP數據包,序列號加一,接收機可以據此檢測丟包和重建包。序列號的初始值是隨機的。 時(shí)間標志:32b,時(shí)間標志反映了RTP數據包中第一個(gè)比特的抽樣瞬間。時(shí)間標志的起始值是隨機的。 SSRC:32b,SSRC域用以識別同步源。標識符被隨機生成,以使在同一個(gè)RTP會(huì )話(huà)期中沒(méi)有任何兩個(gè)同步源有相同的SSRC識別符。 CSRC列表:0~15項,每項32b。CSRC列表識別在此包中負載的有貢獻源。識別符的數目在CC域中給定。 通過(guò)對RTP協(xié)議的分析,總結出以下幾條“流特征”: (1)UDP負荷頭兩個(gè)比特是0x10(RTP的版本號是2)。 (2)RTP流負載類(lèi)型PT值保持不變。即同一流媒體數據包RTP頭的9~15b的值保持不變。 (3)RTP流的SN值為遞增。 (4)RTP包的SSRC值為定值,同一流媒體數據各包的SSRC值保持不變。 3 算法實(shí)現 首先通過(guò)Winpcap過(guò)濾器對數據包進(jìn)行捕獲,識別其中的握手數據包,然后分析呼叫信令的內容,獲取傳輸流媒體的源、目的地址和端口號,再通知給過(guò)濾器針對該源、目的地址和端口號進(jìn)行數據捕捉;識別其中的UDP數據包進(jìn)行分析,根據“流特征”進(jìn)行分析,確定所要捕捉的RTP數據流。 采用以上4條作為判斷RTP流量的必要條件,當對每一個(gè)UDP數據流,如能連續檢出4個(gè)包符合上述策略,則認定其滿(mǎn)足為RTP數據流的充分條件。 經(jīng)過(guò)大量實(shí)際數據的測試,該算法可以有效識別網(wǎng)絡(luò )流媒體。 4 結語(yǔ) 在分析網(wǎng)絡(luò )流媒體傳輸協(xié)議的基礎上,利用Winpcap實(shí)現了一個(gè)網(wǎng)絡(luò )流媒體識別算法。經(jīng)試驗證明,該算法能夠有效識別流媒體,對網(wǎng)絡(luò )流媒體的應用具有積極的作用。 |