我的问题:
我写了一个基于 WebRTC 的视频聊天应用程序。当两个客户端在我们的 LAN 中连接时,它们总是获得对等连接。但是,当我们 LAN 的客户端与 LAN 外部的客户端连接时,它始终是对等连接。当移动设备相互连接时,通常是 TURN-to-TURN。
我的期望:
我知道对称 NAT 问题,预计 20% 到 30% 的连接需要 TURN 连接。但到目前为止,我从未在我们的局域网之外找到任何两个客户端来获得对等连接——这似乎是错误的。
我的设置:
我在 Chrome、Firefox、Electron、Android 和 iOS 设备上进行了测试。
我使用Coturn服务器作为 STUN/TURN 服务器。该服务器可通过互联网访问。
我通过检查peerConnection.getStats()
一个项目
item.type === 'googCandidatePair' && item.googActiveConnection === 'true'
并查看它的
item.googLocalCandidateType
和item.googRemoteCandidateType
。如果类型类似于relay
,则它是 TURN 连接。
我的分析:
当我的系统说涉及 TURN 服务器并且我停止Coturn时,视频会冻结 - 所以我猜我的应用程序反馈是真实的。
我看到了host
,srflx
双方relay
都有 ICE 候选人。所以我的应用程序的 STUN/TURN 配置似乎是正确的。
我什至在我的应用程序中构建了一个测试设置,它尝试连接到指定的机器人对等体,禁用视频和音频,并尝试通过peerConnection
数据通道来回发送数据。然后我检查上述统计数据,但它的行为相同:我们局域网中的点对点。总是转身参与到外面。
在我的测试中,我发现peerConnection.oniceconnectionstatechange
需要很长时间(大约 12 秒)才能
connected
从completed
. 但同样只适用于局域网外的对等方,而不是局域网内的对等方。但是,数据通道较早打开并且可以正常工作。completed
在调用之前等待getStats()
不会改变我的结果。AFAIK 只有调用者有completed
状态。
我的希望:
有没有人暗示我可以改变什么或如何改进或扩展我的检查?哪个组件可能是问题(应用程序代码、网络、STUN 服务器、TURN 服务器)?