Open downgoon opened 6 years ago
建立点对点
信道的一个常见问题,就是NAT
穿越技术。在处于使用了NAT设备的私有TCP/IP网络中的主机之间需要建立连接时需要使用NAT穿越技术。以往在VoIP领域经常会遇到这个问题。目前已经有很多NAT穿越技术,但没有一项是完美的,因为NAT的行为是 非标准化 的。
这些技术中大多 使用了一个公共服务器,这个服务使用了一个从全球任何地方都能访问的IP地址。在RTCPeeConnection
中,使用ICE框架来保证RTCPeerConnection能实现NAT穿越。
ICE,全名叫交互式连接建立(Interactive Connectivity Establishment),一种综合性的NAT穿越技术,它是一种框架,可以整合各种NAT穿越技术如STUN、TURN(Traversal Using Relay NAT 中继NAT实现的穿透)。
ICE
会先使用STUN
,尝试建立一个基于UDP的连接;如果失败了,就会去TCP(先尝试HTTP,然后尝试HTTPS);如果依旧失败ICE就会使用一个中继的TURN服务器。
var iceServers = {
'iceServers': [{
'url': 'stun:stun.services.mozilla.com'
},
{
'url': 'stun:stun.l.google.com:19302'
}
]
}
function createPeerConnection() {
rtcPeerConnection = new RTCPeerConnection(iceServers); // NAT穿越
rtcPeerConnection.onicecandidate = onIceCandidate;
rtcPeerConnection.onaddstream = onAddStream;
rtcPeerConnection.addStream(localStream);
}
RFC3489
中将 NAT 的实现分为四大类:
其中完全最上层的完全锥形NAT的穿透性最好,而最下层的对称形NAT的安全性最高。
国内移动无线网络运营商在链路上一段时间内没有数据通讯后, 会淘汰NAT表中的对应项, 造成链路中断。 国内的运营商一般NAT超时的时间为5分钟,所以通常我们TCP长连接的心跳设置的时间间隔为3-5分钟。
互动聊天:WebRTC + WebSocket
To make it easier to explain how WebSockets works together with WebRTC, we can use the following diagram:
上图非常重要的一点:连接建立的过程需要借助服务器,但是视频/语音通话就不再需要服务器了,而是浏览器对浏览器的直连。不仅降低了通话时延,提高了实时性;而且给服务器 节省了带宽,降低了企业运营成本。
体验
使用
WebRTC
功能,开发者只需要用javascript
编程,调用浏览器内置的API
。现在支持WebRTC
的浏览器有Chrome
,Firefox
和Opera
。Safari
和IE
暂不支持。WebRTC则实现了浏览器在无需插件的情况下对实时视频通讯的支持。WebRTC包含有三个组件:访问用户摄像头及麦克风的
getUserMedia
,穿越NAT及防火墙建立视频会话的PeerConnection
,以及在浏览器之间建立点对点数据通讯的DataChannels
。Google的WebRTC视频聊天演示。参考资料