美文网首页
webrtc的信令传输流程

webrtc的信令传输流程

作者: AI科技智库 | 来源:发表于2020-03-26 14:41 被阅读0次

1 webrtc介绍

WebRTC (Web Real-Time Communications) 是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现Video、Audio、Data数据的传输。WebRTC用户在无需安装任何插件或者第三方的软件的情况下,创建点对点(Peer-to-Peer)的数据分享和电话会议成为可能。

2 webrtc中的几个概念

2.1 Signal服务器

WebRTC主要实现的是浏览器对浏览器之间的实时通信,通讯双方彼此都不知道对方在哪里,怎么给对方发起视频请求?这时双方都应该先跟一个Signal服务器建立连接,所以这就是信令服务的作用,信令服务器不传递音视频数据。

信令服务器用于交换三种类型的信息:

  • 会话控制消息:初始化/关闭,各种业务逻辑消息以及错误报告。
  • 网络相关:外部可以识别的IP地址和端口。(ICE消息)
  • 媒体能力:客户端能控制的编解码器、分辩率,以及它想与谁通讯。(SDP消息)
结构图.png

2.2 STUN

NAT给设备提供了一个IP地址以使用专用局域网,但是这个地址不能在外部使用。由于没有公用地址,WebRTC对等端就无法进行通信。而WebRTC使用 STUN来解决这个问题。
STUN服务器位于公共网络上,STUN做的事情就是:获取自己的IP、PORT和NAT信息。然后通过信令服务器交换这些信息,最后两个客户端根据各自得到的IP、PORT和NAT信息进行相应的穿透,显示情况如下图:

STUN.png

2.3 TURN

TURN的全称为Traversal Using Relays around NAT,如果终端在NAT之后,那么在特定的情景下(对称型NAT),有可能终端之间无法和其对等端(peer)进行直接的通信,这时就需要公网的服务器作为一个中继, 对来往的数据进行转发。这个转发的协议就被定义为TURN。TURN和其他中继协议的不同之处在于,它允许客户端使用同一个中继地址(relay address)与多个不同的peer进行通信。
当单纯的 STUN没有成功建立连接,所以每个对等端还需要使用TURN服务器。

TURN.png

2.4 ICE

ICE,全名叫交互式连接建立(Interactive Connectivity Establishment),可以整合各种NAT穿越技术如STUN、TURN(Traversal Using Relay NAT 中继NAT实现的穿透)。ICE会先使用STUN,尝试建立一个基于UDP的连接,如果失败了,就会去TCP,如果依旧失败ICE就会使用一个中继的TURN服务器。
ICE会试着找最好的路径来让客户端建立连接,他会尝试所有可能的选项,,然后选择最合适的方案,

2.5 SDP

会话描述协议Session Description Protocol (SDP) 是一个描述多媒体连接内容的协议,例如分辨率,格式,编码,加密算法等。所以在数据传输时两端都能够理解彼此的数据。本质上,这些描述内容的元数据并不是媒体流本身。
例如:客户端之间交换offer和answer,即进行媒体能力协商,看双方都支持那些编码方式,支持哪些分辨率等。它们就是以SDP格式进行交换。协商的方法是通过信令服务器交换媒体能力信息。

3 webRTC的信令传输流程

WebRTC并不提供Stun服务器和Signal服务器,服务器端需要自己实现。Stun服务器可以用google提供的实现stun协议的测试服务器(stun:stun.l.google.com:19302),Signal服务器则完全需要自己实现了,它需要在ClientA和ClientB之间传送彼此的SDP信息和candidate信息,ClientA和ClientB通过这些信息建立P2P连接来传送音视频数据。

握手流程.png
  • 1:ClientA首先创建PeerConnection对象,然后打开本地音视频设备,将音视频数据封装成MediaStream添加到PeerConnection中。
  • 2:ClientA调用PeerConnection的CreateOffer方法创建一个用于offer的SDP对象,SDP对象中保存当前音视频的相关参数。ClientA通过PeerConnection的SetLocalDescription方法将该SDP对象保存起来,并通过Signal服务器发送给ClientB。
  • 3:ClientB接收到ClientA发送过的offer SDP对象,通过PeerConnection的SetRemoteDescription方法将其保存起来,并调用PeerConnection的CreateAnswer方法创建一个应答的SDP对象,通过PeerConnection的SetLocalDescription的方法保存该应答SDP对象并将它通过Signal服务器发送给ClientA。
  • 4:ClientA接收到ClientB发送过来的应答SDP对象,将其通过PeerConnection的SetRemoteDescription方法保存起来。
  • 5:在SDP信息的offer/answer流程中,ClientA和ClientB已经根据SDP信息创建好相应的音频Channel和视频Channel并开启Candidate数据的收集,Candidate数据可以简单地理解成Client端的IP地址信息(本地IP地址、公网IP地址、Relay服务端分配的地址)。
  • :6:当ClientA收集到Candidate信息后,PeerConnection会通过OnIceCandidate接口给ClientA发送通知,ClientA将收到的Candidate信息通过Signal服务器发送给ClientB,ClientB通过PeerConnection的AddIceCandidate方法保存起来。同样的操作ClientB对ClientA再来一次。
  • 7:这样ClientA和ClientB就已经建立了音视频传输的P2P通道,ClientB接收到ClientA传送过来的音视频流,会通过PeerConnection的OnAddStream回调接口返回一个标识ClientA端音视频流的MediaStream对象,在ClientB端渲染出来即可。同样操作也适应ClientB到ClientA的音视频流的传输。

