BitTorrent 磁力链接如何工作?

2024-04-22

我第一次使用磁力链接 http://en.wikipedia.org/wiki/Magnet_URI_scheme。我很好奇它是如何工作的,因此查阅了规格,但没有找到任何答案。维基百科说xt表示“确切的主题”,后跟格式 (btih在本例中)使用 SHA1 哈希值。我看到提到了base32,知道它每个字符5位,32个字符,我发现它正好容纳160位,这正是SHA1的大小。

没有空间容纳 IP 地址或其他任何东西,它只是一个 SHA1。那么 BitTorrent 客户端如何找到实际的文件呢?我打开 URL Snooper 来查看它是否访问页面(使用 TCP)或进行查找等,但什么也没发生。我不知道客户是如何找到同行的。这是如何运作的?

另外,哈希值是什么?它是所有文件哈希值一起组成的数组的哈希值吗?也许它是所需的实际 torrent 文件的哈希值(剥离某些信息)?


在虚拟机中,我尝试了 uTorrent(新安装的)的磁力链接,它成功地找到了对等点。第一个同伴从哪里来?它是新鲜的,没有其他种子。


A BitTorrent magnet link identifies a torrent using1 a SHA-1 or truncated SHA-256 hash value known as the "infohash". This is the same value that peers (clients) use to identify torrents when communicating with trackers or other peers. A traditional .torrent file contains a data structure with two top-level keys: announce, identifying the tracker(s) to use for the download, and info, containing the filenames and hashes for the torrent. The "infohash" is the hash of the encoded info data.

Some magnet links include trackers or web seeds, but they often don't. Your client may know nothing about the torrent except for its infohash. The first thing it needs to is find other peers who are downloading the torrent. It does this using a separate peer-to-peer network2 operating a "distributed hash table" (DHT). A DHT is a big distributed index which maps torrents (identified by infohashes) to lists of peers (identified by IP address and ports) who are participating in a swarm for that torrent (uploading/downloading data or metadata).

The first time a client joins the DHT network it generates a random 160-bit ID from the same space as infohashes. It then bootstraps its connection to the DHT network using either hard-coded addresses of clients controlled by the client developer, or DHT-supporting clients previously encountered in a torrent swarm. When it wants to participate in a swarm for a given torrent, it searches the DHT network for several other clients whose IDs are as close3 as possible to the infohash. It notifies these clients that it would like to participate in the swarm, and asks them for the connection information of any peers they already know of who are participating in the swarm.

当对等点上传/下载特定 torrent 时,他们会尝试告诉对方他们所知道的正在参与同一 torrent 群的所有其他对等点。这让对等点可以快速了解彼此,而无需让跟踪器或 DHT 受到持续的请求。一旦您从 DHT 中了解了一些对等点,您的客户端将能够向这些对等点询问 torrent 群中更多对等点的连接信息,直到您拥有所需的所有对等点。

最后,我们可以向这些同行询问 torrent 的info元数据,包含文件名和哈希列表。一旦我们下载了此信息并使用已知的方法验证其正确性infohash,我们的处境与从常规开始的客户几乎相同.torrent文件并从包含的跟踪器中获取对等点列表。

下载可能会开始。

1 The infohash is typically hex-encoded, but some old clients used base 32 instead. v1 (urn:btih:) uses the SHA-1 digest directly, while v2 (urn:bimh:) adds a multihash https://github.com/multiformats/multihash prefix to identify the hash algorithm and digest length.
2 There are two primary DHT networks: the simpler "mainline" DHT, and a more complicated protocol used by Azureus.
3 The distance is measured by XOR.

