javascript - 为什么 WebRTC 有时会使用 TURN?
问题描述
我编写了一个小型 WebRTC 演示,它将视频文件流式传输到另一个对等点,并且一切正常(这是一个真正的 P2P 连接,不使用 TURN 服务器),除了这个:
一个客户端通过移动网络连接,一个通过 wifi 连接。当移动客户端创建报价并来回启动 ICE 候选人时,他们会选择 srflx 候选人并创建真正的 P2P 连接。
但是当 wifi-client 创建 offer 时,它们会退回到 TURN 服务器作为中继。
这发生在 Ubuntu 上的 Firefox 和 Chromium 中。
- 这种行为是否指向我的代码中的一个明显问题?
- 如果不是,这怎么可能?无论哪个客户端是控制器,ICE 协议不应该产生相同的两个候选者吗?
解决方案
如果两个 WebRTC 代理之间的连接成功,NAT 有两个属性影响。这些属性是filtering
和mapping
。
当您将数据包发送到 NAT 之外的地址时,您会创建一个mapping
. 映射是你的IP:Port
,人们通常称之为你的Public IP
。这是Public IP
其他人可以发送的。STUN 服务器只是一个响应您的映射的回显服务器。
第一种映射类型是Address Independent
NAT。这是你想要的。mapping
在此配置中,您每次联系 NAT 外的 IP时都会重复使用。您可以将您的信息分mapping
发给远程同行,他们可以发送给您。
第二种映射类型是Address Dependent
. 在此配置中,您mapping
为每个远程地址创建一个新地址。这意味着您从 STUN 服务器返回的 IP/端口不能被其他对等方使用。在这种情况下,您可能必须使用 TURN 服务器。
filtering
控制谁被允许发送。一些 NAT 允许任何人发送流量。类似的mapping
行为称为Address Independent
. 其他 NAT 仅允许某人发送您尝试联系的流量,称为Address Dependent
NAT。
查看WebRTC 的 Curious's Connecting Chapter我试图更深入地解释这一点。Pion 还有一个工具stun-nat-behavior可以像这样打印出 NAT 的详细信息。
connecting to STUN server: stun.voip.blackberry.com:3478
=> NAT mapping behavior: endpoint independent
=> NAT filtering behavior: address and port dependent
推荐阅读
- ios - “UIAccessibilityNotifications”(又名“UInt32”)类型的值没有成员“screenChanged”
- reactjs - 同一页面中的多种语言
- javascript - 如何在单击的其他元素之后在列表中添加元素并具有特定值的数据属性?用jQuery
- xml - 如何解析 Html 以对应 XML 标准?
- javascript - 如何使用firebase-admin在firestore中将日期保存为时间戳?
- sql - 基于 TOP 的 SQL UPDATE
- c# - 如何通过确定深度级别将子节点添加到树视图?
- three.js - Three.js 的 CopyShader 是什么?
- amazon-web-services - AWS 凭证文件多个角色相同的配置文件
- javascript - 由于拖动元素中的点,JavaScript 拖放时的 XY 位置已关闭