题目与范围
两个浏览器需要建立音频、视频或数据连接。它们可能在同一局域网、不同 NAT 后,或处于阻断 UDP 的网络。请解释建立路径和失败路径,并区分通过信令交换描述的过程与发现、检查网络路径的 ICE。
Credmark 的公开 WebRTC 面试指南明确要求解释 ICE 以及 STUN、TURN 的作用。RFC 8445 定义了 ICE 候选、检查清单和连通性检查;WebRTC.org 说明点对点连接如何使用 STUN 或 TURN 收集候选。
面试官考察什么
- 是否区分信令、候选收集、连通性检查和媒体加密。
- 是否能解释主机、服务器反射和中继候选,而不声称 STUN 会“打开端口”。
- 是否能权衡直连路径的延迟与 TURN 的带宽、隐私和运营成本。
核心信号是因果时间线:描述和候选经过信令传递,候选对执行检查,选定路径后才承载加密媒体或数据。
作答前澄清
- 信令是否已经存在? ICE 不定义你的 WebSocket、HTTP 或消息信令传输。
- 浏览器直连还是经过 SFU? SFU 会改变媒体拓扑,但仍需分别与每个浏览器建立连接。
- UDP 和 TCP 443 是否允许? 防火墙策略决定主机、反射或中继候选能否成功。
- 成本目标是什么? 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 成功证明可达,不证明容量和媒体质量足够。