不同网络下RTCPeerConnection连接失败该如何排查?
核心问题根因
你当前仅配置了STUN服务器,仅能应对非对称NAT的穿透场景,而绝大多数运营商的4G网络采用对称NAT架构,STUN无法完成穿透,必须依赖TURN服务器做流量中继才能实现跨网连通。同一WiFi下两端属于同一内网,不需要NAT穿透即可直连,因此运行正常。
排查建议
- 新增
onicecandidate事件回调,打印两端收集到的所有ICE候选,确认iOS端切换到4G网络后,是否能成功获取到srflx类型的服务器反射候选:如果获取不到,说明Google公共STUN被当前运营商屏蔽,可以替换为国内可用的公共STUN节点测试。 - 检查网络切换后的信令交换流程是否完整,确认重新协商生成的offer、answer以及所有ICE候选都完整传递到对端,iOS混合应用如果基于WKWebView实现,需要额外验证网络切换时WebSocket/HTTP等信令通道没有异常断开导致候选丢失。
- 可以开启
RTCPeerConnection的详细日志,查看ICE候选配对的全过程,确认是否存在匹配成功的候选对。
修复方案
- 部署私有TURN服务器,推荐使用coturn实现,配置完成后将TURN服务器地址、认证信息添加到
iceServers配置中,示例配置如下:
const config: RTCConfiguration = { 'iceServers': [ { 'urls': [ 'stun:stun.l.google.com:19302', 'stun:stun1.l.google.com:19302', 'stun:stun2.l.google.com:19302', 'stun:stun3.l.google.com:19302', 'stun:stun4.l.google.com:19302', ] }, { urls: 'turn:<你的TURN服务器IP/域名>:<端口>', username: '<TURN认证用户名>', credential: '<TURN认证密码>' } ] }
- 若暂时未部署TURN,可以先测试两端在不同WiFi网络下的运行表现,如果跨WiFi也出现连接失败,即可完全确认是NAT穿透问题,必须添加TURN服务器才能解决。
内容的提问来源于stack exchange,提问作者Kurt Spindler
相关产品推荐
相关产品推荐

