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