1?????????? 說(shuō)明
? ? ???本文詳細(xì)描述了基于STUN系列協(xié)議實(shí)現(xiàn)的P2P SIP電話過(guò)程,其中涉及到了SIP信令的交互,P2P的原理,以及STUN、TURN、ICE的協(xié)議交互
? ? ???本文所提到的各個(gè)服務(wù)單元的交互均使用UDP,不涉及TCP的打洞及其他和TCP相關(guān)的操作。
? ? ???本文假設(shè)通信雙方均沒有防火墻對(duì)協(xié)議以及端口的限制。
? ? ???本文不涉及客戶端的資源的發(fā)布與查找。
? ? ???本文適用于有一定基礎(chǔ)的讀者,比如說(shuō)知道NAT設(shè)備的不同類型及其特點(diǎn)、知道STUN/TURN/ICE協(xié)議的基本概念、知道SIP協(xié)議的相關(guān)交互流程等。
? ? ???本文力求嚴(yán)謹(jǐn),但難免有疏漏之處,敬請(qǐng)諒解,歡迎批評(píng)指正。
? ? ???本文大致可分為4個(gè)部分:
? ? ???第一部分,解釋了穿越和打洞的概念以及STUN系列協(xié)議穿越的特點(diǎn)
? ? ???第二部分,STUN、TURN協(xié)議的工作原理及其作用,詳細(xì)介紹了relay端口的分配、消息的接受與發(fā)送、STUN頭的添加與去除
? ? ???第三部分,ICE協(xié)議的工作原理及其作用,詳細(xì)介紹了ICE的打洞原理、兩種打洞方式(regular nomination和aggressive nomination)、Peer Reflexive Candidates?的概念與發(fā)現(xiàn)過(guò)程
? ? ???第四部分,ICE在P2P SIP中的應(yīng)用,詳細(xì)講解了SIP的信令交互流程與媒體建立流程。
2?????????? 打洞和穿越的概念
? ? ???有人將穿越打洞認(rèn)為是一個(gè)概念,其實(shí)這也無(wú)傷大雅,在與其他人交流討論的時(shí)候不產(chǎn)生歧義就好。嚴(yán)格來(lái)說(shuō),是先打洞,后穿越。
? ? ???由于NAT的特性(請(qǐng)查閱NAT的幾種不同類型的各自特點(diǎn)),一個(gè)位于外界的主機(jī)是不可能向內(nèi)網(wǎng)主機(jī)直接建立連接的。要想實(shí)現(xiàn)外界主機(jī)與內(nèi)網(wǎng)主機(jī)的交互,那么 “我(內(nèi)部主機(jī))在我自己的NAT設(shè)備上先打一個(gè)洞,然后使得你(外界主機(jī))的數(shù)據(jù)能經(jīng)過(guò)這個(gè)洞穿越過(guò)來(lái)”。
? ? ???當(dāng)我們打開電腦,連上網(wǎng)絡(luò),打開幾個(gè)不同網(wǎng)站的時(shí)候,打洞和穿越時(shí)時(shí)刻刻都在發(fā)生著。你打開sina的時(shí)候,你就在自己的NAT上打了一個(gè)洞,這個(gè)洞只允許sina的80端口的數(shù)據(jù)穿越回來(lái)。如果沒有你先打的洞,sina是不可能成功給你發(fā)消息的。
? ? ???時(shí)刻記住一個(gè)概念,打洞是為了能讓對(duì)方的數(shù)據(jù)過(guò)來(lái)。
3?????????? P2P中的打洞和穿越
? ? ???既然打洞和穿越實(shí)時(shí)都在發(fā)生著,那么在client/server模型的網(wǎng)絡(luò)編程中為什么很少提及打洞和穿越的概念,卻在P2P通信中反復(fù)提及呢?
? ? ???首先,在cs模型的網(wǎng)絡(luò)編程中,服務(wù)器都架設(shè)在公網(wǎng),服務(wù)器端不用打洞(服務(wù)端不用為客戶端打洞,客戶端的數(shù)據(jù)也能過(guò)來(lái)),客戶端就能向服務(wù)器發(fā)送請(qǐng)求。
? ? ???其次,client向服務(wù)器發(fā)送請(qǐng)求時(shí),client的打洞和服務(wù)器響應(yīng)的穿越是自動(dòng)實(shí)現(xiàn)的。
? ? ???最后,明確一點(diǎn)的是,cs模型中,打洞是單方向的,即只需客戶端打洞。
?
? ? ???而在P2P網(wǎng)絡(luò)編程中,通信的雙方A和B既要當(dāng)服務(wù)器,又要當(dāng)客戶端。因此打洞是雙方的:A在自己的NAT上為B打一個(gè)洞,讓B的數(shù)據(jù)能過(guò)來(lái);B在自己的NAT上為A打一個(gè)洞,讓A的數(shù)據(jù)能過(guò)來(lái);
? ? ???AB雙方的打洞的操作得由我們自己完成,所以不得不提及穿越打洞的概念。
? ? ???理解了“P2P通信中,打洞是雙方的”這一點(diǎn),也就理解了ICE的一半。
4?????????? 使用STUN系列 協(xié)議穿越的特點(diǎn)
? ? ???在知道NAT的幾種類型和每種類型的限制后,就是針對(duì)性的解決這些問(wèn)題實(shí)現(xiàn)NAT的穿越。
? ? ???最容易想到的就是,能不能在NAT上做一下手腳,讓它能識(shí)別出我特有的協(xié)議,從而不限制我特有的協(xié)議,這就是ALG的初衷。ALG(應(yīng)用層網(wǎng)關(guān)),有兩個(gè)功能,一個(gè)是修改自己“認(rèn)識(shí)的”協(xié)議中相關(guān)字段的內(nèi)網(wǎng)地址為外網(wǎng)地址;另一個(gè)是,允許自己“認(rèn)識(shí)的”協(xié)議直接穿透,而不需要打洞;
? ? ???可以認(rèn)為ALG的能力是NAT的一個(gè)插件,插上什么協(xié)議類型的插件,NAT就能辨別什么類型的協(xié)議,繼而對(duì)相應(yīng)類型的協(xié)議做相關(guān)操作。常用的應(yīng)用有FTP、DNS、ICMP、SIP等。在VOIP中,如果使用ALG的話,可以實(shí)現(xiàn)通信雙方的直接媒體通信,但是不足之處就是需要NAT支持SIP,這就不適合像skype類型的應(yīng)用。
? ? ???還有一種成熟的穿越技術(shù):UPnP,它的想法跟ALG有點(diǎn)類似,也是在NAT上做了手腳。當(dāng)內(nèi)網(wǎng)的主機(jī)啟動(dòng)UPnP程序的時(shí)候,就會(huì)在NAT上產(chǎn)生 “映射端口”與UPnP程序的端口一一映射,而且不會(huì)被回收。從外部來(lái)的消息,只要是發(fā)送到“映射端口”的,直接就會(huì)送至內(nèi)網(wǎng)的UPnP程序。像我們平常用到的迅雷、電騾等,這種方式也不用打洞,但缺點(diǎn)就是需要應(yīng)用程序、操作系統(tǒng)以及NAT支持UPnP,同樣不適用于skype類型的應(yīng)用。
? ? ???使用STUN/TURN/ICE最大的好處充分利用NAT的特性,不需要操作系統(tǒng)支持、不需要對(duì)現(xiàn)有的NAT設(shè)備做改變就能實(shí)現(xiàn)穿越。
? ? ???最后需要說(shuō)明的一點(diǎn)就是,沒有不好的技術(shù),只有不適合的技術(shù)。
5?????????? STUN/ TURN/ICE協(xié)議的關(guān)系
? ? ???簡(jiǎn)單來(lái)說(shuō), STUN 的目的是為了進(jìn)行P2P 通信 ,通過(guò)提供反射地址(Server Reflexive Address)這種能力來(lái)使雙方可以進(jìn)行P2P通信,但是依賴NAT類型的不同,這種方式是有失敗的概率的:比如雙方都為對(duì)稱型NAT或者一方為對(duì)稱型,另一方為端口限制型。
? ? ???因?yàn)橛惺〉目赡苄裕詥渭兊囊蕾嘢TUN協(xié)議提供的反射地址的話,需要事先探測(cè)出雙方的NAT類型,假如發(fā)現(xiàn)是對(duì)稱型的NAT,那么就不打洞了,而是直接中轉(zhuǎn)。目前網(wǎng)絡(luò)類型紛繁復(fù)雜,STUN協(xié)議在5389的時(shí)候去掉了NAT類型的判斷的能力,因?yàn)樵絹?lái)越多的實(shí)踐發(fā)現(xiàn),在多層NAT下,類型的探測(cè)不總是有效的。而使用ICE的時(shí)候,不需要事先探測(cè)NAT類型。
? ? ???STUN還有一個(gè)作用是為ICE提供支持(對(duì)Binding的擴(kuò)展)。
? ? ???TURN 協(xié)議的目的是為了保證通信雙方百分之百能進(jìn)行通信 ,就是在只知道反射地址而打洞失敗的情況下的一種補(bǔ)充方案-----使用中繼,使用中繼方式百分之百能使得雙方進(jìn)行通信,只不過(guò)已經(jīng)不是P2P的了,而且伴隨而來(lái)的是轉(zhuǎn)發(fā)效率的問(wèn)題。不過(guò)這不要緊,因?yàn)樵搮f(xié)議的目的就是保證雙方肯定能通信,損失效率來(lái)保證了連同性。
? ? ???ICE 協(xié)議的目的就是綜合以上兩種方案,通過(guò)通信雙方互相發(fā)探測(cè)包,找出一種最合理,最廉價(jià)的可行路徑 。ICE首先探測(cè)內(nèi)網(wǎng)地址,再探測(cè)STUN提供的反射地址,最后探測(cè)TURN協(xié)議的中繼地址,反正最終目的就是探出一條路,內(nèi)網(wǎng)地址不行用反射地址,反射地址不行,最后不得已情況下那就用中繼地址。
?????? 一般來(lái)說(shuō),目前的TURN服務(wù)器通常也實(shí)現(xiàn)了STUN協(xié)議,所以可以稱之為TURN服務(wù)器或者是STUN 服務(wù)器。
如果說(shuō)一個(gè)服務(wù)器是STUN服務(wù)器,那么該服務(wù)器可能是純的STUN(RFC 5389)服務(wù)器,也可能是一個(gè)TURN(RFC 5766)服務(wù)器,也可能是兩者都實(shí)現(xiàn)了的服務(wù)器。本文以下圖中所說(shuō)的STUN服務(wù)器,均為實(shí)現(xiàn)了STUN和TURN的服務(wù)器。
?
? ? ?? 未完。。。。待續(xù)。。。。
?
第二部分: STUN/TURN/ICE協(xié)議在P2P SIP中的應(yīng)用(二)
?
? ?本文為原創(chuàng),轉(zhuǎn)載請(qǐng)注明以下內(nèi)容:
名稱:STUN/TURN/ICE協(xié)議在P2P SIP中的應(yīng)用(一)
作者:大雪先生
鏈接:http://www.cnblogs.com/ishang/p/3810382.html
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
