实际中的WebRTC:STUN,TURN以及信令(二)

作者:Sam Dutton(原文链接

翻译:刘通

原标题:WebRTC in the real world: STUN, TURN and signaling

前文连接:实际中的WebRTC:STUN,TURN以及信令-1

 

WebRTC信令代码

下面的W3C代码示例总结了一个完整的信令过程。该代码假定存在一些信令机制,SignalingChannel。我们会在下文中更详细地讨论信令。

real21

real22

real23

要查看实际提供/应答和候选项的交流过程,请参阅simpl.info/pc上的“单页”视频聊天示例的控制台日志。如果你想知道更多,请从Chrome的chrome://webrtc-internals页面或者Opera中的opera://webrtc-internals页面下载WebRTC信令和统计数据的完整转储。

对等端发现

这是“我改如何找到我要交谈的人”的一种高端说法。

对于电话来说,我们有电话号码和目录。对于在线视频聊天和消息发送,我们需要身份和状态管理系统,以及用户启动会话的方式。WebRTC应用程序需要一种方式让客户互相通知他们想要开始或加入一个通话。

对等端发现机制不是由WebRTC定义的。这个过程可以像发送电子邮件或发送一个URL一样简单:对于视频聊天应用程序,比如talky.io,tawk.com和browsermeeting.com,您可以通过共享自定义链接来邀请人们进行通话。开发人员Chris Ball已经搭建了一个有趣的无服务器的webrtc实验,使WebRTC呼叫参与者能够通过他们喜欢的任何消息服务来交换元数据。

我怎么才能建立一个信令服务?

重申:信令协议和机制不是由WebRTC标准定义的。无论你选择什么,你都需要一个中间服务器来在客户端之间交换信令消息和应用程序数据。不走运的是,一个网络应用程序不能简单地向互联网喊“连接到我朋友那!”

幸亏信令消息很小,而且大多在通话开始的时候进行交换。在使用apprtc.appspot.comsamdutton-nodertc.jit.su进行测试时,我们发现对于视频聊天会话,信令服务总共处理了30-45条消息,总共消息的大小大约为10KB。

WebRTC信令业务在带宽方面的要求相对较低,因为它们只需要中继消息并保留少量的会话状态数据(如连接的客户端),所以不会消耗太多的处理或存储空间。

小贴士:用于交换会话元数据的信令机制也可用于传送应用程序数据。这只是一个消息服务而已!

将消息从服务器推送到客户端

对于信令的消息服务需要是双向的:客户端到服务器和服务器到客户端。双向通信违背了HTTP客户端/服务器的请求/响应模型,但是为了将数据从运行在Web服务器上的服务推送到运行在浏览器中的Web应用程序,多年来已经开发了诸如长轮询之类的各种攻击。

最近,EventSource API已经得到了广泛的实现。这开启了 “服务器发送的事件”:通过HTTP从Web服务器发送到浏览器客户端的数据。在simpl.info/es上有一个简单的演示。EventSource是为单向消息传递而设计的,但是它可以和XHR结合使用来搭建交换信令消息的服务:信令服务器通过XHR请求传递来自呼叫者的消息,通过EventSource推送给被叫者。

WebSocket是一个更自然的解决方案,专为全双工客户端-服务器通信而设计(消息可以同时在两个方向上传输)。使用纯WebSocket或Server-Sent Events(EventSource)构建的信令服务的一个优点是这些API的后端可以在大多数Web托管软件包通用的各种Web框架上实现,比如PHP,Python和Ruby。

大约四分之三的浏览器都支持WebSocket,更重要的是,所有支持WebRTC的浏览器都支持WebSocket,无论是在台式机还是手机上。应该为所有连接都使用TLS,以确保消息不会因为没有加密而被截取,并且减少代理遍历的问题。(有关WebSocket和代理遍历的更多信息,请参阅Ilya Grigorik的高性能浏览器网络中的WebRTC章节。Peter Lubber的WebSocket备忘单提供了有关WebSocket客户端和服务器的更多信息)

用于规范apprtc.appspot.com WebRTC视频聊天应用程序的信令通过Google App Engine Channel API完成,该API使用Comet技术(长轮询)来启用App Engine后端与Web客户端之间推送通信的信令传输。HTML5 Rocks WebRTC文章详细介绍了该应用程序的代码演示

real24

也可以通过让WebRTC客户端通过Ajax轮询消息服务器来处理信令,但这回导致大量的冗余网络请求,尤其对于移动设备时有问题的。即使在会话建立之后,对等端也需要轮询临幸消息,以防其他对等端发生改变或终止会话。WebRTC Book app示例使用此选项,并对轮询频率进行了一些优化。

填写常用邮箱,接收社区更新

WebRTC 中文社区由

运营