《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 通信與網(wǎng)絡(luò) > 業(yè)界動(dòng)態(tài) > SIP ALG穿透NAT的實(shí)現(xiàn)

SIP ALG穿透NAT的實(shí)現(xiàn)

2008-05-05
作者:沈 軍1,周淑華2,張思發(fā)1

  摘 要: 為解決SIP應(yīng)用穿透NAT的問題,剖析了NAT的工作原理,并針對(duì)SIP協(xié)議信令" title="信令">信令過程的特點(diǎn),提出了采用ALG設(shè)備解決NAT的穿透問題,具體設(shè)計(jì)了ALG的結(jié)構(gòu)和相關(guān)實(shí)現(xiàn)算法,并給出了詳細(xì)的實(shí)現(xiàn)方案。
  關(guān)鍵詞: 會(huì)話發(fā)起協(xié)議(SIP) 網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT) 會(huì)話描述協(xié)議(SDP) 信令


  會(huì)話發(fā)起協(xié)議SIP[1](Session Initiation Protocol)是由IETF組織于1999年提出的在Internet網(wǎng)絡(luò)環(huán)境中實(shí)現(xiàn)實(shí)時(shí)通信應(yīng)用的一種信令協(xié)議。SIP引發(fā)了現(xiàn)代通信體系結(jié)構(gòu)的變革,然而它卻在視頻能力、會(huì)議控制方面沒有一個(gè)完善的標(biāo)準(zhǔn);同時(shí),由于大量企業(yè)和駐地網(wǎng)都采用了私有編址[2],并通過網(wǎng)絡(luò)地址轉(zhuǎn)換NAT(Network Address Translation)來(lái)控制與公共網(wǎng)絡(luò)的通信,而SIP數(shù)據(jù)包需通過信令消息中的IP地址和端口號(hào)" title="端口號(hào)">端口號(hào)來(lái)實(shí)現(xiàn)目的地尋址,且它的媒體流" title="媒體流">媒體流端口是動(dòng)態(tài)分配的,這就為在NAT上配置固定的包過濾策略帶來(lái)了困難。因此,SIP穿透NAT是絕大多數(shù)VoIP運(yùn)營(yíng)商亟待解決的問題。
  當(dāng)前,幾種主要的NAT穿透技術(shù)有SIP ALG、Full Proxy、MidCom、VPN、隧道穿透、STUN等。其中,SIP ALG方式是在傳統(tǒng)的NAT上進(jìn)行擴(kuò)展,使之具備感知SIP呼叫控制協(xié)議的能力,從而對(duì)基于SIP呼叫的地址實(shí)現(xiàn)穿透。它是一種比較簡(jiǎn)單的方案,最突出的特點(diǎn)是ALG和具體的SIP系統(tǒng)無(wú)關(guān),對(duì)于一個(gè)SIP系統(tǒng)不需要做任何修改,只要在響應(yīng)的NAT上加載SIP ALG,就能完成私網(wǎng)到公網(wǎng)甚至私網(wǎng)中的兩個(gè)用戶之間的SIP連接。
1 SIP應(yīng)用穿透NAT面臨的問題
1.1 NAT的工作原理
  NAT[3]被置于兩網(wǎng)間的邊界。NAT技術(shù)使得一個(gè)私有網(wǎng)絡(luò)可以通過Internet注冊(cè)IP連接到外部世界。位于內(nèi)網(wǎng)" title="內(nèi)網(wǎng)">內(nèi)網(wǎng)和外網(wǎng)中的NAT路由器在發(fā)送數(shù)據(jù)包之前,負(fù)責(zé)把內(nèi)部IP翻譯成外部合法地址。當(dāng)從外網(wǎng)來(lái)的含公網(wǎng)地址信息的數(shù)據(jù)包到達(dá)NAT時(shí),NAT使用預(yù)設(shè)好的規(guī)則(其組元包含源地址、源端口、目的地址、目的端口、協(xié)議)來(lái)修改數(shù)據(jù)包,然后再轉(zhuǎn)發(fā)給內(nèi)網(wǎng)接收點(diǎn)。NAT的基本工作原理如圖1所示,NAT設(shè)備實(shí)際上是在維護(hù)一個(gè)狀態(tài)表,該表用于把非法的IP地址映射" title="地址映射">地址映射到合法的IP地址上。


