我对STUN和WebRTC的理解正确吗?

时间:2020-03-18 18:05:24

标签: c# webrtc stun

我正在尝试构建一个利用WebRTC允许用户彼此聊天的Web应用程序/网站。

在没有任何参数的情况下初始化新的 RTCPeerConnection 时,我设法使其正常运行。我认为浏览器会自动选择一些STUN服务器来使用。

但这仅在我的本地网络上有效,而当我在公共域(例如example.com)上托管网站时无效。

这导致我尝试使用自己的STUN服务器...

所以现在我用服务器的IP地址初始化 RTCPeerConnection ,并且收到STUN请求。

我正在使用RFC 5389规范来构建STUN服务器。

据我了解,我应该使用收到请求的IP地址和端口回复STUN请求。

这是我的第一个问题,我应该使用其他客户端的IP地址来响应不同的STUN请求还是我正确执行此操作?

在构建STUN服务器时,我正在使用WireShark查看生成的响应,最初它会为UDP响应显示一个无效的消息类型,但是我已经显示了STUN响应字段,所以我假设回答是正确的。
我还在this website上测试了我的STUN服务器,它添加了2个项目,一个项目用于TCP,一个项目用于UDP,但是过了一会儿,它显示了一个 701 错误代码(STUN分配请求已计时出来。)。
因此,我不确定100%我的STUN服务器是否以正确的信息响应。

我还使用了stuntman来测试我的STUN服务器,它也显示出了成功,但是我不确定这是否非常准确。

stun:stun.l.google.com:19302 的公共google stun URL也无效,因此我认为STUN规范可能已更改。
我的第二问题:STUN规范是否已更改,或者我选择的是错误的?

然后我有一个第三问题:
通过使用预共享的代码或ID,我还能够使用Web套接字在2个不同的客户端之间进行通信。
我想知道是否可以使用此Web套接字连接来启动WebRTC连接,而不必使用或依赖STUN。我已经在通过WebSocket连接共享报价和答案,但是现在这些都在等待ICE候选人。

第四个问题是:
在设置RTCPeerConnection时,有什么方法可以调试为什么我的STUN响应不起作用(即创建ICE候选对象)?

如果重要的话,我的STUN服务器是使用UdpClient类使用.Net构建的。

谢谢。

更新:2020年3月20日
如上所述,当我使用Google STUN服务器时,我设法使我的应用正常工作。
好像我没有在客户端添加ice候选对象。
但是在使用我自己的STUN服务器时仍然无法使所有功能正常工作。
我还通过将STUN服务器托管在公共域上进行了测试,因此请求必须通过Internet进行,但仍然无法正常运行。
我的房东收到了冰候选人,但没有收到 null 候选人。

更新:2020年3月21日
所以我弄清楚了它为什么开始起作用。
RTCPeerConnection中的 iceTransportPolicy 值设置为 relay 。删除此文件后,即使在我的公共站点上,该文件也能正常工作。
但是现在对我自己的STUN服务器的请求将被忽略。

当iceTransportPolicy为“中继”时,谷歌眩晕URL也不再起作用,而不仅仅是我的STUN服务器。

通过监视Wireshk流量,我可以在回送流量捕获中看到STUN请求,其中显示了2个有趣的东西:

  1. STUN请求不会发送到互联网。
  2. 我还注意到STUN请求中的用户名属性。

但是根据STUN规范,STUN无法使用用户名,那么浏览器如何实现呢?

更新2:2020年3月21日
我发现我的STUN响应不正确,它返回了绑定指示响应。
我已经修复它以返回绑定成功响应。
但是,它仍然不起作用。
我设法查看了Chrome日志,看来我所有的ICE候选人都被忽略了,以下是我在日志中看到的原因:

  1. 由于不匹配过滤器而将其丢弃。
  2. AllocationSequence:中继端口已禁用,正在跳过。

所以我认为这会使范围进一步缩小。
也许我需要启用Chrome中的某些功能?
还是我还想念什么?

0 个答案:

没有答案