win7系統(tǒng)下載
當(dāng)前位置: 首頁 > 網(wǎng)絡(luò)技術(shù)教程 > 詳細(xì)頁面

SIP通過NAT的案例解析

發(fā)布時(shí)間:2022-12-25 文章來源:深度系統(tǒng)下載 瀏覽:

網(wǎng)絡(luò)技術(shù)是從1990年代中期發(fā)展起來的新技術(shù),它把互聯(lián)網(wǎng)上分散的資源融為有機(jī)整體,實(shí)現(xiàn)資源的全面共享和有機(jī)協(xié)作,使人們能夠透明地使用資源的整體能力并按需獲取信息。資源包括高性能計(jì)算機(jī)、存儲資源、數(shù)據(jù)資源、信息資源、知識資源、專家資源、大型數(shù)據(jù)庫、網(wǎng)絡(luò)、傳感器等。 當(dāng)前的互聯(lián)網(wǎng)只限于信息共享,網(wǎng)絡(luò)則被認(rèn)為是互聯(lián)網(wǎng)發(fā)展的第三階段。

下面對SIP協(xié)議產(chǎn)生NAT穿透問題,作一些解釋;及提出解決的辦法。
1、大致有4種類型的NAT。
a) Full Cone 完全圓錐體
b) restricted cone 受限制的圓錐體
c) port restricted 端口受限制的圓錐體
d) symmetric 對稱的
其中a,b,c 也稱作非對稱的NAT。

2、SIP終端在NAT后面,其工作有可能出現(xiàn)問題。原因是SIP信令走的路徑,和媒體流走的路徑不一樣。

3、Full Cone 完全圓錐體NAT
因特網(wǎng)上的任何PC,可以發(fā)送數(shù)據(jù)包到IP:port對;而NAT將這個(gè)IP:port對(公網(wǎng)上的)映射到內(nèi)網(wǎng)的IP:port對(私有網(wǎng)絡(luò)的)。

4、restricted cone 受限制的圓錐體NAT
NAT外面的PC,只有那些內(nèi)網(wǎng)中已有PC與之聯(lián)系過的PC,才能通過這個(gè)映射進(jìn)來。例如,我通過內(nèi)網(wǎng)的一臺機(jī)器,IP 地址是10.1.1.1:123,與PC(a)聯(lián)系,則PC(a)也可以通過這個(gè)NAT的映射,聯(lián)系到我。而PC(b)則不行。
10.1.1.1:123 ---NAT ---> 202.70.65.78:10000 ------pc(a)
如果pc(b)也發(fā)送數(shù)據(jù)到202.70.65.78:10000,則不會有數(shù)據(jù)送到10.1.1.1:123。

補(bǔ)充說明:
如果我也聯(lián)系過pc(b),則pc(b)也可以進(jìn)來了。
10.1.1.1:123 ---NAT ---> 202.70.65.78:10000 ------pc(b)
如果pc(b)也發(fā)送數(shù)據(jù)到202.70.65.78:10000,則數(shù)據(jù)送到10.1.1.1:123。

5、port restricted 端口受限制的圓錐體NAT
除了4的條件外,即不但要檢測pc(a)的源IP地址,還要檢測其端口是否與前面也一樣。
10.1.1.1:123 --->NAT---->202.70.65.78:10000 -----> pc(a)[213.123.324.34:8000]

這個(gè)NAT只會接收從IP地址 213.123.324.34 且端口為 8000來的數(shù)據(jù),讓進(jìn)入到10.1.1.1:123。

6、對稱的NAT 這是關(guān)系描述最簡單的一個(gè)
10.1.1.1:1000 ----NAT -----> 200.123.123.34:1234 ----pc(a)
10.1.1.1:1000 ----NAT -----> 200.123.123.34:2222----pc(b)
這種NAT的IP:port對,對每個(gè)外部的程序,都是不同的。因而每一個(gè)外部的程序,都有自己的映射(NAT分配的IP:port對)。而前面的三種,多個(gè)外部程序,可能共用一個(gè)NAT的IP:port對。

7、RTP的問題
在RTP的消息正文內(nèi),有UA能夠成功通信所需要的一些信息。這種消息正文,就叫做SDP消息。

問題在于,SIP終端(UA)可能對NAT一無所知。因而在SDP中包含的IP地址,通常使用內(nèi)部的IP地址,也就是SIP終端知道的IP。這樣,當(dāng)通信的對方想與SIP終端通信時(shí),就查看SDP消息中的IP地址,但是什么也沒有得到,因?yàn)檫@里使用的是內(nèi)部IP地址。

