在两个浏览器之间发送数据以进行通信、游戏或文件传输可能是一个相当复杂的过程。 它需要设置服务器并支付费用来中继数据,并可能将其扩展到多个数据中心。 在这种情况下,可能会出现高延迟,并且很难将数据保密。
这些问题可以通过使用 WebRTC 来缓解 RTCDataChannel用于将数据直接从一个对等点传输到另一个对等点的 API。 本文介绍了如何设置和使用数据通道的基础知识,以及当今网络上的常见用例。
要充分利用本文,您需要了解 RTCPeerConnection API,以及对 STUN、TURN 和信号如何工作的理解。 有关更多信息,请参阅 WebRTC 入门 (link:https://www.html5rocks.com/en/tutorials/webrtc/basics/)。
我们有 WebSocket (link:https://www.html5rocks.com/en/tutorials/websockets/basics/)、 AJAX (link:https://www.html5rocks.com/en/tutorials/file/xhr2/)和 服务器发送事件 (link:https://www.html5rocks.com/en/tutorials/eventsource/basics/)。 为什么我们需要另一个沟通渠道? WebSocket 是双向的,但所有这些技术都是为与服务器之间的通信而设计的。
RTCDataChannel 采取不同的方法:
RTCDataChannel 现已在 Google Chrome、Opera 和 Firefox 的桌面和 Android 上提供 SCTP 支持。
WebRTC 支持点对点通信,但它仍然需要服务器用于 信令 交换媒体和网络元数据以引导对等连接。 WebRTC 处理 NAT 和防火墙:
这 RTCDataChannel API 支持一组灵活的数据类型。 该 API 旨在完全模仿 WebSocket,并且 RTCDataChannel 支持 字符串 (link:https://www.w3.org/TR/webrtc/" title="W3C DOMString 规范)以及 JavaScript 中的一些二进制类型,例如 Blob (link:https://www.w3.org/TR/webrtc/" title="W3C Blob 规范)、 ArrayBuffer (link:https://www.w3.org/TR/webrtc/" title="W3C ArrayBuffer 规范)和 ArrayBufferView (link:https://www.w3.org/TR/webrtc/" title="W3C ArrayBufferView 规范)。 这些类型在处理文件传输和多人游戏时会很有帮助。
RTCDataChannel 可以工作在不可靠和无序模式(类似于用户数据报协议或UDP)、可靠和有序模式(类似于传输控制协议或TCP)和部分可靠模式:
在没有丢包的情况下,前两种模式的性能大致相同。 但是,在可靠和有序模式下,丢失的数据包会导致其他数据包在其后面被阻塞,并且丢失的数据包在重新传输并到达时可能已经过时。 当然,可以在同一个应用程序中使用多个数据通道,每个通道都有自己的可靠或不可靠语义。
提供的有用表格 High Performance Browser Networking (link:https://www.oreilly.com/library/view/high-performance-browser/9781449344757/)是 Ilya Grigorik (link:https://www.igvita.com/" title="Ilya Grigorik 的网站):
| TCP | UDP | SCTP | |
| 可靠性 | 可靠的 | 不可靠 | 可配置 |
| 送货 | 已订购 | 无序 | 可配置 |
| 传播 | 面向字节 | 面向消息的 | 面向消息的 |
| 流量控制 | 是的 | 不 | 是的 |
| 拥塞控制 | 是的 | 不 | 是的 |
接下来,您将学习如何配置 RTCDataChannel 使用可靠有序或不可靠无序模式。
有几个简单的demo RTCDataChannel 在线的:
在这些示例中,浏览器与自身建立对等连接,然后创建数据通道并通过对等连接发送消息。 然后它正在创建一个数据通道并沿着对等连接发送消息。 最后,您的消息出现在页面另一侧的框中!
开始使用的代码很短:
const peerConnection = new RTCPeerConnection();
// 在此处使用您的信号通道建立您的对等连接
常量数据通道 =
peerConnection.createDataChannel("myLabel", dataChannelOptions);
dataChannel.onerror =(错误)=> {
console.log("数据通道错误:", error);
};
dataChannel.onmessage = (事件) => {
console.log("得到数据通道消息:", event.data);
};
dataChannel.onopen = () => {
dataChannel.send("Hello World!");
};
dataChannel.onclose = () => {
console.log("数据通道关闭");
};
这 dataChannel对象是从已经建立的对等连接创建的。 它可以在信号发生之前或之后创建。 然后,您传入一个标签以将此通道与其他通道和一组可选配置设置区分开来:
常量 dataChannelOptions = {
ordered: false, // 不保证顺序
maxPacketLifeTime: 3000, // 以毫秒为单位
};
也可以添加一个 maxRetransmits 选项(失败前尝试的次数),但您只能指定 maxRetransmits 或 maxPacketLifeTime,不能同时指定两者。 对于 UDP 语义,设置 maxRetransmits至 0 和 ordered 至 false,有关详细信息,请参阅这些 IETF RFC: 流控制传输协议 (link:https://tools.ietf.org/html/rfc4960" title="IETF RFC 4960)和 流控制传输协议部分可靠性扩展 (link:https://tools.ietf.org/html/rfc3758" title="IETF RFC 3758)。
大多数人需要使用的唯一选项是前三个: ordered,maxPacketLifeTime 和 maxRetransmits。使用 SCTP (link:https://en.wikipedia.org/wiki/Stream_Control_Transmission_Protocol" title="维基百科关于 SCTP 的文章)(现在被所有支持 WebRTC 的浏览器使用)可靠和有序是默认的。 如果你想从应用层完全控制,使用不可靠和无序是有意义的,但在大多数情况下,部分可靠性是有帮助的。
请注意,与 WebSocket 一样, RTCDataChannel 当连接建立、关闭或错误,以及从其他对等方接收到消息时触发事件。
所有 WebRTC 组件都必须加密。 和 RTCDataChannel,所有数据都使用 数据报传输层安全 (link:https://en.wikipedia.org/wiki/Datagram_Transport_Layer_Security" title="维基百科关于 DTLS 的文章)(DTLS) 进行保护。 DTLS 是 SSL 的衍生产品,这意味着您的数据将与使用任何基于 SSL 的标准连接一样安全。 DTLS 已标准化并内置于所有支持 WebRTC 的浏览器中。 有关详细信息,请参阅 Wireshark 维基 (link:https://wiki.wireshark.org/DTLS)。
处理大量数据可能是 JavaScript 的痛点。 正如 Sharefest (link:https://github.com/Peer5/ShareFest)指出的,这需要以一种新的方式来思考数据。 如果您要传输的文件大于可用内存量,则必须考虑保存此信息的新方法。 这就是 FileSystem API (link:https://www.html5rocks.com/en/tutorials/file/filesystem/)发挥作用的地方,如下所示。
现在可以通过以下方式创建可以在浏览器中共享文件的 Web 应用程序 RTCDataChannel。建在上面 RTCDataChannel 意味着传输的文件数据是加密的,不会触及应用提供商的服务器。 此功能与连接到多个客户端以实现更快共享的可能性相结合,使 WebRTC 文件共享成为网络的有力候选者。
成功传输需要几个步骤:
尝试通过以下方式发送文件时需要考虑几点 RTCDataChannel:
一旦文件完全传输到另一端,就可以使用锚标签下载:
函数保存文件(blob){
常量链接 = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = '文件名';
链接.click();
};
上的这些文件共享应用程序 PubShare (link:https://pubnub.github.io/rtc-pubnub-fileshare/)和 GitHub (link:https://github.com/Peer5/ShareFest)使用这种技术。 它们都是开源的,并且为基于 RTCDataChannel。
RTCDataChannel 为构建文件共享、多人游戏和内容交付应用程序的新方法打开了大门。
您现在可以通过使用高性能、低延迟的连接来提供更具吸引力的应用程序 RTCDataChannel,等框架 PeerJS (link:https://peerjs.com/)和 PubNub WebRTC SDK (link:https://github.com/pubnub/webrtc)使 RTCDataChannel 更容易实现,并且 API 现在已广泛支持跨平台。
的出现 RTCDataChannel 可以改变您对浏览器中数据传输的看法。

