Windows Server 2012 R2 中缺少 srflx ice 候选者

Missing srflx ice candidate in Windows Server 2012 R2

我在使用 webrtc 应用程序时遇到问题,该应用程序在我测试的所有 PC 上运行良好,甚至是虚拟机,但它在 Windows Server 2012 R2 上无法运行。我追踪到服务器上缺少服务器反射 (srflx) 候选者。

使用这段测试代码(运行 它在 chrome 开发控制台上):

var rtc = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
var r = new rtc({ iceServers: [{ urls: "stun:stun.l.google.com:19302" }] }, {});
r.onicecandidate = function (a) { console.log('candidate:', JSON.stringify(a.candidate)); };
r.onicecandidateerror = function(a) { console.log('error:', a); }
r.createDataChannel("");
r.createOffer().then(x);

function x(a) {
    r.setLocalDescription(a, function () {}, function () {});
}

在我的电脑上,显示如下:

candidate: {"candidate":"candidate:1221703924 1 udp 2113937151 a044b6a7-4d08-XXXX-XXXX-bc858326ac0f.local 59233 typ host generation 0 ufrag IYpO network-cost 999","sdpMid":"0","sdpMLineIndex":0}
candidate: {"candidate":"candidate:842163049 1 udp 1677729535 111.222.333.444 59233 typ srflx raddr 0.0.0.0 rport 0 generation 0 ufrag IYpO network-cost 999","sdpMid":"0","sdpMLineIndex":0}
candidate: null

但在服务器上它看起来像这样:

candidate: {"candidate":"candidate:3704228534 1 udp 2113937151 e277d76d-XXXX-XXXX-9471-3461192326ad.local 50857 typ host generation 0 ufrag WWDW network-cost 999","sdpMid":"0","sdpMLineIndex":0}
candidate: null

什么可能导致 srflx 候选人丢失?使用带有凭据而不是 stun 的转弯服务器可以做同样的事情。还尝试关闭 windows 防火墙。

这通常意味着 UDP 在该机器上被阻止(onicecandidateerror 回调可能提供更多信息)。

https://bloggeek.me/turn-public-ip-address/ 很好地总结了为什么除了 TURN/UDP.

还需要 TURN/TCP 和 TURN/TLS

这里也是一样。您的问题可能是 udp 通信被阻止,但我的问题来自 运行 本地 STUN 服务器,中间没有 NAT。无意义的主机候选通过 MDNS 解析。由于它与 srflx 候选者的 ip 相匹配,因此被丢弃。如果你在本地网络上,无法解析 MDNS,你需要一个中继,这是垃圾。我的私人 IP 地址是 10.43.212.107。全世界都可以拥有。我不给会飞的猴子屁股。 MDNS 是垃圾!

5.1.3。消除多余的候选人

接下来,ICE 代理(发起和响应)消除冗余 考生。两个候选人可以有相同的运输地址呢 不同的基地,这些不会被认为是多余的。 通常,server-reflexive 候选人和主持人候选人将是 当代理不在 NAT 后面时是冗余的。候选人是 冗余当且仅当其传输地址和基址等于那些 另一位候选人。代理应该消除冗余 优先级较低的候选人。