1.2 技術(shù)難點(diǎn)
  與傳統(tǒng)NAT支持HTTP等數(shù)據(jù)的穿透不同,SIP應(yīng)用中的語(yǔ)音和視頻數(shù)據(jù)需通過信令消息中的IP地址和端口號(hào)來(lái)實(shí)現(xiàn)目的地尋址,因此信令消息在地址穿透中不僅需要對(duì)TCP/UCP層的端口信息以及IP層的源地址和目的地址進(jìn)行變換,還需對(duì)IP包載荷中的相關(guān)地址信息進(jìn)行變換。同時(shí),對(duì)于SIP應(yīng)用來(lái)說,是在控制信息中動(dòng)態(tài)地協(xié)商媒體流端口,信令協(xié)議中的IP地址也是私有的,因此要準(zhǔn)確把握相關(guān)的地址和端口信息,并進(jìn)行正確的轉(zhuǎn)換。這是本文需要解決的首要技術(shù)難點(diǎn)。
  其次,SIP ALG實(shí)現(xiàn)對(duì)NAT的穿透會(huì)因呼叫方處在內(nèi)網(wǎng)和外網(wǎng)而不同,因此對(duì)進(jìn)出NAT的SIP消息在解析時(shí)要判斷是內(nèi)網(wǎng)之間的呼叫請(qǐng)求(內(nèi)部消息)、外網(wǎng)呼叫請(qǐng)求內(nèi)網(wǎng)(對(duì)內(nèi)消息),還是內(nèi)網(wǎng)呼叫請(qǐng)求外網(wǎng)(對(duì)外消息),以便對(duì)該消息進(jìn)行正確處理。這也是本文需要解決的技術(shù)難點(diǎn)。
2 SIP ALG的設(shè)計(jì)思想
  由于媒體流端口是在呼叫雙方SIP信令建立連接后動(dòng)態(tài)協(xié)商的,因此對(duì)SIP消息穿透NAT設(shè)備要綜合考慮這兩個(gè)方面因素。
2.1 SIP信令的穿透原理
  SIP信令穿透NAT與HTTP穿透類似,NAT設(shè)備只要打開固定的端口,就能保證SIP信令穿透NAT并與外界建立連接。
  本文基于SIP終端設(shè)備的特殊性來(lái)考慮信令穿透NAT。SIP終端設(shè)備會(huì)周期性地發(fā)送Register消息[1]到注冊(cè)服務(wù)器上,由于不斷有信令消息經(jīng)過NAT設(shè)備,致使NAT設(shè)備對(duì)通過的消息流始終保持一個(gè)確定的端口;同時(shí),當(dāng)Register消息經(jīng)過ALG,ALG就會(huì)記錄信令穿透NAT時(shí)經(jīng)NAT轉(zhuǎn)換后的IP地址和端口等信息,并將此信息與NAT后面的終端用戶ID(如890010098)等信息進(jìn)行綁定。這樣,當(dāng)一個(gè)信令到來(lái),ALG將通過NAT上正確的地址和端口發(fā)送給被叫方。
2.2 媒體流的穿透原理
  當(dāng)信令穿透NAT后,NAT后面的SIP終端就可以收到來(lái)自外網(wǎng)的呼叫請(qǐng)求。這時(shí)呼叫方的Invite消息和響應(yīng)方的200(OK)消息中都攜帶了用于描述與會(huì)話相關(guān)的信息及與流媒體相關(guān)參數(shù)的SDP(Session Description Protocol)消息體[4]。當(dāng)該消息通過ALG時(shí),ALG將通過與該媒體流相關(guān)的呼叫——會(huì)話層消息中的用戶ID(如890010098)識(shí)別出NAT上的IP地址和端口并進(jìn)行相應(yīng)的轉(zhuǎn)換,這樣當(dāng)呼叫方收到200(OK)消息時(shí)就能從SDP消息體中獲取該IP地址和端口等信息并發(fā)送ACK確認(rèn)消息,從而完成一個(gè)會(huì)話的建立。
