WebRTC:Firefox 中缺少中继候选人

Posted

技术标签:

【中文标题】WebRTC:Firefox 中缺少中继候选人【英文标题】:WebRTC: Missing relay candidates in Firefox 【发布时间】:2017-06-26 12:26:08 【问题描述】:

当涉及到 firefox 并且需要 TURN 服务器时,我无法建立 WebRTC 连接。 使用此测试工具可重现原因:https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/

尝试以下 stun 服务器配置:

URI:转:numb.viagenie.ca

用户名:l1787875@mvrht.com

密码:测试

在 chrome 中出现了接力候选人。在 Firefox 中有缺失。但为什么呢?

Chrome 56.0.2924.87(64 位)中的结果: Time Component Type Foundation Protocol Address Port Priority 0.002 1 host 2969322736 udp 192.168.178.29 58537 126 | 30 | 255 0.002 1 host 1665573758 udp 2001::34ad:4890:3ce5:1be4:aa2b:d831 58538 126 | 10 | 255 0.002 2 host 2969322736 udp 192.168.178.29 58539 126 | 30 | 254 0.003 2 host 1665573758 udp 2001::34ad:4890:3ce5:1be4:aa2b:d831 58540 126 | 10 | 254 0.544 1 srflx 842163049 udp 85.212.39.206 58537 100 | 30 | 255 0.553 2 srflx 842163049 udp 85.212.39.206 58539 100 | 30 | 254 0.658 1 relay 3433799847 udp 66.228.45.110 57491 2 | 30 | 255 0.677 2 relay 3433799847 udp 66.228.45.110 57492 2 | 30 | 254 0.678 Done

Firefox 51.0.1(32 位)中的结果: Time Component Type Foundation Protocol Address Port Priority 0.008 1 host 0 UDP 192.168.178.29 52762 126 | 32512 | 255 0.009 1 host 3 UDP 2001:0:9d38:6abd:82d:1d5a:aa2b:d831 52763 126 | 32256 | 255 0.009 2 host 0 UDP 192.168.178.29 52764 126 | 32512 | 254 0.009 2 host 3 UDP 2001:0:9d38:6abd:82d:1d5a:aa2b:d831 52765 126 | 32256 | 254 11.234 Not reachable?

【问题讨论】:

你能列出你看到的候选人吗?即使在 Chrome 中,我也看不到接力候选人。例如。在 ICE options 下,如果我将 IceTransports value: 设置为 relay,我会看到零个候选者。 你是对的。我已经编辑了问题。 【参考方案1】:

当我测试它时,TURN 服务器响应 486“Allocation Quota Reached”。从现在开始,我没有使用 Chrome 或 Firefox 获得中继候选人,我猜您的 TURN 提供商已禁用您在此处发布的凭据。 如果您可以重现它,我建议您查看 Firefox 中的 about:webrtc。它应该有一些日志消息表明出了什么问题。如果您在日志中看到可疑内容,这可能是一个值得在 bugzilla.mozilla.org 上填写的错误。

更新:我能够重现该问题。它是 Firefox TURN 客户端中的一个错误。我为它创建了这个错误跟踪问题https://bugzilla.mozilla.org/show_bug.cgi?id=1338384

更新 2:该错误已在 Firefox 54 中修复。长解释是 coturn 在其对 Firefox 的回复消息中包含带宽属性。这个带宽属性从未被正式标准化。并且该带宽属性所在的范围要求如果客户端不理解该属性,则将其视为解析失败。除了带宽属性的过期草案明确表示,理解带宽属性的含义是可选的。所以一个糟糕的规范尝试 + 一个实现了从未正式指定的东西的服务器 + 一个不理解结果的客户端。

【讨论】:

看起来配额不再超过,我在 about:webrtc 上看到以下错误消息(我今天稍后会看看):无法识别的属性:0x0010 STUN-CLIENT(relay( IP4:10.252.27.46:50759/UDP|numb.viagenie.ca:3478)::TURN):收到响应;处理 STUN-CLIENT(relay(IP4:10.252.27.46:50759/UDP|numb.viagenie.ca:3478)::TURN):错误处理响应:操作被拒绝,stun 错误代码 0.ICE(PC:1486673561857884 (id= 2147488911 url=webrtc.github.io/samples/src/content/peerconnection/trickle-ice)): 消息不对应任何注册的stun ctx 好的,我的 WebRTC 知识有限,但我的应用程序代码似乎没有问题。理论上很好,但是服务器或客户端是否有解决方案让它运行?我还尝试过使用 coTurn 的 docker 镜像。同样的问题。 不,这不是您的应用程序代码中的问题。问题是 coturn 向其消息中添加了一个属性,而 Firefox 无法正确处理该属性。该问题已在 Firefox 54(现在是 Firefox Nightly)中得到修复。我不知道您是否可以以某种方式将 coturn 配置为不发送带宽属性。 ios webrtc native 存在同样的问题,在检查日志后我发现 if (!config || config->relays.empty()) // 此配置中未指定中继端口。序列标志|= PORTALLOCATOR_DISABLE_RELAY;有人可以帮忙吗?我正在使用谷歌眩晕 STUN 服务器不会为您提供中继候选人,因为它不是 TURN 服务器。只有 TURN 服务器提供我们的中继候选人。【参考方案2】:

对于那些遇到这个问题但没有得到帮助的人,我的问题是 Firefox(在 v. 92 上测试)不支持没有设置凭据的转向服务器。我总是只获得主机类型候选者。

我在 about:webrtc 中遇到以下错误

short term auth failed
Error processing response: Operation rejected, stun error code 0.
Message does not correspond to any registered stun 

设置 coturn 配置:

lt-cred-mech
user=yourUser:yourPassword
realm=domain.com

同时在您的客户端应用程序中设置名称/密码,您现在应该也会获得 relay/srflx。

【讨论】:

以上是关于WebRTC:Firefox 中缺少中继候选人的主要内容,如果未能解决你的问题,请参考以下文章

如何在Chrome for WebRTC应用程序中记录/查看ICE连接检查消息?

为 WebRTC PeerConnections 强制 TCP

WebRTC 中继服务器/广播多个客户端

Twilio WebRTC TURN 中继在几分钟后随机停止工作

WebRTC STUN 服务器如何反馈 SDP 和 ICE 候选人?

无法触发 WebRTC 跟踪事件