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