hughfenghen.github.io icon indicating copy to clipboard operation
hughfenghen.github.io copied to clipboard

WebRTC跨设备无法连接问题

Open hughfenghen opened this issue 5 years ago • 1 comments

编码一小时,调试一整天。。。

用原生的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,电信可以(可能会变,以前文的工具检查结果为准)

hughfenghen avatar Aug 19 '20 02:08 hughfenghen

mark.

yzydeveloper avatar Oct 15 '24 09:10 yzydeveloper