摘要:SIP(會話建立協議)是IETF定義的IP多媒體通信控制協議,也是下一代網絡(NGN)的核心控制協議,SIP音視頻通信的快速發展與IPv地址資源不足的矛盾提出了NAT穿越問題。針對SIP信令和媒體流的NAT穿越問題,闡述了現有穿越的解決方案。如:STUN。
關鍵詞:會話建立協議;網絡地址翻譯;VoIP;STUN
中圖分類號:TP393文獻標識碼:A文章編號:1009-3044(2008)33-1480-05
Research on NAT Traversal Based on SIP
WANG Qing-nian
(School of Computer Science Technology, Soochow University, Suzhou 215007, China)
Abstract: SIP is an IETF defined IP multimedia communication control protocol and the key protocol of the next generation network (NGN), As a result of the inconsistency between the rapid development of SIP-based audio/video communication applications and the shortage of IPv4 adresses, the NAT traversal problem has been raised , In the paper , the NAT traversal problem of SIP singnalling and media stream is explained firstly. Then an overview is given to the existing solutions of media stream traversal. Finally a STUN protocol based on implementation is detailed to be applicable to enterprise networks.
Key words: SIP; NAT; VoIP;STUN
相比較傳統的公共交換網絡(PSTN),VoIP的費用相對比較便宜,VoIP是以IP電話為主,并推出響應的增值業務的技術,VoIP可以便宜的傳輸語音,視頻,傳真和數據等業務。如:虛擬電話、電話會議、電子商務、Internet呼叫管理等。之所以VoIP相對便宜,是因為VoIP實際上是互聯網上的一個應用。而VoIP最大的優勢就是它可以利用龐大的現存的IP網絡。
VoIP的基本原理是發送方的設備將語音進行采樣編碼壓縮,之后通過IP封裝成IP數據包傳輸到接收方,接收方將封包進行解碼輸出到相應的設備。設備還原輸出模擬語音。VoIP技術的發展日趨成熟,VoIP技術可以分為三個方向。
1) 使用電話行業中的信令概念,譬如:H.323,MGCP,MEGACO/H.248。
2) 使用電話行業中的控制概念,譬如:中心控制和軟交換。
3) 使用以Internet協議為中心的SIP(會話建立協議)。
其中SIP借鑒了其他Internet標準和協議的設計思想,相比其他技術有其突出的優點:
1) 它是基于文本的協議,因此,SIP對以文本形式表示的消息的詞法和語法分析就比較簡單。
2) SIP會話請求過程和媒體協商過程等是一起進行的,因此呼叫建立時間短,
3) SIP只要充分利用已定義的頭域,必要時對頭域進行簡單擴展就能很方便地支持補充業務或智能業務。
在目前的網絡環境中,出于安全性和IPv4地址資源問題的考慮,防火墻和NAT設備廣泛使用。這樣,如何使用SIP協議穿透防火墻和NAT已經成為SIP應用領域的一個重要課題。
1 SIP協議概述及其原理
1.1 SIP協議概述
會話建立協議(Session Initiation Protocol,SIP)是一種基于文本的應用層協議,類似于我們熟悉的并廣泛使用的一些協議如HTTP, SMTP。它是由IETF(Internet Engineering Task Force)提出的IP電話信令協議。會話參與者可以使用SIP創建,修改和終止會話。這種會話可以是電話播叫,多媒體會議,和影音傳輸。會話參與方通常產生一個攜帶“媒體描述”的SIP包,以便參與者能夠對媒體Codec(編解碼)達成一致。SIP相對于H.323(另一種IP電話系統結構的信令協議,是由ITU制定的一整套龐大的標準)簡潔,SIP通常可以和其他多種協議進行整合,以發揮更多更大的作用。
早在1996年IETF(Internet Engineering Task Force)中的多媒體工作組已經開發了在Internet上的多媒體基礎,即Henning Schulzrinne教授的SCIP(the Simple Conference Invitation Protocol)和Mark Handley的SIP這兩份提案,后來被宣布合并到會話建立協議(SIP)。新的協議也保留了SCIP提案中的HTTP定位功能。Schulzrinne,SIP協議經過發展在1999年首次被認可作為RFC(Request For Comments,意即“請求注解”)編號2543,也就是SIP的1.0版本,并在同年分離出一個獨立的SIP工作組,對于即時消息和在線檢測業務的工作組(SIP for Instant Messaging and Presence Leveraging, SIMPLE)成立了,在2000年,SIP工作組成立了,它主要是開發和完善SIP協議,比如SIP的方法,消息和事件等。隨后在2002年專注應用和擴展的SIPPING(Session Initiation Proposal Investigation)工作組也成立了。2005年時,已經成立了多個工作組,如XCON(集中式的會議),ECRIT(緊急事件通訊), P2PSIP(Peer-to-Peer SIP)。SIP正受到越來越多企業和研究機構的重視,IETF繼續進行制定SIP這項工作,在2001年發布了標志著SIP已經成熟的2.0版本的規范RFC3261。
RFC 3261的發布標志著SIP的基礎已經確立。那個時候起,IETF又發布了一些RFC 3261的增補版本。例如,RFC 3262 對臨時響應的可靠性作了規定。RFC 3263 確立了 SIP 代理服務器的定位規則。RFC 3264 提供了offer/answer模型,RFC 3265 確定了具體的事件通知。
1.2 SIP協議功能
SIP支持的主要功能:
用戶定位:確定通信所用的端系統的位置。
用戶可用性判定:確定被叫方是否空閑和是否愿意加入通信。
用戶能力交換:確定所用的媒體類型和媒體參數。
會話建立:邀請和提示被叫,在主被叫之間傳遞和建立媒體會話參數。
會話管理:包括轉移和終止會話,修改會話參數以及調用其他業務等。
SIP本身并不提供服務,但是SIP提供一個基礎,用以用來實現不同的服務。
1.3 SIP網絡元素
一個SIP網絡中有四種SIP邏輯實體,每一種實體都有詳細設定的功能,傳統的SIP是基于C/S模型進行信息通訊,在SIP通信中的實體要么作為一個客戶端,用來發送初始化請求,要么作為服務器端用于響應請求,或者同時集中客戶端和服務器端的功能。四種類型的邏輯實體如下:
1) 用戶代理(User Agent,UA),它是終端用戶設備,如用于創建和管理SIP會話的移動電話、手持設備、PC、PDA等。UA又可以分為用戶代理客戶機和用戶代理服務器,用戶代理客戶機用來發送消息,用戶代理服務器對消息進行響應。
2) 代理服務器(Proxy Server),它管理著一個域的會話請求或者響應信息。代理服務器接受SIP UA的會話請求并查詢SIP注冊服務器,或其接收方UA的地址信息。然后,它將會話邀請信息直接發給接收方UA(若果它位于同一域中)或代理服務器(如果UA位于另一個域中)。
3) 重定向服務器(Redirect Server),它允許SIP代理服務器將SIP會話邀請信息定向到外部域。不像代理服務器,重定向服務器不會將傳送請求到另一個重定向服務器上。
4) 注冊服務器(Registrar),它是包含域中所有用戶代理的位置信息的數據庫。通常物理上SIP注冊服務器與重定向服務器同在一個硬件上。
1.4 SIP消息的組成
SIP消息有兩種類型:請求消息(從客戶機發送到服務器)和響應消息(從服務器發送到客戶機)。但這兩種消息在結構上類似,只在起始行上有差別。
SIP消息的格式:
SIP 消息 =起始行(請求行/狀態行)
*消息頭部 (1..*頭部)
CRLF(空行)
[消息體(可選,通常為SDP)]
請求消息行的格式:
請求行 =Method SP Request-URI SP SIP-Version CRLF
比如:INVITE sip:bob@biloxi.com SIP/2.0
在請求行中,SIP-Version(遵循RFC3261協議)等于SIP/2.0(RFC2543是SIP/1.0),請求行中包含了一個方法(Method),它決定了消息的類型和目的。可以是REGISTER,INVITE,ACK,CANCEL,BYE,OPTIONS.(rfc3261中6種),SIP在其他的文檔中還實現了若干個Method。
表1 SIP請求方法

