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

作者:Sam Dutton(原文链接

翻译:刘通

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

 

WebRTC支持端到端通信,但是WebRTC还是需要服务器:

         # 对于客户端来说,用于交换元数据来协调通信:这被称为信令

         # 处理网络地址转换器(Network Address Translator,NAT)和防火墙

在本文中,我们将向您展示如何构建一个信令服务,以及如何使用STUN和TURN服务器来处理现实世界中的连接难题。我们还解释了WebRTC应用程序如何处理多方通话并与VoIP和PSTN(也就是电话)等服务进行交互。

什么是信令

信令是协调通信的过程。为了使WebRTC应用程序能够建立一个“通话”,其客户需要交换以下信息:

         # 会话控制消息用于打开或关闭通信

         # 错误消息

         # 媒体元数据,如编解码器和编解码器设置,带宽和媒体类型

         # 密钥数据,用于建立安全的连接

         # 网络数据,如外界缩减的主机IP地址和端口

这个信令过程需要一个方式使客户来回地进行消息传递。这个机制不是由WebRTC API来实现的:你需要自己去搭建它。我们在下面介绍一些构建信令服务的方法。首先,需要先有一些背景……

为什么信令不是由WebRTC定义的?

为了避免出现冗余,并最大限度地提高与已有技术的兼容性,WebRTC标准并没有规定信令方法和协议。JavaScript会话建立协议JSEP概述了这种方法:

WebRTC通话建立的思想是完全指定和控制媒体平面,但是尽可能将信令平面留给应用程序。其原理是,不同的应用程序可能更喜欢使用不同的协议,例如现有的SIP或Jingle呼叫信令协议,或者对于特定应用程序定制的东西,可能是针对新颖的用例。在这种方法中,需要交换的关键信息是多媒体会话描述,其指定了建立媒体平面所必需的传输和媒体配置信息。

JSEP的架构也避免了浏览器不得不保存状态,即作为一个信号状态机。如果信号数据在每次刷新页面的时候都会发生丢失,就会出现问题。相反,信号状态机可以保存在服务器上。

real1

JSEP要求提供(offer)和应答(answer)对等端之间的交换:上面提到的媒体元数据。提供和应答以会话描述协议(SDP)的格式传递,如下所示:

real2

如果想要知道这个SDP官话到底是什么意思,请查看IETF所提供的例子

需要记住的是,通过编辑SDP文本中的值,WebRTC被设计为可以调整提供或者应答,然后将其设置为本地或者远端描述。例如,apprtc.appspot.com中的preferAudioCodec()函数可用于设置默认编解码器和比特率。使用JavaScript处理SDP有些困难,并且讨论了WebRTC的未来版本中是否应该使用JSON,但是坚持使用SDP还是有一些优势的。

RTCPeerConnection + 信令: 提供,应答和候选项

RTCPeerConnection是WebRTC应用程序用来创建对等端连接并传输音视频的API。

初始化这个过程RTCPeerConnection有两个工作要做:

         # 确定本地媒体条件,如分辨率和编解码器功能。这是用于提供和应答机制的元数据。

         # 获取应用程序主机的潜在网络地址,成为候选项

一旦确定了本地数据,就必须通过信令机制与远端对等端进行交换。

让我们假设一个场景:Alice正在尝试呼叫Eve。下面是完整的提供/应答机制:

         1. Alice创建一个RTCPeerConnection对象。

         2. Alice使用RTCPeerConnection createOffer()方法产生一个提供(一个SDP会话描述)。

         3. Alice用他的提供调用setLocalDescription()。

         4. Alice将提供串联起来,并使用信令机制将其发送给Eve。

         5. Eve用Alice的提供调用setRemoteDescription(),以便她的RTCPeerConnection知道Alice的设置。

         6. Eve调用createAnswer(),以及success callback函数传入本地会话描述:Eve的应答。

         7. Eve通过调用setLocalDescription()将其应答设置为本地描述。

         8. Eve然后使用信令机制将她的字符串化的应答发回给Alice。

         9. Alice使用setRemoteDescription()将Eve的应答设置为远程会话描述。

Alice和Eve也需要交换网络信息。“查找候选项”这个表达是指使用ICE框架查找网络接口和端口的过程。

         1. Alice使用onicecandidate处理器创建一个RTCPeerConnection对象。

         2. 处理器在网络候选变得可用时被调用。

         3. 在处理器中,Alice通过其信令通道将字符串化的候选数据发送给Eve。

         4. 当Eve从Alice那里获得候选消息时,她调用addIceCandidate(),将候选项添加到远端对等描述中。

JSEP支持ICE Candidate Trickling,它允许主叫方在最初的提供之后递增地向被叫方提供候选项,并使被叫方开始在通话中进行操作并建立连接而不用等所有候选项到达。


相关阅读:

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

实际中的WebRTC:STUN、TURN以及信令(三)

实际中的WebRTC:STUN、TURN以及信令(四)

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

WebRTC 中文社区由

运营