3 SIP ALG的實(shí)現(xiàn)
  利用SIP ALG實(shí)現(xiàn)對(duì)NAT的穿透,主要是對(duì)流經(jīng)ALG的SIP消息進(jìn)行處理和維護(hù)。按照各部分功能的差異,可以將SIP ALG劃分為消息解析模塊、消息修改模塊和消息轉(zhuǎn)發(fā)模塊,SIP ALG的整體結(jié)構(gòu)如圖2所示,該圖體現(xiàn)了各功能模塊間的相互關(guān)系。


  下面以一個(gè)典型的兩個(gè)不同NAT內(nèi)的用戶(Joe:890010098@192.168.1.4和Bob:810000004@10.10.15.44)通過注冊(cè)服務(wù)器(SER服務(wù)器)完成連接的過程為例,來(lái)說明SIP ALG的具體實(shí)現(xiàn)。SIP ALG解決NAT穿透的示意圖如圖3所示。


3.1 前提條件
  SIP ALG的實(shí)現(xiàn)主要是對(duì)Request、Response消息進(jìn)行解析、修改與轉(zhuǎn)發(fā)。因此在實(shí)現(xiàn)ALG前首先要了解SIP請(qǐng)求(Request)的方法(Register、Invite、ACK、Options、Cancel、Bye)[1],SIP回答(Response,包括Trying、Ringing、OK和ACK)[1]以及SIP消息中的相關(guān)頭域(Request-URI、Via、From、To、Call-ID、Cseq、Contact等)[1]。
3.2 消息解析模塊的實(shí)現(xiàn)
  消息解析模塊主要對(duì)流經(jīng)ALG的SIP消息進(jìn)行解析,并判斷該消息是內(nèi)部消息、對(duì)外消息還是對(duì)內(nèi)消息,以便消息修改模塊能對(duì)這些消息進(jìn)行正確的處理。消息解析模塊的工作流程如圖4所示。它主要判斷數(shù)據(jù)包From、To、Via等頭域中的IP地址信息,以準(zhǔn)確解析消息類型。


3.3 消息修改模塊的實(shí)現(xiàn)
  由于同一NAT內(nèi)部的用戶間可以直接通信,因此“內(nèi)部消息處理”模塊不需要對(duì)消息體進(jìn)行修改。這樣就把消息修改模塊分為對(duì)內(nèi)消息修改與對(duì)外消息修改。這兩個(gè)過程實(shí)際上是可逆的。對(duì)內(nèi)消息修改主要根據(jù)地址映射表把外網(wǎng)IP和端口號(hào)轉(zhuǎn)換成內(nèi)部IP和端口號(hào),以便外部請(qǐng)求能準(zhǔn)確到達(dá)NAT內(nèi)側(cè)的用戶端;對(duì)外消息修改則根據(jù)地址映射表把內(nèi)部IP和端口號(hào)轉(zhuǎn)化成外網(wǎng)可用的IP和端口號(hào),這樣,來(lái)自外網(wǎng)的請(qǐng)求就能準(zhǔn)確定位到該地址。但無(wú)論哪個(gè)模塊,最終結(jié)果都是對(duì)相應(yīng)的Request和Response消息中與NAT有關(guān)的IP地址和端口號(hào)進(jìn)行修改。消息修改模塊的處理流程如圖5所示。


  對(duì)信令消息的修改需要對(duì)Invite、ACK、BYE和Register等Request消息和100(Tring)、180(Ringing)以及200(OK)等Response消息中的Via、From、To、Call-ID、Contact等頭域中包含的私有IP地址和端口信息進(jìn)行修改。而對(duì)SDP消息體的處理是SIP ALG實(shí)現(xiàn)其功能的關(guān)鍵所在,因?yàn)镾DP消息體的交換是實(shí)現(xiàn)呼叫雙方媒體流通信的前提和關(guān)鍵。對(duì)SIP控制的向內(nèi)的媒體流轉(zhuǎn)發(fā),ALG分析向外的Invite和200(OK)消息中的SDP消息體中“Media Description”和“Connection Information”行,根據(jù)這兩行中的描述地址在NAT上啟用未用端口,完成向內(nèi)接收媒體流的目的地址翻譯,從而實(shí)現(xiàn)媒體流通信的建立。需要注意的是,在對(duì)Response消息進(jìn)行修改時(shí),還需通過Call-ID匹配呼叫的上下文環(huán)境,也要加入Record-Route頭域以告知內(nèi)網(wǎng)上的SIP終端,本次呼叫中以后所有的SIP消息都要流經(jīng)該SIP ALG,這樣才能保證ALG的正確轉(zhuǎn)發(fā)。最后,對(duì)消息修改完畢后,需要重新計(jì)算消息的長(zhǎng)度,并保存在Content-Length中。
