使用 WebRTC 資料通道

在本指南中,我們將探討如何向對等連線新增資料通道,該通道可用於安全地交換任意資料;也就是說,我們可以選擇任何格式來交換我們想要的任何型別的資料。

注意: 由於所有 WebRTC 元件都必須使用加密,因此在 RTCDataChannel 上傳輸的任何資料都會自動使用資料報傳輸層安全 (DTLS) 進行保護。有關更多資訊,請參見下文的 安全

建立資料通道

RTCDataChannel 使用的底層資料傳輸可以透過以下兩種方式之一建立:

  • 讓 WebRTC 為您建立傳輸並將其宣告給遠端對等端(透過使其接收 datachannel 事件)。這是簡單的方法,適用於多種用例,但可能不夠靈活,無法滿足您的需求。
  • 編寫自己的程式碼來協商資料傳輸,並編寫自己的程式碼來向另一方對等端發出訊號,表明它需要連線到新通道。

讓我們分別看看這兩種情況,從最常見的第一種開始。

自動協商

通常,您可以允許對等連線為您處理 RTCDataChannel 連線的協商。為此,請呼叫 createDataChannel(),而不為 negotiated 屬性指定值,或者將該屬性指定為 false。這將自動觸發 RTCPeerConnection 為您處理協商,從而使遠端對等端建立一個數據通道,並將兩者在網路上連線起來。

createDataChannel() 會立即返回 RTCDataChannel 物件;您可以透過監聽傳送到 RTCDataChannelopen 事件來得知連線是否成功建立。

js
let dataChannel = pc.createDataChannel("MyApp Channel");

dataChannel.addEventListener("open", (event) => {
  beginTransmission(dataChannel);
});

手動協商

要手動協商資料通道連線,您首先需要透過 RTCPeerConnection 上的 createDataChannel() 方法建立一個新的 RTCDataChannel 物件,並在選項中指定 negotiated 屬性設定為 true。這會向對等連線發出訊號,使其不代表您嘗試協商通道。

然後,使用 Web 伺服器或其他方式帶外協商連線。此過程應向遠端對等端發出訊號,表明它應使用相同的 id 建立自己的 RTCDataChannel,並將 negotiated 屬性也設定為 true。這將透過 RTCPeerConnection 連線這兩個物件。

js
let dataChannel = pc.createDataChannel("MyApp Channel", {
  negotiated: true,
});

dataChannel.addEventListener("open", (event) => {
  beginTransmission(dataChannel);
});

requestRemoteChannel(dataChannel.id);

在此程式碼片段中,通道以 negotiated 設定為 true 的方式建立,然後使用一個名為 requestRemoteChannel() 的函式來觸發協商,以建立與本地通道具有相同 ID 的遠端通道。

這樣做可以讓您為每個對等端建立具有不同屬性的資料通道,並透過使用相同的 id 值來宣告性地建立通道。

緩衝

WebRTC 資料通道支援出站資料的緩衝。這是自動處理的。雖然無法控制緩衝區的大小,但您可以瞭解當前緩衝了多少資料,並且可以選擇在緩衝區中的排隊資料開始不足時透過事件獲得通知。這使得編寫高效的例程變得容易,這些例程可以確保總是有資料準備好傳送,而不會過度使用記憶體或完全淹沒通道。

瞭解訊息大小限制

您應該保持訊息大小適中。雖然大多數現代瀏覽器支援傳送至少 256KB 的訊息,但傳送大訊息存在缺點,尤其是在訊息交錯不可用時。如果沒有訊息交錯(如 RFC 8260 中定義的那樣),在一個數據通道上傳送大訊息可能會導致 隊頭阻塞,這反過來又會對其他資料通道上的訊息延遲產生負面影響。

最大訊息大小可以使用 max-message-size SDP 屬性進行協商,該屬性在 RFC 8841 中定義。此屬性允許每個對等端宣告它願意接收的 SCTP 使用者訊息的最大大小。透過協商此值,端點可以避免傳送大於另一方對等端可以處理的訊息。如果 SDP 中不存在 max-message-size 屬性,則假定預設值為 64KB。值為 0 表示端點可以處理任何大小的訊息,僅受可用記憶體的限制。

安全

使用 WebRTC 傳輸的所有資料都經過加密。對於 RTCDataChannel,使用的加密是資料報傳輸層安全 (DTLS),它基於 傳輸層安全 (TLS)。由於 TLS 用於保護每個 HTTPS 連線,因此您在資料通道上傳送的任何資料都與使用者瀏覽器傳送或接收的其他任何資料一樣安全。

更根本的是,由於 WebRTC 是兩個使用者代理之間的點對點連線,資料永遠不會透過 Web 或應用程式伺服器。這減少了資料被攔截的機會。