title: WebRTC簡介
categories:[WebRTC]
tags:[音視頻編程]
date: 2021/12/09
作者:hackett
微信公眾號:加班猿
WebRTC簡介
WebRTC (Web Real-Time Communications) 是一項實時通訊技術,它允許網絡應用或者站點,在不借助中間媒介的情況下,建立瀏覽器之間點對點(Peer-to-Peer)的連接,實現視頻流和(或)音頻流或者其他任意數據的傳輸。WebRTC包含的這些標準使用戶在無需安裝任何插件或者第三方的軟件的情況下,創建點對點(Peer-to-Peer)的數據分享和電話會議成為可能。
WebRTC架構
顏色標識說明
(1)紫色部分是Web開發者API層;
(2)藍色實線部分是面向瀏覽器廠商的API層
(3)藍色虛線部分瀏覽器廠商可以自定義實現
架構組件介紹
(1) Your Web App
Web開發者開發的程序,Web開發者可以基于集成WebRTC的瀏覽器提供的web API開發基于視頻、音頻的實時通信應用。
(2)Web API
面向第三方開發者的WebRTC標準API(Javascript),使開發者能夠容易地開發出類似于網絡視頻聊天的web應用。
這些API可分成Network Stream API、 RTCPeerConnection、Peer-to-peer Data API三類,詳細的API說明可以看這里。
Network Stream API
MediaStream:MediaStream用來表示一個媒體數據流。
MediaStreamTrack在瀏覽器中表示一個媒體源。
RTCPeerConnection
RTCPeerConnection: 一個RTCPeerConnection對象允許用戶在兩個瀏覽器之間直接通訊。
RTCIceCandidate :表示一個ICE協議的候選者。
RTCIceServer:表示一個ICE Server。
Peer-to-peer Data API
DataChannel:數據通道( DataChannel)接口表示一個在兩個節點之間的雙向的數據通道 。
(3)WebRTC Native C++ API
本地C++ API層,使瀏覽器廠商容易實現WebRTC標準的Web API,抽象地對數字信號過程進行處理。
(4)Transport / Session
傳輸/會話層
會話層組件采用了libjingle庫的部分組件實現,無須使用xmpp/jingle協議
a. RTP Stack協議棧
Real Time Protocol
b. STUN/ICE
可以通過STUN和ICE組件來建立不同類型網絡間的呼叫連接。
c. Session Management
一個抽象的會話層,提供會話建立和管理功能。該層協議留給應用開發者自定義實現。
重要API
WebRTC原生APIs文件是基于WebRTC規格書撰寫而成,這些API可分成Network Stream API、 RTCPeerConnection、Peer-to-peer Data API三類。
Network Stream API
- MediaStream:MediaStream用來表示一個媒體數據流。
- MediaStreamTrack在瀏覽器中表示一個媒體源。
RTCPeerConnection
- RTCPeerConnection:一個RTCPeerConnection對象允許用戶在兩個瀏覽器之間直接通訊。
- RTCIceCandidate:表示一個ICE協議的候選者。
- RTCIceServer:表示一個ICE Server。
Peer-to-peer Data API
- DataChannel:數據通道(DataChannel)接口表示一個在兩個節點之間的雙向的數據通道。
WebRTC協議介紹
ICE
發送對等方能夠用于通信的方法。
ICE 提供了一個框架,通信對等方可以通過該框架發現和通信其公共 IP 地址,以便其他對等方可以訪問它。
STUN
用于 NAT (STUN) 的會話遍歷實用程序 是一種協議,用于發現您的公共地址并確定路由器中會阻止與對等方直接連接的任何限制。
客戶端將向 Internet 上的 STUN 服務器發送請求,該服務器將回復客戶端的公共地址以及客戶端是否可通過路由器的 NAT 訪問。
- STUN 是一種通信協議工具,用于檢測和遍歷位于兩個通信端點之間的路徑中的網絡地址轉換器
- STUN 消息在用戶數據報協議(UDP) 數據包中發送。由于 UDP 不提供可靠的傳輸,可靠性是通過應用程序控制的 STUN 請求的重傳來實現的
- STUN 與三種類型的 NAT 配合使用:全錐 NAT、受限錐 NAT和端口受限錐 NAT。在受限錐或端口受限錐 NAT 的情況下,客戶端必須先向端點發送數據包,然后 NAT 才會允許從端點到客戶端的數據包。STUN 不適用于大公司網絡中常見的對稱 NAT(也稱為雙向 NAT)。由于STUN 服務器的IP 地址與端點的IP 地址不同,在對稱 NAT 情況下,STUN 服務器的 NAT 映射將與端點不同。TURN使用對稱 NAT 提供更好的結果。
NAT
網絡地址轉換 (NAT)用于為您的設備提供公共 IP 地址。路由器將有一個公共 IP 地址,連接到路由器的每個設備都將有一個私有 IP 地址。請求將從設備的私有 IP 轉換為具有唯一端口的路由器的公共 IP。這樣一來,您就不需要為每臺設備分配一個唯一的公共 IP,但仍然可以在 Internet 上找到它。
網絡地址轉換( NAT ) 是一種通過在數據包通過流量路由設備傳輸時修改數據包IP 標頭中的網絡地址信息來將 IP地址空間映射到另一個IP地址空間的方法。
某些路由器會限制誰可以連接到網絡上的設備。這可能意味著即使我們擁有 STUN 服務器找到的公共 IP 地址,也不是任何人都可以創建連接。在這種情況下,我們需要轉向 TURN。
- 一對一:最簡單的 NAT 類型提供 IP 地址的一對一轉換。
- 一對多:大多數網絡地址轉換器將多個私有主機映射到一個公開的 IP 地址。一對多 NAT 的額外好處之一是它是IPv4 地址耗盡的實用解決方案。即使是大型網絡也可以使用單個公共 IP 地址連接到 Internet
TURN
一些使用 NAT 的路由器采用稱為“對稱 NAT”的限制。這意味著路由器將只接受來自您之前連接過的對等方的連接。
使用中繼繞過 NAT (TURN)旨在通過打開與 TURN 服務器的連接并通過該服務器中繼所有信息來繞過對稱 NAT 限制。您將創建與 TURN 服務器的連接,并告訴所有對等方將數據包發送到服務器,然后該服務器將轉發給您。這顯然會帶來一些開銷,因此只有在沒有其他選擇的情況下才會使用它。
SDP
會話描述協議 (SDP)是用于描述連接的多媒體內容(例如分辨率、格式、編解碼器、加密等)的標準,以便在數據傳輸后雙方可以相互理解。這實質上是描述內容的元數據,而不是媒體內容本身。
那么,從技術上講,SDP 并不是真正的協議,而是一種用于描述設備之間共享媒體的連接的數據格式。
SDP 規范純粹是一種會話描述格式。它旨在根據需要分布在不同的傳輸協議上,包括SAP、SIP和RTSP。SDP 甚至可以通過電子郵件或作為 HTTP 負載傳輸
SDP offer
由代理發送的 SDP 消息,代理生成會話描述以創建或修改會話。它描述所需媒體通信的各個方面。
SDP answer
應答者響應從提議人收到的提議而發送的 SDP 消息。應答指出了已接受的各個方面。例如,提議中的所有音頻和視頻流是否都被接受。
STUN、TURN 和 ICE 如何協同工作
讓我們來看看兩個對等方 A 和 B 的情況,它們都使用 WebRTC 對等雙向媒體流式傳輸(例如,視頻聊天應用程序)。當 A 想打電話給 B 時會發生什么?
要連接到 B 的應用程序,A 的應用程序必須生成 SDP 提議。SDP 提議包含有關 A 的應用程序要建立的會話的信息,包括要使用的編解碼器、這是音頻會話還是視頻會話等。它還包含 ICE 候選項列表,這些候選項是 B 的應用程序可以嘗試用來連接到 A 的 IP 和端口對。
要構建 ICE 候選項列表,A 的應用程序向 STUN 服務器發出一系列請求。服務器返回發起請求的公有 IP 地址和端口對。A 的應用程序將每個對添加到 ICE 候選項列表中,換句話說,它收集 ICE 候選項。一旦 A 的應用程序完成收集 ICE 候選項,它可以返回 SDP。
接下來,A 的應用程序必須通過這些應用程序用于通信的信令通道將 SDP 傳遞給 B 的應用程序。WebRTC 標準中未指定用于此交換的傳輸協議。它可以通過 HTTPS、安全 WebSocket 或任何其他通信協議執行。
現在,B 的應用程序必須生成 SDP 應答。B 的應用程序遵循 A 在上一步中使用的相同步驟:收集 ICE 候選項等。然后,B 的應用程序需要將此 SDP 應答返回給 A 的應用程序。
晚于A 和 B 交換 SDP,然后執行一系列連接性檢查。每個應用程序中的 ICE 算法從它在另一方的 SDP 中收到的列表中獲取候選項 IP/端口對,并向其發送 STUN 請求。如果從另一個應用程序返回響應,發起方應用程序會認為檢查成功,并將該 IP/端口對標記為有效的 ICE 候選項。
在所有 IP/端口對上完成連接性檢查后,應用程序協商并決定使用剩余的有效對之一。當選擇一個對時,媒體開始在應用程序之間流動。
如果其中一個應用程序找不到通過了連接性檢查的 IP/端口對,它們將向 TURN 服務器發出 STUN 請求以獲取媒體中繼地址。中繼地址是一種公有 IP 地址和端口,用于將接收的數據包轉發到應用程序或從應用程序中轉發收到的數據包,以設置中繼地址。然后,將該中繼地址添加到候選項列表中,并通過信令通道進行交換。
這里對WebRTC整體做一個總結備忘。
如果你覺得文章還不錯,可以給個"三連",文章同步到個人微信公眾號[加班猿]
我是hackett,我們下期見
參考文檔: