我正在建造(又一个)通过 DataChannels 手动发送 WebRTC 聊天信号 http://jsfiddle.net/UYxL3/81/(CoffeeScript,对不起 JS 们)。它在本地连接中工作正常,但不能在 NAT 后面的互联网上工作(不幸的是我还无法尝试 NATless)。
我不想维护 TURN 服务器,但如果只有一个对等点必须可通过互联网公开访问才能使设置正常工作,我也可以接受。由于我是唯一拥有可访问计算机的人,因此我们需要我来托管 TCP 连接。在 Firefox 中,没有报告候选 TCP,所以我猜 ICE-TCP 尚未得到支持。
在 Chrome 上,查看 SDP 提供/答案,STUN 服务器正确识别了两个对等方的公共 IP,并添加了每个服务器反射 UDP 候选(参见下面第 10 行),但没有TCP 服务器自反候选 https://datatracker.ietf.org/doc/html/draft-ietf-mmusic-ice-tcp-16#section-5,所以连接永远不会成功。还包括一个 TCP 候选者(参见下面第 9 行),但它只是一个主机候选者。
以下是 SDP 报价示例(我的公共 IP 是 88.88.88.88):
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
我确信互联网可以通过 NAT 到达我的机器,并且端口转发没问题(我的机器是 NAT 转发的默认主机)。
- 为什么我的报价/答案中没有报告 TCP 服务器自反候选?
- Chrome 是否缺乏服务器反射性 ICE-TCP 候选发现?
- 是否可以根据 STUN 服务器报告的公共 IP 手动添加服务器自反候选者?
首先,STUN 可以根据以下规则支持基于 NAT 的 TCPnew RFC https://www.rfc-editor.org/rfc/rfc5389#section-7.2.2并与提议的上述 DTLS RFC 的更新 https://www.rfc-editor.org/rfc/rfc7350。尽管如此,Chrome 仍应支持基于 TCP 的 SCTP,并且根据 bug 891551,Firefox 仍然不支持 https://bugzilla.mozilla.org/show_bug.cgi?id=891551.
我也非常怀疑 MEDIA 是否会支持 TCP 连接,并怀疑任何 TCP 连接(中继或非中继)都只支持 SCTP。
[注:为了历史的缘故,我将保留我的答案的其余部分不变,但一个很好的@adamfisk 发表的评论 https://stackoverflow.com/questions/23434753/chrome-webrtc-datachannels-ice-tcp-server-reflexive-candidates-missing-even-wit#comment42609362_23435637,给我看了一些勘误表。]
原答案
STUN
CANNOT与...一起工作TCP
over a NAT
.
Its RFC http://www.ietf.org/rfc/rfc3489.txt申请声明中也说了同样的内容。 Stun 的设计目的只是为了与UDP
。这就是为什么SCTP
需要建立在UDP
这样你就可以四处走动NATs
。 (只有 Chrome 提供内部选项TCP
).
您必须在其中一台上设置端口转发NATs
如果你想TCP
交通要经过它但是STUN
不会帮助你的。
关于这些坏消息我很遗憾 :(
编辑:这只是 STUN 的限制,而不是 SCTP 的限制(因此如果 Chrome 愿意的话,他们对此无能为力)。无论如何,FireFox 不支持基于 TCP 的 SCTP。我并不是 100% 相信 TURN。这RFC https://www.rfc-editor.org/rfc/rfc5766似乎说TCP仅在客户端和服务器之间的通信中支持,而不是实际的中继。看一下这个 https://groups.google.com/forum/#!topic/turn-server-project-rfc5766-turn-server/vR_2OAV9a_w,Chrome 可以通过 TURN 服务器使用 TCP,正如 T. R. Missner 在线程底部所说的那样。
如果您想将 TCP 与 RTCDataConnection 结合使用,则可能必须在两端都设置端口转发。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)