徐文莉 熊燕 李燕



摘 要:P2P技術(shù)因其非中心化、身份對(duì)等、可擴(kuò)展性等優(yōu)勢(shì),在即時(shí)通信領(lǐng)域受到重視。基于P2P的即時(shí)通信系統(tǒng),廣泛應(yīng)用于個(gè)人通信、商務(wù)洽談、企業(yè)管理等領(lǐng)域。為完善系統(tǒng)功能,提高開(kāi)發(fā)效率,對(duì)在.NET平臺(tái)下建立完全對(duì)等的P2P拓?fù)浣Y(jié)構(gòu),實(shí)現(xiàn)局域網(wǎng)通信關(guān)鍵技術(shù)及應(yīng)用方式進(jìn)行了研究。利用PNRP協(xié)議編程實(shí)現(xiàn)了對(duì)等節(jié)點(diǎn)的發(fā)現(xiàn),通過(guò)對(duì)DirectShow的封裝高效完成了音視頻數(shù)據(jù)的采集與壓縮,在TCP/UDP協(xié)議及多線(xiàn)程技術(shù)支持下實(shí)現(xiàn)了數(shù)據(jù)有效傳輸。實(shí)際應(yīng)用表明,系統(tǒng)架構(gòu)設(shè)計(jì)合理,關(guān)鍵技術(shù)應(yīng)用可行。
關(guān)鍵詞:即時(shí)通信;對(duì)等網(wǎng)絡(luò);TCP/UDP;PNRP;DirectShow
DOI:10.11907/rjdk.172275
中圖分類(lèi)號(hào):TP319 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1672-7800(2017)009-0151-03
Abstract:Due to its advantages of non-centrality, identity equivalence, scalability, P2P technology has gradually attracted more attention in the field of instant messaging. Instant messaging system has been widely applied in certain areas based on P2P technology, such as personal communication, business negotiation, enterprise management and so on. With the purpose of improving systems function and enhancing development efficiency, some key technologies and application methods of establishing completely equivalent P2P topology in .NET platform are under research and analysis. By programming with PNRP protocol, peer node discovery is realized. The work of collecting and compressing audio and video data with packaged DirectShow is finished as well. In the end, data effective transmission is solved with the support of TCP/UDP protocol and multithread technology. It can be proved that systems architecture is reasonable, and the application of key technology is feasible and effective.
Key Words:instant messaging; P2P; TCP/UDP; PNRP; DirectShow
0 引言
即時(shí)通信系統(tǒng)的發(fā)展,滿(mǎn)足了人們對(duì)信息交流實(shí)時(shí)性、多樣性、有效性需求。其中,P2P即時(shí)通信系統(tǒng)利用P2P技術(shù)及網(wǎng)絡(luò)通信技術(shù),以計(jì)算機(jī)網(wǎng)絡(luò)為載體,以弱化或消除服務(wù)器分工為前提,以實(shí)現(xiàn)交互雙方便捷有效的文字、圖像、音視頻信息通信為目的,在計(jì)算機(jī)網(wǎng)絡(luò)與通信領(lǐng)域受到廣泛關(guān)注,主流產(chǎn)品包括MSN、騰訊QQ、Skype等。
局域網(wǎng)即時(shí)通信系統(tǒng)具有輕型、高效、便利、易管理等特點(diǎn),較多服務(wù)于校園網(wǎng)、企業(yè)網(wǎng)領(lǐng)域,例如建設(shè)多人視頻會(huì)議平臺(tái)、網(wǎng)絡(luò)教學(xué)平臺(tái)、企業(yè)內(nèi)部服務(wù)平臺(tái)等,這些系統(tǒng)大多依賴(lài)服務(wù)端的管理或協(xié)調(diào)功能運(yùn)作[1]。本文討論的即時(shí)通信系統(tǒng)是基于.NET平臺(tái)開(kāi)發(fā)的一種無(wú)服務(wù)器的完全對(duì)等型P2P通信應(yīng)用軟件,重點(diǎn)分析了系統(tǒng)功能實(shí)現(xiàn)過(guò)程中的對(duì)等節(jié)點(diǎn)發(fā)現(xiàn)、音視頻數(shù)據(jù)采集及傳輸、網(wǎng)絡(luò)消息管理等解決方案。
1 即時(shí)通信系統(tǒng)架構(gòu)及功能
1.1 系統(tǒng)架構(gòu)選擇
P2P架構(gòu)系統(tǒng)優(yōu)勢(shì)是對(duì)等和分布。隨著P2P技術(shù)的發(fā)展,絕大多數(shù)即時(shí)通信系統(tǒng)功能實(shí)現(xiàn)都建立在P2P方式架構(gòu)之上。使用P2P方式架構(gòu)的系統(tǒng)可分為單純型P2P及混合型P2P兩大類(lèi),區(qū)別在于是否依賴(lài)于專(zhuān)用服務(wù)器[2]。
以騰訊QQ為代表的傳統(tǒng)即時(shí)通信軟件數(shù)據(jù)傳輸采用P2P技術(shù),具有集中式P2P網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),客戶(hù)端通信需要索引服務(wù)器的協(xié)調(diào)配合。而以Skype為代表的P2P VoIP軟件,則是從連接建立到數(shù)據(jù)傳輸過(guò)程中都采用P2P實(shí)現(xiàn),建立混合式P2P網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),通信節(jié)點(diǎn)根據(jù)計(jì)算能力不同設(shè)立不同的分工。兩者都屬于混合型P2P系統(tǒng),需要服務(wù)器完成分發(fā)或存儲(chǔ),同時(shí)還要解決網(wǎng)絡(luò)中地址的轉(zhuǎn)換(NAT)問(wèn)題[3]。
PNRP協(xié)議的出現(xiàn),更好地支持了單純型P2P系統(tǒng)發(fā)展,為開(kāi)發(fā)P2P應(yīng)用程序提供了新的解決途徑[4]。單純型P2P系統(tǒng)所有節(jié)點(diǎn)都是對(duì)等的,任何一個(gè)節(jié)點(diǎn)只要安裝了同一個(gè)P2P應(yīng)用軟件,就可和其它安裝此軟件的節(jié)點(diǎn)直接通信,節(jié)點(diǎn)的管理機(jī)制更加簡(jiǎn)化。但由于PNRP全局云基于IPv6協(xié)議,因此,在IPv6尚未完全普及的今天,PNRP協(xié)議較多應(yīng)用在本地云系統(tǒng)中[2]。考慮到網(wǎng)絡(luò)復(fù)雜性控制,本文選擇建立單純型P2P局域網(wǎng)即時(shí)通信系統(tǒng)。
1.2 系統(tǒng)功能分析
單純型P2P系統(tǒng)可分為登錄模塊、通信模塊、消息存儲(chǔ)與管理模塊及可擴(kuò)展模塊,見(jiàn)圖1。
相關(guān)模塊的實(shí)現(xiàn)及對(duì)應(yīng)的關(guān)鍵技術(shù)支持密不可分,各模塊具體功能如下:endprint
(1)登錄模塊:實(shí)現(xiàn)對(duì)等節(jié)點(diǎn)的注冊(cè)與注銷(xiāo)。對(duì)等節(jié)點(diǎn)通過(guò)登錄模塊,以IP地址及端口為唯一標(biāo)識(shí),加入或退出網(wǎng)絡(luò)拓?fù)洌瑫r(shí)完成用戶(hù)在線(xiàn)狀態(tài)的實(shí)時(shí)更新,在通信列表中能查看到在線(xiàn)用戶(hù)信息。對(duì)初次登錄節(jié)點(diǎn)生成新的本地存檔文件,用于保存通信記錄。重新登錄時(shí),更新該文件相關(guān)數(shù)據(jù)。
(2)通信模塊:包含文本、音頻、視頻3種通信方式,是系統(tǒng)的核心模塊,分為音視頻處理框架和即時(shí)通信協(xié)議兩部分。音視頻處理框架集成了音視頻采集、音視頻編解碼、音視頻分流控制、音視頻數(shù)據(jù)流網(wǎng)絡(luò)擁塞控制等技術(shù)模塊,能夠完成音視頻數(shù)據(jù)流的采集、編碼、分流等基本處理流程。即時(shí)通信協(xié)議則負(fù)責(zé)為音視頻數(shù)據(jù)協(xié)商傳輸通道,在協(xié)商好的傳輸通道上建立對(duì)應(yīng)連接,從而為音視頻數(shù)據(jù)的順暢傳輸提供保障。
(3)消息存儲(chǔ)與管理模塊:用本地XML文檔存儲(chǔ)用戶(hù)信息及通信消息[5]。該文檔的作用類(lèi)似于日志文件,記載通信數(shù)據(jù),可用于通信記錄查詢(xún)、用戶(hù)行為分析等功能。
(4)可擴(kuò)展模塊:包括消息群發(fā)、文件傳輸、圖像截取、音視頻錄制等,可擴(kuò)展系統(tǒng)功能。
2 關(guān)鍵技術(shù)分析
2.1 PNRP協(xié)議編程
PNRP是微軟公司設(shè)計(jì)的基于IPv4和IPv6的點(diǎn)對(duì)點(diǎn)協(xié)議,提供了安全靈活的動(dòng)態(tài)名稱(chēng)注冊(cè)和名稱(chēng)解析[6]。系統(tǒng)登錄模塊本質(zhì)就是完成局域網(wǎng)中對(duì)等節(jié)點(diǎn)名稱(chēng)的注冊(cè)與解析,可基于.NET平臺(tái)的PNRP協(xié)議編程實(shí)現(xiàn)。
.NET平臺(tái)的System.Net.PeerToPeer及System.Net.PeerToPeer.Collaboration命名空間包含了實(shí)現(xiàn)PNRP的類(lèi)。對(duì)等節(jié)點(diǎn)名稱(chēng)注冊(cè)及名稱(chēng)解析是完成PNRP資源發(fā)現(xiàn)的關(guān)鍵,處理流程如圖2所示。
2.1.1 名稱(chēng)注冊(cè)
用戶(hù)登錄過(guò)程即對(duì)應(yīng)名稱(chēng)注冊(cè)。將對(duì)等名稱(chēng)發(fā)布到云中,以便其它對(duì)等節(jié)點(diǎn)解析,主要涉及到PeerName類(lèi)、PeerNameRegistration類(lèi),前者用于構(gòu)建對(duì)等名稱(chēng)實(shí)例對(duì)象,后者用于完成對(duì)等名稱(chēng)實(shí)例注冊(cè)。其中,設(shè)定Peer端點(diǎn)所有連接本機(jī)的PNRP群及注冊(cè)PNRP Peer Name到PNRP Cloud中的代碼為:
peerNameRegistration.Cloud = Cloud. Available; //設(shè)定Cloud的屬性值
peerNameRegistration.Start(); //調(diào)用Start()方法完成注冊(cè)
2.1.2 名稱(chēng)解析
名稱(chēng)解析是利用對(duì)等名稱(chēng)獲取注冊(cè)到云中的對(duì)等節(jié)點(diǎn)的IP地址和端口過(guò)程。完成名稱(chēng)解析,則完成了通信節(jié)點(diǎn)定位,可通過(guò)PeerNameResolver類(lèi)的Resolve方法實(shí)現(xiàn):
PeerNameRecordCollection recColl = myRes.Resolve(myPeer)
由于P2P網(wǎng)絡(luò)允許參與其中的各個(gè)對(duì)等用戶(hù)自主加入和退出,為實(shí)現(xiàn)在線(xiàn)對(duì)等節(jié)點(diǎn)信息實(shí)時(shí)更新,需要使用多線(xiàn)程編程技術(shù)完成名稱(chēng)實(shí)時(shí)解析,主要涉及到委托回調(diào)機(jī)制。
2.2 DirectShow與音視頻信息處理
音視頻信息處理框架設(shè)計(jì)能有效保證系統(tǒng)功能的多樣化,DirectShow技術(shù)為音視頻信息處理提供了高效的解決方法[7]。
2.2.1 .NET對(duì)DirectShow封裝
為使C#開(kāi)發(fā)者能方便使用DirectShow,.NET對(duì)DirectShow系統(tǒng)框架設(shè)計(jì)了C#開(kāi)源封裝。利用DirectX.Capture(基于DirectShow.Net的類(lèi)庫(kù))及DShowNET(DirectShow的組件封裝類(lèi))實(shí)現(xiàn)DirectShow的各種功能[7]。
2.2.2 音視頻信息處理
根據(jù)實(shí)際應(yīng)用需求,用戶(hù)可完成純文本/語(yǔ)音通信或音視頻實(shí)時(shí)通信,需要分開(kāi)建立文本、音頻及視頻傳輸模塊,音視頻模塊的數(shù)據(jù)處理流程基本類(lèi)似[8]。音視頻處理模塊的Filter Graph鏈路、各功能塊Filter及數(shù)據(jù)流處理流程見(jiàn)圖3。
過(guò)濾器圖表提供了音視頻數(shù)據(jù)的轉(zhuǎn)換輸出流程[9]。源過(guò)濾器負(fù)責(zé)采集原始數(shù)據(jù),經(jīng)由轉(zhuǎn)換過(guò)濾器處理數(shù)據(jù)并生成輸出流,通過(guò)提交過(guò)濾器接收數(shù)據(jù),將數(shù)據(jù)提交給外設(shè)呈現(xiàn)。DirectX.Capture類(lèi)庫(kù)通過(guò)Filters類(lèi)構(gòu)建音視頻的源Filter、音視頻壓縮Filter,通過(guò)Capture類(lèi)實(shí)現(xiàn)音視頻數(shù)據(jù)的相關(guān)處理[10]。
由源過(guò)濾器到轉(zhuǎn)換過(guò)濾器的實(shí)現(xiàn),主要包括音視頻設(shè)備的識(shí)別、基本屬性的設(shè)置、數(shù)據(jù)采集、音視頻壓縮Filter的創(chuàng)建等過(guò)程。
(1)數(shù)據(jù)采集。Capture類(lèi)定義了Start()和Stop()方法,實(shí)現(xiàn)數(shù)據(jù)采集的開(kāi)始與停止控制。利用創(chuàng)建的過(guò)濾器圖表管理器(Filter Graph Manager)可引出ImediaControl接口,該接口是DirectShow的常用接口,用于控制媒體流在FilterGraph中的流動(dòng),從而實(shí)現(xiàn)對(duì)應(yīng)的Start()及Stop()方法,來(lái)開(kāi)啟或停止音視頻數(shù)據(jù)的采集。另外視頻幀圖像的獲取,可以利用Sample Grabber過(guò)濾器的一個(gè)接口IsampeGrabberCB來(lái)實(shí)現(xiàn)。
(2)創(chuàng)建音視頻壓縮Filter。音視頻壓縮的實(shí)現(xiàn)過(guò)程是安裝需要的音視頻編解碼器,DirectX.Capture可枚舉出相應(yīng)的壓縮Filter,由AudioCompressor和VideoCompressor屬性分別記錄對(duì)應(yīng)設(shè)定值。這兩個(gè)屬性通過(guò)DirectShow的IBaseFilter接口定義,用來(lái)實(shí)現(xiàn)數(shù)據(jù)壓縮的處理[11]。音頻壓縮采用G.729標(biāo)準(zhǔn),視頻壓縮采用H.264壓縮標(biāo)準(zhǔn)。
從音視頻壓縮Filter的定義方式可看出,壓縮標(biāo)準(zhǔn)的選擇需要在數(shù)據(jù)采集前就完成設(shè)定,否則系統(tǒng)內(nèi)部的FilterGraph會(huì)因改變而重建,可能造成有效數(shù)據(jù)的丟失。endprint
(3)DirectShow音視頻同步播放控制。由于視頻比音頻的數(shù)據(jù)量大,音頻數(shù)據(jù)比視頻數(shù)據(jù)傳輸速率快這一特性,使得音視頻同步成為音視頻通信的關(guān)鍵技術(shù)。DirectShow通過(guò)給媒體數(shù)據(jù)加蓋時(shí)間戳來(lái)實(shí)現(xiàn)音頻和視頻的同步播放,但局域網(wǎng)中音視頻的采集方式具有間隔均勻(采樣頻率決定)、實(shí)時(shí)性等特點(diǎn),可適當(dāng)簡(jiǎn)化數(shù)據(jù)同步控制環(huán)節(jié)。
2.3 傳輸層技術(shù)應(yīng)用
P2P即時(shí)通信系統(tǒng)中,通信節(jié)點(diǎn)間可直接發(fā)送文本消息或進(jìn)行音、視頻實(shí)時(shí)通信。區(qū)分各類(lèi)數(shù)據(jù)信息的關(guān)鍵在于對(duì)應(yīng)數(shù)據(jù)類(lèi)型的定義不同,數(shù)據(jù)的通信交互流程基本原理是相同的。
對(duì)比TCP協(xié)議及UDP協(xié)議各自?xún)?yōu)勢(shì),選擇采用UDP方式收發(fā)通信消息,監(jiān)聽(tīng)控制則選用TCP協(xié)議來(lái)保證可靠傳輸。在有效接收文本消息的同時(shí),將數(shù)據(jù)保存在XML文檔中。
2.3.1 文本信息傳輸
用戶(hù)可利用UdpClient對(duì)象負(fù)責(zé)發(fā)送和接收消息。在System.Net.Sockets命名空間下的UdpClient類(lèi)對(duì)基礎(chǔ)Socket進(jìn)行封裝,提供發(fā)送和接收UDP數(shù)據(jù)報(bào)的方法。在發(fā)送線(xiàn)程中,利用UdpClient對(duì)象的Send方法,將UDP數(shù)據(jù)報(bào)發(fā)送到位于指定遠(yuǎn)程結(jié)點(diǎn)的主機(jī);在接收線(xiàn)程中,利用該對(duì)象的Receive方法來(lái)獲取從遠(yuǎn)程主機(jī)發(fā)送的UDP數(shù)據(jù)報(bào)。UDP方式不需要建立連接,可以在任何時(shí)候直接向網(wǎng)絡(luò)中的任意主機(jī)發(fā)送UDP數(shù)據(jù)。
2.3.2 音視頻數(shù)據(jù)實(shí)時(shí)傳輸
在建立網(wǎng)絡(luò)傳輸通路時(shí),需要分別創(chuàng)建音視頻數(shù)據(jù)的Socket連接,對(duì)應(yīng)的數(shù)據(jù)傳輸也是分離的。利用DirectShow技術(shù),在構(gòu)建Filter Graph前,將Socket相關(guān)操作都放入音視頻的接收/發(fā)送Filter中,可簡(jiǎn)化設(shè)計(jì)流程。
3 結(jié)語(yǔ)
本文對(duì).NET平臺(tái)下實(shí)現(xiàn)單純型P2P即時(shí)通信系統(tǒng)的關(guān)鍵技術(shù)進(jìn)行了研究,包括P2P網(wǎng)絡(luò)技術(shù)、PNRP名稱(chēng)解析協(xié)議及基于DirectShow技術(shù)的音視頻處理等,為P2P應(yīng)用軟件開(kāi)發(fā)提供了一種有效的解決方法。由于條件限制,系統(tǒng)功能還有待進(jìn)一步完善,例如消息存儲(chǔ)與管理功能中,可考慮采用數(shù)據(jù)緩存機(jī)制,減少XML文檔讀寫(xiě)頻率,對(duì)于音視頻數(shù)據(jù)可添加錄制、保存功能等。另外,僅討論了局域網(wǎng)的P2P通信,對(duì)位于不同子網(wǎng)的對(duì)等節(jié)點(diǎn)通信還需進(jìn)一步研究與探討。
參考文獻(xiàn):
[1] 張鵬.P2P技術(shù)在即時(shí)通信中的應(yīng)用及安全策略[J].信息通信,2015(1):178-179.
[2] 鄭阿奇.Visual C#網(wǎng)絡(luò)編程[M].北京:電子工業(yè)出版社,2012:134-145.
[3] 張春紅,裘曉峰,弭偉,等.P2P技術(shù)全面解析[M].北京:人民郵電出版社,2010:150-152.
[4] 段明瑋,王振,周弟偉.基于PNRP的P2P技術(shù)實(shí)現(xiàn)方案[J].科技研究,2012(11):109-110.
[5] 祝遠(yuǎn)緩.基于P2P的即時(shí)通信系統(tǒng)的研究[D].長(zhǎng)春:東北師范大學(xué),2012.
[6] 范先龍,郭傳雄,遲學(xué)斌.一種基于Windows Peer to Peer網(wǎng)絡(luò)的VoIP系統(tǒng)及其實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用研究,2006,11(4):220-223.
[7] 崔龍衛(wèi).基于P2P的音視頻通訊系統(tǒng)的研究與設(shè)計(jì)[D].武漢:武漢理工大學(xué),2011.
[8] 雷文禮,任新成,張棟,等.基于DirectShow的網(wǎng)絡(luò)視頻點(diǎn)播系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2015,38(7):31-33.
[9] 王新蕾,劉乃豐,夏濟(jì)海.基于DirectShow的視頻處理Filter組件設(shè)計(jì)與實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2016,39(13):46-50.
[10] 方文驍,張?jiān)阼?基于.NET框架的網(wǎng)絡(luò)視頻處理[J].計(jì)算機(jī)工程,2011(37):359-361.
[11] 孟月華,鄧基園.DirectShow技術(shù)的應(yīng)用研究與開(kāi)發(fā)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2013,22(6):196-199.
(責(zé)任編輯:杜能鋼)endprint