WebRTC原理解析

瀏覽器本身不支持點(diǎn)對(duì)點(diǎn)建立信道進(jìn)行通信嘴秸,需通過服務(wù)器進(jìn)行中轉(zhuǎn)泰鸡。因此瀏覽器之間一次通信需通過兩段信道近弟,通信效率同時(shí)受制于兩段信道寬度晓褪,因此并不適合數(shù)據(jù)流的傳輸。

WebRTC是瀏覽器實(shí)時(shí)通信RTC的提供JS接口扎筒,JS接口通過信令建立瀏覽器點(diǎn)對(duì)點(diǎn)(peer-to-peer,P2P)的信道莱找,信道可發(fā)送任何數(shù)據(jù)并無需經(jīng)過服務(wù)器。

WebRTC提供三個(gè)API

  • MediaStream用于獲取本地音視頻流
  • RPCPeerConnection用于瀏覽器之間建立連接以傳遞音視頻流
  • RTCDataChannel用于瀏覽器之間傳遞自定義數(shù)據(jù)嗜桌。
var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
getUserMedia.call(navigator, {video:true, audio:true}, function(localMediaStream){
  var video = document.getElementById('video');
  video.src = window.URL.createObjectURL(localMediaStream);
  video.onloadedmetadata = function(e){
    console.log(localMediaStream.label);
    console.log(localMediaStream.getAudioTracks());
    console.log(localMediaStream.getVideoTreacks());
  }
}, function(err){
  console.log('rejected', err);
});

WebRTC使用RTCPeerConnection在瀏覽器之間傳遞流數(shù)據(jù)奥溺,此流數(shù)據(jù)通道是P2P的,無需服務(wù)器中轉(zhuǎn)症脂。但并不意味著能拋棄服務(wù)器谚赎,仍需服務(wù)器為傳遞信令(signaling)來建立信道淫僻。WebRTC沒有定義用于建立信道的信令協(xié)議诱篷,信令并不是RTCPeerConnection API的一部分。

既然沒有定義信令(signaling)的協(xié)議雳灵,可選擇任意方式(如AJAX棕所、WebSocket)任意協(xié)議(如SIP、XMPP)來傳遞信令悯辙,建立信道琳省。

需要信令來交換信息分為:

  • SESSION信息用來初始化信道還是錯(cuò)誤信息
  • 網(wǎng)絡(luò)配置迎吵,例如IP地址和端口等
  • 媒體適配, 發(fā)送方和接收方的瀏覽能接收什么樣的編碼器和分辨率

通過服務(wù)器建立信道

WebRTC提供瀏覽器之間P2P信道進(jìn)行數(shù)據(jù)傳輸针贬,但建立這個(gè)信道必須有服務(wù)器的參與击费。

WebRTC需服務(wù)器提供:

  • 用戶發(fā)現(xiàn)以及通信
  • 信令傳輸
  • NAT/防火墻穿越
  • 若P2P通信建立失敗可作為中轉(zhuǎn)服務(wù)器

NAT/防火墻穿越技術(shù)

在處于使用NAT設(shè)備的私有TCP/IP網(wǎng)絡(luò)中的主機(jī)之間建立連接時(shí)需使用NAT穿越。NAT的行為是非標(biāo)準(zhǔn)化的桦他,穿越技術(shù)大多使用公共服務(wù)器蔫巩,使全球任何地方都能訪問得到IP地址,在RTCPeerConnection中實(shí)用ICE框架來保證RTCPeerConnection實(shí)現(xiàn)NAT穿越快压。

ICE

ICE(Interactive Connectivity Establishment圆仔, 綜合性NAT穿越技術(shù))框架整合各種NAT穿越技術(shù)如STUN、TURN(Traversal Using Relay NAT蔫劣,中繼NAT實(shí)現(xiàn)的穿透)坪郭,ICE先使用STUN嘗試建立一個(gè)基于UDP的連接,失敗后實(shí)用TCP(先嘗試HTTP然后嘗試HTTPS)脉幢,若依然失敗歪沃,ICE就會(huì)使用中繼的TURN服務(wù)器。

RTCDataChannel

既然能建立P2P信道來傳遞實(shí)時(shí)音視頻數(shù)據(jù)流鸵隧,為什么不能使用此信道傳遞其他數(shù)據(jù)呢绸罗?RTCDataChannel API可實(shí)現(xiàn)瀏覽器之間傳遞任意數(shù)據(jù)。DataChannel是建立在PeerConnection之上的豆瘫,不能單獨(dú)使用珊蟀。

WebRTC原理

WebRTC的實(shí)現(xiàn)是建立瀏覽器之間的直接連接而無需服務(wù)器中轉(zhuǎn),即P2P外驱。因此要求彼此知道對(duì)方外網(wǎng)地址育灸,而計(jì)算機(jī)大多位于NAT之后,少數(shù)主機(jī)擁有外網(wǎng)地址昵宇。這就要求一種方式可穿透NAT技術(shù)(STUN磅崭、TRUN)。

WebRTC實(shí)用默認(rèn)STUN服務(wù)器獲取當(dāng)前主機(jī)的外網(wǎng)地址和端口瓦哎,Chrome默認(rèn)的是Google域名下的一個(gè)STUN砸喻,國(guó)內(nèi)不大穩(wěn)定。

P2P建立過程需依賴服務(wù)端中轉(zhuǎn)(信令服務(wù)器)蒋譬,需實(shí)用雙工通訊方式的WebSocket來實(shí)現(xiàn)信令的中轉(zhuǎn)割岛。

網(wǎng)絡(luò)信息交換

瀏覽器A創(chuàng)建一個(gè)RTCPeerConnection對(duì)象,RTCPeerConnection自動(dòng)向STUN服務(wù)器獲取自己的外網(wǎng)IP與端口犯助,然后將自己的網(wǎng)絡(luò)信息經(jīng)過信令服務(wù)器中轉(zhuǎn)后發(fā)送給瀏覽器B癣漆。

瀏覽器B接收到A的網(wǎng)絡(luò)信息后創(chuàng)建一個(gè)RTCPeerConnection對(duì)象,將接收的信息通過addIceCandidate添加到對(duì)象中剂买。

音視頻設(shè)備信息交換

瀏覽器A通過RTCPeerConnection對(duì)象的createOffer()獲取本地音視頻編碼分辨率等信息惠爽,通過setLocalDescription添加到RTCPeerConnection中癌蓖,并將這些信息經(jīng)過信令服務(wù)器中轉(zhuǎn)后發(fā)送給瀏覽器B。瀏覽器B接收到瀏覽器A發(fā)送過來的信息后婚肆,使用RTCPeerConnection對(duì)象的setRomoteDescription()保存租副。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市较性,隨后出現(xiàn)的幾起案子附井,更是在濱河造成了極大的恐慌,老刑警劉巖两残,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件永毅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡人弓,警方通過查閱死者的電腦和手機(jī)沼死,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來崔赌,“玉大人意蛀,你說我怎么就攤上這事〗“牛” “怎么了县钥?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)慈迈。 經(jīng)常有香客問我若贮,道長(zhǎng),這世上最難降的妖魔是什么痒留? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任谴麦,我火速辦了婚禮,結(jié)果婚禮上伸头,老公的妹妹穿的比我還像新娘匾效。我一直安慰自己,他們只是感情好恤磷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布面哼。 她就那樣靜靜地躺著,像睡著了一般扫步。 火紅的嫁衣襯著肌膚如雪魔策。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天锌妻,我揣著相機(jī)與錄音代乃,去河邊找鬼旬牲。 笑死仿粹,一個(gè)胖子當(dāng)著我的面吹牛搁吓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吭历,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼堕仔,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了晌区?” 一聲冷哼從身側(cè)響起摩骨,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎朗若,沒想到半個(gè)月后恼五,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哭懈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年灾馒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遣总。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡睬罗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出旭斥,到底是詐尸還是另有隱情容达,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布垂券,位于F島的核電站花盐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏菇爪。R本人自食惡果不足惜卒暂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望娄帖。 院中可真熱鬧也祠,春花似錦、人聲如沸近速。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽削葱。三九已至奖亚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間析砸,已是汗流浹背昔字。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人作郭。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓陨囊,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親夹攒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜘醋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容