为 WebRTC PeerConnections 强制 TCP

Posted

技术标签:

【中文标题】为 WebRTC PeerConnections 强制 TCP【英文标题】:Force TCP for WebRTC PeerConnections 【发布时间】:2016-05-05 21:34:46 【问题描述】:

是否可以强制与 WebRTC 建立 TCP 隧道 (TLS) 连接?

我们正在为我们的业务开发 WebRTC 应用程序,但我们遇到了一些由内部网络引起的传入 UDP 流的主要问题。我们已经在使用 TURN 服务器,并且我们正在获得一堆 ICE 候选者(甚至是中继 UDP 者)。

问题是,正如我上面所说,我们传入的 UDP 流量在这里工作不可靠(卡顿、非常糟糕的图像质量、非常低的 fps)。给浏览器一个印象就足够了,WebRTC 可以将它用于它的 PeerConnection(s),但实际结果在 UDP 上非常糟糕。

如果我阻止所有传出和传入的 UDP 流,我可以看到(在 Wireshark 中)WebRTC 通过使用我们的转向服务器回退到 TCP 流量。

通过 TCP 连接,我们获得了非常好的结果(帧速率高,图像质量非常好)。

我已经尝试了几种强制 TCP 的方法:

    我删除了 m=video 行中的 UDP 部分

    m=视频 TLS/RTP/SAVPF 100 116 117 96

    我已从候选列表中排除了每个 UDP 候选

在每种情况下,我什至都无法建立连接。

我可以做些什么来强制 WebRTC 中的 TCP 还是我们真的完全依赖浏览器?

【问题讨论】:

【参考方案1】:

使用 TURN/TCP 服务器配置 peerconnection 并将 iceTransports 约束设置为中继。见http://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/ 请注意,质量通常比 UDP 差。

浏览器到浏览器的连接不支持 ICE-TCP。仅当您拥有 SFU/MCU/网关时。

【讨论】:

我就是这么做的。 IceTransportPolicy 设置为 'relay' 并且转弯服务器地址以 ?transport=tcp 结尾。我得到的唯一候选人是“UDP中继”。我也测试了其他(公共转向服务器) - 结果相同。你在涓涓冰示例中获得 TCP 中继候选者吗? 这些候选项中的“udp”表示转向服务器已在中继地址打开了一个 udp 端口​​。从客户端到 TURN 服务器的连接应该仍然是 TCP。您应该在“优先级”字段中看到:1 | 30 | 255 1 表示您正在使用 TCP 作为 TURN 的传输。或者您可以使用wireshark 来验证这一点。 我可以确认,如果候选人包含 udp,则会建立 tcp 连接。您也可以使用 nettop 来验证这一点。【参考方案2】:

由于不支持 ICE-TCP,您无法获得 TCP 中继候选,但对于 RFC-5766,客户端和 TURN 服务器之间的 TCP 控制连接有一个备用机制。这需要支持这种回退机制的 TCP TURN 服务器,根据这种机制,客户端将使用 TCP 传输协议与 TURN 服务器连接,并且作为分配请求的一部分,它将请求 UDP 候选者,因此通道类似于 TCP-UDP。因此,如果对等方做同样的事情并且您强制发生 Relay-Relay 连接,那么两个客户端都将使用 TCP 连接到 TURN 服务器。如果 UDP 和 TCP TURN 服务器均未配置但 TLS 已配置,该回退机制也支持 TLS 连接。

【讨论】:

根据this answer,是否支持ICE-TCP?

以上是关于为 WebRTC PeerConnections 强制 TCP的主要内容,如果未能解决你的问题,请参考以下文章

001 WebRTC

001 WebRTC

为 iOS 构建 webrtc 库时出错

WebRTC 也不是为 Windows 构建的

为WebRTC 应用部署Turn Server

为 webRTC 使用特定端口