我的问题:
我写了一个基于WebRTC的视频聊天应用程序。当两个客户端连接到我们的局域网内时, 他们总是获得对等连接。但是,当来自我们局域网的客户端与 局域网之外的客户端始终是点对点连接。当移动设备连接时 彼此之间通常是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服务器)?