我遇到的麻烦NAT traversal
和WebRTC
.视频流可以与某些人合作,但与在学生宿舍路由器后面的人不同.
我认为这应该通过使用TURN服务器来解决.我已经这样做了,它仍然无法工作,现在我想知道TURN服务器是否正常工作.因此,我想知道我是否可以或应该设置多个TURN服务器,如果是,如何.
我在另一个线程中找到了这个STUN/TURN服务器列表.现在我正在设置它们
var STUN = { 'url': 'stun:stun.l.google.com:19302', }; var TURN = { url: 'turn:homeo@turn.bistri.com:80', credential: 'homeo' }; var iceServers = { iceServers: [STUN, TURN] }; var pc = new RTCPeerConnection(iceServers);
所以我的问题基本上是:是否可以设置几个STUN/TURN服务器?如果可能,我应该这样做,那代码会是什么样的?
A STUN server is used to get an external network address. TURN servers are used to relay traffic if direct (peer to peer) connection fails.
STUN和/或TURN服务器的URL(可选)由iceServers配置对象中的WebRTC应用程序指定,该对象是RTCPeerConnection构造函数的第一个参数.
使用更多服务器的示例:
var ICE_config= { 'iceServers': [ { 'url': 'stun:stun.l.google.com:19302' }, { 'url': 'turn:192.158.29.39:3478?transport=udp', 'credential': 'JZEOEt2V3Qb0y27GRntt2u2PAYA=', 'username': '28224511:1379330808' }, { 'url': 'turn:192.158.29.39:3478?transport=tcp', 'credential': 'JZEOEt2V3Qb0y27GRntt2u2PAYA=', 'username': '28224511:1379330808' } ] } pc = new RTCPeerConnection(ICE_config);
一旦RTCPeerConnection具有该信息,ICE魔法就会自动发生:RTCPeerConnection使用ICE框架计算出对等体之间的最佳路径,必要时使用STUN和TURN服务器.
STUN:STUN服务器位于公共互联网上并且有一个简单的任务:检查传入请求的IP:端口地址(来自在NAT后面运行的应用程序)并将该地址作为响应发回.换句话说,应用程序使用STUN服务器从公共角度发现其IP:端口.此过程使WebRTC对等体能够为自己获取可公开访问的地址,然后通过信令机制将其传递给另一个对等体,以便建立直接链接.(实际上,不同的NAT以不同的方式工作,并且可能存在多个NAT层,但原理仍然相同.)
TURN:TURN RTCPeerConnection尝试通过UDP建立对等体之间的直接通信.如果失败,RTCPeerConnection将转向TCP.如果失败,TURN服务器可用作回退,在端点之间中继数据.
重申一下:TURN用于在对等体之间中继音频/视频/数据流,而不是信令数据!
TURN服务器具有公共地址,因此即使对等方位于防火墙或代理之后,也可以与对等方联系.TURN服务器具有概念上简单的任务 - 中继流 - 但与STUN服务器不同,它们本身消耗大量带宽.换句话说,TURN服务器需要更强大.
看到这个
关于STUN,WebRTC将向所有人发送绑定请求,并将结果合并.(请注意,在旧版本的WebRTC代码中,似乎只使用了第一个STUN服务器)
我建议使用多个STUN服务器,因为平均会减少连接时间.确切的数量取决于STUN服务器的可靠性.一般2个就足够了.
关于TURN,问题更复杂,因为这些服务器将在无法进行P2P连接时中继您的流量.如果您有许多客户端,单个TURN服务器可能会达到其最大带宽.在这种情况下,设置多个TURN服务器将有所帮助.
怎么样?在连接检查阶段,WebRTC将选择具有最低往返时间的TURN继电器.因此,设置多个TURN服务器可使您的应用程序在带宽和用户数量方面进行扩展.
如果您没有开发大规模应用程序,那么1或2个TURN服务器通常就足够了.
您可以访问https://chromium.googlesource.com/external/webrtc/+/master浏览WebRTC代码
我建议查看内部:webrtc/p2p/client/basicportallocator.cc,webrtc/p2p/base/stunport.cc和webrtc/p2p/base/turnport.cc