同学 Zoom 黑屏掉线
起因
同学说 Zoom 卡,影响了他在线考试。我们收集了一些资料后发现 Zoom 有中国服务器,但是只有商业用户可以连接,而免费账户只能连接到美国的服务器。我怀疑是中国到 Zoom 的美国服务器网络线路不好。
我们尝试了下发现挂代理也没用——尽管 Zoom 已经检测到了代理(在统计信息页面)。我同学说他那边丢包,我这边感觉还好,但有时候也有丢包。我担心是 UDP 请求不能被正常代理。
补充:几种代理方式的能力范围
HTTP 代理
支持 IPv4 和 IPv6,仅能代理 TCP。
从 https://superuser.com/a/302955/ 来看,虽然其主要是代理 HTTP(当然也能代理 HTTPS),但许多 HTTP 代理服务器能够处理 CONNECT
请求(因此实际上支持了裸 TCP 连接),所以 HTTP 代理也能用来代理其他 TCP 协议。
SOCKS4 代理
支持 IPv4 的 TCP 请求。
SOCKS5 代理
支持 IPv4 和 IPv6,支持 TCP 和 UDP,算是比较全能了。
在 v2rayN 上的设置
为了能用代理 UDP 连接,首先修改以下的选项:
- 代理方式设置为白名单,而且还要点击主界面的检查更新 > Geo files,完成 Geosite 和 Geoip 的更新(这样做是避免没有 Geo files 数据,导致软件不能判断每个请求是否要代理)1。
- 打开设置中的 UDP 代理。
- v2rayN 的默认代理为 http,要选择
socks://{ip}:{socks_port}
才能使用 socks 代理。
在 NatTypeTester 中测试到服务器 stun.syncthing.net 的连接情况,手动填写 socks 代理之后确实能代理 UDP(即看到的公网 IP 是代理服务器的,而不是本地的,可以通过查询公网 IP 的归属地来分辨)。但是不填写就不行,用不了系统代理 2。
查阅资料得知 Windows 上系统代理的 SOCKS 协议是 SOCKS4,不能代理 UDP 3。实际上,使用 SOCKS 代理之后,在 Windows 系统代理服务器设置页面的 ip 位置会显示 http://socks=127.0.0.1
而不是 127.0.0.1
,好像也暗示了实际上是 HTTP 代理。不过至少从 NatTypeTester 测试结果来看 v2rayN 的 SOCKS5 代理端口是有效的。
在 Proxifier 上的尝试
网上说为了让 Windows 使用系统级别的 SOCKS5 代理,可以配合使用 Proxifier 这个软件,可以免费评估 31 天。我将它的代理服务器设置为 localhost,端口设置为本地的 SOCKS5 代理端口。
注意要下载安装版,不要用便携版,否则无法检测代理死锁(使用本地代理软件就很出现代理死锁),代理不能正常工作、Chrome 会闪退。
和同学如此操作一下,好像网络是正常了?(其实还是有点隐隐担心。)
其他尝试:查阅 Zoom 的白皮书
https://explore.zoom.us/docs/doc/Zoom%20Connection%20Process%20Whitepaper.pdf
Zoom 的音视频传输方式是:优选 UDP 8801 端口,次选 TCP 8801 端口,如果都不行就选择 SSL 443 端口。很显然,如果我们想要在 Windows 上面使用系统代理,就不希望 Zoom 使用 UDP,直接使用 TCP 或者用 SSL 都是可以的。
接下来 Zoom 的白皮书又提到了特殊情况(上图):如果 Zoom 发现了代理的使用,那么就不会使用 UDP 或者裸 TCP 传输,而是使用 SSL 传输。
这是我的 Proxifier 页面:
果然是没有 8801 端口的——无论是 UDP 还是 TCP 都没有,传输也用的是 SSL。我之前对软件不能正常代理 UDP 请求的担心是多余的。
既然已经知道在有代理的时候 Zoom 不会使用 UDP,我是不是能直接换成系统代理,而不用 Proxifier 呢?很遗憾不行,我关掉 Proxifier、启用 v2rayN 的系统代理之后,视频就开始丢包了。
反思
考虑到 Proxifier 的截图中出现了 IPv6,而且这是我刚刚进入会议的时候截的图,创建的 IPv6 连接应该是在和多媒体路由器通信用的。我觉得也可能是因为 SOCKS4 无法代理 IPv6 导致我这边卡。
可能我只需要使用 HTTP 系统代理就能正常使用 Zoom,开 SOCKS 代理反而不对(因为无法代理 IPv6)。至于我同学那边,则可能是之前没有正确更新 Geo files 导致白名单模式无法正常工作。现在通过我自己的两台设备进入 Zoom 会议看起来没有问题,也没有麻烦同学继续测试了。