欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

WebRTC信令服务器实现 八、第二节 WebRTC信令服务器原理

程序员文章站 2022-06-16 19:53:48
WebRTC是没有将信令服务纳入到整个的规范中,更多的是规范了客户端这边的所有的过程,那为什么没有将信令服务器放到规范中,各个公司它的业务模型都是不一样的,很难将每个公司的信令都统一订成一套规范。所有与其这个不如让他们各自自己去定义。只有是我必须的这些信息的交换可以实现,其他的业务你可以自己去定义,这个比较灵活,各个公司也比较容易接受这套方案。其实这个对整个WebRTC的推广其实是有好处的。下面我看看 信令服务器的作用。如果我们没有信令服务器,WebRTC之间是肯定不能通信的,这个大家是...

WebRTC是没有将信令服务纳入到整个的规范中,更多的是规范了客户端这边的所有的过程,那为什么没有将信令服务器放到规范中,各个公司它的业务模型都是不一样的,很难将每个公司的信令都统一订成一套规范。所有与其这个不如让他们各自自己去定义。

只有是我必须的这些信息的交换可以实现,其他的业务你可以自己去定义,这个比较灵活,各个公司也比较容易接受这套方案。

其实这个对整个WebRTC的推广其实是有好处的。

下面我看看 信令服务器的作用。

WebRTC信令服务器实现 八、第二节 WebRTC信令服务器原理

如果我们没有信令服务器,WebRTC之间是肯定不能通信的,这个大家是一定要清楚的,我们来看上图,这张图就表达了信令服务器在整个通话过程中它起到的作用。

首先我们先看下面蓝色的发起端和接受端,这个发起端和接受端如果想传递媒体数据的时候 ,它有两个信息是必须要经过信令服务器交换之后才能进行通信的,这个两个信息。第一个就是媒体信息,它是通过SDP来表述。可以简单的理解,我们双方要通信,你的编解码的器是什么,比如说我现在可以进行视频传输,我的编码是H264,那么对方也要告诉我你的编解码器能不能支持H264的码,比如我们给你传过去H264的码,你说只能解H265的,那肯定双方之间就没法通信了。所有这个信息是必须要传递的。

此外你是否支持视频是否支持音频,你们的编码方式是什么,这些信息是通过SDP给它描述出来,通过信令服务器,首先客户端要将这个SDP信息发送到服务端 ,服务端再中转,中转到另一端,大家已经知道了为什么要通过信令服务器进行中转,因为这个时候相互之间还没有进行连接,相互之间还不知道对方的存在。那这是第一个要传递的信息,第二个要传递的信息是网络信息,大家知道WebRTC最终之间尽可能通过P2P进行传输,那在他们连接之前,他们如何发现对方呢?也是通过信令服务器,首先你要将所有网络相关的信息传到服务器,那么这个服务器在帮你交换到对端,那对端拿到你的信息之后,才知道我们是在同一个局域网内,那就直接通过P2P就传输好了。那如果不在同一个网络内,那我要通过P2P穿越 ,看看之间能不能打通,这里面又分了好几种类型,对于对称是肯定打通不了,对于非对称的那就可以尝试打通,打通之后,他们之间才能进行通信。如果打通不了,还要通过服务端进行中转。所以这个信令服务器最基础的要传输媒体相关的信息进行交换,第二个是网络相关的信息要进行交换,再有第三个就是你的具体的业务,加入房间,离开房间,禁言,将对方禁止发言,或者给对方权限让他发言等等有很多信令,可以根据自己的业务模型去设置。

这个就是信令服务器在整个WebRTC在整个WebRTC通讯中的作用,所以这是WebRTC中必须要有的信令服务器。

为什么要使用socket.io

我们这里要实现一个信令服务器,我们这里使用的是socket.io,主要是因为它有几个优点

socket.io是WebSocket超集,它本身就有WebSocket功能,我们都知道在整个音视频传输的时候,一般有两种协议,TCP和UDP,底层协议里面UDP主要用于流媒体的传输,比如音频、视频、文本可以通过 UDP进行传输,UDP的问题在于它是不可靠的传输,也就是说我是可以丢包的,对于音频视频来说这是没有任何问题的。当我网络不好的时候,我丢了音频数据,它顶多就卡一下,它还能继续运行,不太影响我们正常的通话。

但是如果对于信令来说就不一样了,信令一般就使用TCP,叫做可靠性连接,我的包是要必须保证到达的,否则我就断开连接了,因为网络就不能支持我的整个业务运转。所以它要么就必须达到,我们就甭玩了。就这两种状况,所以我们的信令在传输的过程中是必须要到达的。

如果我们的媒体信息和网络信息不能交换的话,那肯定就是不能工作的,所以对于 信令来说我们一般使用TCP,websocket底层使用的就是TCP,所以socket.io底层使用的也是 TCP。

 

socket.io有房间的概念,socket.io两个人或者多个人进行通讯的时候,首先我要进入到 一个房间里,这是很自然的一个逻辑,我们 要上课 或者开会,首先大家要聚集在一起,有一个虚拟的逻辑的概念,就是大家要在一个房间里,大家在这个房间大家就可以相互通信了。

我们可以看webrtc官方提供的例子,实际上他有三种服务器,分别是房间服务器,信令服务器,流媒体中转服务器,我们这里用了socket.io我们这里就不用单独写一个房间服务器了,也就是说房间服务器和信令服务器是在同一个服务器上。

 

socket.io跨平台、跨终端、跨语言,这样就方便我们在各个端上去实现信令的各个端,去与我们的服务端进行连接,所以特别方便,这就是使用socket来实现socket.io来实现信令服务器的根本原因。

 

socket.io工作原理

WebRTC信令服务器实现 八、第二节 WebRTC信令服务器原理

其实非常简单,socket.io其他它是一个js库,它是基于node.js 的Server的,这个和我们的技术选项有关,我们之前选择web服务器的时候选择的是nodeJS,在这个nodeJS的服务器上 我们在增加这个socket.io,那么我们整个服务器端就完成了,非常简单,但是如果我们单独写一套的话,那要花很长很长时间,在我们现有的nodeJS  web服务器上我们只有增加了socket.io,简简单单的修改几行代码,我们就实现了一个服务器端,其实光有服务器它还是不能工作的,所以还有客户端。

在网页 也好,在安卓或者IOS也好,在任何终端都可以引入socket.io这个client lib客户端的库,那么客户端这个库我们就可以连接到NodeJS 的socket.io的这个服务上,那么这样就建立了连接,建立了连接之后,我们才可以创建房间或者加入到房间里,那么在整个房间内的用户就可以相互通信了,这块的逻辑非常的简单。

这个socket.io它是可以横向扩展的,还可以级联部署很多个socket.io服务,还可以串到一起,这时当我去发送信息的时候,它是可以在各个socket.io上传输的,比如有两个用户,第一个用户在北京那个节点上,有一个 用户是上海这个节点上,没关系在它上层也就是它服务端可以串在一起的,那么北京的用户首先将你的信息发送到北京的服务端,北京的服务端通过整个网络曾然后传到上海的节点,上海的节点最终找到上海的用户,最后发送出去,这样他们之间就实现了通信。

当然这是一个非常宏大的场景了,我们真实的部署中可以这样设置。

以上就是WebRTC信令服务器的基本内容。

 

本文地址:https://blog.csdn.net/xyphf/article/details/107289846