建立连接相关的API

1. A获取媒体流(MediaStream)或数据流

一般通过MediaDevices.getUserMedia()获取媒体流,媒体流包含了请求媒体类型的轨道(MediaStreamTrack)。一个流可以包含视频轨道,音频轨道或其他。通过MediaStream的addTrack方法可以添加轨道。

MediaDevices.getUserMedia()

2. A生成一个RTCPeerConnection接口对象

RTCPeerConnection接口代表一个由本地计算机到远端的WebRTC连接。该接口提供了创建,保持,监控,关闭连接的方法的实现。

pc = new RTCPeerConnection([RTCConfiguration dictionary]) //可选参数包括ice服务器等。

3. A将流加入到RTCPeerConnection对象中

stream.getTracks().forEach(track => pc.addTrack(track, stream));

4. A生成Offer信息

pc.createOffer(function(offer)=>{//创建完成 TODO 5},error)

5. A将生成的Offer设置为本地描述

pc.setLocalDescription(new RTCSessionDescription(offer),function(){},error);

6. A将生成的Offer发给另一端B

send json.stringify(offer)

7. B也生成RTCPeerConnection,并按需求设置流

new RTCPeerConnection()

8. B将收到的Offer设置为远端描述

pc.setRemoteDescription(new RTCSessionDescription(Json.parse(offerString)),function({},error);

9. B生成Answer,并设置为本地描述

pc.createAnswer(function(answer){pc.setLocalDescription(new RTCSessionDescription(answer),function(){ })},error)

10. B把Answer发送给发起方A

send json.stringify(answer)

11. A将Answer设置为远端描述

pc.setRemoteDescription(new RTCSessionDescription(Json.parse(answerString)),function(){},error);

12. 交换ICE候选地址信息

setLocalAndSend中会设置本地sdp,完成设置后会回调onicecandidate事件,传递ICE候选地址,需要将其转发至另一端,并通过另一端的方法addIceCandidate方法设置对方的候选地址。

pc.addIceCandidate(new RTCIceCandidate(iceinfo));

理想情况下,现在已经建立连接了。

13.交换与使用媒体流

当一方addStream或addTrack后,另一方的RTCPeerConnection会触发onaddstream或addTrack事件回调,通过事件参数可以获取对面的流或轨道数据,以此进行媒体显示等。

相关文章

  • webrtc的信令传输流程

    1 webrtc介绍 WebRTC (Web Real-Time Communications) 是一项实时通讯技...

  • WebRTC 控制信令流程图

    自己画的 webrtc 协议流程图,主要是信令控制方面的,底层媒体传输协议,如 SRTP、QUIC 等未包含。

  • KMS应用架构设计

    KMS架构 KMS交互 媒体协商(信令面) 媒体传输 对于WebRTC,媒体协商就是SDP Offer/Answe...

  • WebRTC网关服务器单端口方案实现

    标准WebRTC连接建立流程这里描述的是Trickle ICE过程,并且省略了通话发起与接受的信令部分。流程如下:...

  • WebRTC信令交互流程

    WebRTC信令交互流程: 上述序列中,WebRTC并不提供Stun服务器和Signal服务器,服务器端需要自己实...

  • WebRTC 服务器要干些什么

    概述 WebRTC 的服务器大体分为信令服务器和媒体服务器 WebRTC 信令服务器是主要功能是为 WebRTC ...

  • android webrtc 两个手机 P2P 视频聊天

    webrtc 很简单,核心流程就是上面这张图。唯一需要我们实现的就是 signal sever。当然信令交换一般都...

  • WebRTC客户端主要流程分析

    通信过程 因为WebRTC规范里没有包含信令协议,所以像OWT、mediasoup等支持WebRTC的开源项目,其...

  • WebRTC之信令篇

    在WebRTC中,信令发挥着举足轻重的作用,但是webrtc工作组并没有对信令交互进行标准化,留给开发人员自行选择...

  • webrtc

    使用WebRTC搭建前端视频聊天室——入门篇使用WebRTC搭建前端视频聊天室——信令篇Android之WebRTC介绍

网友评论

      本文标题:webrtc的信令传输流程

      本文链接:https://www.haomeiwen.com/subject/hurquhtx.html