跳转至

BitTorrent

简介#

BitTorrent 既是软件,也是协议,不过由于 BitTorrent 软件在 2006 年商业化,停止了开源,所以 BitTorrent 现在主要指代其协议。

协议#

BitTorrent 协议简称 BT,是用在对等网络中文件分享的网络协议程序。和点对点(point to point)的协议程序不同,它是用户群对用户群(peer to peer)(对等式网络),而且用户越多,下载同一文件的人越多,下载该文件的速度越快。且下载后,继续维持上传的状态,就可以「分享」。

词语#

  • Bram Cohen(布莱姆·科亨)

    BitTorrent 的设计者。

  • BitTorrent, Inc.

    这是 Bram Cohen 和 Ashwin Navin 于 2004年9月22日 建立的公司,之后更名为 Rainberry, Inc.

  • Peer to peer

    简称为 P2P,通常被翻译成点对点,但是存在歧义,所以这里使用「用户群对用户群」「对等式网络」和「对等网络」的译名。

  • Point to point

    点对点,常见于 Client Server (CS) 架构的网络,比如万维网(WWW)主要就是这样的结构。

Torrent#

〔待续〕

Tracker#

〔待续〕

DHT#

DHT 全称为分布式哈希表(Distributed hash table)

DHT 历史#

BitTorrent 知名的功能之一是 DHT,而 DHT 知名的实例也是 BitTorrent,但这最初是第三方 BitTorrent 客户端 Azureus (现 Vuze)首先实现于 2005年5月2日 的 2.3.0.0 版本,1 当时还叫做分散追踪(Decentralised tracking),并且 Azureus 的开发者当时不认为 DHT 属于 BitTorrent 协议的一部分,而是称之为「BitTorrent 网络之上添加的一个层,用于提升 Azureus 的性能」。2

因为有了 DHT,所以此版本也添加了磁力链接(Magnet URI),不过当时还没有相关标准,所以磁力链接还是 magnet:?xt=urn:sha1:哈希,并不是现在常见的 magnet:?xt=urn:btih:哈希

其中的 btih 是指 BitTorrent info hash,这是 SHA-1 哈希,部分情况会是被 Base32 编码后的,区别二者的方法可以简单的看看长度,SHA-1 有 40 个字符,而被 Base32 编码后只有 32 个字符,34 所以 btih 与 sha1 几乎是等价的。

很快 BitTorrent 软件也推出了自己的 DHT,但与 Azureus 的版本不兼容,虽然都是基于 Kademlia 算法,但有一些差异。5 开发者表示相似的算法 Chord 曾经被亚伦·斯沃茨(Aaron Swartz)于 2002 年提及,被它的简单震惊,所以开发者在当时就开始开始探索这一类 DHT 算法了,甚至早于 Azureus 的第一个版本。6

备注:BitTorrent 软件又称 Mainline,表示主线(主要线程),与第三方的分支进行区别,所以 BitTorrent 的 DHT 版本也就分别叫做 Mainline DHT。

之后所有的 BitTorrent 第三方客户端,均使用了 Mainline DHT,Vuze 也出现了兼容 Mainline DHT 的插件。

有了 DHT,BitTorrent 就可以摆脱 Tracker,因为 Tracker 服务器可能会因为各种原因而被关闭,或干扰。DHT 能大大的增加 BitTorrent 协议的独立性。

不过由于各种原因,DHT 的推广较慢,因为在当时 DHT 还是会占用大量路由器的资源,导致缓慢,直到海盗湾在 2009年11月 关闭自己的 Tracker,全面转向磁力链接 DHT。

DHT 简介#

这是一种为了解决分布式哈希表的系统,而诞生的概念,随后出现了多种算法,比如之前提到的 Kademlia 和 Chord。

DHT 的特点是节点能轻易的上线、离线以及检索信息,所以 DHT 通常被设计成一个空间,比如圆、二叉树甚至是多维空间,然后每个节点被映射到其中,然后通过算法,导航到目标节点的附近,与需要或者分享文件的用户进行接触。

用比喻来解释 DHT,「空间」就是一座城市,我寻找的东西会被转化成一个具体的地点,然后我尝试向地点接近,携带着文件的人也通过这个方法,将自己的联系方式写在了这个地点附近,等待着我的到来。

磁力链接#

磁力链接与 DHT 的关系是一体两面,或者说磁力链接是 DHT 的一部分,是描述「地点」的一部分。所以理论上可以使用任何标识都能使用,甚至是 magnet:?xt=urn:uuid,不过 uuid 或者其他的随机值没有承载源文件的信息,所以可以这么做,但完全没必要。7

