实际中的WebRTC:STUN,TURN以及信令(五)
原標(biāo)題:WebRTC in the real world:?STUN,?TURN?and signaling
前文鏈接:實(shí)際中的WebRTC:STUN,TURN以及信令(一),實(shí)際中的WebRTC:STUN,TURN以及信令(二),實(shí)際中的WebRTC:STUN,TURN以及信令(三),實(shí)際中的WebRTC:STUN,TURN以及信令(四)
?
STUN
NAT給設(shè)備提供了一個(gè)IP地址以使用專(zhuān)用局域網(wǎng),但是這個(gè)地址不能在外部使用。由于沒(méi)有公用地址,WebRTC對(duì)等端就無(wú)法進(jìn)行通信。而WebRTC使用?STUN來(lái)解決這個(gè)問(wèn)題。
STUN服務(wù)器位于公共網(wǎng)絡(luò)上,并且有一個(gè)簡(jiǎn)單的任務(wù):檢查傳入請(qǐng)求的IP地址(來(lái)自運(yùn)行在NAT后面的應(yīng)用程序),并將該地址作為響應(yīng)發(fā)送回去。換句話說(shuō),應(yīng)用程序使用?STUN服務(wù)器從公共角度發(fā)現(xiàn)其IP:端口。這個(gè)過(guò)程使得WebRTC對(duì)等端為自己活得一個(gè)可公開(kāi)訪問(wèn)的地址,然后通過(guò)信令機(jī)制將其傳遞給另一個(gè)對(duì)等端以建立直接鏈接。(實(shí)際上不同NAT工作方式都有所不同,可能有多個(gè)NAT層,但是原理是一樣的)。
因?yàn)?STUN服務(wù)器不需要做太多的工作或者記特別多的東西,所以相對(duì)低規(guī)格的?STUN服務(wù)器就可以處理大量的請(qǐng)求。
根據(jù)webrtcstats.com的統(tǒng)計(jì)(2013年),大多數(shù)WebRTC通話都成功地使用?STUN進(jìn)行連接,有86%。盡管對(duì)于防火墻之后的對(duì)等端之間的呼叫以及復(fù)雜的NAT配置,成功通話量會(huì)更少一些。
TURN
RTCPeerConnection嘗試通過(guò)UDP建立對(duì)等端之間的直接通信。如果失敗的話,RTCPeerConnection就會(huì)使用TCP進(jìn)行連接。如果使用TCP還失敗的話,可以用?TURN服務(wù)器作為后備,在終端之間轉(zhuǎn)發(fā)數(shù)據(jù)。
重申:?TURN用于中繼對(duì)等端之間的音頻/視頻/數(shù)據(jù)流,而不是信令數(shù)據(jù)。
TURN服務(wù)器具有公共地址,因此即使對(duì)等端位于防火墻或代理之后也可以與其他人聯(lián)系。?TURN服務(wù)器有一個(gè)概念上來(lái)講簡(jiǎn)單的任務(wù)—中繼數(shù)據(jù)流—但是與?STUN服務(wù)器不同的是,他們會(huì)消耗大量的帶寬。換句話說(shuō),?TURN服務(wù)器需要更加的強(qiáng)大。
上圖顯示了?TURN的作用:單純的?STUN沒(méi)有成功建立連接,所以每個(gè)對(duì)等端還需要使用?TURN服務(wù)器。
部署?STUN和?TURN服務(wù)器
為了進(jìn)行測(cè)試,Google運(yùn)行了一個(gè)公共?STUN服務(wù)器?stun.l.google.com:19302,就是apprtc.appspot.com所使用的那樣。對(duì)于產(chǎn)品的?STUN/?TURN服務(wù),我們推薦使用rfc5766-turn-server;?STUN和?TURN服務(wù)器的源代碼可從code.google.com/p/rfc5766-turn-server獲得,該代碼還提供了有關(guān)服務(wù)器安裝的多個(gè)信息源的鏈接。Amazon Web Services的VM映像也可用。
另一個(gè)?TURN服務(wù)器是restund,可用作源代碼,也可用于AWS。以下是如何在Google Compute Engine上設(shè)置restund的說(shuō)明。
???????? 1. 根據(jù)需要打開(kāi)防火墻,對(duì)于tcp = 443,udp/tcp = 3478
???????? 2. 創(chuàng)建四個(gè)實(shí)例,每個(gè)公共IP標(biāo)準(zhǔn)一個(gè),Standard Ubuntu 12.06映像
???????? 3. 設(shè)置本地防火墻配置
???????? 4. 安裝工具:
?????????????????? sudo apt-get install make
?????????????????? sudo apt-get install gcc
???????? 5. 從creytiv.com/re.html安裝libre
???????? 6. 從creytiv.com/restund.html獲取并解壓縮restund
???????? 7. wget?hancke.name/restund-auth.patch并且使用patch – p1
???????? 8. 對(duì)libre和restund運(yùn)行make, sudo make install
???????? 9. 根據(jù)你的需要(替換IP地址并確保它包含相同的共享密鑰)對(duì)restund.conf進(jìn)行調(diào)整,并復(fù)制到/etc
???????? 10. 復(fù)制restund/etc/restund到/etc/init.d/
???????? 11. 配置restund:
?????????????????? 設(shè)置LD_LIBRARY_PATH
?????????????????? 復(fù)制restund.conf到/etc/restund.conf
?????????????????? 設(shè)置restund.conf以使用正確的 10. IP地址
???????? 12. 運(yùn)行restund
???????? 13. 從遠(yuǎn)端機(jī)上使用社團(tuán)的客戶端進(jìn)行測(cè)試:./client IP:port
多方WebRTC
你可能還想查看一下Justin Uberti提出的用于訪問(wèn)TURN服務(wù)的REST API的IETF標(biāo)準(zhǔn)。
很容易想象媒體流的使用情況超出了簡(jiǎn)單的一對(duì)一呼叫:例如,一組同事之間的視頻會(huì)議,或一個(gè)發(fā)言者和數(shù)百(數(shù)百萬(wàn))個(gè)關(guān)公的公共事件。
WebRTC應(yīng)用程序可以使用多個(gè)RTCPeerConnection,以便每個(gè)端點(diǎn)都可以連接到網(wǎng)格配置中的每個(gè)其他端點(diǎn)。這是talky.io等應(yīng)用程序所采取的方法,對(duì)于值有少數(shù)幾個(gè)對(duì)等端的情況來(lái)說(shuō)可以很好的工作。除此之外,處理和帶寬會(huì)過(guò)度消耗,對(duì)于移動(dòng)客戶端來(lái)說(shuō)尤其是這樣。
或者,WebRTC應(yīng)用程序可以選擇一個(gè)端點(diǎn)以星形配置將流分配給所有其他端點(diǎn)。也可以在服務(wù)器上運(yùn)行WebRTC端點(diǎn)并構(gòu)建自己的重新分配機(jī)制。(webrtc.org提供了一個(gè)客戶端應(yīng)用示例)
從Chrome 31和Opera 18開(kāi)始,來(lái)自一個(gè)RTCPeerConnection的MediaStream可以用作另一個(gè)的輸入:在simpl.info/multi上有一個(gè)演示。這可以啟用更靈活的體系結(jié)構(gòu),因?yàn)樗筗eb應(yīng)用程序能夠通過(guò)選擇要連接的其他對(duì)等端來(lái)處理呼叫路由。
多點(diǎn)控制單元
大量端點(diǎn)情況的更好選擇是使用多點(diǎn)控制單元(Multipoint Control Unit,MCU)。它是一個(gè)服務(wù)器,可以作為在大量參與者之間分發(fā)媒體的橋。MCU可以處理視頻會(huì)議中的不同分辨率,編解碼器和幀速率,處理轉(zhuǎn)碼,選擇性流轉(zhuǎn)發(fā),混音或錄制音頻和視頻。對(duì)于多方通話,需要考慮許多問(wèn)題:特別是如何顯示多個(gè)視頻輸入并混合來(lái)自多個(gè)來(lái)源的音頻。
你可以購(gòu)買(mǎi)一個(gè)完整的MCU硬件包,或者建立自己的MCU。
有幾個(gè)開(kāi)源的MCU軟件可供選擇。比如說(shuō),Licode為WebRTC做了一個(gè)開(kāi)源MCU;OpenTok也有Mantis。
除了瀏覽器以外還有:VoIP,電話和消息
WebRTC的標(biāo)準(zhǔn)化特性使得在瀏覽器中運(yùn)行的WebRTC應(yīng)用程序與另一個(gè)通信平臺(tái)運(yùn)行的設(shè)備或停牌(例如電話或視頻會(huì)議系統(tǒng))之間建立通信成為可能。
SIP是VoIP和視頻會(huì)議系統(tǒng)使用的信令協(xié)議。為了實(shí)現(xiàn)WebRTC應(yīng)用程序與視頻會(huì)議系統(tǒng)等SIP客戶端之間的通信,WebRTC需要代理服務(wù)器來(lái)調(diào)解信令。信令必須通過(guò)網(wǎng)關(guān)流動(dòng),但一旦通信建立,SRTP流量(視頻和音頻)就可以直接流向?qū)Φ榷恕?/p>
公共交換電話網(wǎng)(PSTN)是所有“普通老式”模擬電話的電路交換網(wǎng)絡(luò)。對(duì)于WebRTC應(yīng)用程序和電話之間的通話,通信必須通過(guò)PSTN網(wǎng)關(guān)。同樣,WebRTC應(yīng)用程序需要中間的XMPP服務(wù)器來(lái)與Jingle端點(diǎn)(如IM客戶端)進(jìn)行通信。Jingle由Google開(kāi)發(fā),作為XMPP的擴(kuò)展,為語(yǔ)音和視頻提供消息傳遞服務(wù):當(dāng)前的WebRTC實(shí)現(xiàn)是基于C++ libjingle庫(kù)的,這是一個(gè)最初為Google Talk開(kāi)發(fā)的Jingle實(shí)現(xiàn)。
許多應(yīng)用程序,庫(kù),和平臺(tái)利用WebRTC與外部世界的溝通能力:sipML5,jsSIP,Phono,Zingaya,Twilio和Uberconference等等。
sipML5開(kāi)發(fā)者也構(gòu)建了webrtc2sip網(wǎng)關(guān)。Tethr和Tropo展示了一個(gè)在災(zāi)難通信框架,使用OpenBTS單元通過(guò)WebRTC實(shí)現(xiàn)手機(jī)和計(jì)算機(jī)之間的通信。這是一個(gè)沒(méi)有運(yùn)營(yíng)商在中間的電話通信!
超強(qiáng)干貨來(lái)襲 云風(fēng)專(zhuān)訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的实际中的WebRTC:STUN,TURN以及信令(五)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: VirtualBox下安装Ubuntu
- 下一篇: 做WebRTC,千万别把媒体和信令混在一