进一步阅读

  • BEP-3:BitTorrent 协议规范 http://www.bittorrent.org/beps/bep_0003.html
  • BEP-52:BitTorrent 协议规范 v2 http://www.bittorrent.org/beps/bep_0052.html
  • BEP-5:DHT 协议 http://www.bittorrent.org/beps/bep_0005.html
  • BEP-9:对等方发送元数据文件的扩展 http://www.bittorrent.org/beps/bep_0009.html
  • BEP-10:扩展协议 http://www.bittorrent.org/beps/bep_0010.html
  • BEP-11:同行交换(PEX) http://www.bittorrent.org/beps/bep_0011.html
  • Azureus DHT 说明 http://wiki.vuze.com/w/Distributed_hash_table
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BitTorrent 磁力链接如何工作? 的相关文章

  • 用C语言开发一个BT下载软件 (四) ------ 代码实现-1-种子文件解析模块

    parse metafile h ifndef PARSE METAFILE define PARSE METAFILE 保存从种子文件中获取的tracker的URL typedef struct Announce list char an
  • BitTorrent协议规范(BitTorrent Protocol Specification)系列之B编码(Bencoding)-第一部分

    鉴定 BitTorrent是由布莱姆 科恩设计的一个端对端 peer to peer 文件共享协议 此协议使多个peers通过不可信任的网络的文件传输变得更容易 目的 此规范的目的是详细介绍 BitTorrent 协议规范 v1 0 Bra
  • Ruby BitTorrent 库 [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我正在考虑用 ruby 编写定制的 torrent 客户端 我找到了以下库 正如马特下面指出的那样 它们相当古老 不过 我想听听我可能错过的任何图书馆 并且我很想听听社区对以下图书馆的
  • 如何将从 sha1 字节数组生成的字符串返回到该字节数组?

    首先很抱歉英语不好 好吧 我想从 torrent 文件中读取片段哈希信息 目前 我正在使用https github com hyPiRion java bencode这个 Bencode 库来解码信息 但我的问题是当我想将片段字符串转换为字
  • 在 Python 中使用 Rasterbar libtorrent 挑选同级

    有谁知道是否可以选择使用 libtorrent 进行连接的对等点 也就是说 在跟踪器返回对等 IP 和端口的列表后 只有选定的几个将根据某些定义的标准进行连接 Thanks 您可以使用以下命令从集合中删除对等点set ip filter 您
  • Torrent 客户端中的哈希计算

    我想知道是否有人知道 BitTorrent 客户端中的 哈希 指的是什么 它显然不是hash文件的代码 但有些不同 我认为这更像是一个文件的磁力链 接 但是它是如何连接到文件本身的呢 我只是想了解幕后的构造 torrent 客户端中的文件
  • 最新的 BitTorrent DHT 实施建议是什么?

    我正在努力实现另一个 BitTorrent 客户端 目前正在与 DHT 作斗争 是按照这个规范来实现的http www bittorrent org beps bep 0005 html但开始调试它时 我注意到网络上其他节点的响应有所不同
  • 如何从 torrent 跟踪器响应中获取对等列表

    我正在制作一个种子客户端 我解码 torrent 文件并将此请求发送到跟踪器 http tracker mininova org announce uploaded 0 downloaded 0 compact 0 event starte
  • Ruby Torrent 库

    Ruby 有什么好的库可以与 BitTorrent 跟踪器一起使用吗 下载或种子文件 rubyforge 上有一个 ruby torrent 库 但它最后一次更新是在 2005 年 似乎不再工作了 参见 lib torrent ruby h
  • 创建 torrent 哈希信息

    如何在 torrent 文件上生成 torrent 哈希信息 我一直在看这个例子 如何使用 Java 计算 torrent 的哈希值 https stackoverflow com questions 3436823 how to calc
  • BitTorrent 扩展协议

    我正在尝试用java编写自己的bittorrent客户端 这是一个make work项目来刷新我的java技能 我一直停留在开发的某个阶段 尽管有一些用于 BitTorrent 开发的论坛 但它们似乎并不十分活跃 到目前为止我可以执行以下操
  • 打开磁力链接而不失去焦点

    javascript 或其他 有没有办法在浏览器失去焦点的情况下处理磁力链接 这有点像在后台打开一个选项卡而不离开当前页面 我最近遇到了类似的问题 并且能够通过在页面上创建命名框架并将其用作目标来解决该问题window open windo
  • Bittorrent 协议如何处理数据块?

    BitTorrent 协议中如何处理数据块 当客户想要下载时 例如Linux 发行版中 跟踪器是否返回对等点列表 然后客户端连接到该列表并向每个对等点请求块 或者跟踪器是否返回对等点列表以及哪个对等点具有哪些数据的信息 数据块在哪里管理或处
  • 使用 libtorrent-python 下载 Torrent

    我有以下 python 代码 import libtorrent as lt import time ses lt session ses listen on 6881 6891 params save path home download
  • 解码 Torrent 追踪器抓取的 Torrent 哈希值?

    我在用BEncoded PHP 库 http proger i forge net BEncoded E2 80 93 handling torrent files in PHP 7Tn解码来自 Bittorrent 跟踪器的编码响应 Tr
  • 将下载的 torrent 保存在内存中而不是文件 libtorrent

    使用 Rasterbar libtorrent 我不希望下载的数据放在我的硬盘上 而是放在管道或变量或软的东西上 这样我可以将其重定向到其他地方 Mysql 甚至垃圾 如果它不是我想要的 有没有如果不是使用 Libtorrent 在 C 中
  • 在 Python 中使用 Rasterbar libtorrent 加载 Magnet LINK

    如何通过 rasterbar libtorrent python 绑定加载 Magnet 链接 import libtorrent as lt import time ses lt session params save path home
  • BitTorrent 磁力链接如何工作?

    我第一次使用磁力链接 http en wikipedia org wiki Magnet URI scheme 我很好奇它是如何工作的 因此查阅了规格 但没有找到任何答案 维基百科说xt表示 确切的主题 后跟格式 btih在本例中 使用 S
  • PEX协议(磁力链接)如何找到它的第一个IP?

    我试图了解磁力链接如何工作 因为我读过他们使用 DHT 和 PEX 来获取对等点 但如果我是网络中的新节点 如何才能找到仅具有哈希值的对等点文件 它不是总是需要一个到已知主机的链接吗 Thanks Bittorrent DHT 可以通过多种
  • 类似 wget 的 BitTorrent 客户端或库? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 是否有任何

随机推荐

  • 如何以编程方式选择视频文件并上传到 iPhone 中的服务器

    我想选择 iPhone 中的一个视频文件并将其上传到服务器 由于 UIImagePicker 用于选择照片库或其他模式中可用的图片 是否有任何选项可以以编程方式选择位于 iPhone 中的文件 使用资产库 参考这个问题 使用 AssetsL
  • 让 COUNTIFS 忽略所有空白单元格(= 空单元格和包含“”的单元格)

    我想得到一个公式COUNTIFS like COUNTIF A1 A3 lt gt 这样当A1 2 A2 A3 空 返回 1 Notes A2包含一个空字符串 作为公式的结果 A3 is a 空白单元格 其中没有公式 发布的公式返回 2 我
  • 如何从子类向父类中定义的变量传递值?

    我的主页有一个工具栏 其中包含三个按钮 主页 通知和登录 我希望仅在用户登录时显示通知按钮 这是我的代码 Parent class interface Toolbar UIViewController UIToolbar toolBar U
  • 在哪里可以找到有关重构的资源? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 重构是改进现有系统设计而不改变其行为的过程 除了马丁 福勒的开创性著作 重构 改进现有代码的设计 ht
  • ASP.NET Webforms 应用程序有时无法加载,直到 cookie 被删除

    我正在我的 Windows 7 PC 上开发 ASP NET 4 Webforms 应用程序 我正在运行VS2010和IIS7 5 我有一个奇怪的问题 在加载几个页面 从 1 到 20 左右 后 我没有从 IIS 得到任何响应 我什至无法在
  • 从 Java 应用程序发送陷阱

    从 Java 应用程序发送陷阱的最快捷 最简单的方法是什么 提前致谢 I use SNMP4J http www snmp4j org 为了这 This http www snmp4j org doc org snmp4j Snmp htm
  • 如何在 Angular 2 中使用量角器?

    我将 Protractor 与 Angular 1 x 一起使用 我想逐步迁移到 Angular 2 0 但我没有看到 Protractor在文档中 https angular io docs ts latest testing 从 Ang
  • 警告:“声明似乎没有效果”[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 PyCharm 以黄色突出显示我的代码并发出警告 悬停时 它说 声明似乎没有效果 有人可以解释一下这是什么意思吗 您需要一个等号 赋值给pu
  • 使用 istream (std cin):防止 Windows 上的“[输入] 未被识别为...”

    我有一个具有命令行功能的 Qt gui 应用程序 为了使这项工作正常进行 我将其添加到了顶部main 功能 ifdef WIN32 if AttachConsole ATTACH PARENT PROCESS freopen CONOUT
  • Flutter - firebase FCM 消息根本不适用于 Testflight 版本构建

    Preface 我的应用程序基于 Flutter 但需要本机代码实现才能使 FCM 消息正常工作 请参阅下文了解更多详细信息 GitHub问题 154 https github com ConnectyCube connectycube f
  • 如何实现 JSR 规范

    我正在考虑实现一两个 JSR API 我还没有阅读整个规范 计划是在编写实现代码时阅读它们 但我对它们非常熟悉 我读到 JSR 流程包括实现测试兼容性工具包 TCK 以测试所述 JSR 实现 在我开始编写一堆单元测试来验证我的实现的正确性
  • 视频swf的php正则表达式

    我想从对象 嵌入 html 源获取视频 url 我读到我可以使用正则表达式来获取它 但我和正则表达式不是朋友 这就是我所拥有的
  • 二进制串口读取c中丢失的字节

    我正在将二进制数据从 arduino 发送到运行此代码的串行端口 在十六进制模式下使用cutecom可以清楚地读取我对该串行端口的期望 如下所示 00000000 24 04 85 ab 47 43 04 04 24 04 85 ab 47
  • E/未知:React:本机调用中出现异常

    我通过模拟器运行 Android 应用程序 但出现了如下错误 不知道如何修复它 有知道解决办法的人吗 请帮忙 thanks E unknown React Exception in native call java lang Runtime
  • PHP 中的 if (\false) (是的,带反斜杠)是什么意思?

    今天早上 我接到通知 有一个新的Twig 扩展 https github com twigphp Twig extensions发布可用 耶 在将其集成到之前树枝小提琴 https twigfiddle com 我想看changes htt
  • keycloak 令牌自省总是失败并显示 {"active":false}

    我有点急于让这件钥匙斗篷发挥作用 我可以进行身份 验证 但由于某种原因 我的令牌内省总是失败 例如 如果我尝试进行身份验证 curl d client id flask api d client secret 98594477 af85 4
  • 从本地路径加载图像并将其绘制在画布上

    我想在画布上绘制图像 其中图像源将由用户动态设置 在尝试设置图像的 src 时出现以下错误 不允许加载本地资源 file D My 20Picsb jpg 有没有办法从本地驱动器加载文件以将它们绘制在画布上 var img new Imag
  • 将当前过滤器选择提供给 Django 中的另一个自定义 SimpleListFilter

    我正在尝试更改一个过滤器的提示 以响应另一个过滤器中所做的当前选择 我非常不知道如何将 AttributeCategoryFilter 的当前选定值传递到 AttributeFilter 中 我正在使用 Django 1 4 dev 试图弄
  • 从整数数组中删除重复项

    我在编码时遇到问题 编写一个名为的静态方法removeDuplicates它接受一个整数数组作为输入 并返回一个删除了所有重复项的新整数数组作为结果 例如 如果输入数组包含元素 4 3 3 4 5 2 4 则结果数组 应为 4 3 5 2
  • BitTorrent 磁力链接如何工作?

    我第一次使用磁力链接 http en wikipedia org wiki Magnet URI scheme 我很好奇它是如何工作的 因此查阅了规格 但没有找到任何答案 维基百科说xt表示 确切的主题 后跟格式 btih在本例中 使用 S