2

我的问题:

我写了一个基于 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.googLocalCandidateTypeitem.googRemoteCandidateType。如果类型类似于relay,则它是 TURN 连接。

我的分析:

当我的系统说涉及 TURN 服务器并且我停止Coturn时,视频会冻结 - 所以我猜我的应用程序反馈是真实的。

我看到了hostsrflx双方relay都有 ICE 候选人。所以我的应用程序的 STUN/TURN 配置似乎是正确的。

我什至在我的应用程序中构建了一个测试设置,它尝试连接到指定的机器人对等体,禁用视频和音频,并尝试通过peerConnection数据通道来回发送数据。然后我检查上述统计数据,但它的行为相同:我们局域网中的点对点。总是转身参与到外面。

在我的测试中,我发现peerConnection.oniceconnectionstatechange需要很长时间(大约 12 秒)才能 connectedcompleted. 但同样只适用于局域网外的对等方,而不是局域网内的对等方。但是,数据通道较早打开并且可以正常工作。completed在调用之前等待getStats()不会改变我的结果。AFAIK 只有调用者有completed状态。

我的希望:

有没有人暗示我可以改变什么或如何改进或扩展我的检查?哪个组件可能是问题(应用程序代码、网络、STUN 服务器、TURN 服务器)?

4

0 回答 0