Dweb:使用 WebTorrent 建立弹性网络

在本系列文章中,我们将介绍一些探索 Web 去中心化或分布式化后可能性的项目。这些项目与 Mozilla 无关,其中一些项目重写了我们对 Web 浏览器的认知。它们的共同点是:这些项目是开源的,开放参与,并与 Mozilla 的使命一致,即保持 Web 的开放和对所有人可访问。

当自我表达的经济成本不再成为障碍时,Web 才能保持健康。在本期 Dweb 系列文章中,我们将学习 WebTorrent - 一个在 Web 浏览器中运行的 BitTorrent 协议 实现。这种文件服务方法意味着网站可以随着同时访问网站的用户数量的增加而扩展 - 消除了在数据中心运行集中式服务器的成本。这篇文章由 WebTorrent 的创建者 Feross Aboukhadijeh 撰写,他是 PeerCDN 的联合创始人,也是一位多产的 NPM 模块作者...... 截至目前已发布了 225 个模块!-Dietrich Ayala

什么是 WebTorrent?

WebTorrent 是第一个在浏览器中运行的 torrent 客户端。它完全用 JavaScript(Web 语言)编写,并使用 WebRTC 进行真正的点对点传输。不需要任何浏览器插件、扩展或安装。

WebTorrent 利用开放式 Web 标准,将网站用户连接在一起,形成一个分布式的、去中心化的浏览器到浏览器网络,以便高效地进行文件传输。使用 WebTorrent 支持的网站的人越多,该网站的速度越快,弹性也越强。

Screenshot of the WebTorrent player interface

架构

WebTorrent 协议的工作原理与 BitTorrent 协议相同,只是它使用 WebRTC 而不是 TCP 或 uTP 作为传输协议。

为了支持 WebRTC 的连接模型,我们对跟踪器协议进行了一些更改。因此,基于浏览器的 WebTorrent 客户端或“Web 对等点”只能连接到支持 WebTorrent/WebRTC 的其他客户端。

一旦对等点连接起来,用于通信的线协议与正常的 BitTorrent 中完全相同。这将使现有的流行 torrent 客户端(如 TransmissionuTorrent)更容易添加对 WebTorrent 的支持。 Vuze 已经支持 WebTorrent 了!

Diagram showing the decentralized P2P network of torrents

入门

只需要几行代码就可以在浏览器中下载 torrent!

要开始使用 WebTorrent,只需在页面上包含 webtorrent.min.js 脚本。您可以从 WebTorrent 网站 下载脚本,也可以 链接到 CDN 副本

<script src="webtorrent.min.js"></script>

这将在 window 对象上提供一个 WebTorrent 函数。还有一个
npm 包 可用。

var client = new WebTorrent()

// Sintel, a free, Creative Commons movie
var torrentId = 'magnet:...' // Real torrent ids are much longer.

var torrent = client.add(torrentId)

torrent.on('ready', () => {
// Torrents can contain many files. Let's use the .mp4 file
var file = torrent.files.find(file => file.name.endsWith('.mp4'))

// Display the file by adding it to the DOM.
// Supports video, audio, image files, and more!
file.appendTo('body')
})

就是这样!现在您将看到 torrent 流式传输到网页中的 <video width="300" height="150"> 标签中!

了解更多

您可以在 webtorrent.io 上了解更多信息,或者在 Freenode IRC 的 #webtorrent 或 Gitter 上提出问题。我们正在寻找更多可以回答问题并帮助 GitHub 问题跟踪器中遇到问题的人员。如果您是一个友好、乐于助人的人,并且想要一个更深入地研究 torrent 协议或 WebRTC 的借口,那么这就是您的机会!

 

 

关于 Feross Aboukhadijeh

Feross 编写了流行的开源软件,包括 WebTorrentStandardJS 和数百个 Node.js 包(总计每月 2 亿多次下载)。他最近发布了一个名为 BitMidi 的有趣网站,该网站为您的聆听乐趣提供 MIDI 文件!他的开源工作得到了 Patreon 上慷慨捐赠者的支持。

更多 Feross Aboukhadijeh 撰写的文章...


