我目前正在尝试在nodeJS中实现一个最小的torrent客户端。
我正在阅读此规范:https://wiki.theory.org/index.php/BitTorrentSpecification
我有2个磁铁URI:
magnet:?xt=urn:btih:633ab5b0cc27218bca2f9fec9b68ae4f7cbf0c5f&dn=dmb2017-05-31.dpa4021.flac16
xt=urn:btih:633ab5b0cc27218bca2f9fec9b68ae4f7cbf0c5f
dn=dmb2017-05-31.dpa4021.flac16
magnet:?xt=urn:btih:9f9165d9a281a9b8e782cd5176bbcc8256fd1871&dn=Ubuntu+16.04.1+LTS+Desktop+64-bit&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969
xt=urn:btih:9f9165d9a281a9b8e782cd5176bbcc8256fd1871
dn=Ubuntu+16.04.1+LTS+Desktop+64-bit
tr=udp://tracker.leechers-paradise.org:6969
tr=udp://zer0day.ch:1337
tr=udp://open.demonii.com:1337
tr=udp://tracker.coppersurfer.tk:6969
tr=udp://exodus.desync.com:6969
根据我的阅读,跟踪器用于查找从中下载数据的对等项。那么如何下载第一个洪流呢?它没有跟踪器。
我如何实际进行此连接?
规范中没有磁链接,并声明跟踪器可以通过HTTP(S)协议使用,但这些显然是UDP。
我对此进行了抨击:
var PORT = 6969 ;
var HOST = 'tracker.leechers-paradise.org';
var dgram = require('dgram');
var message = new Buffer("xt=urn:btih:9f9165d9a281a9b8e782cd5176bbcc8256fd1871");
var client = dgram.createSocket('udp4');
client.on('listening', function () {
var address = client.address();
console.log('UDP Server listening on ' + address.address + ":" + address.port);
});
client.on('message', function (message, remote) {
console.log(remote.address + ':' + remote.port +' - ' + message);
});
client.send(message, 0, message.length, PORT, HOST, function(err, bytes) {
if (err) throw err;
console.log('UDP message sent to ' + HOST +':'+ PORT);
console.log(bytes);
});
显然,这不起作用,但我找不到任何文件可以提供帮助。
答案 0 :(得分:0)
非官方的Wiki.theory.org/BitTorrentSpecification无疑是开始学习BitTorrent协议的最佳场所,但它并不完整。它仅涵盖基础协议和早期开发的扩展。这就是为什么你找不到你需要的所有信息的原因。
自2008年以来,该协议的官方*文件可在BitTorrent.org找到 基本协议的官方版本是简洁而密集的BEP3 - The BitTorrent Protocol Specification。
BEP9 - Extension for Peers to Send Metadata Files中包含磁铁链接 你可以阅读:
如果没有指定跟踪器,客户端应该使用DHT来获取对等体。
DHT在BEP5 - DHT Protocol中指定。
正如您所注意到的,现在跟踪器使用的是BEP15 - UDP Tracker Protocol中指定的UDP。
脚注:* 官方仅表示它由BitTorrentInc运行,而不是它是优越的或唯一使用的源。 BitTorrent协议不受权限管辖。没有客户承诺效忠BEP。该协议是由真实客户的共识形成的。