Chrome WebRTC DataChannels:即使使用 STUN,ICE-TCP 服务器反射候选也丢失

2024-01-31

我正在建造(又一个)通过 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(使用前将#替换为@)

Chrome WebRTC DataChannels:即使使用 STUN,ICE-TCP 服务器反射候选也丢失 的相关文章

  • Nodejs TCP连接客户端端口分配

    我使用nodejs在客户端和服务器之间创建了tcp连接 网络模块 https nodejs org api net html 服务器正在侦听已经预定义的端口 并且客户端正在连接到该端口 据我了解客户端的端口是由节点动态分配的 那是对的吗 节
  • TCP 代理:在后端不可用时保持连接

    在 Docker 设置的上下文中 我想使用类似大使的模式来允许某些容器 例如数据库服务器 正常重新启动 而不必重新启动所有依赖的容器 例如 Web 服务器 并且没有错误消息 因为 数据库服务器不可用 因此 我想知道 是否有一个 TCP 代理
  • 为什么在数据包输入时 skb_buffer 需要跳过 20 个字节才能读取传输缓冲区?

    我正在 Linux 中编写一个网络模块 我发现只有在从 skb 缓冲区跳过 20 个字节后才能提取 tcp 标头 即使 API 是 skb transport header 其背后的原因是什么 有人可以详细解释一下吗 传出数据包不需要同样的
  • 为什么我无法发送这个IP数据包?

    我正在尝试使用 C 发送 IP 数据包 destAddress IPAddress Parse 192 168 0 198 destPort 80 Create a raw socket to send this packet rawSoc
  • 通过 TCP 客户端套接字接收数据时出现问题

    我正在尝试用 C 语言编写一个 TCP 客户端程序 客户端将在其中启动 连接到服务器 然后它会发送一些信息 然后监听它收到的信息并做出相应的反应 我遇到麻烦的部分是持续聆听 这是我所拥有的 while 1 numbytes recv soc
  • WebRTC 局域网内是否需要 STUN 服务器?

    我使用Webrtc开发了一个p2p视频聊天 我知道需要 STUN 或 TURN 服务器来识别 NAT 后面的公共 IP 目前正在使用 Google 的 STUN 服务器 我的应用程序安装在连接到 LAN 的服务器上 但无法访问互联网 我是否
  • 查找网络中的所有IP地址

    我正在尝试用 C 来做这个 我需要找到我的网络中所有活动的 IP 地址并将它们显示在列表中 我可以 ping 网络中所有可用的 1 255 IP 地址 但我想让这个过程更快 此代码在大约 1 秒内扫描我的网络 255 个 D 级段 我在 V
  • 是否可以通过 TCP 连接到正在侦听 3G 网络端口的 iPhone?

    我正在开发一个严重依赖 P2P 的应用程序 但我目前没有任何 SIM 卡可供实验 因此我正在 wifi 网络上进行测试 我想知道 3G 网络上的 iPhone 是否可以连接以及是否需要穿越 NAT 设备 您位于提供商的路由器后面 您的 IP
  • syn队列和accept队列的混淆

    在阅读TCP源码时 我发现一个困惑的事情 我知道 TCP 在 3 次握手中有两个队列 第一个队列存储服务器收到的连接SYN并发回ACK SYN 我们称之为同步队列 第二个队列存储3WHS成功并建立连接的连接 我们称之为接受队列 但在阅读代码
  • Scapy 不需要的 RST TCP 数据包

    为了理解TCP是如何工作的 我尝试伪造自己的TCP SYN SYN ACK ACK 基于教程 http www thice nl creating ack get packets with scapy http www thice nl c
  • WebRTC:强制对等点使用 TURN 服务器

    我有一个 webrtc 应用程序 它工作正常 但出于测试目的 我需要测试我的 TURN 服务器是否工作 但因为两个测试设备都在同一网络内 所以我无法测试 认为下面的代码会限制候选人仅那些使用 TURN 服务器的 function onIce
  • 是否可以通过互联网在两个移动设备 (iPhone) 之间连接套接字?

    是否可以通过互联网在两个移动设备 iPhone 之间连接套接字 我正在尝试发现每个设备的IP并直接连接 我知道可以使用 Bonjour 来完成 但这只适用于本地网络 我需要通过互联网在两个设备之间建立高速连接 Thanks 如果你有两个 I
  • 如何模拟 TCP/IP 错误?

    在多层应用程序上 我需要模拟各种 TCP IP 错误来测试一些重新连接代码 有谁知道我可以使用什么工具 基于 Windows 来实现此目的 谢谢 Scapy http secdev org projects scapy 允许您控制数据包的各
  • 为什么我们可以将 sockaddr 转换为 sockaddr_in

    我明白为什么强制转换很有用sockaddr to sockaddr in 但我不明白这怎么可能 据我所知 它们的大小相同sockaddr in添加了sin zero使其大小相同 我想知道编译器如何知道从哪里获取信息sockaddr in如果
  • React Native - 在 Android 中显示传入视频通话屏幕(VOIP 应用程序)[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试实施视频通话React Native 应用程序中的功能 我用过React 原生 twilio 视频 webrtc https
  • 两个http请求可以合并在一起吗?如果可以的话,nodeJS服务器如何处理呢?

    昨天我做了一些关于 NodeJS 的演讲 有人问我以下问题 我们知道nodeJS是一个单线程服务器 多个请求是 到达服务器并将所有请求推送到事件循环 如果什么 两个请求同时到达服务器 服务器将如何处理 处理这种情况 我猜到了一个想法并回复如
  • AMQP如何克服直接使用TCP的困难?

    AMQP如何克服直接使用TCP发送消息时的困难 或者更具体地说 在发布 订阅场景中 在 AMQP 中 有一个代理 该代理接收消息 然后完成将消息路由到交换器和队列的困难部分 您还可以设置持久队列 即使客户端断开连接 也可以为客户端保存消息
  • 为什么turn服务器不支持tcp连接?

    我是 WebRTC 新手 我需要为我的 webrtc 应用程序配置我自己的 Turn 服务器 我使用以下命令安装了我的转弯服务器 apt get install coturn 我只需要通过 tcp 运行转变服务器 它不必使用 UDP 进行任
  • webrtc - 视频出现斑点,但它仍然是黑色的

    我使用 chrome 21 运行我的 webrtc 代码 如果我在同一个 chrome 中打开两个选项卡 然后打开其中包含 webrtc 代码的页面 一个选项卡用于发送视频流 一个选项卡用于接收视频流 效果很好 但是 如果我使用两种隐身模式
  • 无法分配请求的地址 - 可能的原因?

    我有一个由主服务器和分布式从服务器组成的程序 从属服务器向服务器发送状态更新 如果服务器在固定时间内没有收到特定从属服务器的消息 则会将该从属服务器标记为关闭 这种情况一直在发生 通过检查日志 我发现从站只能向服务器发送一个状态更新 然后永

随机推荐