14 条评论

  1. Valentin C.

    我可能不太熟悉 P2P 协议,但有什么可以保证从对等点接收到的数据的完整性?

    2018 年 8 月 15 日 下午 11:36

    1. Feross Aboukhadijeh

      对等点接收到的数据会进行哈希处理,并与已知的良好哈希值进行比较。如果恶意对等点改变了数据中的哪怕一个位,那么哈希值将不匹配,数据将被丢弃。

      您可以在我 2014 年在 JSConf Asia 上的演讲中了解更多关于 torrent 的信息:https://www.youtube.com/watch?v=kxHRATfvnlw

      2018 年 8 月 15 日 下午 11:49

  2. Valentin C.

    顺便说一下,作为这些技术的例子,您可以提到 PeerTube (https://joinpeertube.org/en/),它的目标是成为一个去中心化的、FOSS 的 YouTube。

    2018 年 8 月 16 日 上午 5:02

    1. Feross Aboukhadijeh

      是的!PeerTube 是 WebTorrent 最令人印象深刻的应用之一,它拥有巨大的潜力。

      在该页面上还列出了 WebTorrent 的全部用户:https://webtorrent.io/faq

      2018 年 8 月 16 日 上午 11:01

  3. Richie Sikra

    我认为这具有很大的潜力,并且看起来玩起来可能很有趣。
    感谢您的辛勤工作。

    2018 年 8 月 16 日 上午 9:31

  4. Richie Sikra

    刚刚在 WebTorrent 网站上看到了使用 Brave 的视频,它像没事一样下载了 129MB 的文件...... 我印象深刻。

    2018 年 8 月 16 日 上午 9:44

    1. Feross Aboukhadijeh

      谢谢您!

      2018 年 8 月 16 日 上午 11:07

  5. Tailor Vijay

    超级有趣。

    客户端缓存内容并将其提供给其他客户端的时间是多久?
    客户端是否可以设置愿意提供的带宽数量?
    这是否会影响客户端可以期望的 QOS?

    2018 年 8 月 16 日 下午 12:00

    1. Feross Aboukhadijeh

      客户端会在浏览器标签保持打开状态的时间内提供内容。一旦浏览器标签关闭,网页就会被浏览器卸载,JavaScript 也无法继续运行。

      > 客户端是否可以设置愿意提供的带宽数量?这是否会影响客户端可以期望的 QOS?

      目前还没有,尽管有一个开放的问题是添加带宽速率限制。我认为 QoS 不会受到影响,因为使用的是上传带宽,而这通常不是最终用户的瓶颈。

      2018 年 8 月 16 日 下午 1:00

  6. Danyl Strype

    Torrent 客户端开发者在哪里可以找到关于如何效仿 Vuze 并支持 WebTorrent 群组的信息?

    2018 年 8 月 29 日 上午 10:50

    1. Feross Aboukhadijeh

      目前最好的方法是查看源代码以了解我们正在做什么。规范工作正在进行中。还有讨论关于使用 WebSockets 而不是 WebRTC 的问题,这是一个更简单、更务实的方案,对于客户端来说更容易实现。在这里了解更多信息:https://github.com/webtorrent/webtorrent/issues/1492

      2018 年 8 月 29 日 下午 12:31

  7. gr

    您好,您能否添加或显示使用该 JS 脚本将新文件添加到 WebTorrent/存储新文件的示例链接?

    2018 年 9 月 1 日 上午 3:31

    1. Feross Aboukhadijeh

      创建新的 torrent 并进行种子 (在浏览器中)

      var dragDrop = require('drag-drop') var WebTorrent = require('webtorrent') var client = new WebTorrent() // 当用户在浏览器上拖放文件时,创建一个新的 torrent 并开始进行种子! dragDrop('body', function (files) { client.seed(files, function (torrent) { console.log('Client is seeding ' + torrent.magnetURI) }) })

      此示例使用了 drag-drop 包,以便更容易地使用 HTML5 拖放 API。

      2018 年 9 月 1 日 下午 3:27

  8. Abby Nion

    不错的文章,我非常支持 DWeb。

    2018 年 9 月 11 日 上午 11:16

本文的评论已关闭。