張 毅,馬 丹,唐 紅
(重慶郵電大學(xué) 通信與信息工程學(xué)院,重慶 400065)
軟交換是下一代網(wǎng)絡(luò)的控制功能實(shí)體,為NGN具有實(shí)時(shí)性要求的業(yè)務(wù)提供呼叫控制和連接控制功能,是下一代網(wǎng)絡(luò)呼叫與控制的核心。在軟交換中,一個(gè)重要的控制協(xié)議就是會(huì)話初始化協(xié)議(Session Initial Protocol,SIP)。SIP協(xié)議用來(lái)建立、修改和終止多媒體會(huì)話[1]。隨著交換技術(shù)的快速發(fā)展,實(shí)驗(yàn)課程也在不斷更新,軟交換和SIP協(xié)議等已成為該課程的主要內(nèi)容。因此,設(shè)計(jì)一套軟交換實(shí)驗(yàn)系統(tǒng)來(lái)配合理論教學(xué),使學(xué)生深入理解和掌握軟交換系統(tǒng)的工作原理已勢(shì)在必行。
為了將軟交換實(shí)驗(yàn)系統(tǒng)的內(nèi)部工作過(guò)程開(kāi)放出來(lái),該系統(tǒng)的一個(gè)重要任務(wù)就是實(shí)時(shí)監(jiān)聽(tīng)SIP通話創(chuàng)建、修改和釋放過(guò)程。還要實(shí)現(xiàn)包括用戶代理及服務(wù)器的配置、SIP網(wǎng)絡(luò)平臺(tái)和信令模塊的組建等其他的實(shí)驗(yàn)相關(guān)內(nèi)容,而Wireshark等通用平臺(tái)不能更好地與這些具體實(shí)驗(yàn)內(nèi)容相融合。基于此種需求,筆者設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)軟交換實(shí)驗(yàn)系統(tǒng)中用于監(jiān)聽(tīng)[2]和顯示SIP信令的軟件平臺(tái)。
軟交換實(shí)驗(yàn)系統(tǒng)分為硬件和軟件兩部分。硬件部分由網(wǎng)絡(luò)平臺(tái)和多個(gè)PC組成,如圖1所示。其中一臺(tái)PC做服務(wù)器主機(jī),其余PC做客戶端主機(jī)。其中的網(wǎng)絡(luò)平臺(tái)采用交換機(jī),因?yàn)楸緦?shí)驗(yàn)系統(tǒng)對(duì)使用人數(shù)(即端口數(shù))和帶寬等相關(guān)性能參數(shù)有更高的要求。但是,這種方法的實(shí)施增加了監(jiān)聽(tīng)的難度。筆者將深入探討交換式以太網(wǎng)環(huán)境下客戶端如何對(duì)服務(wù)器進(jìn)行遠(yuǎn)程監(jiān)聽(tīng)的方法。
軟件部分是由服務(wù)器端的SIP服務(wù)器和客戶端的軟交換終端及本軟件組成。網(wǎng)絡(luò)監(jiān)聽(tīng)技術(shù)有2個(gè)要點(diǎn):1)盡可能完整地捕獲網(wǎng)絡(luò)上的數(shù)據(jù)包;2)對(duì)捕獲到的數(shù)據(jù)包進(jìn)行分析和翻譯,并將翻譯結(jié)果顯示出來(lái)。因此,首先要在客戶端遠(yuǎn)程捕獲服務(wù)器端的SIP數(shù)據(jù)包,然后對(duì)捕獲到的數(shù)據(jù)包進(jìn)行分析,包括數(shù)據(jù)包的解析、保存、過(guò)濾和顯示。軟交換實(shí)驗(yàn)系統(tǒng)的軟件功能框圖如圖2所示。
交換環(huán)境下實(shí)現(xiàn)監(jiān)聽(tīng)的方法與共享環(huán)境下不同,共享環(huán)境下只要將主機(jī)設(shè)置成混雜模式就能監(jiān)聽(tīng)到其他主機(jī)間通信的數(shù)據(jù)包,而交換環(huán)境只能監(jiān)聽(tīng)到源地址或目的地址為本身的數(shù)據(jù)包,在交換環(huán)境下實(shí)現(xiàn)監(jiān)聽(tīng)其他主機(jī)間數(shù)據(jù)包的常用方法是地址解析協(xié)議(ARP)欺騙[3]。ARP用于將32位IP地址映射為以太網(wǎng)的48位MAC地址,以便將數(shù)據(jù)包封裝成幀進(jìn)行發(fā)送。ARP欺騙就是通過(guò)向目標(biāo)主機(jī)發(fā)送一個(gè)包含偽造的IP-MAC映射信息的ARP應(yīng)答報(bào)文,當(dāng)目的主機(jī)收到此應(yīng)答報(bào)文后就會(huì)更新其ARP高速緩存,從而使目標(biāo)主機(jī)將數(shù)據(jù)包發(fā)送給錯(cuò)誤的對(duì)象。但是ARP欺騙的監(jiān)聽(tīng)方式存在缺陷,比如,如果局域網(wǎng)內(nèi)2臺(tái)客戶端主機(jī)A和B同時(shí)向主機(jī)C發(fā)送呼叫請(qǐng)求,A和B就會(huì)同時(shí)向服務(wù)器發(fā)送內(nèi)容為C主機(jī)IP對(duì)應(yīng)A主機(jī)MAC地址和B主機(jī)IP對(duì)應(yīng)C主機(jī)MAC地址的ARP應(yīng)答報(bào)文,這樣服務(wù)器就會(huì)發(fā)生混亂,不能識(shí)別C主機(jī)。
筆者使用 WinPcap(Windows Packet Capture)函數(shù)庫(kù)提供的遠(yuǎn)程捕獲數(shù)據(jù)包功能[4],克服了ARP欺騙的缺陷,實(shí)現(xiàn)了交換環(huán)境下在客戶端捕獲到服務(wù)器端數(shù)據(jù)包的功能,方法簡(jiǎn)單可靠。
圖2 軟交換實(shí)驗(yàn)系統(tǒng)的軟件功能框圖
基于上述分析,本軟件的主要任務(wù)是捕獲和分析SIP數(shù)據(jù)包。在實(shí)驗(yàn)系統(tǒng)交換環(huán)境下,服務(wù)器端運(yùn)行遠(yuǎn)程捕獲數(shù)據(jù)包的后臺(tái)程序,該程序能夠在遠(yuǎn)程主機(jī)上捕獲數(shù)據(jù)包,并把捕獲到的數(shù)據(jù)包發(fā)回客戶端主機(jī);客戶端運(yùn)行本監(jiān)聽(tīng)軟件,接收并分析捕獲到的SIP數(shù)據(jù)包。WinPcap的捕獲遠(yuǎn)程數(shù)據(jù)包功能主要由pcap_findalldevs_ex()函數(shù)來(lái)實(shí)現(xiàn),將該函數(shù)中的參數(shù)source設(shè)置成遠(yuǎn)程主機(jī)的IP地址和網(wǎng)卡設(shè)備,即可捕獲到相應(yīng)遠(yuǎn)程主機(jī)的數(shù)據(jù)包。
數(shù)據(jù)包捕獲模塊的主要功能是采集數(shù)據(jù),這是整個(gè)軟件的基礎(chǔ)和數(shù)據(jù)來(lái)源。使用ARP欺騙方式監(jiān)聽(tīng)數(shù)據(jù)包不適合較大數(shù)據(jù)通信量的網(wǎng)絡(luò),也不適用于本實(shí)驗(yàn)系統(tǒng)。因此,使用Windows平臺(tái)下一個(gè)免費(fèi)、公共的網(wǎng)絡(luò)訪問(wèn)系統(tǒng)WinPcap捕獲網(wǎng)絡(luò)中的原始數(shù)據(jù)包。
設(shè)計(jì)程序時(shí)首先初始化WinPcap:獲取設(shè)備列表并返回適配器的詳細(xì)信息,打開(kāi)適配器并返回一個(gè)包捕獲器的描述符,通過(guò)設(shè)置數(shù)據(jù)流過(guò)濾規(guī)則實(shí)現(xiàn)過(guò)濾數(shù)據(jù)包。初始化完成之后,新建線程,在新線程中捕獲基于IPv4的用戶數(shù)據(jù)協(xié)議(User Datagram Protocol,UDP)數(shù)據(jù)包[5]。 數(shù)據(jù)包捕獲流程如圖3所示。
圖3 數(shù)據(jù)包捕獲流程圖
該模塊的主要功能就是對(duì)捕獲的數(shù)據(jù)包按照數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層和應(yīng)用層的層次結(jié)構(gòu)自底向上進(jìn)行解析:通過(guò)設(shè)置WinPcap過(guò)濾條件捕獲到基于IPv4的UDP數(shù)據(jù)包,根據(jù)UDP使用不同的端口號(hào)為不同的應(yīng)用保留各自的數(shù)據(jù)傳輸通道從UDP數(shù)據(jù)包中篩選出SIP數(shù)據(jù)包,根據(jù)SIP數(shù)據(jù)包的第1個(gè)換行符判定起始行的內(nèi)容,根據(jù)起始行的前7個(gè)字符是否為“SIP/2.0”解析出請(qǐng)求方法或狀態(tài)碼。SIP消息解析流程如圖4所示。
圖4 SIP消息解析流程圖
監(jiān)聽(tīng)程序在運(yùn)行的時(shí)候需要消耗大量的處理器時(shí)間,此時(shí)如果對(duì)數(shù)據(jù)包內(nèi)容進(jìn)行詳細(xì)分析就會(huì)造成丟包,所以應(yīng)先保存數(shù)據(jù)包再整理分析。但是,SIP消息的長(zhǎng)度不確定,而且每次捕獲到數(shù)據(jù)包的個(gè)數(shù)也不確定,所以要使用vector(一個(gè)能夠存放任意類型的動(dòng)態(tài)數(shù)組)來(lái)存儲(chǔ)捕獲到的任意長(zhǎng)度字符串形式的數(shù)據(jù)包。將數(shù)據(jù)包的內(nèi)容壓入堆棧,在調(diào)用某條數(shù)據(jù)包時(shí),即可將對(duì)應(yīng)序號(hào)的數(shù)據(jù)包內(nèi)容顯示到界面上。
通過(guò)監(jiān)聽(tīng)SIP代理服務(wù)器,能將若干個(gè)通話流程的SIP數(shù)據(jù)包全部捕獲到本地主機(jī),因此捕獲到SIP數(shù)據(jù)包之后,要對(duì)數(shù)據(jù)包再一次進(jìn)行過(guò)濾,將需要查看流程的SIP數(shù)據(jù)包過(guò)濾出來(lái)。根據(jù)捕獲數(shù)據(jù)包的主、被叫的用戶名來(lái)提取出需要查看流程的數(shù)據(jù)包。根據(jù)From和To頭字段中的內(nèi)容找到主、被叫用戶名與所需查看的主、被叫用戶名對(duì)比,即可過(guò)濾出需要的數(shù)據(jù)包。
軟件界面圖由MFC編寫(xiě),主窗口被列表框和編輯框劃分成上下兩個(gè)窗口。將解析出的SIP數(shù)據(jù)包時(shí)間、長(zhǎng)度、源IP地址/源端口號(hào)、目的IP地址/目的端口號(hào)、消息的起始行等值,賦給相應(yīng)的全局變量,在列表框中調(diào)用這些變量用于實(shí)時(shí)顯示相應(yīng)數(shù)據(jù)包頭部信息。單擊列表框的某行數(shù)據(jù)包頭部信息可以調(diào)用存儲(chǔ)SIP數(shù)據(jù)包字符串?dāng)?shù)組對(duì)應(yīng)位置的元素,在編輯框中顯示該數(shù)據(jù)包的完整內(nèi)容。
利用MFC函數(shù)新建一個(gè)對(duì)話框用于顯示呼叫流程圖,先用Windows自帶的繪圖函數(shù)構(gòu)成畫(huà)箭頭模塊[6],然后從保存數(shù)據(jù)包數(shù)組中循環(huán)取出每個(gè)數(shù)據(jù)包的源、目的IP和請(qǐng)求方法/狀態(tài)碼,畫(huà)出每條流程,最后組成完整的呼叫流程圖。
設(shè)定2個(gè)客戶端A(用戶名為100,地址為172.22.141.150)和 B(用戶名為 101,地址為 172.22.141.143)通過(guò)SIP服務(wù)器(IP地址為172.22.141.25)進(jìn)行通信。在客戶端A的主機(jī)上同時(shí)運(yùn)行Wireshark和本軟件對(duì)通信過(guò)程的數(shù)據(jù)包進(jìn)行監(jiān)聽(tīng)。圖5、圖6分別為本軟件和Wireshark捕獲到SIP數(shù)據(jù)包的界面。圖7、圖8分別為本軟件和Wireshark繪制的呼叫流程圖。
由圖5、圖6可知,Wireshark和本軟件捕獲到的SIP數(shù)據(jù)包內(nèi)容一致,證明了本軟件的正確性,Wireshark抓包軟件對(duì)數(shù)據(jù)包的分析更細(xì)致,但本軟件對(duì)數(shù)據(jù)包整體內(nèi)容的顯示更加簡(jiǎn)潔明了,更適合于教學(xué)。同時(shí),如在本軟件的“輸入主叫用戶名”和“輸入被叫用戶名”編輯框中輸入非本機(jī)客戶端的用戶名,可以監(jiān)聽(tīng)到其他客戶端之間的通話流程。
由圖7、圖8可知,Wireshark和本軟件繪制的呼叫流程圖相同,但Wireshark的流程圖中包括了很多附加信息,比如,端口號(hào)和請(qǐng)求/狀態(tài)標(biāo)志,而本軟件對(duì)呼叫流程圖進(jìn)行了優(yōu)化,使流程圖更加清晰簡(jiǎn)潔。其詳細(xì)信息通過(guò)點(diǎn)擊各流程狀態(tài)來(lái)展示。
綜上所述,本軟件僅針對(duì)SIP協(xié)議進(jìn)行了監(jiān)聽(tīng),并且將該功能集成到整個(gè)實(shí)驗(yàn)系統(tǒng)中,其功能和效果與Wireshark一致,且更適合于教學(xué)的需求。
本系統(tǒng)實(shí)現(xiàn)了在交換網(wǎng)絡(luò)中捕獲和分析軟交換實(shí)驗(yàn)系統(tǒng)SIP數(shù)據(jù)包的功能,達(dá)到實(shí)驗(yàn)教學(xué)的要求,使學(xué)生更容易理解軟交換和SIP協(xié)議的知識(shí)。
[1]IETFRFC3261,SIP:Session Initiation Protocol[S].2002.
[2]王艷艷,房子河,郅晨,等.基于數(shù)字網(wǎng)絡(luò)視頻監(jiān)控的SIP信令系統(tǒng)設(shè)計(jì)[J].電視技術(shù),2008,32(5):77-87.
[3]盛志偉,劉仕筠,李群.以太網(wǎng)數(shù)據(jù)包捕獲與轉(zhuǎn)發(fā)技術(shù)[J].微計(jì)算機(jī)信息,2006(34):279-282.
[4]許愛(ài)軍,謝娟,張華.基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)解析及其實(shí)現(xiàn)[J].科學(xué)技術(shù)與工程,2009(10):2797-2800.
[5]王亞非.SIP通信網(wǎng)絡(luò)監(jiān)聽(tīng)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].北京:北京郵電大學(xué),2008.
[6]孫鑫,余安萍.VC++深入詳解[M].北京:電子工業(yè)出版社,2006.