SIP協(xié)議的NAT穿越技術(shù)
NAT 指的是網(wǎng)絡(luò)地址轉(zhuǎn)換(Netword Address Translation)。這一技術(shù)使得大部分人可以在家里用多于一臺(tái)的計(jì)算機(jī)上網(wǎng)但只用一個(gè)IP地址。多半時(shí)間里,一臺(tái)有NAT功能的路由器支持從內(nèi)部 網(wǎng)絡(luò)(帶有內(nèi)部IP地址)中取得數(shù)據(jù),并將其發(fā)送到Internet,同時(shí)將每一個(gè)包的內(nèi)部IP地址替換為外部地址。如下圖所示:
SIP協(xié)議的NAT穿越技術(shù)
什么是RTP?
RTP 指的是實(shí)時(shí)傳輸協(xié)議(Real-Time Transport Protocol),這個(gè)協(xié)議的目的是在主叫和被叫之間傳輸語音數(shù)據(jù)。問題是,當(dāng)你試圖用RTP協(xié)議呼叫一個(gè)人的時(shí)候,你要事先知道他的IP地址和端口號(hào) (PORT),這使得RTP協(xié)議單獨(dú)使用起來有相當(dāng)?shù)睦щy,因?yàn)楹艚械碾p方?jīng)]有辦法事先知道彼此的IP和端口。這就是為什么人們還需要SIP。
什么是SIP?
SIP 也就是會(huì)話初始協(xié)議(Session Initiation Protocol),語法上很象HTTP協(xié)議,是可讀的文本。它的目的是讓主叫方可以找到被叫方的IP和端口,同時(shí)它也幫助雙方協(xié)商媒體的類型和格式。比 如,你想通過家里的一臺(tái)PC機(jī)上運(yùn)行的Free World Diadup(它使用SIP協(xié)議)來呼叫你遠(yuǎn)在羅馬尼亞的朋友,如下圖:
SIP協(xié)議的NAT穿越技術(shù)
SIP發(fā)送一個(gè)INVITE包到FWD SERVER,其中包含有主叫方的RTP的IP地址和端口,F(xiàn)WD將這個(gè)包轉(zhuǎn)到對(duì)應(yīng)的被叫方,被叫方接受了呼叫并將它自己的RTP的IP地址和端口返回來。
SIP+NAT,一個(gè)不能解決的問題?
SIP的NAT的問題,其實(shí)不是SIP的問題,而是RTP的問題。SIP來聲明RTP的地址和端口,但是如果客戶端在NAT之后的話,它聲明的端口就會(huì)與NAT在外部分配的不同。如下圖:
SIP協(xié)議的NAT穿越技術(shù)
即使很多SIP的實(shí)現(xiàn)都基于NAT總是分配一個(gè)與內(nèi)網(wǎng)端口相同的一個(gè)外部端口這樣一個(gè)假設(shè),但這個(gè)假設(shè)是錯(cuò)誤的。在產(chǎn)品環(huán)境下,你不能告訴奶奶說她不能與孫子說話是因?yàn)橛行┞酚善鞣峙淞艘粋€(gè)不同的端口號(hào)。
SIP協(xié)議的NAT穿越技術(shù)
如果你是一個(gè)carrier,解決辦法要簡(jiǎn)單一點(diǎn),因?yàn)槟阋硭械臄?shù)據(jù),就是用SIP會(huì)話邊界控制器(SIP Session Border Controller),簡(jiǎn)稱SIP SBC。SIP SBC通常位于carrier的內(nèi)部SIP網(wǎng)絡(luò)的前面,它來解決NAT穿越問題,同時(shí)也保護(hù)SIP網(wǎng)絡(luò)。
SIP協(xié)議的NAT穿越技術(shù)
這種情況下解決NAT穿越問題需要一些小技巧。
第一個(gè)小技巧是讓NAT上從客戶端到服務(wù)器的洞保持打開狀態(tài),這通常是讓SIP客戶端至少每隔30發(fā)送一個(gè)兩個(gè)字節(jié)的包到服務(wù)器。一些路由器會(huì)將30秒內(nèi)沒用的映射顯式的刪除掉,GNU/Linux通常是3分鐘后才刪除。
第二個(gè)小技巧是在我們?cè)趛ate項(xiàng)目中用到的,就是從到達(dá)服務(wù)器本地的RTP IP和端口的第一個(gè)包中計(jì)算客戶端的RTP IP和端口,而不是用在SDP中聲明的那個(gè)IP和端口。這個(gè)技巧可以解決NAT的穿越問題,不論客戶端在多少層NAT之后。這個(gè)方法的主要缺點(diǎn)是,在一些 情況下,客戶端不能收到起初的媒體流(since at that point, it sends out no voice packets)并將聽不到振鈴音。
如果你不是一個(gè)carrier,你想實(shí)現(xiàn)一個(gè)Peer to Peer的呼叫,并且呼叫的雙方都在NAT之后,你必須用一個(gè)外部的SIP代理或網(wǎng)關(guān)來在兩點(diǎn)之間傳遞SIP,希望NAT們一個(gè)接一個(gè)的為RTP接連打開 合適的端口。然而,對(duì)于這種情況,沒有最終的解決方案。兩個(gè)建議的解決方案是STUN和ICE,但是當(dāng)前每個(gè)解決方案有時(shí)都可能達(dá)到的你目的。Skype 發(fā)現(xiàn)了一種非常簡(jiǎn)單好用的解決這個(gè)問題的方法:他們用沒在NAT內(nèi)的客戶端來做在NAT內(nèi)的客戶端的代理。
SIP協(xié)議的NAT穿越技術(shù)
這個(gè)解決方案從技術(shù)上講是非常好的。但是,有一些道義和政策上的原因不能用Skype的方法。原因之一是,如果你是一個(gè)在NAT外的客戶端,你不知道誰的數(shù)據(jù)從你這里傳遞過去了。另一個(gè)原因是,這會(huì)占用你的帶寬。最后,你不得不為代理語音流而為多余的帶寬付費(fèi)。
我個(gè)人希望在不久的將來有更多的SIP實(shí)現(xiàn)用YATE現(xiàn)在用的這兩個(gè)小技巧來實(shí)現(xiàn)NAT的穿越。Skype或許在長(zhǎng)時(shí)間內(nèi)還會(huì)在家庭用戶中廣為流傳,但是企 業(yè)用戶會(huì)慢慢的移向Voip提供者,隨著大量的努力和一點(diǎn)運(yùn)氣,他們將會(huì)像PSTN提供者一個(gè)可靠,因?yàn)榧夹g(shù)會(huì)越來越好。