代表性面试主题

通用面试:ICE、STUN 和 TURN 如何建立 WebRTC 连接?

通用困难
Offer.cc 编辑团队发布 更新

题干

两个浏览器需要在未知网络之间建立 WebRTC 连接。请解释信令、ICE、STUN、TURN 如何协作,如何选择候选对,以及如何诊断 ICE 失败。

题目与范围

两个浏览器需要建立音频、视频或数据连接。它们可能在同一局域网、不同 NAT 后,或处于阻断 UDP 的网络。请解释建立路径和失败路径,并区分通过信令交换描述的过程与发现、检查网络路径的 ICE。

Credmark 的公开 WebRTC 面试指南明确要求解释 ICE 以及 STUN、TURN 的作用。RFC 8445 定义了 ICE 候选、检查清单和连通性检查;WebRTC.org 说明点对点连接如何使用 STUN 或 TURN 收集候选。

面试官考察什么

  • 是否区分信令、候选收集、连通性检查和媒体加密。
  • 是否能解释主机、服务器反射和中继候选,而不声称 STUN 会“打开端口”。
  • 是否能权衡直连路径的延迟与 TURN 的带宽、隐私和运营成本。

核心信号是因果时间线:描述和候选经过信令传递,候选对执行检查,选定路径后才承载加密媒体或数据。

作答前澄清

  1. 信令是否已经存在? ICE 不定义你的 WebSocket、HTTP 或消息信令传输。
  2. 浏览器直连还是经过 SFU? SFU 会改变媒体拓扑,但仍需分别与每个浏览器建立连接。
  3. UDP 和 TCP 443 是否允许? 防火墙策略决定主机、反射或中继候选能否成功。
  4. 成本目标是什么? TURN 会承载流量,因此视频码率和中继比例决定支出。

30 秒回答

“信令交换 SDP offer、answer,以及 ICE 候选;信令是应用自定义的。每个端收集主机候选,向 STUN 请求服务器反射地址,在直连可能失败时获取 TURN 中继候选。ICE 组成候选对,使用认证的连通性检查并提名可用对。随后 DTLS 验证对端并派生媒体或数据密钥。STUN 帮助发现映射地址;TURN 转发字节。对称 NAT、阻断 UDP 或严格防火墙可能迫使使用 TURN,因此我会按网络类型衡量候选对成功率、连接时间、中继比例和失败率。”

分步深答

第一步:通过信令交换描述。

呼叫方创建包含媒体段和 ICE 凭据的 offer,通过应用信令服务发送。被叫方返回 answer。信令还传递 trickle 候选和候选结束标记。信令服务器转发 SDP,并不因此承载媒体。

第二步:收集候选类型。

主机候选代表本地接口。STUN binding 请求让端点获知 STUN 服务器观察到的公共映射地址和端口,形成服务器反射候选。TURN allocation 创建中继候选,TURN 服务器成为流量端点。候选优先级和 foundation 帮助 ICE 比较路径,但较高优先级不保证检查通过。

第三步:组成并检查候选对。

双方组合本地和远端候选。ICE 将候选对放入检查清单,使用 ICE 凭据发送 STUN 连通性检查并记录响应。检查成功只证明当时能穿过该对,并不保证未来持续可用。控制端提名有效候选对,双方收敛到同一路径。

第四步:保护选定路径。

ICE 连通后,DTLS 验证对端并派生密钥。SRTP 保护音视频,DTLS 上的 SCTP 承载数据通道。ICE 选择可达路径,不负责加密应用载荷。浏览器暴露连接状态和候选统计,这些数据对诊断很重要。

第五步:解释常见 NAT 结果。

同一局域网的主机候选通常可用。兼容的 NAT 可能允许服务器反射候选。对称 NAT 映射、端点相关过滤或阻断 UDP 会使直连失败。TURN 可通过 UDP、TCP 或 443 端口上的 TLS 中继,但会增加延迟、带宽成本和信任面。

第六步:用证据诊断失败。

记录信令状态、ICE 收集状态、ICE 连接状态、候选类型、候选对检查、选定候选对、RTT、同意保活和网络族。用局域网、移动网络、对称 NAT、VPN 和 UDP 被阻断网络组成测试矩阵。若收集成功但检查失败,检查防火墙和 NAT;若只有中继成功,先衡量中继成本和通话质量,再调整直连策略。

高质量示范回答

“我会画出四个边界。应用信令服务交换 SDP、ICE 凭据、候选和结束标记,它不是媒体路径。主机候选描述本地接口,STUN 产生服务器反射映射,TURN 分配中继。ICE 组合本地和远端候选,使用认证 STUN 消息检查并提名路径。之后 DTLS 派生密钥,SRTP 承载音视频,SCTP 承载数据通道。

直连主机或反射路径成本更低,通常延迟也更低,但对称 NAT 和阻断 UDP 会要求 TURN。我会按网络类别监控候选收集、检查错误、连接时间、选定候选类型、中继比例、RTT 和同意丢失,从而区分信令缺失、NAT 穿透失败和已连接但媒体路径质量不足。”

常见错误

  • 把 STUN 当中继 → STUN 返回映射地址但不承载会话 → 只有 TURN 才有中继语义。
  • 说信令建立媒体 → 信令只传输描述和候选 → 继续追踪 ICE 检查和选定候选对。
  • 认为 STUN 成功就代表连接成功 → 远端仍可能因过滤无法发送 → 检查完整候选对。
  • 所有通话都使用 TURN → 中继带宽和延迟会推高成本并损害质量 → 偏好直连并监控中继比例。
  • 把 ICE 当加密 → ICE 只检查可达性 → 分别解释 DTLS、SRTP 和 SCTP。

追问与回答

追问 1:为什么 STUN 可用但点对点连接仍失败?

STUN 只说明服务器观察到一侧的映射。远端可能因为 NAT 使用端点相关映射或过滤,或者防火墙阻断协议,无法发送到这个映射。ICE 必须检查完整候选对;STUN 请求成功不是路径保证。

追问 2:什么时候应该强制使用 TURN?

当策略禁止暴露对端地址、直连检查反复失败,或已知网络类别阻断 UDP 时,可以强制或优先 TURN。使用短期凭据、区域中继、限流和容量告警。全局强制会掩盖直连回归并增加带宽成本,因此要把它作为有度量依据的明确策略。

追问 3:通话已连接但视频质量差,检查什么?

读取选定候选对、是否为中继、RTT、丢包、抖动、同意保活、码率自适应,并比较直连和中继路径。检查 CPU、编码队列,以及 SFU 或 TURN 区域是否距离过远。ICE 成功证明可达,不证明容量和媒体质量足够。

公开来源

同类题目