WebRTC跨设备无法连接问题
编码一小时,调试一整天。。。
用原生的WebRTC接口、peerjs写了一个p2p demo。
现象:同一设备下的两个页面(可以跨浏览器)可以建立链接,跨设备则无法连通(同一wifi或不同网络都不行)。
原因:因为我们的设备连接网络基本都经过NAT,但NAT有多种类型,只有部分支持P2P连接。
类型如下,只有前两种支持P2P链接:
客户端主机所在网络可以分为以下类型:
1, Opened: 即主机拥有公网IP,并且没有防火墙,可自由与外部通信.
2, Full Cone NAT: 主机前有NAT设备,NAT规则如下: 从主机UDP端口A发出的数据包都会对应到NAT设备出口IP的端口B,并且从任意外部地址发送到该NAT设备UDP端口B的包都会被转到主机端口A.
3, Restricted cone NAT: 主机前有NAT设备,NAT规则如下: 从主机UDP端口A发出的数据包都会对应到NAT设备出口IP的端口B,但只有从之前该主机发出包的目的IP发出到该NAT设备UDP端口B的包才会被转到主机端口A.
4, Port Restricted cone NAT: 主机前有NAT设备,NAT规则如下: 从主机UDP端口A发出的数据包都会对应到NAT设备出口IP的端口B,但只有从之前该主机发出包的目的IP/PORT发出到该NAT设备UDP端口B的包才会被转到主机端口A.
5, Symmetric UDP Firewall: 主机出口处没有NAT设备,但有防火墙,且防火墙规则如下: 从主机UDP端口A发出的数据包保持源地址,但只有从之前该主机发出包的目的IP/PORT发出到该主机端口A的包才能通过防火墙.
6, Symmetric NAT: 主机前有NAT设备,NAT规则如下: 即使数据包都从主机UDP端A发出,但只要目的地址不同,NAT设备就会为之分配不同的出端口B.
7, Blocked: 防火墙限制UDP通信.
浪费这么久时间根本原因是背景知识缺乏(简单了解NAT,没想到这么复杂o(╯□╰)o))。。。
额外收获
NAT检测工具
- PC:https://github.com/jtriley/pystun
- 安卓:https://play.google.com/store/apps/details?id=hu.uszeged.inf.wlab.stunner&hl=zh (多试几次,有时候会检测失败)
WebRTC定位工具
- 检测ICE Server是否可用:https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/
- Chrome查看WebRTC日志:chrome://webrtc-internals/
- Firefox查看WebRTC日志:about:webrtc
其他
- 推荐:Heroku,可以免费部署信令服务(比如:peerjs-server)到外网
由于Heroku动态分配端口,注意服务启动时从环境变量中获取端口,否则将无法在Heroku中启动服务 - 经验:联通、移动的蜂窝网络似乎不支持P2P,电信可以(可能会变,以前文的工具检查结果为准)
mark.