Chrome WebRTC数据通道:ICE-TCP服务器自反候选者丢失,即使被击晕

Chrome WebRTC数据通道:ICE-TCP服务器自反候选者丢失,即使被击晕,tcp,webrtc,stun,candidate,Tcp,Webrtc,Stun,Candidate,我正在建立(另一个)(咖啡脚本,对不起,伙计们)。它可以在本地连接中正常工作,但不能在NAT后面通过internet(不幸的是,我还不能尝试NATless) 我不想维护TURN服务器,但如果只有一个对等服务器必须可以从internet公开访问,安装才能正常工作,我就可以了。因为我是唯一一个拥有可访问机器的人,所以我们需要我主持一个TCP连接。在Firefox中没有报告TCP候选,所以我猜ICE-TCP还不受支持 在Chrome上,查看SDP提供/回答,STUN服务器正确识别了对等方的公共IP,并

我正在建立(另一个)(咖啡脚本,对不起,伙计们)。它可以在本地连接中正常工作,但不能在NAT后面通过internet(不幸的是,我还不能尝试NATless)

我不想维护TURN服务器,但如果只有一个对等服务器必须可以从internet公开访问,安装才能正常工作,我就可以了。因为我是唯一一个拥有可访问机器的人,所以我们需要我主持一个TCP连接。在Firefox中没有报告TCP候选,所以我猜ICE-TCP还不受支持

在Chrome上,查看SDP提供/回答,STUN服务器正确识别了对等方的公共IP,并添加了每个服务器自反UDP候选(见下面第10行),但没有,因此连接从未成功。还包括一个TCP候选(请参见下面的第9行),但它只是一个主机候选

以下是SDP报价示例(我的公共IP为88.88.88.88):

我确信互联网可以通过NAT到达我的机器,端口转发也可以(我的机器是NAT转发到的默认主机)

  • 为什么在我的报价/答案中没有报告TCP服务器自反候选人
  • Chrome是否缺少服务器自反ICE-TCP候选发现
  • 根据STUN服务器报告的公共IP,是否可以手动添加服务器自反候选

首先,STUN可以根据建议的和通过NAT支持TCP。综上所述,Chrome仍然应该通过TCP和IP支持SCTP

我还高度怀疑媒体是否会支持TCP连接,并怀疑任何TCP连接(中继或不中继)都只支持SCTP

[注:出于历史原因,我保留了我的答案的其余部分,但是一个很好的例子给了我一些勘误表。]


原始答案
STUN
无法通过
NAT
使用
TCP

它在应用程序声明中也说明了这一点。Stun仅设计用于使用
UDP
。这就是为什么
SCTP
需要建立在
UDP
之上,这样您就可以绕过
NATs
。(只有Chrome提供内部选项
TCP

如果希望
TCP
流量通过
nat,则必须在其中一个
nat
上设置端口转发,但
STUN
对您没有帮助

对坏消息感到抱歉:(

编辑:这只是眩晕的限制,而不是SCTP的限制(因此,如果chrome愿意的话,他们对此无能为力).FireFox无论如何都不支持TCP上的SCTP。我不是100%开启。似乎说TCP只支持客户端和服务器之间的通信,而不是实际的中继。Chrome可能通过T.R.Missner在线程底部所述的TURN服务器与TCP一起工作


如果要将TCP与RTCDataConnection一起使用,您可能必须在两侧设置端口转发。

因此,两个对等方都需要端口转发NAT?太糟糕了,我认为可以使用TCP在幕后绕过这个问题,使用经典的方法,即端口转发主机充当TCP服务器,以便另一个对等方可以连接到他。看起来很奇怪,这不是STUN提供的选项之一!是的,
STUN不处理TCP,无论是传入的还是传出的
。太糟糕了,因为一个TCP服务器就足够了。当然ICE仍然可以工作,但如果没有外部IP候选和STUN不提供TCP支持,这几乎是没有用的。根据我得到的TCP候选g是主机候选(5.1)。当已经使用UDP时,5.4似乎是多余的,但为什么服务器自反候选(5.2)不工作?我想5.3甚至没有在Chrome中实现(尽管我的NAT启用了UPnP),但5.2看起来与我需要的完全一样,具有公共IP发现的TCP候选。在第5.2节的底部有一个有趣的注释:
一个广泛使用的获取服务器自反候选的协议是STUN
@DuckTyped是的,ICE可能支持TCP,但由于您仅使用STUN服务器,因此只能获取external UDP候选。Chrome的ICE协商受到您提供的服务器的限制。主要问题可能是您正在使用的服务器,因为它们似乎只是公共服务器,它们可能没有那么复杂,并且支持所有内容。首先,您引用的是一个旧的STUN RFC。当前的一个是:您将看到STUN证书ainly确实支持TCP,并且用于ICE-TCP。ICE-TCP本身只能在比UDP更少的情况下工作,因此可靠性要低得多。这可能就是为什么它没有在WebRTC中实现,而且可能永远不会实现的原因。
01. v=0
02. o=- 7452583715680269460 2 IN IP4 127.0.0.1
03. s=-
04. t=0 0
05. a=msid-semantic: WMS
06. m=application 50816 DTLS/SCTP 5000
07. c=IN IP4 88.88.88.88
08. a=candidate:864190085 1 udp 2122194687 10.10.10.4 50816 typ host generation 0
09. a=candidate:2097250933 1 tcp 1518214911 10.10.10.4 0 typ host generation 0
10. a=candidate:3500406889 1 udp 1685987071 88.88.88.88 50816 typ srflx raddr 10.10.10.4 rport 50816 generation 0
11. a=ice-ufrag:2066nM5kqwFDQMBT
12. a=ice-pwd:thO7oP0H+H1VBHFNfT8SLFiI
13. a=ice-options:google-ice
14. a=fingerprint:sha-256 72:87:BF:AD:03:9C:09:A7:58:0C:3A:DF:.....:B7
15. a=setup:actpass
16. a=mid:data
17. a=sctpmap:5000 webrtc-datachannel 1024