WebRTC是浏览器实时通信 RTC 的提供 JS 接口, JS 接口通过信令建立浏览器点对点(peer-to-peer,P2P)的信道,信道可发送任何数据并无需经过服务器。
WebRTC提供三个API
WebRTC使用 RTCPeerConnection 在浏览器之间传递流数据,此流数据通道是P2P的,无需服务器中转。但并不意味着能抛弃服务器,仍需服务器为传递信令(signaling)来建立信道。WebRTC没有定义用于建立信道的信令协议,信令并不是 RTCPeerConnection API 的一部分。
既然没有定义信令(signaling)的协议,可选择任意方式(如AJAX、WebSocket)任意协议(如SIP、XMPP)来传递信令,建立信道。
需要信令来交换信息分为:
通过服务器建立信道
WebRTC提供浏览器之间P2P信道进行数据传输,但建立这个信道必须有服务器的参与。
WebRTC需服务器提供:
NAT/防火墙穿越技术
在处于使用NAT设备的私有TCP/IP网络中的主机之间建立连接时需使用NAT穿越。NAT的行为是非标准化的,穿越技术大多使用公共服务器,使全球任何地方都能访问得到IP地址,在 RTCPeerConnection 中实用ICE框架来保证 RTCPeerConnection 实现NAT穿越。
ICE
ICE(Interactive Connectivity Establishment, 综合性NAT穿越技术)框架整合各种NAT穿越技术如STUN、TURN(Traversal Using Relay NAT,中继NAT实现的穿透),ICE先使用STUN尝试建立一个基于UDP的连接,失败后实用TCP(先尝试HTTP然后尝试HTTPS),若依然失败,ICE就会使用中继的TURN服务器。
RTCDataChannel
既然能建立P2P信道来传递实时音视频数据流,为什么不能使用此信道传递其他数据呢? RTCDataChannel API 可实现浏览器之间传递任意数据。 DataChannel 是建立在 PeerConnection 之上的,不能单独使用。
WebRTC原理
WebRTC的实现是建立浏览器之间的直接连接而无需服务器中转,即P2P。因此要求彼此知道对方外网地址,而计算机大多位于NAT之后,少数主机拥有外网地址。这就要求一种方式可穿透NAT技术(STUN、TRUN)。
WebRTC实用默认STUN服务器获取当前主机的外网地址和端口,Chrome默认的是Google域名下的一个STUN,国内不大稳定。
P2P建立过程需依赖服务端中转(信令服务器),需实用双工通讯方式的WebSocket来实现信令的中转。
浏览器A创建一个 RTCPeerConnection 对象, RTCPeerConnection 自动向STUN服务器获取自己的外网IP与端口,然后将自己的网络信息经过信令服务器中转后发送给浏览器B。
浏览器B接收到A的网络信息后创建一个 RTCPeerConnection 对象,将接收的信息通过 addIceCandidate 添加到对象中。
浏览器A通过 RTCPeerConnection 对象的 createOffer() 获取本地音视频编码分辨率等信息,通过 setLocalDescription 添加到 RTCPeerConnection 中,并将这些信息经过信令服务器中转后发送给浏览器B。浏览器B接收到浏览器A发送过来的信息后,使用 RTCPeerConnection 对象的 setRomoteDescription() 保存。
Stun Server是开源的coTurn穿透服务器,Signal Server是开源的Apache Active MQ。
Signal Server用的是开源的Apache ActiveMQ,网上有很多花里胡哨的方法,这个是简单能搭建成功的过程, 搭建过程 。
穿透服务器用的是开源的coturn, 搭建过程
SDP交换
根据MQTT协议订阅发布机制:
订阅同一个主题:(实现接收消息)
发布同一个主题:(实现发布消息)
对于每一个客户端来说唯一标示是ClientId,客户端发布消息时设置的主题也是ClientId.
1、客户端连接到ActiveMQ服务器
这里的ClientId,就是在ActiveMQ服务端添加的
这里主要是连接到ActiveMQ的流程
首先,呼叫方initCall,主要作用是创建PeerConnection对象,设备,将音视频数据封装成MediaStream添加到然后打开本地音视频PeerConnection中,显示呼叫页面。
然后呼叫方startCall,主要作用是CreateOffer,SendOffer,所以要发布Topic:呼叫方Message
假如ClientA呼叫ClientB,首先ClientA订阅主题ClientB,然后ClientB订阅主题ClientA。
Client A给Client B发送消息时,发布主题Client_A_ID和Message。
Client B给Client A发送消息时,发布主题Client_B_ID和Message。
zjf001连接到服务器
根据前面文章,看一下基本流程
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)