- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在 build (又一个)manual signalling WebRTC chat via DataChannels (CoffeeScript,对不起 JS 伙计们)。它在本地连接中工作正常,但在 NAT 后面的互联网上却不行(不幸的是我还不能尝试 NATless)。
我不想维护 TURN 服务器,但如果只有一个对等点必须可从 Internet 公开访问才能使设置正常工作,我也没问题。由于我是唯一拥有可访问机器的人,因此我们需要我来主持 TCP 连接。在 Firefox 中没有报告 TCP 候选者,所以我猜 ICE-TCP 还不被支持。
在 Chrome 上,查看 SDP 提议/答案,STUN 服务器正确识别了两个对等方的公共(public) IP 并添加了每个服务器自反 UDP 候选者(参见下面的第 10 行)但没有 TCP server reflexive candidate ,所以连接永远不会成功。还包括一个 TCP 候选者(请参阅下面的第 9 行),但它只是一个主机候选者。
这是一个示例 SDP 报价(我的公共(public) 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 转发到的默认主机)。
最佳答案
首先,STUN 可以根据new RFC 支持NAT 上的TCP。并提出了 updates for said RFC for DTLS .尽管如此,Chrome 仍应支持 SCTP over TCP 和 Firefox still does not according to bug 891551 .
我也非常怀疑 MEDIA 是否会支持 TCP 连接,并怀疑任何 TCP 连接(中继或非中继)都只支持 SCTP。
[注意:为了历史起见,我保留了其余的答案,但很好 comment made by @adamfisk , 给我看了一些勘误表。]
STUN
CANNOT 通过 NAT
使用 TCP
。
它的 RFC在申请声明中说了这么多。 Stun 仅设计用于 UDP
。这就是为什么 SCTP
需要建立在 UDP
之上,以便您可以绕过 NAT
。 (只有 Chrome 提供了 TCP
的内部选项)。
如果您想让 TCP
流量通过它,但 STUN
不会,您必须在其中一个 NAT
上设置端口转发帮助你。
对不起坏消息:(
编辑:这只是 STUN 的限制,而不是 SCTP 的限制(因此 chrome 如果愿意的话也无能为力)。无论如何,FireFox 都不支持 SCTP over TCP。我不是 100% 的 TURN。 RFC好像说TCP只支持客户端和服务器之间的通信,而不是实际的中继。 Check this out , Chrome 可以通过 TURN 服务器与 TCP 一起工作,正如 T. R. Missner 在帖子底部所说的那样。
如果您想将 TCP 与 RTCDataConnection 一起使用,您可能必须在两端都设置端口转发。
关于tcp - Chrome WebRTC 数据通道 : ICE-TCP server reflexive candidates missing even with STUN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23434753/
一 点睛 通道用于数据的双向传输,即一个通道既可以用于读数据,又可以用于写数据。注意,这点不同于 I/O 中的 Stream,Stream 是单向的(只能是输入流或输出流)。 在 NIO 中,就是使用
一 点睛 通道用于数据的双向传输,即一个通道既可以用于读数据,又可以用于写数据。注意,这点不同于 I/O 中的 Stream,Stream 是单向的(只能是输入流或输出流)。 在 NIO 中,就是使用
我是一名优秀的程序员,十分优秀!