響應消息行的格式:
響應行 =SIP-Version SP Status-Code SP Reason-Phrase CRLF
如:SIP/2.0 180 Ringing.
在響應行中,Status-Code(狀態碼)參數是從100~699的整數,共有6大類狀態碼定義了不同的類型的狀態,而每一類又可以分為若干個子狀態。
表2 SIP響應狀態碼

在響應行中的 Reason-Phrase(原因)參數用于對Status-Code(狀態碼)進行的簡單文本描述。在消息頭部中,是一些通用的頭域,由用戶代理客戶機產生的SIP請求必須包含下列6個頭域:To、From、CSeq、Call-ID、Max-Forwards和Via。
消息頭部的格式
Header-Field = “header-name” “:” header-value *(COMMA header-value)
SIP消息示例:
INVITE sip:bob@biloxi.com SIP/2.0
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds
Max-Forwards: 70
To: Bob
From: Alice
Call-ID: a84b4c76e66710@pc33.atlanta.com
CSeq: 314159 INVITE
Contact:
Content-Type: application/sdp
Content-Length: 142
(SDP 省略)
1.5 SIP會話呼叫流程
一次簡單的建立會話過程如圖1,簡單的呼叫必須至少有呼叫方和被叫方,在兩者之間通常有SIP代理服務器,所有的SIP信令都必須通過SIP代理修改和轉發。在SIP終端啟動時都會向SIP注冊服務器(這里SIP代理同時也是注冊服務器)發送REGISTER消息,而注冊服務器響應200,表示注冊成功。建立會話時,SIP終端A首先發起呼叫請求,向SIP代理發送INVITE消息,SIP代理向終端B發送INVITE請求。圖1中100為臨時響應,表示呼叫正在處理中。終端B振鈴,向SIP服務器發送臨時響應180,主叫(SIP終端A)收到180后聽到鈴音。SIP終端B向SIP代理發送成功響應200,表示被叫(SIP終端B)同意會話并摘機,SIP終端A在收到SIP代理轉發的成功響應200之后發出ACK,至此兩個SIP終端建立連接,兩者之間可以進行媒體通信。
SIP終端A向SIP代理發送BYE消息請求釋放連接,經過SIP代理的轉發BYE傳送到SIP終端B,在終端A收到200響應后,呼叫釋放成功。
2 SDP(會話描述協議)概述
2.1 SDP協議介紹
SDP是由IETF定義用來描述流媒體會話初始化參數的。例如,在多媒體會話中包括音頻和視頻編碼類型,采樣率等。SDP不是一個通訊協議,它的描述語言采用文本模式,所以使用者很容易了解SDP包中所包含的信息。
2.2 SDP與SIP關系
SDP純粹是一種會話描述的格式,它可以使用不同的傳輸協議,如會話通告協議SAP、會話建立協議SIP和超文本傳輸協議HTTP等。
在SIP包的消息體中通常攜帶SDP的內容,并在SIP消息體中用Content-Type: application/sdp指示。這行之后,就是純粹的SDP消息。

