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

C# 我对STUN和WebRTC的理解正确吗?,c#,webrtc,stun,C#,Webrtc,Stun,我正在尝试构建一个web应用程序/网站,利用WebRTC允许用户彼此聊天 当我在没有任何参数的情况下初始化一个新的RTPeerConnection时,我成功地使它工作。我假设浏览器会自动选择一些STUN服务器来使用 但这只适用于我的本地网络,而不适用于我在公共域(例如example.com)上托管网站的情况 这让我尝试使用我自己的眩晕服务器 因此,现在我使用服务器的IP地址初始化RTPeerConnection,并接收STUN请求 我正在使用该规范构建STUN服务器 据我所知,我应该用我收到请求

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

当我在没有任何参数的情况下初始化一个新的RTPeerConnection时,我成功地使它工作。我假设浏览器会自动选择一些STUN服务器来使用

但这只适用于我的本地网络,而不适用于我在公共域(例如example.com)上托管网站的情况

这让我尝试使用我自己的眩晕服务器

因此,现在我使用服务器的IP地址初始化RTPeerConnection,并接收STUN请求

我正在使用该规范构建STUN服务器

据我所知,我应该用我收到请求的Ip地址和端口回复STUN请求

这是我的第一个问题,我应该用其他客户端的IP地址响应不同的STUN请求,还是这样做正确

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

我还用特技演员测试了我的特技服务器,它也显示了成功,但我不太确定这是否准确

stun:stun.l.google.com:19302的公共google stun URL也不起作用,所以我想可能stun规范已经改变了。
我的第二个问题:晕眩规格是否改变了,或者我是否遵循了错误的规格

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

第四个问题是:
设置RTPeerConnection时,是否有任何方法可以调试我的STUN响应不起作用(即创建ICE候选)的原因

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

提前谢谢

更新日期:2020年3月20日 如前所述,在使用google STUN服务器时,我成功地使我的应用程序正常工作。
看起来我没有在客户端添加ice候选对象。
但在使用我自己的STUN服务器时,仍然无法使其全部正常工作。
我还通过将我的STUN服务器托管在公共域上进行了测试,因此请求必须通过internet进行,但仍然无法工作。
我的主机接收ice候选项,但不接收null候选项

更新日期:2020年3月21日 所以我找到了它开始工作的原因。
RTPeerConnection中的iceTransportPolicy值被设置为中继。删除此选项后,即使在我的公共域网站上,也能完全正常工作。
但是现在对我自己的STUN服务器的请求被忽略了

当iceTransportPolicy为“中继”时,google stun URL也不再工作,不仅仅是我的stun服务器

通过监视wireshark流量,我可以在环回流量捕获中看到STUN请求,这显示了两个有趣的事情:

  • 眩晕请求不会发送到互联网
  • 我还注意到STUN请求中有一个username属性
  • 但是根据STUN规范,使用STUN不可能使用用户名,那么浏览器是如何实现这一点的呢

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

  • 丢弃候选项,因为它与筛选器不匹配
  • 分配顺序:中继端口已禁用,正在跳过
  • 因此,我认为这会缩小范围。
    也许我需要在Chrome中启用某些功能?

    或者我还遗漏了什么?

    Stunt server放在一边,您的公共服务器测试url是否使用SSL?我真的无法回答你的问题,但当你说它适用于
    localhost
    但不适用于web时,我突然想到了这一点。我曾经深入网络/NAT/stunrabbit漏洞,结果发现浏览器对某些WebRTC内容需要https。该网站在web上使用https,但不在本地主机上。我研究了UDP over SSL/TLS,但在.net中似乎没有任何本机的内容,所以我现在就不谈了。我一直在关注node.js开源项目,主要是为了代码示例和想法,我不记得看到过任何与http/s相关的东西。我会看得更详细,实际上可能就是这样,你永远不知道。如果两个对等方在LAN中,则不需要STUN服务器,因为webrtc库可以通过网络接口找到ip地址。当您在公共域上托管时,什么不起作用?非LAN用例需要STUN,但这不能解决整个问题,还需要TURN server。当我在公共域上指定STUN URL时,即使我使用google的STUN URL,onicecandidate事件也不会触发。为什么你说我还需要一个TURN服务器?确保你使用了Firefox的测试工具。使用chrome时,我也得到701。把昏迷服务器放在一边,你的公共服务器是测试你的吗