关于跨P2P协议、跨BT种子下载文件的一个设想

相信每一位 BT 用户都会碰到过 Dead Seed (无源种子) 的情况,特别是下载多年以前发布的老旧种子时碰到这种情况的几率特别高。

对于我来说,碰到 Dead Seed 时不得不使用 某雷(吸血软件)、eMule 来尝试下载,运气好的时候可以完成下载,但绝大多数时候都没机会。

另外一个经常碰到的情况是,有些发布种子的人其实很多时候都是先从其它 BT 种子源下载完,接着修改文件名、删些文件、加几个自己另外创建的文件,然后再次发布新的种子。——也就是说其实很多种子的主要文件内容是完全一致的,这个结论通过下载完不同的种子任务后对比文件的 sha1 可以得到确认。


BitComet 目前已经支持从 ED2K 网络下载数据,建议再进一步支持跨 BT 种子下载文件。

简单来说就是以“文件的 ED2K hash” 作为依据,加上在 BitComet 用户间交换 “文件哈希对应数据库”(file_hash_db) ,即可实现跨 BT 种子下载文件。


具体想法如下:

一. 对于 用户A1

(1) 用户A1 有文件目录结构如下

    UserA1_files/
        file1.txt
        file2.jpg
        file3.mp4

(2) 用户A1 现在使用 BitComet 制作 Torrent 文件得到了 seedA1.torrent ,假设该 torrent 的特征码是 seedA1_torrent_hash

(3) BitComet 再对 UserA1_files 目录下每一个文件单独生成它自己的 ED2K hash

(4) 经过上述步骤,用户A1 有了 “文件哈希对应数据库” (UserA1_file_hash_db),该 file_hash_db 内容如下

    File Path                   File Torrent Hash       ED2K File ID        ED2K AICH Hash
    ----------------------------------------------------------------------------------------------
    UserA1_files/file1.txt      seedA1_torrent_hash     ed2k_file_id1       ed2k_aich_hash1
    UserA1_files/file2.jpg      seedA1_torrent_hash     ed2k_file_id2       ed2k_aich_hash2
    UserA1_files/file3.mp4      seedA1_torrent_hash     ed2k_file_id3       ed2k_aich_hash3

(5) 用户A1 发布种子给别人下载

二. 对于 用户A2

(1) 用户A2 下载 用户A1 发布的种子,在 BitComet 添加任务,通过 DHT 网络连接到了 用户A1,用户A1 将自己本地的 “文件哈希对应数据库” (UserA1_file_hash_db) 里面跟 seedA1_torrent_hash 相关的内容发送给 用户A2。—— 这里再次特别说明:只发送跟 seedA1_torrent_hash 相关的内容。

(2) 用户A2 将收到的 UserA1_file_hash_db 数据跟自己本地的 file_hash_db 合并。

(3) 用户A2 下载完后,他可能会另外做种,例如重新修改了目录结构、文件名称、删除了某些文件:

    UserA2_haha/
        movie_A2.mp4

    说明:这里的 UserA2_haha/movie_A2.mp4 其实跟 UserA1_files/file3.mp4 是同一个文件。

(4) 用户A2 现在使用 BitComet 制作 Torrent 文件得到了 seedA2.torrent ,假设该 torrent 的特征码是 seedA2_torrent_hash

(5) BitComet 再对 UserA2_haha 目录下每一个文件单独生成它自己的 ED2K hash

(6) 经过上述步骤,用户A2 有了 “文件哈希对应数据库” (UserA2_file_hash_db),该 file_hash_db 内容如下

    File Path                   File Torrent Hash       ED2K File ID        ED2K AICH Hash
    ----------------------------------------------------------------------------------------------
    UserA1_files/file1.txt      seedA1_torrent_hash     ed2k_file_id1       ed2k_aich_hash1
    UserA1_files/file2.jpg      seedA1_torrent_hash     ed2k_file_id2       ed2k_aich_hash2
    UserA1_files/file3.mp4      seedA1_torrent_hash     ed2k_file_id3       ed2k_aich_hash3
    UserA2_haha/movie_A2.mp4    seedA2_torrent_hash     ed2k_file_id3       ed2k_aich_hash3

    说明:这时 用户A2 的 file_hash_db 有了一条文件对应关系 ( UserA1_files/file3.mp4 <==> UserA2_haha/movie_A2.mp4 )

(6) 用户A2 发布新种子给别人下载

三. 对于 用户B1

(1) 用户B1 下载的是 用户A1 发布的种子,在 BitComet 添加任务,通过 DHT 网络连接到了 用户A1,得到了 UserA1_file_hash_db 相关内容,用户B1 将相关内容合并到自己的 file_hash_db

(2) 用户B1 按照目前的 BitComet 下载任务的方式从 用户A1 处下载全部文件的数据

(3) 用户B1 通过 DHT 网络向其他 BitComet 用户询问 ed2k_file_id1、ed2k_file_id2、ed2k_file_id3 ,用户A2 收到询问后回答自己有 ed2k_file_id3,将自己的 UserA2_file_hash_db 相关内容发给了 用户B1,用户B1 将相关内容合并到自己的 file_hash_db

(4) 用户B1 现在可以从 用户A2 处下载单个文件 (ed2k_file_id3 对应的文件) 的数据 —— 现在这里就实现了跨 BT 种子下载。

