子曰:“不患無位,患 所以立;不患莫己,求 為可知也?!?/p>
前言
WebRTC(Web Real-Time Communication),一個可以讓用戶用自己流量實現(xiàn)音視頻實時通信的框架(APIs),支持瀏覽器(Firefox、Chrome、Opera)以及iOS、Android 原生系統(tǒng)(Poor WP,默哀)。對于覺得帶寬賊貴又需要實現(xiàn)用戶之間音視頻通信的公司來說,這是一個大大的福利。本系列文章會從WebRTC基本概念慢慢說起。
What is WebRTC?
官方介紹:
WebRTC is a free, open project that provides browsers and mobile applications with Real-Time Communications (RTC) capabilities via simple APIs.The WebRTC components have been optimized to best serve this purpose.
Our mission: To enable rich, high-quality RTC applications to be developed for the browser, mobile platforms, and IoT devices, and allow themall to communicate via a common set of protocols.
WebRTC是一個free的開源項目,該項目提供了一組可以在瀏覽器、手機應(yīng)用平臺(再次聲明,目前只支持iOS和Android。)實現(xiàn)實時通信的簡單API(s),WebRTC的目標是將實時通信過程做得最優(yōu)化。
我們的任務(wù)(指WebRTC官方):在手機應(yīng)用平臺、瀏覽器和物聯(lián)網(wǎng)設(shè)備之間用同一組協(xié)議實現(xiàn)高質(zhì)量實時通信。
RTC基本框架
按照傳統(tǒng)的通信流程,是這樣的:
如下圖所示,數(shù)據(jù)發(fā)送端和接收端都需要通過公網(wǎng)服務(wù)器進行轉(zhuǎn)發(fā)(因為發(fā)送端和接收端通常都做了NAT,彼此并不知對方實際位置)。
e.g.:猶如一個中國人和一個外國人,他們彼此不懂對方的語言,不知道對方的地址,但是中間有一個郵局知道對方的地址,因為對方都在郵局做了注冊地址并且獲取了同一個編號,那么如果他們之間需要互相通信的話,就需要和郵局聯(lián)系,郵局會進行翻譯并發(fā)往同一編號的對應(yīng)地址。 但是這中間就會產(chǎn)生一個問題,這時候如果有多個中國人和多個外國人都要進行通信,那么郵局的工作量就會越來越大,當他們的通信超過原有郵局人手可處理規(guī)模時,郵局要么擴招(需要錢)要么延緩發(fā)送(會造成延遲,甚至丟失信件)。

怎么辦?這時我們就要考慮另外一種解決方案了。我們讓發(fā)送端直接發(fā)送數(shù)據(jù)給接收端,這樣就可以省掉服務(wù)器的轉(zhuǎn)發(fā)功能了是不是?當然是,但是如我們上述例子所說,中國人不懂俄語,俄羅斯人不懂中文,雞同鴨講眼碌碌。他們之間怎么通信呢?郵局覺得上述方式太不靠譜了,于是決定通過一種技術(shù),當有一個中國人或者外國人尋求轉(zhuǎn)發(fā)時,郵局通過“魔法”查找出了對方地址,并且不說話丟給了對方一只翻譯面包,對方接收到翻譯面包后可以習得對方語言,直接和對方通話。
例子中的“魔法”就是本文要介紹的 ICE框架,而翻譯面包就是NAT穿越技術(shù)。

時間關(guān)系,以下內(nèi)容不再舉例說明,需要網(wǎng)絡(luò)基礎(chǔ)的同學才能繼續(xù)觀看。
-
ICE(Interactive Connectivity Establishment)框架
在真實世界的網(wǎng)絡(luò)中,因為IPv4的地址個數(shù)問題,我們基本都是采用NAT連接的:

當處于以上網(wǎng)絡(luò)時,Peer和Peer之間基本都是通過NAT和防火墻連接上互聯(lián)網(wǎng)的,所以當我們要建立兩端之間的直接通信時,我們需要服務(wù)器對兩端進行Signalling,具體如何進行Signalling會在下篇文章中介紹。本文假設(shè)兩端已經(jīng)Signalling完畢[1]。
ICE框架 (ICE會嘗試找到端與端之間最優(yōu)連接路徑)會完成以下工作:
- 首先ICE會直接利用主機地址和網(wǎng)卡地址進行連接,如果剛好端擁有公網(wǎng)IP(無NAT),那么此時可以直接建立連接。
- 如果第一步失敗,ICE會嘗試建立STUN[2]連接。

- 如果第二步失敗,ICE會利用TURN[3]服務(wù)器建立連接。

在本章中,我們只需要知道,ICE是一個提供了連接建立的服務(wù)框架。
-
STUN(Session Traversal Utilities for NAT)
STUN服務(wù)器提供的功能十分簡單,它讓使用者獲取自己所在的公網(wǎng)地址和在NAT中所映射端口號,這個服務(wù)有什么用呢?當使用者知道自己所在公網(wǎng)地址以及內(nèi)部NAT映射端口時,它便可以講自己的公網(wǎng)地址和端口號通知對方,這樣對方就可以在茫茫大網(wǎng)中找到自己。
在以往統(tǒng)計中,WebRTC通過STUN建立連接的成功率為86%。
-
TURN(Traversal Using Relay NAT)
TURN[2]是一個client-server協(xié)議。TURN的NAT穿透方法與STUN類似,都是通過取得應(yīng)用層中的公有地址達到NAT穿透。但實現(xiàn)TURN client的終端必須在通訊開始前與TURN server進行交互,并要求TURN server產(chǎn)生"relay port",也就是relayed-transport-address。這時TURN server會建立peer,即遠端端點(remote endpoints),開始進行中繼(relay)的動作,TURN client利用relay port將資料傳送至peer,再由peer轉(zhuǎn)傳到另一方的TURN client。

TURN 和 STUN
STUN服務(wù)在查詢出客戶端所在IP和端口后,其所成功建立的連接是直接通過端與端之間的連接的。
TURN服務(wù)是通過TURN服務(wù)器(擁有公網(wǎng)地址)作為中間人進行轉(zhuǎn)發(fā),所以如果TURN服務(wù)速度比STUN慢,而且是需要消耗TURN服務(wù)器帶寬。