RTCDtlsTransport

RTCDtlsTransport 接口提供了访问有关数据报传输层安全性 (DTLS) 传输的信息,RTCPeerConnectionRTPRTCP 数据包通过其 RTCRtpSenderRTCRtpReceiver 对象发送和接收。

RTCDtlsTransport 对象还用于提供有关连接的 SCTP 数据包传输和接收的信息 数据通道

DTLS 传输的功能包括为底层传输添加安全性;RTCDtlsTransport 接口可用于获取有关底层传输以及 DTLS 层为其添加的安全性信息。

EventTarget RTCDtlsTransport

实例属性

还继承了来自 EventTarget 的属性。

iceTransport 只读

返回对底层 RTCIceTransport 对象的引用。

state 只读

返回一个字符串,该字符串描述底层数据报传输层安全性 (DTLS) 传输状态。它可以是以下值之一:newconnectingconnectedclosedfailed

实例方法

还继承了来自 EventTarget 的方法。

getRemoteCertificates()

返回一个 ArrayBuffer 数组,其中包含连接的远程对等方的证书。

事件

error

RTCPeerConnection 上发生传输级错误时发送。

statechange

state 的 DTLS 传输更改时发送。

描述

DTLS 传输的分配

当应用程序调用 setLocalDescription()setRemoteDescription() 时,会创建 RTCDtlsTransport 对象。创建的 DTLS 传输的数量以及它们的使用方式取决于创建 RTCPeerConnection 时使用的捆绑模式。

是否使用捆绑取决于另一个端点能够协商的内容。所有浏览器都支持捆绑,因此当两个端点都是浏览器时,您可以放心使用捆绑。

但是,一些非浏览器遗留端点可能不支持捆绑。为了能够与这些端点协商(或完全排除它们),在创建连接时可以提供 bundlePolicy 属性。bundlePolicy 允许您控制如何与这些遗留端点协商。默认策略为 "balanced",它在性能和兼容性之间取得平衡。

例如,要使用最高级别的捆绑创建连接

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

const pc = new RTCPeerConnection(rtcConfig);

捆绑 允许您使用一个 RTCDtlsTransport 来承载多个更高级别传输的数据,例如多个 RTCRtpTransceiver

不使用 BUNDLE 时

当连接在不使用 BUNDLE 的情况下创建时,每个 RTCRtpTransceiver 的每个 RTP 或 RTCP 组件都有自己的 RTCDtlsTransport;也就是说,每个 RTCRtpSenderRTCRtpReceiver 都有自己的传输,并且所有 RTCDataChannel 对象共享一个专用于 SCTP 的传输。

使用 BUNDLE 时

当连接使用 BUNDLE 时,每个 RTCDtlsTransport 对象都表示一组 RTCRtpTransceiver 对象。如果连接是使用 max-compat 模式创建的,则每个传输负责处理给定媒体类型(音频、视频或数据通道)的所有通信。因此,具有任意数量的音频和视频通道的连接始终只有一个用于音频通信的 DTLS 传输和一个用于视频通信的 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

浏览器兼容性

BCD 表仅在启用 JavaScript 的浏览器中加载。

另请参阅