下面舉個(gè)例子說明:

INVITE sip:040600@192.168.20.2:5060 SIP/2.0.
Record-Route: <sip:143.248.130.35;ftag=3a7ceb24a6ac50c4;lr=on>.
Via: SIP/2.0/UDP 143.248.130.35;branch=z9hG4bK758e.976609c7.0.
Via: SIP/2.0/UDP
192.168.20.3;rport=1024;received=223.178.140.109;branch=z9hG4bK34efcab2403aa20d.
From: "Iqbal" <sip:040618@sip.dom>;tag=3a7ceb24a6ac50c4.
To: <sip:040600@sip.dom>.
Contact: <sip:040618@223.178.140.109:1024>.
Supported: replaces.
Call-ID: 7f2c327896a5b0e1@192.168.20.3.
CSeq: 8717 INVITE.
User-Agent: Grandstream HT487 1.0.5.18.
Max-Forwards: 16.
Allow: INVITE,ACK,CANCEL,BYE,NOTIFY,REFER,OPTIONS,INFO,SUBSCRIBE.
Content-Type: application/sdp.
Content-Length: 343.
.
v=0.
o=040618 8000 1 IN IP4 192.168.20.3.
s=SIP Call.
c=IN IP4 192.168.20.3.
t=0 0.
m=audio 38660 RTP/AVP 0 8 4 18 2 15 99.
a=sendrecv.
a=rtpmap:0 PCMU/8000/3.
a=rtpmap:8 PCMA/8000/3.

SIP消息的標(biāo)題頭,類似于郵件的標(biāo)題頭。從后往前看,從From行開始,看到第一個(gè)Via行,這是SIP終端自己認(rèn)為的IP地址,例如192.168.20.3。但是SIP代理服務(wù)器是聰明的,它知道這個(gè)消息是從哪里發(fā)過來的,它添加了rport和接收到的標(biāo)志:
Via: SIP/2.0/UDP
192.168.20.3;rport=1024;received=223.178.140.109;branch=z9hG4bK34efcab2403aa20d.

也就是說,SIP代理服務(wù)器,知道發(fā)消息的SIP終端的公網(wǎng)地址是223.178.140.109:1024。
這樣,SIP代理服務(wù)器是可以與SIP終端通信的,因?yàn)樗繱IP終端的公網(wǎng)地址。

但是,可憐的老式的RTP被阻塞了,因?yàn)樗臉?biāo)題頭如下:
v=0.
o=040618 8000 1 IN IP4 192.168.20.3.
s=SIP Call.
c=IN IP4 192.168.20.3.
t=0 0.
m=audio 38660 RTP/AVP 0 8 4 18 2 15 99.
a=sendrecv.
a=rtpmap:0 PCMU/8000/3.
a=rtpmap:8 PCMA/8000/3.

SIP終端期望從端口 port m=38660 且IP地址IP c= 192.168.20.3來接收RTP數(shù)據(jù),而這個(gè)192.168.20.3:38660,就是通信的對方試圖發(fā)RTP數(shù)據(jù)的目的地址。

這就是SIP電話振鈴總是能夠聽到,而接起來卻沒有聲音的原因。

8 解決辦法 告訴SIP終端,不要如此傻地工作,而要想辦法知道NAT分配給自己的端口映射。

并將公網(wǎng)的IP地址:端口放到SDP消息中。這樣,SIP終端就問NAT....;蛘呤菃柟W(wǎng)的某個(gè)服務(wù)器,NAT分配給自己的映射是什么。

9 問NAT。 這種辦法就是使用UPnP協(xié)議,另外去參見UPnP的資料。

10 問公網(wǎng)上的某個(gè)服務(wù)器。 如STUN服務(wù)器。
SIP終端發(fā)送一個(gè)探測數(shù)據(jù)包,到公網(wǎng)上的服務(wù)器。公網(wǎng)上的服務(wù)器會發(fā)回?cái)?shù)據(jù)包,會包含有關(guān)NAT的詳細(xì)信息。有了這些信息,SIP終端就會知道它是否在NAT后面。這種探測方法,可以用于上面4種NAT,都有效。例如SIP終端從10.1.1.1:1000發(fā)送一個(gè)數(shù)據(jù)包,則SDP消息中包含的是m=1000 and c=10.1.1.1。但是,如果SIP終端先進(jìn)行NAT探測,則會知道NAT會分配公網(wǎng)的IP:端口是212.134.123.23:12345。則 SIP終端直接在SDP消息寫m=12345,c=212.134.123.23。

