webrtc实现音视频通话

webrtc是什么?

webrtc(Web Real-Time Communication)是跨平台的音视频实时通话协议。
使用webrtc开发一个移动端的实时音视频通讯协议功能需要具备以下几项能力,NAT穿越、SignalChannel信令通道、webRTC会话建立、音视频数据获取、音视频数据传输。

NAT穿越技术

ICE

由以下几个技术和协议组成的:STUN、NAT、TURN、SDP,这些协议技术,帮助ICE共同实现了NAT/防火墙穿越。

STUN

1 概念

STUN(Session Traversal Utilities for NAT,NAT会话传输应用程序)是一种网络协议,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的Internet端端口。

2 作用

STUN服务器部署2个IP以及2个port。A客户端通过向STUN服务器不同IP发UDP包。再根据是否能收到STUN服务器的response等等来判断。1是否当前在公网2NAT的类型

3 NAT探测过程

STEP1:

B向C的IP1的pot1端口发送一个UDP 包。C收到这个包后,会把它收到包的源IP和port写到UDP包中,然后把此包通过IP1和port1发还给B。这个IP和port也就是NAT的外网 IP和port,也就是说你在STEP1中就得到了NAT的外网IP。当B收到此UDP后,把此UDP中的IP和自己的IP做比较,如果是一样的,就说明自己是在公网。如果不一样,说明有NAT的存在,系统进行STEP2的操作。

STEP2:

B向C的IP1发送一个UDP包,请求C通过另外一个IP2和PORT(不同与SETP1的IP1)向B返回一个UDP数据包。我们来分析一下,如果B收到了这个数据包,那说明什么?说明NAT来着不拒,不对数据包进行任何过滤,这也就是STUN标准中的full cone NAT。如果没收到,那么系统进行STEP3的操作。

STEP3:

B向C的IP2的port2发送一个数据包,C收到数据包后,把它收到包的源IP和port写到UDP包中,然后通过自己的IP2和port2把此包发还给B。如果这个port和step1中的port一样,那么可以肯定这个NAT是个CONE NAT,否则是对称NAT。

STEP4:

B向C的IP2的一个端口PD发送一个数据请求包,要求C用IP2和不同于PD的port返回一个数据包给B。

我们来分析结果:如果B收到了,那也就意味着只要IP相同,即使port不同,NAT也允许UDP包通过。显然这是restrict cone NAT。如果没收到,没别的好说,port restrict NAT.

4 获取客户端公网地址

客户端A向STUN服务器发送一个UDP包1。STUN服务器接收到UDP包1后,将该UDP包的源IP和源Port写到UDP包2发送给A。A收到UDP包2后,打开一看,源IP和源Port就是自己的公网地址

TURN(数据中转)

1 概念

TURN(Traversal Using Relay NAT),是一种资料传输协议(data-transfer protocol)。通过中继服务器,穿透 NAT 或防火墙使两个 TCP 或 UPD 客户端建立连接。

2 作用

如果使用STUN打洞失败,只能使用TURN服务器做中转数据

信令通道(SignalChannel)

Signalling 来发现各个 Peer,通过 Signalling 来控制各个 Peer 之间连接的建立和断开。(通常用WebSocket/MQTT/Socket原生/XMPP)

webRTC协议

WebRTC会话建立

SDP(客户端配置信息)

会话描述协议Session Description Protocol (SDP) 是一个描述多媒体连接内容的协议,例如分辨率,格式,编码,加密算法等

JSEP(会话建立协议JavaScript Session Establishment Protocol)

• 呼叫方发送 offer;
• 被呼叫方接受这个 offer;
• 被呼叫方发送 answer;
• 呼叫方接受 answer

必要信息

1 本地客户端的配置信息;
2 远程客户端的配置信息;
3 远程参与建立P2P连接的信息:主要是 IP 和端口。

P2P连接的过程

1 A和B连接上服务端,建立一个TCP长连接(任意协议都可以,WebSocket/MQTT/Socket原生/XMPP),我们这里为了省事,直接采用WebSocket,这样一个信令通道就有了。

2 A从ice server(STUN Server)获取ice candidate并发送给Socket服务端,并生成包含session description(SDP)的offer,发送给Socket服务端。

3 Socket服务端把A的offer和ice candidate转发给B,B会保存下A这些信息。

4 然后B发送包含自己session description的answer(因为它收到的是offer,所以返回的是answer,但是内容都是SDP)和ice candidate给Socket服务端

5 Socket服务端把B的answer和ice candidate给A,A保存下B的这些信息。至此A与B建立起了一个P2P连接。

获取音视频数据

MediaStream:
媒体流,一个媒体流包含 0 个到多个的媒体数据源,媒体流里面的数据源在呈现(render)必须同步

MediaStreamTrack:
媒体数据源,一个媒体数据源构成一个 MediaStreamTrack,比如音频数据源和视频数据源,多个相互之间有关联的媒体数据源(比如有同步关系的音频视频媒体数据源)构成一个媒体流(MediaStream)。

传输音频和视频数据

PeerConnection(RTCPeerConnection (C++)):

表示一个 WebRTC 通讯连接对象,它维护与这个通讯连接相关的 MediaStream,处理通讯双方信令事件,完成通讯数据的传输。

传输任意二进制数据

DataChannel(RTCDataChannel)

数据通道,两个 WebRTC 终端的连接建立后,它们可以通过这个数据通道传输任意类型的数据。

安全性

客户端

  • 对通话对象的安全身份认证
  • 对通话内容的加密

服务端

  • 对客户端的合法性认证,对自身的保护
  • 对合法客户端的保护
Blacktea wechat
ex. subscribe to my blog by scanning my public wechat account
记录生活于感悟,您的支持将鼓励我继续创作!