四. 对于 用户B2,他下载的是 用户A2 发布的种子,他通过跟类似的方式可连接到 用户A1 来下载相应文件的数据。


最后,实现跨 BT 种子下载其实还有很多附带好处,例如:

(1) 等于是在 BitComet 用户之间实现了次级 ED2K 网络,加上有了 “文件哈希对应数据库”(file_hash_db) 就可以在 BitComet 中实现类似 eMule 的搜索功能。

(2) 以后碰到 BT 种子中有路径特别长的文件,用户操作系统不支持长路径,用户可以将该文件(改名或)移动到其它位置,然后再用 BitComet 对该文件做种,即使不发布到网络,其它用户也能够下载。

2個讚

想法思路很好, 实际上目前长效种子也是类似的设计,已经实现了跨种子分享文件。只不过识别文件没用 ED2K hash,采用了更快的专有特征码算法。

1個讚

我个人认为使用 ED2K hash 可以完美地跟 ED2K 网络融合,BitComet 使用电驴插件后等于是将 ED2K 网络吸纳到 BitComet 中。

BitComet 的长效种子(使用 ED2K hash) ,加上 ED2K 网络,应该是目前最能够提升文件生存率的机制。

和楼上说的,现在长效已经是跨文件了,只要hash一致就可以互传,不需要种子文件相同。
长效种子服务器和现有软件已经运行的情况,估计要改也没办法改了,改的话要推翻完全重做,不太现实,而且ED2K基本上,,快死绝了,而且没有更新,很多历史遗留问题,最简单的例子上面也说了,ED2K hash特别慢,长效用的是其他方法实现的。
所以软件有电驴插件功能,制作种子时候,或者下载完成,会进行hash一次,记录ed2k hash字符串到种子文件中,二次访问下载,即可直接拉取hash字符串进行查询下载

Due to the fact that in LT-Seeding protocol resources are being identified using a hash value that is being calculated per file this means that through LT-Seeding you could even get the same files from peers belonging to another torrent swarm (i.e. a torrent swarm using a .torrent file with a different info-hash than the BitTorrent swarm for which you’re currently being a peer), as long as at least some files of the alternative torrent are identical (on a binary level, thus yielding the same file-hash) to the ones of your current torrent and LT file hashes have been uploaded to the server for those files.
官方这一句话意思:一个文件,存在多个不同种子文件内部,比如A种子文件有个mp4文件,B种子文件也有这个mp4,就可以同时打通做下载

A BitComet client must have an open port! LAN users must make sure they have an open port (i.e. the status light is green).
这句话意思,必须要绿灯,拥有外网端口,才能进行长效上传

Note: LT-Seeding is being inactivated automatically (and cannot be enabled) for any task added to the Task List if the torrent is a private one (i.e. it bears the private key in the info dictionary of the .torrent file).
*benefits of comet ID are not available on torrents issued by trackers requiring the “private flag” (i.e. private torrents).
这句话意思是,PT私有种子会强制禁用长效种子和登录用户账号获益功能

官方介绍:long-term_seeding [BitComet Wiki]

你的建议2,长路径问题也是可以正常下载的,你试试,不过直接修改种子目录型的多文件格式的话,,目前没有做,你是想例如123.mp4和456.mp4的长路径的话,可以直接下载修改成1.mp4和4.mp4实现短路径,这个之前我看有人提过了,看官方做不做了,,,我个人认为没有什么必要

BitComet制作种子文件时、任务下载完成时,默认都是会计算长效种子特征码和ED2K hash的。

在 BitComet 目前的长效种子机制下,假设 用户A 下载的种子(seedA.torrent)里有2个文件, dir/file1.txt , dir/file2.mp3

用户A 下载完后,他删除了任务,然后他将 dir/file2.mp3 修改为 music/mv1.mp3, 然后自己用 BitComet 做种(seedB.torrent), 长效机制是否会上传数据到 seedA.torrent 的那些用户?

对的,可以正常上传,文件名修改没事,只要文件数据不动,hash不变就行,你可以测试一下,需要文件大于1MB,如果是TXT文件小的话是不生效的

只要文件被包含在任何一个启用了长效上传的任务里,都可以被上传

长效上传的数据分享率 预计哪个版本可以出来?

另外,建议加个类似 eMule 的 Statistics(统计数据) 功能

1.67不做大变动了,等下个版本咯

统计功能在下方那,切换选中就有了,可以看到当前长效上传速度,可进行上传文件数量等等各种内存信息

文件的对应关系是通过 DHT 网络在 BitComet 用户间传递,或者是通过中间服务器来传播?

用的是服务器,不是用户,,你想做成DHT的话,DHT不可靠的。
DHT等你已经花费1个小时成功下完了一个种子,可能都还没连上DHT网络进行搜索到长效。

最理想方式是所有bt軟體多支援長效,個人只能像接力賽一樣,我下完放個幾天,換下一個放個幾天,這樣延續種子生命。資源無限,硬碟有限。而且這種個人分享模式,其實有侵權的行為,不太能大張旗鼓的。
還有很多是可以用正常管道取得,只是代價很高而已,低調點是好事。
真的有點時間的種子,只好拜託人重發了。

热门的种子无论使用什么BT软件、有没有长效种子 都哦能够很快完成下载,重点是依靠服务器提供的文件对应关系 从长远来说是不稳定的。 —— 例如当服务器因某些原因(出问题、被墙、停止运作等)

我认为应该由 BitComet 程序端实现该功能才是正途。