使用DataChannel 发送数据
到目前为止,我们唯独讨论了webRTC的音视频能力。然而,我们没有谈论另一个课题,那就是通过webRTC传输主观数据(比如聊天)。结果是,webRTC可以很好的传输数据,不仅是音视频,而是任何我们想传的数据都可以。
这一章,我们将全面讨论datachannel协议以及如何将它应用到我们的聊天软件中。通过这一章的学习,我们重点掌握以下几个方面:
datachannel是怎么结合到webrtc的问题- 怎样在对等端创建一个
data channel对象 - 我们关心的编码和安全问题
data channel的潜在用例有哪些
流控制传输协议和数据传输
事实证明,对等端发送数据某种程度上是比较艰难的。典型地,目前用户间发送数据是通过TCP链接。这意味着,利用Ajax和webSocket发送数据到服务器,然后,从另一端去接收。对高性能应用来说通常是显得慢而且笨重的。在两个用户之间传输数据,开发者不得不购买服务器。这将是昂贵的,就算是一个小型分布式网络,每个月也要付上千美元。
在webRTC模型中,已经建立了在用户之间高速度,低延时的链接。利用这个链接,我们可以在对等端快速的发送数据。目前,这一协议是为音频和视频数据设计的,然而,也是专门为音频和视频流设计的数据帧。这也是为什么WebRTC介绍了Stream Control Transmission Protocol (SCTP) 作为一种在我们当前设置的对等连接之上发送数据的方法。
SCTP是WebRTC栈的另一种独立技术。这也是说WebRTC是一门有趣技术的原因。给JavaScript 开发者带来了更多新的数据传输方法。SCTP 基于 Datagram Transport Layer Security (DTLS) 协议实现了每一个WebRTC 链接,并且为Data Channel 层绑定输出数据提供了出口。所有的这些都基于UDP, 是我们在 第三章,创建一个基础的WebRTC应用 中讨论的,UDP是WebRTC 数据传输最基本的方法。目前为止,我们当前的技术栈如下图所示:
这看起来有些复杂,却都是为了SCTP 的强大功能。 WebRTC的设计者意识到,每一个应用程序在利用数据通道的功能都是独一无二的。一些可能选择可靠传输的TCP, 另一些可能选择高性能的UDP。这也就迫使他们选择SCTP,使得两全其美。以下是SCTP的一些特性:
- 基于
DTLS的安全传输层 - 传输层可选择可靠或非可靠模式
- 传输层可以保证或不保证数据包的传输顺序
- 数据的传输是面向消息的,从而允许将消息分解并在另一侧重新组合
- 传输层提供流量和拥塞控制
Endpoints: 这些定义为两个IP位置之间的任意数量的连接Messages: 所有的数据都是通过SCTP层传输给应用Chunks: 这些是准备通过网络发送的数据包,可以代表任何消息的一部分
整个协议包含16个部分,这也是理解WebRTC工作原理的最好开端。这部分我们要记住,data channel 是完全不同于其他依赖于浏览器的传输层协议。它传输数据是可配置且高效的。这是WebRTC 为每一个Javascript 应用开发者提供的强有力技术。
RTCDataChannel 对象
现在,我们理解了基础的运行理论,我们可以开始学习RTCDataChannel 对象相关的API 是如何工作的。事实上,API的应用比SCTP的基础理解起来要简单的多。创建数据通道的主要功能来自已经建立的RTCPeerConnection 对象:
var peerConnection = new RTCPeerConnection(); // Establish your peer connection using signaling here
var dataChannel = peerConnection.createDataChannel("myLabel", dataChannelOptions);
这就是您开始所需要的! WebRTC API需要考虑浏览器内部的所有内容。 一旦执行了信令并建立了连接,这一切都会发生。 您可以在进程中的任何时候创建数据通道,直到 RTCPeerConnection 对象关闭为止。 尽管已关闭,但在尝试创建新通道时也会抛出异常。
以下是数据通道的几个状态:
connecting: 默认状态,数据通道等待链接中。open: 链接已建立,可以开始交流。closing: 数据通道链接即将销毁。closed: 数据已关闭,不能再继续交流。