页面经 VPN 能打开,通话却始终连不上:同一个地址栏里藏着两种不同的故障。隧道改变的是浏览器所用的路径;它没有变成信令服务、STUN 服务器或中继,也不决定 ICE 会选哪一对候选。正是把各组件的职责分开,才把含糊的“WebRTC 被封锁”变成具体的故障。

四项工作,隧道只触及其中一项

应用通过某种信令安排交换会话信息,这是第一项工作。ICE 收集候选地址并测试地址对,直到有一对可用,这是第二项。STUN 让对端了解自己的流量从外部看是什么样子,TURN 则为不存在直连路径的情况分配中继。这四种角色彼此不同,VPN 只影响它们遇到的地址与过滤,并不亲自提供其中任何一种。

所以登录成功并不能说明媒体路径如何。信令通常走页面已在用的同一个 HTTPS,端口为 443,而媒体却可能经 UDP 前往完全不同的目的地。

私有地址让混乱更严重。隧道地址只有在对方有一条通往它的既定回程时才有用;私有并不等于相互可达,浏览器在丢弃无法检验的候选时也不会这样认为。对你来说像是本地的候选,从另一端可能根本无法测试。在断定隧道丢弃媒体之前,值得先排除这一空隙。

比较 VPN 出口与 TURN 中继

两者都会转发数据包,因此常被混为一谈,上面的对照表值得逐列阅读,而不是当作功能清单。中继分配是由已认证请求创建的、按会话存在的对象;隧道则是一条路由。一个带有会过期的凭据,另一个带有一个要么可达、要么不可达的对端地址。

ComponentWhat it contributesWhat it needs to workWhat it cannot do
VPN exitChanges the observed mapping and the route packets takeA working tunnel and a policy that permits the media transportAllocate a relay or supply signaling
STUN serverReports the mapped address a peer appears to useReachability from the client, on its configured transportCarry media when a direct path fails
TURN serverRelays media through an authenticated allocationValid credentials, an allowed transport and sufficient capacityFix a missing ICE policy or an unauthorized client
Signaling channelCarries offers, answers and candidate listsBoth peers reaching the same application endpointEstablish connectivity by itself

端口号让差别变得具体。TURN 默认在 3478 上监听 UDP 与 TCP,在 5349 上监听 TLS;一个放行 443 却丢弃这些端口的网络,会让经中继的通话失败,而网页浏览照常进行。修改 VPN 的端口并不会配置其中任何一项,因为关键的端口属于中继服务,而不属于隧道。

先读诊断,再测试通话

浏览器无需抓包就能展示所需信息。打开所用浏览器的 WebRTC 诊断页面,发起通话,然后读选中的候选对,而不是已收集的列表:选用了哪些本地与远端候选类型、经由哪种传输与地址族,以及路径是直连还是经中继。

有两种读法值得提前了解。若选中的对是私有地址上的主机对主机,媒体就留在你可以推理的路径上;若是中继对中继,通话就在消耗中继容量,并依赖该服务的可用性。停在“检查中”而没有选中对的故障,意味着候选已经收集,但没有一个通过连通性检查。

接着在同一通话中比较同样的两个端点,只改变一个已获准的条件,并以双向媒体或数据、而不是“已连接”指示来判断结果。候选收集在许多从不承载一帧音频的情况下也会成功。在改动的另一侧重复通话,并保留两份诊断记录,因为比较两次运行比只读其中一份更有信息量。同样的端点、同样的编解码、只改一个变量。

刻意把 ICE 传输策略设为 relay 的应用,只要求中继候选。这一设置既不创建中继,也不修复缺失的凭据;它只是把要求讲明白,这在有人把网站自己选定的策略归咎于 VPN 时很有用。

把隐私主张收窄到证据允许的范围

候选的暴露取决于浏览器与应用策略,而不只是隧道状态,W3C 的对等连接规范把 IP 处理视为它自己的议题。因此,已连接的 VPN 并不是承诺“通话只暴露一个选定地址”的好依据。同一隧道后的两端甚至可能选择一条从不离开主机的路径,这同时是隐私改善与连通性限制。

你能准确陈述的范围更窄,也更有用:选中的是哪一对候选、由哪种传输承载,以及这条路径是否留在隧道之内。把这三项事实分别记在可用与失败的通话上,差异通常会指出需要修复的组件。

连通之后,把性能与可达性分开。丢包、时延、排队与 MTU 都位于正确候选对的下游,把卡顿的通话当成连通性故障,只会让你毫无必要地回到候选列表。

相关文章