3.4 消息轉(zhuǎn)發(fā)模塊的實(shí)現(xiàn)
  消息轉(zhuǎn)發(fā)模塊主要是通過控制NAT,對(duì)修改后的SIP消息進(jìn)行轉(zhuǎn)發(fā),以完成一個(gè)會(huì)話的建立。消息轉(zhuǎn)發(fā)模塊在ALG中保留并維護(hù)當(dāng)前呼叫的上下文環(huán)境,也就是一個(gè)地址映射信息表,如表1所示。以記錄相關(guān)的地址映射信息。


  表1中的數(shù)據(jù)表示所有目的地址為202.205.11.230、60012的SIP包都會(huì)被NAT網(wǎng)關(guān)轉(zhuǎn)發(fā)到主機(jī)10.10.15.44:5060上處理。消息修改模塊在做修改前,要首先查詢ALG內(nèi)記錄的地址映射信息表,如果表內(nèi)已建立了該用戶的信息,則按此信息對(duì)向NAT處的SIP消息做相應(yīng)修改,否則丟棄該消息。
  為生成相關(guān)地址映射信息表,ALG首先需要分析向外的Register消息。ALG記錄Register中的To和Contact頭域,按它們的值在NAT設(shè)備上啟用一個(gè)未用的端口,然后ALG記錄生成的映射信息并填入地址映射信息表。生成地址映射信息表后,消息修改模塊再按映射信息修改向外的Invite和Register等報(bào)文,然后再通過消息轉(zhuǎn)發(fā)模塊實(shí)現(xiàn)對(duì)NAT的穿透。
  本文通過分析NAT的工作原理以及SIP信令與媒體流的特點(diǎn),詳細(xì)講述了SIP ALG的具體實(shí)現(xiàn)方法。實(shí)驗(yàn)證明,本文設(shè)計(jì)的SIP ALG能很好地解決NAT穿透問題,且運(yùn)行穩(wěn)定,互通性好。
參考文獻(xiàn)
1 Handley M,Schulzrinne H,Schooler E et al.SIP:Session Initiation Protocol.RFC3261,IETF,2002
2 Rekhter Y,Moskowitz B,Karrenberg D et al.Address alloca-tion for private internets.RFC1918,IETF,1996
3 Rosenberg J,Weinberger J,Huitema C et al.STUN- Simple Traversal of User Datagram Protocol(UDP) Through Network Address Translators (NATs).RFC3489,IETF,2003
4 Handley M,Jacobson V.SDP:Session Description Protocol.RFC2327,IETF,1998
5 Rosenberg J,Weinberger J,Schulzrinne H.SIP Extensions for NAT Traversal.Internet Draft,IETF,2001
6 沈 波,張順頤,沈蘇彬.會(huì)話發(fā)起協(xié)SIP的分析和研究.數(shù)據(jù)通信,2001;(4)

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請(qǐng)及時(shí)通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。