RTCDtlsTransport
Baseline 广泛可用 *
RTCDtlsTransport 接口提供了对 Datagram Transport Layer Security (DTLS) 传输的访问,该传输用于 RTCPeerConnection 的 RTP 和 RTCP 数据包通过其 RTCRtpSender 和 RTCRtpReceiver 对象进行发送和接收。
RTCDtlsTransport 对象也用于提供有关通过连接的 数据通道 传输和接收的 SCTP 数据包的信息。
DTLS 传输的特点包括为底层传输添加安全性;RTCDtlsTransport 接口可用于获取有关底层传输以及 DTLS 层为其添加的安全性信息。
实例属性
还继承了 EventTarget 的属性。
iceTransport只读-
返回底层
RTCIceTransport对象的引用。 state只读-
返回一个字符串,描述底层的 Datagram Transport Layer Security (DTLS) 传输状态。它可以是以下值之一:
new、connecting、connected、closed或failed。
实例方法
还继承了 EventTarget 的方法。
getRemoteCertificates()-
返回一个包含连接远程对等方证书的
ArrayBuffer数组。
事件
error-
当在
RTCPeerConnection上发生传输层错误时发送。 statechange-
当 DTLS 传输的
state发生变化时发送。
描述
DTLS 传输的分配
当应用调用 setLocalDescription() 或 setRemoteDescription() 时,会创建 RTCDtlsTransport 对象。创建的 DTLS 传输数量以及它们的使用方式取决于创建 RTCPeerConnection 时使用的捆绑模式。
是否使用捆绑取决于另一端点能够协商的内容。所有浏览器都支持捆绑,因此当两端点都是浏览器时,您可以放心捆绑将被使用。
然而,一些非浏览器遗留端点可能不支持捆绑。为了能够与此类端点协商(或完全排除它们),在创建连接时可以提供 bundlePolicy 属性。bundlePolicy 允许您控制如何与这些遗留端点进行协商。默认策略是 "balanced",它在性能和兼容性之间取得了平衡。
例如,使用最高级别的捆绑来创建连接
const rtcConfig = {
bundlePolicy: "max-bundle",
};
const pc = new RTCPeerConnection(rtcConfig);
Bundling 允许您使用一个 RTCDtlsTransport 来承载多个高级别传输的数据,例如多个 RTCRtpTransceiver。
不使用 BUNDLE 时
当连接在不使用 BUNDLE 的情况下创建时,每个 RTCRtpTransceiver 的每个 RTP 或 RTCP 组件都有自己的 RTCDtlsTransport;也就是说,每个 RTCRtpSender 和 RTCRtpReceiver 都有自己的传输,并且所有 RTCDataChannel 对象共享一个专用于 SCTP 的传输。
使用 BUNDLE 时
当连接使用 BUNDLE 时,每个 RTCDtlsTransport 对象代表一组 RTCRtpTransceiver 对象。如果连接是使用 max-compat 模式创建的,则每个传输负责处理给定类型媒体(音频、视频或数据通道)的所有通信。因此,具有任意数量音频和视频通道的连接将始终有一个 DTLS 传输用于音频通信,一个用于视频通信。
由于传输在协商过程的早期建立,因此很可能在传输创建后才能知道远程对等方是否支持捆绑。出于这个原因,您有时会看到一开始创建了单独的传输,每个轨道一个,然后在得知捆绑成为可能后,它们会被捆绑起来。如果您的代码直接访问 RTCRtpSender 和/或 RTCRtpReceiver,您可能会遇到它们最初是独立的,然后一半或更多被关闭,并且发送者和接收者被更新以引用相应的剩余 RTCDtlsTransport 对象的情况。
数据通道
RTCDataChannel 使用 SCTP 进行通信。所有对等连接的数据通道共享一个 RTCSctpTransport,可以在连接的 sctp 属性中找到。
反过来,您可以通过查看 RTCSctpTransport 对象的 transport 属性来识别用于安全封装数据通道 SCTP 通信的 RTCDtlsTransport。
示例
此示例展示了一个名为 tallySenders() 的函数,该函数遍历 RTCPeerConnection 的 RTCRtpSender,计算它们处于各种状态的数量。该函数返回一个对象,其中包含指示每个状态有多少发送者的属性。
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;
}
请注意,在此代码中,new 和 connecting 状态被视为返回对象中的单个 connectionPending 状态。
规范
| 规范 |
|---|
| WebRTC:浏览器中的实时通信 # dom-rtcdtlstransport |
浏览器兼容性
加载中…