SukkaW/Koolshare-Clash

Do you want to work on this issue?
You can request for a bounty in order to promote it!
关于 YouTube 不能播放的问题 #56
SukkaW posted onGitHub
#36
使用 KoolClash 后 YouTube 不能播放属于已知、且可以稳定复现的问题。这个问题由上游 Clash 导致、与 KoolClash 无关。关于「切换节点后中断已建立的 TCP 连接」的相关提案已经向 Clash 开发者提出。如果你需要解决这个问题,请要求 Clash 开发者实现连接管理器等特性,或由你亲自向 Clash 提交 Pull Request 实现相关特性。
TL; DR
更换节点后,IP 不会实时更新。
复现步骤
- 重启 Clash
- 在浏览器中启用 Dev Tools
- 打开 YouTube,播放任一视频,在 Dev Tools 中 Network 选项卡查看瀑布图,可以看到所有发往 YouTube 视频 CDN 域名的 HTTP 请求全部正常、状态码为 200。
- 在 Clash Dashboard 中切换 YouTube 使用的节点
- 刷新 YouTube 页面、或切换别的视频,视频无法继续缓冲、或提示无法播放;所有发往 YouTube 视频 CDN 域名的 HTTP 请求状态码为 403。
问题分析
在更换节点后,Clash 不会终止任何现有的 TCP 连接,因此已经建立的 TCP 连接将会继续使用之前的节点。现代浏览器为了提升性能,都会复用并维持 TCP 连接,在刷新 www.youtube.com
时,与 www.youtube.com
建立的 TCP 连接一般不会重新建立,因此即使更换节点后,www.youtube.com
仍然在通过之前的节点;但是由于不同的视频、CDN 域名一般不同,因此会重新建立 TCP 连接,此时加载视频使用的是更换后的节点。由于请求 www.youtube.com
以及主站其它 API 和请求视频 CDN 的节点不同、IP 不同,触发了 YouTube 视频 CDN 的防盗链机制,阻止了视频的播放。这一防盗链机制可能由托管 Google 全球边缘节点的运营商部署、并非 Google / YouTube 的行为,因此在 YouTube 网页或客户端中可能不会出现防盗链相关提示。
解决方案
- 更换节点前重启 Clash 以中断任何现有的 TCP 连接,重启 Clash 后更换节点。
- 向 Clash 提出连接管理器相关特性。
- 避免使用
url-test
,load-balance
等会引发节点更改的type
- 在服务端部署针对 YouTube 的 SNI 代理服务器,确保更换节点后实际请求 YouTube 的 IP 不改变