WebRTC学习总结(一)


(个人理解)
是一种实时音视频通讯技术(P2P)。
涉及的知识点:NAT,STUN,TURN,ICE,信令,SDP…

P2P:点对点连接,目前网络上两主机通信都是 主机A--->服务器--->主机B,服务器负责数据的转发等,P2P则是 主机A--->主机B,没中转服务器,大大减少了服务器的压力。

SDP描述符:(offer和answer)分辨率,格式,编码,加密算法等信息。

NAT(网络地址转换):为了解决IPV4地址不够用的问题,同一路由器下的主机共用一个公网地址,再给每个主机分配私有地址(仅在同一局域网内使用);NAT就是实现了公网地址和私网地址之间转换的一种机制;但是也产生了一个问题,有一个处于局域网的主机A和一个处于公共网络的主机B,当主机A要访问主机B时,可以访问成功,但是当主机B访问主机A时,将被NAT拦截,不能访问,因此为了解决这个问题,我们要穿透NAT。

ICE,STUN,TURN:是某种协议,目的都是为了穿透NAT。ICE结合了STUN和TURN,所以普遍被运用。

P2P中的主要服务器有:(虽然说P2P没有服务器来中转数据,但是这不代表它不会用到服务器,比如连接还没建立之前,需要有服务器来告知何时建立连接和一些必要的信息的传递)。

(1)信令服务器: 通知何时开启连接何时关闭连接,传递一些错误信息,传递一些元数据(音视频的信息,编解码等),传递网络信息(如IP和端口)。

(2)STUN服务器:用于提供外网地址。(主机A向STUN服务器发起请求,STUN服务器将返回主机A的外网地址)。

(3)TURN服务器:当NAT穿透失败时(P2P失败),将使用TURN服务器作为中转服务器,中转数据。

NAT穿透的方案:(原理:当主机A向服务器请求,连接成功后,服务器就可以穿透NAT,和主机A连接) 
现在我们想让两个位于NAT后的主机A和主机B(且不在同一个局域网)连接:
主机A向STUN服务器请求,得到它的公网地址A,主机B向STUN服务器请求,得到它的公网地址B;主机A,B都将自身的公网地址发给信令服务器,信令服务器将公网地址A转发给服务器B,信令服务器将公网地址B转发给服务器A,至此主机A、B都得到了对方的公网地址,终于可以愉快的交流了。

三个主要API:
MediaStream:用于获取视频、音频的同步流。
RTCPeerConnection:用于点对点连接的媒体流的传输。
RTCDataChannel:用于点对点连接的数据的传输。

P2P的主要流程:

A与B连接过程:(RTCPeerConnection简称PC)

1.确定本机上的媒体流的特性,比如分辨率、编解码能力等(SDP描述符),通过使用会话描述协议(SDP)交换offer和answer来进行交换媒体配置信息的信令。
(1)A和B各自建立一个PC实例。 
(2)A通过PC提供的createOffer()方法建立一个包含A的SDP描述符的offer。
(3)A通过PC所提供的setLocalDescription()方法,将offer交给自己的PC实例。 
(4)A将offer通过信令服务器发送给B。
(5)B得到A的offer,通过PC提供的setRemoteDescription()方法交给自己的PC实例。
(6)B通过PC所提供的createAnswer()方法建立一个含B的SDP描述符answer。 
(7)B通过PC所提供的setLocalDescription()方法,将answer交给自己的PC实例。
(8)B将answer通过信令服务器发送给A。
(9)A接收到B的answer后,调用setRemoteDescription()方法将answer交给自己的PC实例。

通过在这一系列的信令交换之后,甲和乙所创建的PC实例都包含甲和乙的SDP描述符了,完成了两件事的第一件。

2.连接两端的主机的网络地址(ICE Candidate)
(1)A、B各创建配置了ICE服务器的PC实例,并为其添加onicecandidate事件回调。
(2)当网络候选可用时,将会调用onicecandidate函数。
(3)在回调函数内部,A或B将网络候选的消息封装在ICE Candidate信令中,通过服务器中转,传递给对方。
(4)A或B接收到对方通过服务器中转所发送过来ICE Candidate信令时,将其解析并获得网络候选,将其通过PC实例的addIceCandidate()方法加入到PC实例中。
这样连接就创立完成了,可以向RTCPeerConnection中通过addStream()加入流来传输媒体流数据。将流加入到RTCPeerConnection实例中后,对方就可以通过onaddstream所绑定的回调函数监听到了。

你可能感兴趣的:(WebRTC)