RTCDtlsTransport

Baseline 廣泛可用 *

此特性已經十分成熟,可在許多裝置和瀏覽器版本上使用。自 2022 年 3 月起,它已在各瀏覽器中可用。

* 此特性的某些部分可能存在不同級別的支援。

RTCDtlsTransport 介面提供了對 Datagram Transport Layer Security (DTLS) 傳輸的訪問,該傳輸用於 RTCPeerConnectionRTPRTCP 資料包透過其 RTCRtpSenderRTCRtpReceiver 物件進行傳送和接收。

RTCDtlsTransport 物件也用於提供有關透過連線的 資料通道 傳輸和接收的 SCTP 資料包的資訊。

DTLS 傳輸的特點包括為底層傳輸新增安全性;RTCDtlsTransport 介面可用於獲取有關底層傳輸以及 DTLS 層為其新增的安全性資訊。

EventTarget RTCDtlsTransport

例項屬性

還繼承了 EventTarget 的屬性。

iceTransport 只讀

返回底層 RTCIceTransport 物件的引用。

state 只讀

返回一個字串,描述底層的 Datagram Transport Layer Security (DTLS) 傳輸狀態。它可以是以下值之一:newconnectingconnectedclosedfailed

例項方法

還繼承了 EventTarget 的方法。

getRemoteCertificates()

返回一個包含連線遠端對等方證書的 ArrayBuffer 陣列。

事件

error

當在 RTCPeerConnection 上發生傳輸層錯誤時傳送。

statechange

當 DTLS 傳輸的 state 發生變化時傳送。

描述

DTLS 傳輸的分配

當應用呼叫 setLocalDescription()setRemoteDescription() 時,會建立 RTCDtlsTransport 物件。建立的 DTLS 傳輸數量以及它們的使用方式取決於建立 RTCPeerConnection 時使用的捆綁模式。

是否使用捆綁取決於另一端點能夠協商的內容。所有瀏覽器都支援捆綁,因此當兩端點都是瀏覽器時,您可以放心捆綁將被使用。

然而,一些非瀏覽器遺留端點可能不支援捆綁。為了能夠與此類端點協商(或完全排除它們),在建立連線時可以提供 bundlePolicy 屬性。bundlePolicy 允許您控制如何與這些遺留端點進行協商。預設策略是 "balanced",它在效能和相容性之間取得了平衡。

例如,使用最高級別的捆綁來建立連線

js
const rtcConfig = {
  bundlePolicy: "max-bundle",
};

const pc = new RTCPeerConnection(rtcConfig);

Bundling 允許您使用一個 RTCDtlsTransport 來承載多個高級別傳輸的資料,例如多個 RTCRtpTransceiver

不使用 BUNDLE 時

當連線在不使用 BUNDLE 的情況下建立時,每個 RTCRtpTransceiver 的每個 RTP 或 RTCP 元件都有自己的 RTCDtlsTransport;也就是說,每個 RTCRtpSenderRTCRtpReceiver 都有自己的傳輸,並且所有 RTCDataChannel 物件共享一個專用於 SCTP 的傳輸。

使用 BUNDLE 時

當連線使用 BUNDLE 時,每個 RTCDtlsTransport 物件代表一組 RTCRtpTransceiver 物件。如果連線是使用 max-compat 模式建立的,則每個傳輸負責處理給定型別媒體(音訊、影片或資料通道)的所有通訊。因此,具有任意數量音訊和影片通道的連線將始終有一個 DTLS 傳輸用於音訊通訊,一個用於影片通訊。

由於傳輸在協商過程的早期建立,因此很可能在傳輸建立後才能知道遠端對等方是否支援捆綁。出於這個原因,您有時會看到一開始建立了單獨的傳輸,每個軌道一個,然後在得知捆綁成為可能後,它們會被捆綁起來。如果您的程式碼直接訪問 RTCRtpSender 和/或 RTCRtpReceiver,您可能會遇到它們最初是獨立的,然後一半或更多被關閉,並且傳送者和接收者被更新以引用相應的剩餘 RTCDtlsTransport 物件的情況。

資料通道

RTCDataChannel 使用 SCTP 進行通訊。所有對等連線的資料通道共享一個 RTCSctpTransport,可以在連線的 sctp 屬性中找到。

反過來,您可以透過檢視 RTCSctpTransport 物件的 transport 屬性來識別用於安全封裝資料通道 SCTP 通訊的 RTCDtlsTransport

示例

此示例展示了一個名為 tallySenders() 的函式,該函式遍歷 RTCPeerConnectionRTCRtpSender,計算它們處於各種狀態的數量。該函式返回一個物件,其中包含指示每個狀態有多少傳送者的屬性。

js
let pc = new RTCPeerConnection({ bundlePolicy: "max-bundle" });

// …

function tallySenders(pc) {
  let results = {
    transportMissing: 0,
    connectionPending: 0,
    connected: 0,
    closed: 0,
    failed: 0,
    unknown: 0,
  };

  let senderList = pc.getSenders();
  senderList.forEach((sender) => {
    let transport = sender.transport;

    if (!transport) {
      results.transportMissing++;
    } else {
      switch (transport.state) {
        case "new":
        case "connecting":
          results.connectionPending++;
          break;
        case "connected":
          results.connected++;
          break;
        case "closed":
          results.closed++;
          break;
        case "failed":
          results.failed++;
          break;
        default:
          results.unknown++;
          break;
      }
    }
  });
  return results;
}

請注意,在此程式碼中,newconnecting 狀態被視為返回物件中的單個 connectionPending 狀態。

規範

規範
WebRTC:瀏覽器中的即時通訊
# dom-rtcdtlstransport

瀏覽器相容性

另見