產(chǎn)生的問題 因?yàn)镹AT的端口分配是動態(tài)的,因而有可能會改變。這樣,在發(fā)送了NAT探測消息后,要很快地發(fā)送出SIP消息。而且,SIP終端發(fā)送數(shù)據(jù)的端口和接收數(shù)據(jù)的端口要是一樣的。

注意受限制的圓錐體(包括端口受限制的圓錐體)NAT,它不讓回來的消息進(jìn)來,除非SIP終端先發(fā)了一個(gè)數(shù)據(jù)包給它。因而,SIP終端需要先發(fā)一個(gè)數(shù)據(jù)包給對方。這樣以后對方來的數(shù)據(jù),就可以進(jìn)入NAT內(nèi)部了(不過,不需要為這個(gè)操作擔(dān)心,有辦法的)。

上面的辦法在對稱的NAT后面,不能夠工作。因?yàn)椋瑢ΨQ的NAT,它在分配給SIP終端外部的IP:port時(shí),每次都變化(不同的對方不一樣)。也就是SIP終端在探測NAT時(shí),得到的IP:port,與它后來發(fā)SIP消息時(shí),分配的IP:port不一樣。這樣,對方來的語音數(shù)據(jù)就進(jìn)不來,因?yàn)閷Ψ降貌坏秸_的IP:port。

11、上面描述的過程,其實(shí)就是采用STUN協(xié)議時(shí),解決問題的過程。就是SIP終端向STUN服務(wù)器發(fā)探測NAT的數(shù)據(jù)包。

12、對稱的NAT 解決辦法 就是在公網(wǎng)上放一個(gè)中轉(zhuǎn)語音流的服務(wù)器。這個(gè)中轉(zhuǎn)語音流的服務(wù)器有時(shí)就是一個(gè)Out Bound proxy。注意,這個(gè)中轉(zhuǎn)語音流的服務(wù)器,可能會成為瓶頸。由于語音要經(jīng)過中轉(zhuǎn)語音流的服務(wù)器,所以路徑增長了,音質(zhì)會變差。所以,對稱的NAT,要SIP能夠工作,總之是個(gè)麻煩。

不過,目前大多數(shù)的NAT,都可以做“虛擬服務(wù)器的端口轉(zhuǎn)發(fā)”,即將SIP工作需要的端口轉(zhuǎn)發(fā)到SIP終端上去。如果在NAT設(shè)備上,做了“虛擬服務(wù)器的端口轉(zhuǎn)發(fā)”,則NAT會保留SIP工作需要的端口,專用于SIP終端,這樣SIP終端就相當(dāng)于是在一個(gè)Full Cone完全圓錐體的NAT后面,SIP用STUN工作沒有問題。SIP終端需要的端口數(shù)是這樣確定的,一個(gè)端口用于SIP信令,比如5060。RTP端口的數(shù)量,取決于通話的路數(shù)。一路通話需要2個(gè)RTP端口。每增加一路通話,則需要多2個(gè)端口。
只支持一路通話的SIP話機(jī),需要NAT映射3個(gè)端口。
前面三種的NAT,可統(tǒng)稱為非對稱的NAT。非對稱的NAT,都可以用STUN協(xié)議穿過NAT。

將對稱的NAT,通過端口轉(zhuǎn)發(fā)的方式,變?yōu)橥耆珗A錐體的NAT,是解決NAT問題的最好辦法。首先應(yīng)當(dāng)用這種辦法來解決。沒有辦法映射端口,再想其它的辦法。當(dāng)然,建議大家不要買那種不能夠映射端口的寬帶路由器,那樣的路由器太差了。

【相關(guān)文章】

  • Mailvision SIP平臺企業(yè)應(yīng)用解決方案
  • SIP基本應(yīng)用方案
  • 新一代多媒體通信協(xié)議SIP及其實(shí)現(xiàn)


網(wǎng)絡(luò)的神奇作用吸引著越來越多的用戶加入其中,正因如此,網(wǎng)絡(luò)的承受能力也面臨著越來越嚴(yán)峻的考驗(yàn)―從硬件上、軟件上、所用標(biāo)準(zhǔn)上......,各項(xiàng)技術(shù)都需要適時(shí)應(yīng)勢,對應(yīng)發(fā)展,這正是網(wǎng)絡(luò)迅速走向進(jìn)步的催化劑。

本文章關(guān)鍵詞: NAT SIP 協(xié)議