omn*_*ain 1 webrtc kurento libnice
我花了几天时间寻找连接问题,但没有任何运气。我正在尝试使用Kurento实现一个相对简单的one2one呼叫。
在下面,您会找到Kurento的调试日志,其中说明了可以建立连接和连接失败的情况。
如果您需要更多日志(例如,客户端,信令服务器,tcpdumps或Kurento的跟踪日志),请告诉我,我会提供!
任何帮助或新的投入,我们将不胜感激!
问题描述:
在大约30%的情况下,无法建立WebRTC连接。不幸的是,当可以建立Connection时,我缺乏任何形式,而当不能建立连接时,它似乎是完全随机的。我在同一网络中,使用相同的设备,使用相同的TURN服务器,使用相同的信令协议,但是在30%的情况下无法建立连接。
当我在本地运行应用程序时,它似乎更可靠地工作,几乎可以在100%的时间内建立连接(或者甚至有100%的时间可以建立连接,我已经测试了很多次了,但我都失去了跟踪)。我使用docker在本地设置基础架构,并在单独的网络中运行不同的容器(TURN,Kurento和Signalling)以模仿生产部署。
我们在开发和生产环境中会遇到相同的行为。在我们的开发环境中,我们绝对没有防火墙,因此这似乎不是问题。
我试图找出问题原因的原因:
通常,我一直在比较有效案例和无效案例的日志,但是我没有发现它们之间的任何重大差异都可以指出问题所在。
我已经通过TURN服务器(使用Firefox和force_relay标志)以及通过Kurento直接测试了WebRTC连接,但是在这两种情况下,大约30%的情况下连接均失败。
我尝试过滤不是中继候选者的所有ICE候选者。
我已经嗅探了我们的信令服务器(也控制Kurento)和Kurento之间的流量,以查看所交换的JSON RPS消息是否存在任何差异,但它们看起来基本相同。
我已经使用以下工具测试了我们的STUN和TURN服务器:https : //webrtc.github.io/samples/src/content/peerconnection/trickle-ice/,我同时获得了serverreflexive和中继候选者,它们看起来都是正确的
我已经从成功的连接和不成功的连接中窃听了来自客户端的流量,但是可能会发现很大的不同
我简化了Kurento媒体管道(没有记录,没有集线器),但是行为是相同的
我使用了不同的浏览器(Chrome,Firefox和本机iOS实现),但是行为是相同的
Kurento调试日志,说明可以建立连接的情况:
https://gist.github.com/omnibrain/2bc7ad54f626d278d3c8bac29767ac4c
无法建立连接的情况下的Kurento调试日志:
https://gist.github.com/omnibrain/f7caee04a5c6d77ea22a9ccfa95dd825
经过几天的调试和几乎疯狂,我们终于找到了问题的根源:
我们使用Socket.IO的Swift客户端和Socket.IO的Java Netty Socket.IO服务器实现。客户端(iOS)使用长轮询来与服务器(Java)通信。事实证明,Netty Socket.IO服务器正在URL解码Swift Socket.IO客户端的长轮询有效负载,但是Swift Socket.IO客户端实际上并未对其进行URL编码。这意味着从Swift Socket.IO客户端发送的每个“ +”都被服务器上的“”(空格)替换。为什么这是个问题?因为客户端的SDP报价包含ufrag,其中可以包含加号!因此,如果SDP包含“ +”,则在服务器上将其替换为空格,这将导致STUN ping失败,因为无法验证消息的完整性。
归档时间: |
|
查看次数: |
490 次 |
最近记录: |