RTCDtlsTransport
RTCDtlsTransport
接口提供了访问有关数据报传输层安全性 (DTLS) 传输的信息,RTCPeerConnection
的 RTP 和 RTCP 数据包通过其 RTCRtpSender
和 RTCRtpReceiver
对象发送和接收。
RTCDtlsTransport
对象还用于提供有关连接的 SCTP 数据包传输和接收的信息 数据通道。
DTLS 传输的功能包括为底层传输添加安全性;RTCDtlsTransport
接口可用于获取有关底层传输以及 DTLS 层为其添加的安全性信息。
实例属性
还继承了来自 EventTarget
的属性。
iceTransport
只读-
返回对底层
RTCIceTransport
对象的引用。 state
只读-
返回一个字符串,该字符串描述底层数据报传输层安全性 (DTLS) 传输状态。它可以是以下值之一:
new
、connecting
、connected
、closed
或failed
。
实例方法
还继承了来自 EventTarget
的方法。
getRemoteCertificates()
-
返回一个
ArrayBuffer
数组,其中包含连接的远程对等方的证书。
事件
error
-
在
RTCPeerConnection
上发生传输级错误时发送。 statechange
-
当
state
的 DTLS 传输更改时发送。
描述
DTLS 传输的分配
当应用程序调用 setLocalDescription()
或 setRemoteDescription()
时,会创建 RTCDtlsTransport
对象。创建的 DTLS 传输的数量以及它们的使用方式取决于创建 RTCPeerConnection
时使用的捆绑模式。
是否使用捆绑取决于另一个端点能够协商的内容。所有浏览器都支持捆绑,因此当两个端点都是浏览器时,您可以放心使用捆绑。
但是,一些非浏览器遗留端点可能不支持捆绑。为了能够与这些端点协商(或完全排除它们),在创建连接时可以提供 bundlePolicy
属性。bundlePolicy
允许您控制如何与这些遗留端点协商。默认策略为 "balanced"
,它在性能和兼容性之间取得平衡。
例如,要使用最高级别的捆绑创建连接
const rtcConfig = {
bundlePolicy: "max-bundle",
};
const pc = new RTCPeerConnection(rtcConfig);
捆绑 允许您使用一个 RTCDtlsTransport
来承载多个更高级别传输的数据,例如多个 RTCRtpTransceiver
。
不使用 BUNDLE 时
当连接在不使用 BUNDLE 的情况下创建时,每个 RTCRtpTransceiver
的每个 RTP 或 RTCP 组件都有自己的 RTCDtlsTransport
;也就是说,每个 RTCRtpSender
和 RTCRtpReceiver
都有自己的传输,并且所有 RTCDataChannel
对象共享一个专用于 SCTP 的传输。
使用 BUNDLE 时
当连接使用 BUNDLE 时,每个 RTCDtlsTransport
对象都表示一组 RTCRtpTransceiver
对象。如果连接是使用 max-compat
模式创建的,则每个传输负责处理给定媒体类型(音频、视频或数据通道)的所有通信。因此,具有任意数量的音频和视频通道的连接始终只有一个用于音频通信的 DTLS 传输和一个用于视频通信的 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 |
浏览器兼容性
BCD 表仅在启用 JavaScript 的浏览器中加载。