2013 年,一个叫 Feross Aboukhadijeh 的程序员在 Hacker News 上贴出一个 demo:打开一个网页,网页里直接播一部电影,电影不是从任何服务器下载,而是从另一个也在看这部电影的用户的浏览器里直接流过来。整个过程没有迅雷、没有 qBittorrent、没有 eMule,只有一个 Chrome 标签页。这是 WebTorrent 的第一次公开亮相。
它解决的不是一个“更快的下载工具”的问题,而是一个更根本的问题:浏览器能不能成为下载工具?二十年来,浏览器一直被当成“展示层”,真正的下载发生在它之外的某个客户端里。WebTorrent 把这个边界彻底打破了——浏览器既是展示层,也是下载节点,也是上传节点,三合一。
技术底座:WebRTC 的“端到端”能力
WebTorrent 不发明新协议,它把 BitTorrent 协议重新实现了一遍,运行在 WebRTC 之上。WebRTC 是浏览器原生支持的实时通信协议,Google 在 2011 年开源,最初为视频通话设计。它给浏览器提供了两个关键能力:第一,看到本地 IP 地址和 NAT 类型;第二,和其他浏览器建立直接的 UDP 数据通道。
这两个能力,正好是 BitTorrent 协议在浏览器里运行所需要的。BitTorrent 客户端之间需要互相连接、交换分片、协调上传下载,过去这些连接建立在操作系统的 TCP socket 上,现在被替换成了 WebRTC 的 RTCDataChannel。整个握手、连接、加密、流量控制逻辑,都被翻译成了 WebRTC 的对应物。
WebTorrent 不是“在浏览器里模拟 BitTorrent”,它就是 BitTorrent,只不过跑在一个新传输层(WebRTC)之上。
对浏览器架构的颠覆
WebTorrent 之前,浏览器下载文件的方式只有一种:HTTP GET。浏览器向服务器发请求,服务器把字节流回来,浏览器保存到磁盘。这是 1990 年代以来的标准模式,简单、稳定、但完全中心化。
WebTorrent 之后,浏览器多了一种新的文件获取方式:从其他浏览器 peer 直接拿。这个能力是浏览器厂商主动提供的——Chrome、Firefox、Edge、Safari 都支持 WebRTC。这意味着任何网页,只要加载 WebTorrent 的 JavaScript 库(约 100KB),就具备了 P2P 收发文件的能力。
这种能力的应用场景迅速超出了“下载工具”的范畴。Popcorn Time 用 WebTorrent 实现了无需服务器的在线视频流媒体;Internet Archive 用它来减轻服务器负担;一些去中心化的直播平台直接基于它构建。今天 npm 上的 webtorrent 包每周有几十万次下载,GitHub 上有数千个 star,这是一个已经成熟的生产级方案。
WebTorrent 解决的三个具体问题
第一个问题是“边下边播”的体验。传统 HTTP 下载一部 4GB 电影,你必须等下载完成后才能看。WebTorrent 因为流式地从多个 peer 接收数据,可以做到“打开网页就开始播”。这个能力在 WebTorrent Desktop 客户端里非常成熟,也被 Popcorn Time、Instant.io 等项目大量使用。
第二个问题是“分享成本”。一个网站想给一万个用户提供 1GB 的视频下载,自建服务器至少需要几十万的带宽费用。WebTorrent 让这 10000 个用户彼此互传,网站只需要承担最初几个用户的引导流量,后续分发完全由用户贡献。这是一种新型的“用户越多,网站越省钱”的成本模型。
第三个问题是“种子做种的人太少”。传统 BitTorrent 在中国大陆长期不温不火,核心原因是大多数用户装了 NAT、防火墙,主动做种困难。WebTorrent 通过 WebRTC 的 ICE 协议,可以穿透大多数家用 NAT,显著提升了 peer 之间的连通率。这让 WebTorrent 网络里的实际可用节点比传统 BitTorrent 多。
WebTorrent 没有解决的事
WebTorrent 也有它的天花板。它最大的局限是浏览器沙箱的限制——网页里的 JavaScript 不能任意访问文件系统,不能直接保存大文件到磁盘(只能触发浏览器下载)。这让 WebTorrent 在处理 GB 级以上文件时体验不佳,必须借助 WebTorrent Desktop 这类独立客户端。
另一个局限是 WebRTC 的连接建立仍然需要一个信令服务器(signal server)。两个浏览器第一次互相发现时,需要一台服务器帮它们交换连接信息。这台服务器不传文件本身,只传元数据,但它仍然是中心化的。WebTorrent 通过 trackerless DHT 在一定程度上缓解了这个问题,但首次连接仍需要一个引导节点。
对下载生态的启示
WebTorrent 给整个下载行业最大的启示,不是它本身有多厉害,而是它证明了浏览器可以是下载工具。这个观念一旦确立,后面所有 web3 下载协议的设计都开始考虑“在浏览器里跑”这件事。IPFS 的 Helia(取代 js-ipfs)就是一个浏览器优先的 IPJS 实现,Filecoin 的检索市场也大量依赖浏览器端的轻客户端。
下一篇我们会看到一个稍微晚一点、但野心更大的项目——Resilio Sync。它试图用 P2P 协议干掉“网盘”这个产品类别本身,让你不再需要一家运营公司来帮你保存文件。
参考资料
- WebTorrent 官方。 WebTorrent - Streaming torrent client for the web https://webtorrent.io
- GitHub。 webtorrent/webtorrent https://github.com/webtorrent/webtorrent
- 少数派。 WebTorrent Desktop – 支持 BT 种子、磁力链接 https://www.appinn.com
- CSDN。 如何使用 WebTorrent:完整的网页端 BT 下载与流媒体指南 https://blog.csdn.net