前面提到磁力链接与 DHT 的关系是一体两面,所以磁力链接不仅仅被 BitTorrent 所使用。

磁力链接标准的设计者是 Bitzi,于 2002 年开发,目的是中立的描述对等式网络中的文件,因为当时 eDonkey2000 和 Freenet 分别设计出了自己的文件链接,分别以 ed2k:freenet: 开头,并且 ed2k 的链接没有遵守违反了 IETF 的 RFC 1738 和 2396。

所以 Bitzi 想要创建一个中立的,符合 IETF 规范的对等式网络中的文件链接。

磁力链接的发展#

2002 年,Bitzi 提出磁力链接之后,2002年6月17日 完成了最终版的技术概述/规范草案。

Gnutella 网络是最先使用的,当时 Gnutella 是非常流行的分享文件的协议,有着各种第三方客户端,最先支持磁力链接的应该是 Shareaza,这款软件在 1.6 版本,大约是 2002年8月21日 添加了磁力链接。89

随后 gtk-gnutella 于 2002年11月17日 添加了磁力链接的支持,10 , LimeWire 于 2003年3月7日 的 2.9.0 版本添加,11 但是其他的商业软件比如 Kazza 没有更新日志,所以尚不明确其添加磁力链接的版本与时间。

然后时间来到 2005 年,Azureus 与 BitTorrent 软件先后实现了 DHT 与磁力链接。其他的第三方 BitTorrent 客户端也纷纷跟进,成为了 BitTorrent 的事实标准。

但是磁力链接也就推广到这里了,之后 Gnutella 淡出了历史,BitTorrent 也就成了磁力链接唯一的主要使用者。

磁力链接的结构#

一个简单的磁力链接就像下面的样子,磁力链接属于 URN(统一资源名称(Uniform Resource Name))。

 magnet:?xt=urn:btih:c7b01623dbc4f58ab0c4bee964a7416538ad4453
+------+---+---+----+----------------------------------------+
|   1  | 2 |                        3                        |
+------+---+---+----+----------------------------------------+
           |3.1| 3.2|                   3.3                  |
           +---+----+----------------------------------------+
  1. magnet 是指磁力链接
  2. xt 表示 Exact Topic,这是磁力链接必要的参数,它的后方通常是 URN
  3. 使用 URN 表示的文件哈希,关于 URN 的介绍〔待续〕

    〔待续〕

磁力链接的图标#

在 MAGNET-URI Project 的官网里,给出了一些磁力链接图片,用来推广,方便用户快速理解。

  • magnet_logo
  • fig1 magnet-icon-9w-9h.gif
  • fig2 magnet-icon-9w-10h.gif
  • fig3 magnet-icon-12w-12h.gif
  • fig4 magnet-icon-14w-14h.gif
  • fig5 magnet-tile-16w-16h.gif
  • fig5_2 magnet-tile2-16w-16h.gif
  • fig6 magnet-tile-purple-13w-9h.gif
  • fig7 magnet-tile-purple-19w-14h.gif

Private Tracker BT#

〔待续〕

协议加密#

〔待续〕

标准化#

BitTorrent 在 2008年1月 开始尝试标准化,将与最初 BitTorrent 协议不同的部分表述为 BitTorrent Enhancement Proposals(之后简称为 BEP),跟 XMPP 的模块化相似:

XMPP 的模块化

XMPP 的意思是可扩展消息与存在协议,是自由、开放和公开的即时通讯协议,特点是灵活,服务器端可以只安装必要的功能,然后就能在客户端运行了。

这种模块化的设计来自 XMPP 标准基金会。它将几乎一切 XMPP 的功能模块化,包括用户头像、群聊和上传文件这样的,在其他即时通讯软件中几乎必不可少的功能,到了 XMPP 里都是可选的功能。

被模块化的功能会像 RFC 一样拥有编号,被放在网络上被查阅,然后服务器端和客户端的开发者就参考这些标准进行开发。所以前文没有说 XMPP 是开源的,因为 XMPP 的根基是一页页的标准组成的协议,根据其标准开发的软件不一定会开源,就像是 HTML5、ECMAScript(JavaScript) 一样,都是规范。

BEP 是由 BitTorrent.org 维护,此网站由 BitTorrent, Inc.(现 Rainberry, Inc.)维护。其中绝大多数的标准均被放置在公有领域,所以算是开放规范。

不过我没查到 BEP 具体的历史,所以细节尚不明确。

BitTorrent v2#

BitTorrent v2 全称是 The BitTorrent Protocol Specification v2,BEP 编号为 52,由 the8472 设计,改进的设计有许多,最明显的就是磁力链接。

