Chrome WebRTC DataChannels:即使使用 STUN,ICE-TCP 服务器反身候选者也会丢失
Posted
技术标签:
【中文标题】Chrome WebRTC DataChannels:即使使用 STUN,ICE-TCP 服务器反身候选者也会丢失【英文标题】:Chrome WebRTC DataChannels: ICE-TCP server reflexive candidates missing even with STUN 【发布时间】:2014-06-19 12:40:48 【问题描述】:我正在构建(又一个)manual signalling WebRTC chat via DataChannels(CoffeeScript,对不起 JS 伙计们)。它在本地连接中可以正常工作,但不能通过 NAT 后面的 Internet(不幸的是我还不能尝试 NATless)。
我不想维护 TURN 服务器,但如果只有一个对等方必须可从 Internet 公开访问才能使设置正常工作,那我很好。由于我是唯一拥有可访问机器的人,因此我们需要我托管 TCP 连接。在 Firefox 中没有报告 TCP 候选,所以我猜 ICE-TCP 还不支持。
在 Chrome 上,查看 SDP 提供/答案,STUN 服务器正确识别了两个对等方的公共 IP 并添加了每个服务器自反 UDP 候选(见下面的第 10 行)但没有TCP server reflexive candidate,因此连接永远不会成功。还包括一个 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 的情况下,是否可以手动添加服务器自反候选?【问题讨论】:
【参考方案1】:首先,STUN 可以根据new RFC 和建议的updates for said RFC for DTLS 支持基于 NAT 的 TCP。综上所述,Chrome 应该仍然支持 SCTP over TCP 和Firefox still does not according to bug 891551。
我也非常怀疑 MEDIA 是否会支持 TCP 连接,并且怀疑任何 TCP 连接(中继或不中继)都只支持 SCTP。
[注意:出于历史原因,我将保留我的其余答案不变,但一个很好的comment made by @adamfisk,向我展示了一些勘误表。]
原答案
STUN
不能通过NAT
使用TCP
。
它的RFC 在应用程序声明中说了很多。 Stun 仅适用于 UDP
。这就是为什么SCTP
需要建立在UDP
之上,这样你就可以绕过NATs
。 (只有 Chrome 提供了 TCP
的内部选项。
如果您希望TCP
流量通过它,您必须在NATs
之一上设置端口转发,但STUN
不会帮助您。
很抱歉坏消息:(
编辑:这只是 STUN 的限制,而不是 SCTP 的限制(因此,如果他们愿意,chrome 无能为力)。 FireFox 无论如何都不支持 SCTP over TCP。我不是 100% 的 TURN。 RFC 似乎说 TCP 仅支持客户端和服务器之间的通信,而不是实际的中继。 Check this out,Chrome 可以通过 TURN 服务器与 TCP 一起工作,T.R. Missner 在线程底部指出。
如果您想将 TCP 与 RTCDataConnection 一起使用,您可能必须在双方都设置端口转发。
【讨论】:
那么两个对等点都需要端口转发的 NAT?太糟糕了,我认为 TCP 可以用来规避幕后的问题,经典方法是端口转发的主机充当 TCP 服务器,以便其他对等方可以连接到他。看起来很奇怪,它不是 STUN 提供的选项之一! 是的,STUN does not address TCP, either incoming or outgoing
。太糟糕了,因为单个 TCP 服务器就足够了。当然 ICE 仍然可以工作,但如果没有外部 IP 候选者和 STUN 不提供 TCP 支持,它几乎没用。
根据tools.ietf.org/html/draft-ietf-mmusic-ice-tcp-16#section-5,我得到的 TCP 候选是主机候选 (5.1)。已经使用 UDP 时,5.4 似乎是多余的,但为什么 Server Reflexive Candidates (5.2) 不起作用?我猜 5.3 甚至没有在 Chrome 中实现(尽管我的 NAT 启用了 UPnP),但 5.2 看起来完全符合我的需要,具有公共 IP 发现的 TCP 候选。在第 5.2 节的底部有一个有趣的注释:A widely used protocol for obtaining server reflexive candidates is STUN
。
@DuckTyped 是的,ICE 可能支持 TCP,但由于您只使用 STUN 服务器,因此您只能获得外部 UDP 候选者。 Chrome 的 ICE 协商受限于您提供的服务器。主要问题可能是您正在使用的服务器,因为它们似乎只是公共服务器,它们很可能并不那么复杂并且支持一切。
首先,您引用的是旧的 STUN RFC。当前是:tools.ietf.org/html/rfc5389 你会看到 STUN 确实支持 TCP,它用于 ICE-TCP。 ICE-TCP 本身只能在比 UDP 更小的情况下工作,但是,它的可靠性要低得多。这可能是它没有在 WebRTC 中实现的原因,而且它可能永远不会实现。以上是关于Chrome WebRTC DataChannels:即使使用 STUN,ICE-TCP 服务器反身候选者也会丢失的主要内容,如果未能解决你的问题,请参考以下文章
WebRTC[51] - 如何获取Chrome浏览器底层的WebRTC日志