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

浏览器兼容性

另见