WebRTC 協議簡介

本文介紹了 WebRTC API 所構建的基礎協議。

ICE

互動式連線建立 (ICE) 是一個框架,允許您的瀏覽器與對等方連線。從對等方 A 到對等方 B 的直接連線之所以會失敗,有很多原因。它需要繞過阻止建立連線的防火牆,在您沒有公共 IP 地址(這很常見)的情況下為您分配一個唯一的地址,並在您的路由器不允許您直接與對等方連線時透過伺服器中繼資料。ICE 使用 STUN 和/或 TURN 伺服器來實現此目的,如下所述。

STUN

NAT 的會話遍歷實用程式 (STUN) 是一種用於發現您的公共地址並確定路由器中可能阻止與對等方直接連線的限制的協議。

客戶端會向網際網路上的 STUN 伺服器傳送一個請求,該伺服器會回覆客戶端的公共地址以及客戶端是否可以透過路由器的 NAT 訪問。

An interaction between two users of a WebRTC application involving a STUN server.

NAT

網路地址轉換 (NAT) 用於為您的裝置分配一個公共 IP 地址。路由器將擁有一個公共 IP 地址,而連線到路由器的每個裝置都將擁有一個私有 IP 地址。請求將從裝置的私有 IP 轉換為路由器的公共 IP,並帶有一個唯一的埠。這樣,您就不需要為每臺裝置分配唯一的公共 IP,但仍可在網際網路上被發現。

某些路由器會對連線到網路上裝置的使用者進行限制。這意味著,即使我們透過 STUN 伺服器找到了公共 IP 地址,也不是任何人都可以建立連線。在這種情況下,我們需要使用 TURN。

TURN

某些使用 NAT 的路由器會採用一種名為“對稱 NAT”的限制。這意味著路由器只會接受來自您之前連線過的對等方的連線。

透過 NAT 代理進行遍歷 (TURN) 旨在透過與 TURN 伺服器建立連線並讓所有資訊透過該伺服器進行中繼來繞過對稱 NAT 限制。您將與 TURN 伺服器建立連線,並指示所有對等方將資料包傳送到該伺服器,然後由該伺服器轉發給您。這顯然會帶來一些開銷,因此只有在沒有其他選擇的情況下才會使用。

An interaction between two users of a WebRTC application involving STUN and TURN servers.

SDP

會話描述協議 (SDP) 是一種用於描述連線的多媒體內容的標準,例如解析度、格式、編解碼器、加密等,以便在資料傳輸時雙方能夠相互理解。本質上,這是描述內容的元資料,而不是媒體內容本身。

因此,從技術上講,SDP 並不是真正的協議,而是一種用於描述共享裝置間媒體的連線的資料格式。

SDP 的文件記錄遠超出本文件的範圍;但是,有幾點在此值得注意。

結構

SDP 由一行或多行 UTF-8 文字組成,每行都以一個字元型別開頭,後跟一個等號 (=),然後是組成值或描述的結構化文字,其格式取決於型別。以給定字母開頭的文字行通常被稱為“字母行”。例如,提供媒體描述的行型別為 "m",因此這些行被稱為“m 行”。

瞭解更多資訊

要了解更多關於 SDP 的資訊,請參閱以下有用資源

多方視訊會議

在 WebRTC 點對點網路中,對等方根據裝置功能和網路頻寬協商合適的影片編解碼器/流。然後,每個傳送者將包含影片資訊的單個流“單播”到其對等方。

多方之間的視訊會議更加複雜,因為對等方可能具有不同的功能和網路條件:一個特定的影片流解析度、速率和質量可能不適合所有接收者,同時傳送者為許多接收者生成和傳送多個流既不高效也不可擴充套件。

解決這些問題的最常見方法是使用稱為選擇性轉發單元 (SFU) 或選擇性轉發中介軟體 (SFM) 的中間伺服器。傳送者輸出編碼後的影片,以便 SFM 可以選擇性地轉發適合每個接收者的影片流。WebRTC 在這種情況下用於編碼影片的兩種主要技術是: simulcast 和可伸縮影片編碼。

Simulcast

Simulcast 以不同解析度和位元率的相同源的多個同步版本傳送到單獨的流中。SFM 根據接收者的網路條件和裝置功能將最合適的流轉發給每個接收者。

SFM 依賴於確定幀依賴關係的能力,例如從一個幀鏈到最後一個關鍵幀,以便在接收者察覺不到的情況下轉發資料包和切換 simulcast 層。

VP8 和 VP9 編解碼器分別可以在 VP8 有效載荷描述符和 VP9 有效載荷描述符中包含幀依賴資訊。對於 AV1 編解碼器,資訊透過 依賴描述符 (DD) RTP 頭擴充套件傳送。

最近的瀏覽器實現通常對所有編解碼器使用 DD 頭,因為它與編解碼器無關,這可以簡化 SFM 的實現。此外,因為它屬於 RTP 頭的一部分而不是有效載荷,所以它可以在端到端加密場景中使用。

可伸縮影片編碼

可伸縮影片編碼 (SVC) 將影片源編碼到單個流中,該流具有多個層,可以被選擇性地解碼以獲得特定解析度、位元率或質量的影片。SFM 可以轉發一部分層,以傳送適合每個接收者網路和裝置的流。

請注意,在 simu​​lcast(請參閱 SVC 規範中的依賴關係圖以“瞭解”其複雜性)中,依賴關係比僅為選擇要轉發的流所需的要複雜得多。SVC 流包含一個提供最低質量水平的基礎層,並且可能包含多個增強層,這些增強層允許可變的幀速率(“時間可伸縮性”)、更高的解析度(“空間可伸縮性”)以及相同解析度下的不同位元率。VP8 編解碼器僅支援時間層,而 VP9 支援時間和空間層。

VP8 和 VP9 編解碼器分別可以在 VP8 有效載荷描述符和 VP9 有效載荷描述符中包含幀依賴資訊。對於 AV1 編解碼器,資訊透過 依賴描述符 (DD) RTP 頭擴充套件傳送。

與 simulcast 一樣,最近的瀏覽器實現通常對所有支援 SVC 的編解碼器使用 DD 頭,以簡化 SFM 的實現,並且因為它支援端到端加密場景。

Chrome 111 及更高版本支援 SVC。在撰寫本文時(大約 FF136),Firefox 不支援 SVC。

依賴描述符 RTP 頭擴充套件

在規範AV1 的 RTP 有效載荷格式 (v1.0) 中定義的 依賴描述符 (DD) RTP 頭擴充套件,提供了一種獨立於編解碼器、靈活、高效且可擴充套件的方法來描述多層影片流中幀之間的關係。

SFM 可以使用這些資訊來選擇和轉發與目標接收者所在層相關的資料包。由於該標頭檔案是真正的擴充套件,因此它不是有效載荷的一部分,因此在端到端加密 (E2EE) 場景中仍然可以被 SFM 使用。

Chrome 和 Firefox(136+)支援 DD 頭。

WebRTC 支援的編解碼器

此資訊可在 WebRTC 使用的編解碼器 中找到。