圖1 SIP呼叫流程
SDP文本信息包括:
1) 會話名稱和意圖;
2) 會話持續時間;
3) 構成會話的媒體;
4) 有關接受媒體的信息(地址等)。
協議結構
SDP 信息是文本信息, SDP 會話描述如下:(標注 * 符號的表示可選字段):
會話描述:
v = (協議版本)
o = (所有者/創建者和會話標識符)
s = (會話名稱)
i = * (會話信息)
u = * (URI 描述)
e = * (Email 地址)
p = * (電話號碼)
c = * (連接信息 ― 如果包含在所有媒體中,則不需要該字段)
b = * (帶寬信息)
一個或更多時間描述(如下所示):
z = * (時間區域調整)
k = * (加密密鑰)
a = * (0 個或多個會話屬性行)
0個或多個媒體描述(如下所示)
時間描述
t = (會話活動時間)
r = * (0或多次重復次數)
媒體描述:
m = (媒體名稱和傳輸地址)
i = * (媒體標題)
c = * (連接信息 — 如果包含在會話層則該字段可選)
b = * (帶寬信息)
k = * (加密密鑰)
a = * (0 個或多個會話屬性行)
其中,c=<network type> <address type> <connection address>: “c=”域包含鏈接的信息,“連接地址”指的是傳輸流媒體的IP地址。m=<media> <port> <transport> <fmt list>:每個媒體描述域由多個子域組成。<meidia>可以是“audio”、“video”、“application”、“data”和“control”五種形式。<port>是媒體流發送的傳輸端口;<transport>是傳輸媒體時所用的傳輸協議,通常為UDP.。該子域的值依賴于“c=”;<fmt list>表示媒體格式。
3 NAT的網絡概念
在計算機網絡中,為了節約公網IP地址和基于一些安全性考慮,通常局域網內使用內部私有地址,局域網內的主機若要訪問INTERNET網,則IP包必先經過NAT(網絡地址轉換)設備,NAT設備通常是路由器或者防火墻設備,在INTERNET上大多數系統使用NAT是為了使多個主機上使用一個單一的公共IP地址,從而節約一大部分資金以及方便管理和隱藏內部主機的地址。NAT對于內部主機是透明的,同一個局域網內的主機訪問外網使用同一個地址,這個地址也就是NAT設備的連接公網的接口地址,使用不同的端口來區分不同的主機的請求。同時NAT會記錄下內外網地址的映射關系。以便外部接收外部傳輸來的連接發到正確的內網設備。
3.1 NAT的類型
根據NAT的對于內外網的映射關系的不同和是否允許外網主動連接內網主機,NAT可以分為下面三種。
1) 靜態NAT(Static NAT)
靜態NAT是指內部網絡中的每個主機都被永久映射成外部網絡的某個合法地址。
2) 動態NAT(Pooled NAT)
與靜態NAT不同的是動態地址NAT則是外部網絡中定義了一系列的合法,采用動態分配的方法映射到內部網絡。
3) NA(P)T
NAPT則是把內部地址映射到外部網絡的一個IP地址的不同端口上,不用的內網機器對應一個外部IP的不同的端口。
絕大部分的NAT使用的這種方式,通常可將NAPT分為四種類型。
1) 完全錐形NAT
完全錐形NAT把所有來自一個內部私網地址/端口的請求,都映射到同一個外部公網地址/端口。并且,任何外部主機可以通過映射得到的該外部地址發送數據包,從而NAT接收數據包并發送到該內網主機。
2) 受限錐形NAT
只有當私網IP向外發出數據包時,NAT才會進行該私網IP/端口與公網IP/端口的映射,這時目標公網IP的返回數據包能通過NAT到達私網設備,而其他公網IP所發送的數據包會被拒絕。也就是,只有當NAT后面的主機主動與其通信時,該IP設備發出的數據包才能獲得通過。
3) 端口受限錐形NAT

圖2 NAT(P)T示意圖
與受限錐形NAT類似,除了NAT后面的主機(私網主機)主動發送數據包到外網IP地址/端口,該IP地址/端口可以發送數據包通過NAT設備到達私網主機,相比受限錐形NAT更嚴格,即使來自相同外網IP但是用不同的端口發送數據給NAT,NAT就會將該數據包丟棄。
4) 對稱NAT
一個私網設備同時與不同的兩個公網設備進行通信時,NAT需要提供兩組公網IP地址及端口。這種情況下通常是分配給同一個私網設備數據包發送出外網同一個IP不同的端口。
4 現有SIP穿越NAT技術概述
基于SIP協議的NAT穿越主要指的是RTP流的穿越問題,對于這一問題,業界提出了多種不同的技術。
4.1 應用層網關(ALG)
在NAT/Firewall上加入能夠用于具體應用協議(如SIP)感知的模塊,通過對具體協議的感知,進行針對不同協議的具體NAT/Firewall穿越處理。對于每一種應用協議都需要一個ALG實例來支持,因此每增加一個應用層協議的支持,或者現有的協議修改了,都需要一個新的ALG來支持,因此這種穿越NAT機制在實現中復雜度高,需要升級NAT設備,成本也大,可擴展性差,這種方式在應用中受到很大的限制。
4.2 MIDCOM控制協議
MiddleBox Communications(MidCOM)是通過在受防火墻/NAT信任的第三方實體(MIDCOM Agent)和防火墻/NAT(MiddleBox)之間建立中間盒通信,使中間盒設備(防火墻/NAT)變成可控制的一種新概念。這些信任的實體通過MDCOM協議與防火墻/NAT進行通信。這種方式允許受防火墻信任的第三方實體代表NAT做出決定,強制其開放端口傳送媒體流或數據流,但是并非所有的防火墻/NAT都能夠支持某種MIDCOM協議,因此這類技術在實際中的應用也存在一定的局限。
4.3 STUN(UDP的NAT簡單穿越)
RFC 3489中提出來一種穿越NAT的一種方式,就是在公網上設置一個STUN服務器,用于與私網終端通訊,在發送數據包之前,終端用戶先與STUN服務器通訊,在通信的過程中STUN服務器得知終端的外網地址和出口端口號,并告訴給終端,最終修改SDP數據包的是終端,終端與外網服務器之間使用RFC 3489中定義的STUN協議。但是因為STUN告訴內網終端的端口是UDP目的地為STUN服務器的數據包出外的端口,在對稱NAT下真正的媒體流出去則分配一個不同的端口號,所有終端修改了數據包也是沒有用的,因而,STUN這種方式不能解決在對稱式的NAT下的數據包的穿越問題。
4.4 TURN(STUN Relay Usage)
TURN的全稱為Traversal Using Relay NAT,及通過Relay方式穿越NAT。這種方式可以解決對稱式NAT下的穿越問題,TURN方式解決NAT問題的思路與STUN相似,不同的是,所有的媒體流都需要經過TURN服務器進行Relay轉發。
實現TURN的穿越方式需要終端支持TURN Client,這一點同STUN一樣對網絡終端有要求;此外,所有報文都經過TURN服務器,特別是語音流,這樣增大了網絡延時和丟包的可能性。
4.5 ICE(Interactive Connectivity Establishment,交互式連通)
交互式連通建立方式ICE(Interactive Connectivity Establishment)并不是一種新的協議,ICE是通過綜合如STUN,TURN或者其他方式,使之在最適合的情況下工作,以彌補單獨使用其中任何一種,所帶來的固有的缺陷。對于SIP來說,ICE只需要定義一些SDP附加的屬性即可。傳統的STUN最大的缺陷在于它不能保證在所有網絡拓撲結構中都正常工作,最典型的問題就是Symmetric NAT。對于TURN或類似轉發方式工作的協議來說,由于服務器的負擔過重,很容易出現丟包或者延遲情況。而ICE方式正好提供了一種負載均衡的解決方案,它將轉發服務作為優先級最低的服務,從而在最大程度上保證了服務的可靠性和靈活性。此外,ICE的優勢還在于對IPv6的支持。
5 結束語
在現有的網絡中,部署了大量的NAT設備和防火墻,通過SIP穿過不同的NAT有各種方法,但各有利弊。一般的穿越SIP的技術針對不同類型的NAT,到現在為止還沒有什么技術針對所有的四種類型NAT。即便是ICE這種方式也還是草案,還有很多值得改進的方面。因此下一步的研究方向是結合幾種NAT穿越方式,采用優先級選擇的思想提出支持所有這四種類型的NAT穿越的有效方案。
參考文獻:
[1] Rosenberg J.Schulzrinne H,Camarillo G,et al.SIP: Session Initiation Protocol[S].RFC 3261,2002.
[2] 張榮,武波.SIP協議的應用研究[J].計算機技術與發展,2006,16(6):71-73.
[3] Handley M,Jacobson V,Perkins C.SDP: Session Description Protocol[S].RFC 4566,2006.
[4] 羅忠.多媒體通信中多種NAT/Firewall穿越技術分析和相關國際標準動態的探討[J]..中國多媒體視訊,2005(7):60-64,2005.
[5] Rosenberg J,Weinberger J,Huitema C,et al.STUN - Simple Traversal of User Datagram Protocol (UDP) Through Network Address Translators (NATs)[S].RFC 3489,2003.
[6] Rosenberg J.Obtaining Relay Addresses from Simple Traversal Underneath NAT (STUN)[S].draft-ietf-behave-turn-03 (work in progress),2007.
[7] Rosenberg J.Interactive Connectivity Establishment (ICE): A Protocol for Network Address Translator (NAT) Traversal for Offer/Answer Protocols[S].draft-ietf-mmusic-ice-17 (work inprogress),2007.