Page 292 - Web性能权威指南
P. 292
发信服务器可以作为已有通信网络的网关,此时由网络负责将连接提议发送给目标
端,然后再将应答返回给 WebRTC 客户端,以初始化信息交换。而应用也可以使用
自己的自定义发信信道,可能由一或多台服务器和一个自定义通信协议构成:如果
两端都连到了同一个发信服务,那这个服务就可以为它们传递消息。
Skype 是使用自定义发信系统中的一个典型示例:音频和视频通信是端到
端的,而 Skype 用户必须连接到 Skype 的发信服务器,该服务器使用自己
专有的协议辅助实现端到端的连接。
选择发信服务
WebRTC 可以让我们实现端到端的通信,但每个 WebRTC 应用都需要一个发信服
务器才能完成协商并建立连接。那该怎么办?
目前,可以与 WebRTC 互操作的通信网关越来越多。比如 Asterisk 就是这么一个
流行、免费、开源的框架,被全球很多私人公司和大型运营商采用,以实现他们
的无线电通信。对我们来说,Asterisk 有一个 WebSocket 模块,该模块支持将 SIP
作为发信协议:浏览器建立到 Asterisk 网关的 WebSocket 连接,然后两者通过交
换 SIP 消息来协商会话!
此外,如果不需要与其他网络互操作,那么实现并部署自定义的发信网络对应用
而言也不难。比如,一个网站可以为用户提供端到端的音频、视频和数据交换服
务,而该网站会跟踪所有已经登录的用户,所以它可以对所有在线用户打开发信
连接。然后,当两个用户想要建立端到端的会话时,网站的服务器就可以为两个
客户端“鸿雁传书”。
选择什么发信网关要视具体情况而定,取决于应用的自身需求。不过,在考虑自
定义之前,有必要先调研一下市面上有哪些开源或商业的服务可用。当然,一定
要密切关注底层的发信协议,因为协议很可能严重影响发信通道的延迟和客户端
与服务器的开销;参见 14.4 节“应用 API 与协议”。
18.4.2 会话描述协议(SDP)
假设应用实现了共享的发信通道, 那接下来就可以执行发起 WebRTC 连接的初始
步骤:
var signalingChannel = new SignalingChannel(); ➊
var pc = new RTCPeerConnection({}); ➋
navigator.getUserMedia({ "audio": true }, gotStream, logError); ➌
function gotStream(stream) {
282 | 第 18 章