作者:Anton Venema(原文链接)
翻译:刘通
如果你有这篇文章题目所说的一样的问题,那么你可能已经有了SIP的基础设施,并且正在寻找一种可以与WebRTC终端互联的方法;或者你已经有了一个网页应用,并且在寻找一种与电话网络相互联的方法。在上述的两种情况中,最终目标是一样的—互联—而这正是与SIP所涉及的内容。
在我们回答标题所提出的问题之前,我们需要搞明白SIP到底是什么。
SIP是什么?
会话初始协议,简称SIP,从1990年代就开始出现在人们的视线范围内。SIP是一项基于文本的信令协议,用来管理两个IP连接终端之间的媒体会话,常常被用于VoIP通讯中。最开始,SIP还只是一个简单的规范,但现在成为了一个RFC,方案,以及延伸的庞大的规范集合。
但是最终,SIP的基础内容还是比较简单的。在结构上与HTTP十分的相似;每个SIP消息由很多的报头组成,每个报头都有自己的行,跟在消息主体之后。
SIP消息的主体使用会话描述协议(SDP),在某些SIP消息中用来描述关于媒体流的信息,并且最终会在两个终端之间进行传递,比如数据流的数量和类型(音频,视频)以及使用哪种编码技术(G.711,Opus,VP8,H.264)。
在典型的通话建立阶段中,会发送两个SDP消息—一个请求一个应答。会话开始方首先发送请求,尽可能多的描述关于立即建立的会话,以及请求方性能/需求的信息。会话接听方然后(如果接听通话的话),发回应答消息,包括了关于其自身性能/需求的信息。
如果一切运行正常的话,两端交换的信息就足够形成一个连接,并且可以进行数据的发送和接收。
SIP与WebRTC有什么必然联系?
WebRTC与上文所提到的这些特性都紧密相关。与SIP一样,WebRTC用来支持两个终端之间的媒体会话建立。与SIP一样,一旦信令完成,WebRTC连接就会使用实时传输协议(RTP)在媒体平面传输数据。与SIP一样,WebRTC使用SDP来对自身进行描述。
但是在两个关键点上二者存在差别:
#1 WebRTC在信令平面上不对SIP消息的使用进行授权。事实上,WebRTC根本不会选择使用SIP或者任何其他信令协议。SDP消息的实际信令(发送/接收)被刻意地留给了应用自身。对于SIP,相反,定义了非常明确地消息格式,封装和发送SDP消息必须使用这种特定的格式用来创立通话。
#2 WebRTC在媒体平面上授权了几种SIP可选特性的使用。它们是:
·特定codec的使用。G.711和Opus指定用来处理音频,VP8和H.264/AVC被指定用来进行视频处理。(需要注意的是,从技术上讲,只有网页浏览器被要求同时支持VP8和H.264,但出于实际考虑来说,每个支持WebRTC的终端为了获得最佳的效果,都应该及支持VP8也支持H.264。)
·使用SRTP配置文件来提供媒体包的加密和消息认证。
·使用DTLS来生成使用SRTP的密钥。DTLS验证指纹必须在SDP中传输。(注意过去可以使用SDES,但是现在已经不可以了)。
·使用ICE,STUN,TURN来进行网络穿透。
抛开这些不同之处的好坏不提,它们之间的区别是实际存在的,所以我们必须注意其间的差别。让我们单独的来看这两项。
信令平面
基于现存SIP基础不会选择其他信令协议的这个假设,WebRTC这边必须知道如何使用SIP。有两个方法:
·使用SIP作为你的WebRTC应用的信令堆栈。
·在你的WebRTC应用中使用其他信令解决方案,但是需要加入一个信令网关来将其他的信令翻译成SIP。
那种方法更适合你?需要根据你现有的基础架构和你的规划进行选择。
·你是否已经有SIP基础架构?
·你是否有SFU或者MCU来帮助你扩展WebRTC连接?
·你的网页应用是否准备好实用像WebSync或者XMPP的系统,来进行实时的文本消息通信?
·你的应用是运行在哪个用户平台上?
·你是否有运行在这些平台上的SIP信令栈?
你需要仔细的思考并回答这些问题,然后再进行选择。
媒体平面
如果你现在手头上没有现成的SIP基础架构,那么正确的选择可能就是简单的选择一个兼容WebRTC的SIP技术。
很多SIP网关(比如FreeSWITCH)和SIP中继服务(比如Voxbone)可以被配置成使用DTLS/ICE以及WebRTC授权的codec。
如果你已经有了SIP基础架构,那么可能需要加入一个会话边界控制器(SBC),或者其他相似的设备,可以被用来作为WebRTC和VoIP终端之间的媒体网关。
如果你有SFU/MCU来帮助你扩展WebRTC连接的话,那么媒体服务器就可以当做这个网关。