假设社区中有几位成员一直在合作完成某个项目的部分工作,现在他们想分发他们的成果。我们假设引擎团队有一个名为“engine.data”的文件,车轮团队有“wheels.data”,安全带团队有“seatbelts.data”,等等。
期望的结果是一个 car.torrent 文件,其中包含 engine.data、wheels.data、seatbelts.data 等等,社区可以在他们之间以及与公众共享。
每个团队的文件均视为冻结且最终版本,并且一旦包含在该种子中将不会更新。
社区中的每个成员都有自己数据的完整版本,但没有成员拥有任何其他人的数据。如果已经存在一个 torrent,那就没问题了!每个成员都会播种他们拥有的块,同时接收他们没有的块……这正是 BitTorrent 的工作方式。但在这种情况下,还没有创建任何 torrent。会这样吗?如果是这样,怎么做到的?
答案1
不,这不是 torrent 的工作方式。创建 torrent 时,您会推送应有的数据,然后客户端会将其拥有的数据与服务器上存储的数据进行比较。因此,服务器不会将其数据添加到服务器上的 torrent 中,而是会删除其数据。
您想要做的是拥有一个全局 torrent 服务器,每个成员都可以将自己的部分添加为 torrent,这样整个项目组就可以下载所有单独的 torrent 并获得一个整体。您只需要一个 torrent 服务器来跟踪所有 torrent,但无论如何这都是一个要求,除非您只进行对等分发。我没有这方面的经验,所以我不知道这有多容易使用。
另外,请记住,一旦创建了 torrent,最初的创建者就不能只编辑他们的文件并期望它更新。相反,torrent 也会用 torrent 中的内容覆盖他们的更改。
每次更新时都必须创建一个新的 torrent。
Torrent 只是基于快照的分发,而不是更新服务。如果您想要更新,请使用基于云的存储解决方案,例如 OneDrive、Google Drive、DropBox 等...
答案2
社区中的每个成员都有自己数据的完整版本,但没有成员拥有任何其他人的数据。如果已经存在一个 torrent,那就没问题了!每个成员都会播种他们拥有的块,同时接收他们没有的块……这正是 BitTorrent 的工作方式。但在这种情况下,还没有创建任何 torrent。会这样吗?如果是这样,怎么做到的?
理论上这是可能的,但我认为目前还没有现成的工具可以实现。
创建.torrent文件的核心过程大致如下:
- 从...开始:
torrent = { "info": { "files": [], "piece size": 4194304, "pieces": bytearray(), }, }
- 确定所有文件的列表(其大小以字节为单位)并存储在
torrent["info"]["files"]
; - 将所有文件按照列表的顺序连接到单个流中;
- 将流分成固定大小的“块”(例如 4 MB);
- 计算每一块的SHA-1;
- 将所有片段的 SHA-1 哈希值连接起来并存储在中
torrent["info"]["pieces"]
。 - 使用 Bencode序列化整个
torrent
结构并转储到 .torrent 文件中。
在步骤 1 中,您无法从多个来源汇编列表,确定哪个来源具有哪些片段范围,而在步骤 4 中,您无法要求每台机器为其自己的片段提供哈希值,这没有任何根本原因。您只需要编写自己的工具来完成所有这些操作。
(如果文件长度是片段大小的整数倍,则会有所帮助,但是某些 BitTorrent 应用程序已经插入空的“填充”文件以保持文件片段对齐,因此您也可以这样做。)
对于一个成员来说,首先下载其他所有人的数据(例如,为每个组件创建单独的种子),然后按照通常的创建种子的方式从这些数据中创建超级种子,这可能会更简单。
或者,您可以研究其他软件,例如dat
。