SIP應用層網(wǎng)關(guān)技術(shù)
引言
本文引用地址:http://dyxdggzs.com/article/156365.htmSIP (Session Initiation Protocol)稱(chēng)為會(huì )話(huà)初始協(xié)議[1][4],是一個(gè)與HTTP和SMTP類(lèi)似的、基于文本的協(xié)議,SIP獨立于傳輸層協(xié)議和其它會(huì )話(huà)控制協(xié)議,可以與其他協(xié)議(如RSVP,RTSP等)一起構建多媒體通信系統如智能家居網(wǎng)絡(luò )、視頻會(huì )議[2]等。
NAT/防火墻(FW)為私網(wǎng)提供統一的對外出口,從而隱藏內部網(wǎng)絡(luò )的拓撲結構,提高了私網(wǎng)的安全性[3]。但這也給私網(wǎng)的遠程控制應用帶來(lái)很大的麻煩。對于NAT,其功能是在公網(wǎng)IP地址及端口和私網(wǎng)IP地址及端口間進(jìn)行映射,工作在傳輸層,它只對TCP/UDP包頭中的地址、端口進(jìn)行修改,而SIP協(xié)議需要在信令消息中內嵌IP地址和端口號[5],這些地址、端口在應用層上才可見(jiàn),因此NAT不會(huì )對其中的地址信息進(jìn)行修改,導致信令消息中的IP地址和端口不能指向正確的地址,因而通信也不能正常進(jìn)行;對于FW,對公網(wǎng)打開(kāi)的端口通常是固定的(Fw不會(huì )在運行過(guò)程中動(dòng)態(tài)的打開(kāi)或者關(guān)閉這些端口),且數目有限。而基于SIP構建的私網(wǎng)的遠程控制應用要求FW不但能夠提供對信令協(xié)議的代理功能,而且要求FW能夠在通信過(guò)程中動(dòng)態(tài)的打開(kāi)一些端口進(jìn)行媒體流數據的交流,現有的FW難以滿(mǎn)足這個(gè)要求。
鑒于上述原因,本文提出了“SIP應用層網(wǎng)關(guān)”技術(shù),并將其應用于網(wǎng)絡(luò )通信中來(lái)建立相對合理、完善的SIP網(wǎng)絡(luò ),以解決SIP私網(wǎng)遠程控制中穿越NAT/FireWall的難題。
SIP私網(wǎng)穿越NAT/防火墻方法分析
由于所有NAT和Firewall都是對于TCP/IP層以下進(jìn)行處理和過(guò)濾的,而SIP是應用層控制信令協(xié)議,SIP與下面的傳輸層和網(wǎng)絡(luò )層協(xié)議無(wú)關(guān)。所以必須采用其他的途徑來(lái)解決基于SIP的私網(wǎng)穿越NAT/防火墻這一問(wèn)題,主要有以下不同的解決方案:1.UpnP(通用即插即用);2.TURN(Traversal Using Relay NAT);3.STUN(Simple Traversal of UDP Through network Address Translators);4.ALG(Application Layer Gateway,應用層網(wǎng)關(guān))。
其中前3種都是由SIP Client(包括UA和Proxy)通過(guò)某種手段或協(xié)議在INVITE之前獲取自己的公網(wǎng)地址和端口。需要SIP Client提供額外支持,并且也不適應所有的NAT方式。ALG(Application Layer Gateway)[2]適應所有NAT方式,并不需要SIP Client做任何額外的支持。它對Application層的SIP信令進(jìn)行處理和修改,從而做到透明轉換地址。該思想的基本思路是通過(guò)在NAT/FW中加入協(xié)議認知(Protocol Awareness)能力,使NAT/FW能夠在SIP信令消息通過(guò)時(shí)修改其內容中的地址信息,ALG修改SIP消息里面的SIP地址和端口,并為分配給呼叫雙方的地址和端口進(jìn)行綁定,這樣,以后的媒體流數據能夠通過(guò)NAT/FW指定的端口穿過(guò)。本文主要討論的是基于SIP的應用層網(wǎng)關(guān)方法。
SIP應用層網(wǎng)關(guān)原理分析
“SIP應用層網(wǎng)關(guān)”是為解決基于SIP的私網(wǎng)控制應用穿越NAT/FW的問(wèn)題,實(shí)現私網(wǎng)內的SIP用戶(hù)代理與公網(wǎng)上的SIP用戶(hù)代理之間的互連而提出的解決方案,從功能上來(lái)說(shuō),SIP應用層網(wǎng)關(guān)是一種為私網(wǎng)內的SIP終端提供連接到公網(wǎng)的代理功能的SIP設備或軟件。下文中提及的“應用層網(wǎng)關(guān)”和ALG(Application Level Gateway)都是指SIP應用層網(wǎng)關(guān)。
為了實(shí)現SIP應用層網(wǎng)關(guān)的功能,同時(shí)保持與已有SIP應用的兼容性,必須把ALG設計成一個(gè)SIP兼容的應用。但是對于私網(wǎng)上和公網(wǎng)上的SIP應用而言,ALG提供的功能并不完全相同:對于私網(wǎng)的SIP終端,SIP應用層網(wǎng)關(guān)的角色是一個(gè)SIP意義上的代理服務(wù)器(Proxy),它不但需要為通往公網(wǎng)上的呼叫提供代理,同時(shí)還需要為私網(wǎng)內部不同SIP終端之間的呼叫提供代理;另一方面ALG必須允許私網(wǎng)內部SIP終端進(jìn)行注冊,因為只有通過(guò)注冊才能使SIP終端明白ALG是它們的代理服務(wù)器,因此,SIP應用層網(wǎng)關(guān)同時(shí)也是私網(wǎng)上的SIP注冊服務(wù)器。而對于公網(wǎng)上的SIP終端而言,私網(wǎng)內部是不可見(jiàn)的,唯一可見(jiàn)的是處于公網(wǎng)上的SIP應用層網(wǎng)關(guān),因此對它而言,ALG只是一個(gè)SIP終端,公網(wǎng)上的SIP設備就能夠直接對它進(jìn)行呼叫或者接收它的呼叫。
綜上所述,SIP應用層網(wǎng)關(guān)功能在私網(wǎng)和公網(wǎng)上是非對稱(chēng)的,可劃分為:1.對內功能:SIP應用層網(wǎng)關(guān)是私網(wǎng)上的SIP注冊服務(wù)器和代理服務(wù)器,同時(shí),對于跨網(wǎng)呼叫的情況,SIP應用層網(wǎng)關(guān)除需為私網(wǎng)終端提供SIP消息的代理,還須提供媒體流數據的代理,這種媒體數據的代理功能對通信雙方是透明的;對外功能:在公網(wǎng)上,SIP應用層網(wǎng)關(guān)作為一個(gè)普通的SIP終端而存在,它能夠與公網(wǎng)上的其它SIP應用建立互連關(guān)系,并隱藏ALG與私網(wǎng)內部SIP應用之間的關(guān)系。
SIP應用層網(wǎng)關(guān)的實(shí)現
本節前面部分詳細的介紹了SIP應用層網(wǎng)關(guān)實(shí)現的理論基礎,本節介紹ALG的軟件實(shí)現方式,軟件開(kāi)發(fā)平臺是Windows2000,開(kāi)發(fā)工具是Visua1C++ 6.0,采用的是OSIP協(xié)議棧,開(kāi)發(fā)的語(yǔ)言主要是C。
結構及工作流程
這里ALG被分成兩個(gè)部分:ALG主體部分和SIP URI信息管理系統部分,這兩部分被設計成是兩個(gè)相互獨立的程序。ALG主體部分的功能是處理各種流向上的SIP消息、管理呼叫環(huán)境以及跨網(wǎng)絡(luò )呼叫時(shí),在通信雙方之間進(jìn)行RTP數據包的轉發(fā);SIP URI信息管理系統部分的功能是負責私網(wǎng)內部SIP URI及其綁定信息的管理和維護,該系統及其維護的數據庫放置在私網(wǎng)內部的其它主機上運行。兩部分之間通過(guò)UDP/TCP進(jìn)行通信,這樣可以減小來(lái)自外網(wǎng)上攻擊的風(fēng)險,從而提高數據信息的安全性。 由于A(yíng)LG主體無(wú)法直接對SIPURI的數據信息進(jìn)行訪(fǎng)問(wèn),因此必須在這兩部分之間提供訪(fǎng)問(wèn)的接口,“信息數據庫接口”模塊就是為 ALG訪(fǎng)問(wèn)SIP URI信息管理系統的接口。
SIP應用層網(wǎng)關(guān)的主要工作由一個(gè)SIP消息的監聽(tīng)線(xiàn)程、一個(gè)與SIP URI信息管理系統進(jìn)行通信的線(xiàn)程、一個(gè)SIP消息處理線(xiàn)程(包括對話(huà)的管理和維護)和數量不定的RTP數據包轉發(fā)線(xiàn)程完成。RTP數據包轉發(fā)線(xiàn)程能夠根據需要而動(dòng)態(tài)的生成和釋放,因此數量不定。
SIP應用層網(wǎng)關(guān)的基本工作流程如下:
應用程序初始化完畢以后,啟動(dòng)SIP消息監聽(tīng)線(xiàn)程、URI信息數據庫訪(fǎng)問(wèn)線(xiàn)程和SIP消息處理線(xiàn)程。SIP消息監聽(tīng)線(xiàn)程對ALG的所有SIP端口(包括私網(wǎng)和公網(wǎng))進(jìn)行監聽(tīng),如果收到SIP消息,它把消息連同其源IP地址和端口以及消息本身的長(cháng)度封裝成一個(gè)簡(jiǎn)單的數據結構放入一個(gè)先入先出的隊列(FIFO)當中,然后繼續監聽(tīng),它不對消息進(jìn)行進(jìn)一步的處理。
一旦FIFO中有了SIP消息,SIP消息處理線(xiàn)程就被喚醒,并投入運行,它從FIFO中取走消息,然后開(kāi)始對這個(gè)消息進(jìn)行處理:首先它對消息進(jìn)行解析以及例行的語(yǔ)法檢查,然后根據SIP消息的源地址和目的地址將其分成四類(lèi):
(1)內部消息,其源地址和目的地址都在私網(wǎng)內部。
(2)對外消息,其源地址是私網(wǎng)地址,目的地址是公網(wǎng)地址。
(3)對內消息,其源地址是公網(wǎng)地址,目的地址是ALG的公網(wǎng)地址。
(4)外部消息,其源地址和目的地址都是公網(wǎng)地址。
SIP消息被分成以上四類(lèi)后,ALG對它們進(jìn)行不同的處理。第(1)類(lèi)消息稱(chēng)為“內部消息”,第(2)類(lèi)和第(3)類(lèi)消息統稱(chēng)為“跨網(wǎng)絡(luò )消息”;第(4)類(lèi)消息稱(chēng)為“外部消息”,它會(huì )被無(wú)條件丟棄,ALG不對其作進(jìn)一步的處理。SIP消息處理線(xiàn)程在對“跨網(wǎng)絡(luò )消息”消息進(jìn)行處理的同時(shí),對呼叫的上下文環(huán)境進(jìn)行管理和維護,并在必要的時(shí)候,啟動(dòng)新的RTP數據包轉發(fā)線(xiàn)程,使其完成對跨網(wǎng)絡(luò )通信的RTP數據包的轉發(fā)工作。
基于SOCKET消息接收與應答功能模塊
由于UDP包的接收是異步的,ALG無(wú)法預測何時(shí)會(huì )有SIP消息到來(lái),因此在SIP應用層網(wǎng)關(guān)的設計中,用單獨的線(xiàn)程對SIP端口進(jìn)行監聽(tīng)。由于SIP應用層網(wǎng)關(guān)處在兩個(gè)網(wǎng)絡(luò )的邊界上,并在兩網(wǎng)之間轉發(fā)數據,因此ALG的SIP端口也相應的分為私網(wǎng)和公網(wǎng)兩部分,在任何一邊的網(wǎng)絡(luò )上,都可以打開(kāi)一個(gè)或者多個(gè)與套節字(SOCKET)相聯(lián)系的SIP端口。并且每隔一定時(shí)間試圖從所有監聽(tīng)的SIP端口相關(guān)聯(lián)的SOCKET上讀取數據,如果讀到了數據,就對數據做簡(jiǎn)單的封裝,然后把它放入應用層網(wǎng)關(guān)的SIP消息FIFO當中。
c++相關(guān)文章:c++教程
tcp/ip相關(guān)文章:tcp/ip是什么
評論