美文网首页
Android webRTC原理浅析

Android webRTC原理浅析

作者: imkobedroid | 来源:发表于2019-09-26 19:58 被阅读0次

说明

因为公司项目设计到类似与英雄联盟的开黑语音和微信群语音通信的开发,经过大量的调研选择了webRtc来进行研究!这里对研究原理做一下简单的总结!不对的地方希望指出。

协议说明

基本概念
RTC(Real Time Communication): 实时通信
WEBRTC(基于web): 基于web的实时通信
Signaling(信令):  一些描述媒体或网络的字符串
SDP(Session Description Protocol): 会话描述协议, 主要描述媒体信息
ICE(Interactive Connectivity Establishment): 交互式连接建立
STUN(Session Traversal Utilities for NAT): NAT会话穿透工具
TURN(Traversal Using Relays around NAT): 中继穿透NAT
传输层协议:udp

原因:使用tcp的话是安全性的传输协议,如果第一个没传输到那后面的传输将会堵塞,导致一出问题全部就会接受不到,使用udp的话不是安全的传输,只需要发送出去,到没到不需要关心,所以会出现丢包的情况,但是不会一出问题全部接受不到

媒体协议:srtp srtcp

安全实时传输协议(SRTP,Secure Real-time Transport Protocol) 通过 IP 网络交付音频和视频等实时数据的标准安全格式。

安全实时控制传输协议(SRTCP,Secure Real-time Control Transport Protocol) 通过 SRTP 流交付发送和接收方统计及控制信息的安全控制协议。

数据协议:DTLS

我们都知道UDP是不安全的,但是WebRTC要求所有传输的数据(音频、视频和自定义应用数据)都必须加密,所以这里就要引入一个DTLS协议的概念。
DTLS说白了,其实就是因为TLS无法保证UDP上传输的数据的安全,所以在现存的TLS协议架构上提出了扩展,用来支持UDP。其实就是TLS的一个支持数据报传输的版本。

IP地址映射与防火墙

NAT技术

NAT 是Net Address Translation 的缩写,从名字也可以看出,它是负责网络地址转换的一个协议。通俗的说,它负责把私网内的的IP和端口转换成公网的IP和端口,也即使我们通常所说的IP地址影射。

例如:

公司内一般有一个私网,假设为10.1.1.1网段。公司通过一个公网服务器(机器 A)接入Internet,此服务器内网IP为10.1.1.1,外网为220.220.1.6。私网内的机器B 10.1.1.102打开自己的88端口想连接公网的一台WEB服务器C,假设IP为:204.56.43.8,端口为80。过程如下:

  1. step1: B (10.1.1.102:88->204.56.43.8:80)将数据包发送给网关A (10.1.1.1)
  2. A将(10.1.1.102:88)数据包的地址更换为服务器外网IP,并分配一个的端口(如何分配端口方法是不同的,以后会详细的说),假设为200,数据包也就变成了(220.220.1.6:200->204.56.43.8:80),服务器A将数据发送出去
  3. C 将响应数据发送给网络服务器 A (204.56.43.8:80->220.220.1.6:200)
  4. A将C返回的响应数据报的IP地址的目的IP和端口做如下修改:(204.56.43.8:80-> 10.1.1.102:88)然后把数据发送出去
  5. B接收到C的响应数据。

这个过程实际上也是NAT的工作过程,在B角度,B完全感受不到自己是在内网,它似乎有在公网一样的权利,这也就是NAT的优点所在:用同一个IP实现多个用户的Internet接入。

防火墙

防火墙是通过管理网络端口的方法来拒绝和允许网络连接,这些拒绝或允许的原则由firewall的设计者来指定,并没有统一的标准,但防火墙大多都遵循以下几个原则:

(1)允许内部向外部发送数据包

(2)拒绝一切外部向内部的主动连接

(3)允许本地发起的,符合firewall规则的外部数据包穿过firewall

在第三条中,firewall的规则通常有以下两种:
1、返回的数据包的源IP必须是内部发起的目的IP。
2、返回的数据包的源IP必须是内部发起的目的IP并且返回的数据包的源端口必须是内部发起的目的端口。

STUN

为了进行P2P通信,会话参与双方都需要知道其对等端的IP地址和指定的UDP端口。因此,在WebRTC通信建立之前,需要进行一定数量的信息交换。
每个对等端需要使用一个STUN服务器来探测他们的公共IP地址,这个IP在连接建立的时候会被ICE框架所引用。STUN服务器是通常是可公开访问的,WebRTC应用可以自由访问。

TURN

URN服务指的是中继型NAT遍历服务器,其地址是一个公共ip地址,用于转发数据包给对端浏览器。当2个对等端因为NAT类型而无法建立连接时(当遇到对称型NAT会导致打洞失败),才需要使用中继服务器。

ICE: 交互式连接建立(Interactive Connectivity Establishment)

ICE是一种标准穿透协议,利用STUN和TURN服务器来帮助端点建立连接。WebRTC当通过信令服务器交换完sdp, candidate后,之后依靠ICE框架在2端之间建立一个通道。

ICE的过程主要分为5步:

1, 收集候选传输地址

2, 在信令通道中交换候选选项

3, 执行连接检查

4, 选择选定的对并启动媒体

5, 心跳检测

WebRTC原理

WebRTC的实现是建立浏览器之间的直接连接而无需服务器中转,即P2P。因此要求彼此知道对方外网地址,而计算机大多位于局域网,少数主机拥有外网地址。这就要求一种方式可穿透NAT技术(STUN、TRUN),WebRTC实用默认STUN服务器获取当前主机的外网地址和端口

P2P建立过程需依赖服务端中转(信令服务器),需实用双工通讯方式的WebSocket来实现信令的中转。

rtc工作图解

浏览器A创建一个RTCPeerConnection对象,RTCPeerConnection自动向STUN服务器获取自己的外网IP与端口,然后将自己的网络信息经过信令服务器中转后发送给浏览器B。

传输过程

浏览器B接收到A的网络信息后创建一个RTCPeerConnection对象,将接收的信息通过addIceCandidate添加到对象中。

浏览器A通过RTCPeerConnection对象的createOffer()获取本地音视频编码分辨率等信息,通过setLocalDescription添加到RTCPeerConnection中,并将这些信息经过信令服务器中转后发送给浏览器B。浏览器B接收到浏览器A发送过来的信息后,使用RTCPeerConnection对象的setRomoteDescription()保存。

参考地址

参考地址

信令交互流程

相关文章

网友评论

      本文标题:Android webRTC原理浅析

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