原本的 urn 的命名空间从 btih 变成了 btmh,含义从 BitTorrent info hash 变成了 BitTorrent multi hash,表示的是「哈希树」,然后使用 SHA-2 的 SHA-256 算法取代了 SHA-1。并且支持创建和使用混合版本的种子,下面是一些示例,分别是 v1, v2 和混合。12

magnet:?xt=urn:btih:631a31dd0a46257d5078c0dee4e66e26f73e42ac
magnet:?xt=urn:btmh:1220caf1e1c30e81cb361b9ee167c4aa64228a7fa4fa9f6105232b28ad099f3a302e
magnet:?xt=urn:btih:631a31dd0a46257d5078c0dee4e66e26f73e42ac&xt=urn:btmh:1220d8dd32ac93357c368556af3ac1d95c9d76bd0dff6fa9833ecdac3d53134efabb

追动画#

因为 BitTorrent 的开放性,所以 BitTorrent 的订阅功能直接使用 RSS 实现,通常还支持字符匹配等功能,比如 qBittorrent 的「RSS 智能剧集过滤器」功能,然后就能自动下载需要的最新一集的动画。

2023年4月 上旬,哔哩哔哩知名动画区 UP 主「范式」在直播中分享了使用 BitTorrent 以及 RSS 订阅动画的技巧,主要是播放了十年怎么走的《qBittorrent 如何自动追番》这期视频,13 随后 4月9日《【泛式】范式教你全自动下载新番!!!》的切片上传,之后因为不明原因更名为《【泛式】新番引进大大减少了!?以后应该如何看番??》。14

2023年4月20日 开始,多个中文 BitTorrent 网站被 GFW 封锁:15

(上述时间仅仅是可被查证的、被观察到的封禁时间,可能比起真正的封锁时间更晚。)

对此,有人认为范式的宣传和 BT 站被封锁是相关的。16


  1. Azureus Dev, 《Azureus2 changelog - 2.3.0.0 - May 2, 2005》, VuzeWiki, 2005-05-02. (参照 2022-11-29). 

  2. Thomas Mennecke, 《Azureus Introduces DHT Layer》, Slyck News, 2005-05-03. (参照 2022-11-29). 

  3. Greg Hazel、Arvid Norberg, 《Extension for Peers to Send Metadata Files》, BitTorrent.org, 2017-03-26. (参照 2022-11-29). 

  4. Xilon, 《BTIH Magnet URI support》, µTorrent Community Forums, 2005-11-11. (参照 2022-11-29). 

  5. Eric Chan-Tin, Victor Heorhiadi, Nicholas Hopper 和 Yongdae Kim, Hijacking the Vuze BitTorrent network: all your hop are belong to us, IET Information Security, vol. 9, no. 4, 页码 203–208, 2015, doi: 10.1049/iet-ifs.2014.0337. 

  6. Ben Jones, 《BitTorrent’s DHT Turns 10 Years Old》, TorrentFreak, 2015-06-07. (参照 2022-11-29). 

  7. Arun Ranganathan, 《Re: Discussion of Blob URI Scheme for Binary Data Access》, IETF from Arun Ranganathan, 2011-05-15. (参照 2022-11-30). 

  8. ANNOUNCING SHAREAZA 1.6》, Shareaza, 2002-11-01. (参照 2022-11-30). 

  9. fluffylogic, 《shareaza relase dates?》, Shareaza, 2009-08-19. (参照 2022-11-30). 

  10. gtk-gnutella/gtk-gnutella》. gtk-gnutella, 2022-11-14. 参照: 2022-11-30. [Online]. 

  11. Lime Wire LLC., 《Features History》, LimeWire: The Official Site, 2006-10-15. (参照 2022-11-30). 

  12. arvid, 《BitTorrent v2》, libtorrent blog, 2020-09-07. (参照 2022-12-01). 

  13. 十年怎么走, 《qBittorrent 如何自动追番》, 哔哩哔哩, 2023-02-19. (参照 2023-04-22). 

  14. 夜空无界, 《【泛式】新番引进大大减少了!?以后应该如何看番??》, 哔哩哔哩, 2023-04-09. (参照 2023-04-22). 

  15. &’a ::rynco::UntitledChannel, 「今天刚被屏蔽的应该包括……」, Telegram, 2023-04-22. (参照 2023-04-22). 

  16. 邦古型工机, 《蜜柑、大马哈鱼等bt站被ban的原因猜测》, bangumi, 2023-04-21. (参照 2023-04-22). 

(由于更新时间是手动更新的,所以部分页面内容已更新,但忘记修改新的日期了……)