如何获得对 ut_metadata 件请求的响应? (node.js 比特洪流 BEP 0009)
How to get responses to ut_metadata piece request ? (node.js Bit Torrent BEP 0009)
我正在使用 Node.js 构建一个 Bittorrent 客户端,但无法通过 PWP 元数据扩展 (BEP 0009)
从同行那里获得答案
我从 DHT (BEP 0005)(我宣布的地方)获得对等点,然后使用网络套接字通过 PWP 发送握手和扩展握手。
buildHandshake = (torrent, ext) => { // torrent contains mainly infoHash
const buf = Buffer.alloc(68)
buf.writeUInt8(19, 0)
buf.write('BitTorrent protocol', 1)
if (ext) {
const big = new Uint64BE(1048576)
big.toBuffer().copy(buf, 20)
} else {
buf.writeUInt32BE(0, 20)
buf.writeUInt32BE(0, 24)
}
torrent.infoHashBuffer.copy(buf, 28)
anon.nodeId().copy(buf, 48) // tool that generates a nodeId once.
return buf
}
buildExtRequest = (id, msg) => {
const size = msg.length + 1
const buf = Buffer.alloc(size + 5)
buf.writeUInt32BE(size, 0)
buf.writeUInt8(20, 4)
buf.writeUInt8(id, 5)
msg.copy(buf, 6)
return buf
}
const client = new net.Socket()
client.connect(peer.port, peer.ip, () => {
client.write(buildHandshake(torrent, true))
const extHandshake = bencode.encode({
m: {
ut_metadata: 2,
},
metadata_size: self.metaDataSize, // 0 by default
p: client.localPort,
v: Buffer.from('Hypertube 0.1')
})
client.write(buildExtRequest(0, extHandshake))
})
从这里,我得到握手和扩展的 Hanshake(有时还有位域),然后我需要元数据片段:
const req = bencode.encode({ msg_type: 0, piece: 0 })
// utMetadata is from extended Handshake dictionary m.ut_metadata
client.write(message.buildExtRequest(utMetadata, req))
之后,我再也听不到同行的消息了。
2分钟后没有保持活动状态,连接超时。
有没有人知道为什么我没有得到回复?
如果您像我一样是初学者,可能会不清楚 BitTorrent 协议消息格式。
消息结构始终如下(握手除外):
<len><message>
其中 len 是值 message.length 的 UInt32 大端字节序,
消息 是您发送的除握手之外的任何内容。
例如:
扩展协议块请求:ut_metadata块消息
<len><id><extId><ut_metadata dict>
其中:
- len 是一个 UInt32 big endian of value: size of ()
- Id 是一个值为 20 的 Uint8(它是协议扩展指示符)
- extId 是一个 UInt8。它的值取决于从对端收到的extended handshake(其中给出了ut_metadata交换的extId)
ut_metadata dict 是一个编码字典:
{ 'msg_type': 0, 'piece': 0 }
d8:msg_typei0e5:piecei0ee
(第一行是对象 - 字典 - 第二行是编码后的同一个对象)
msg_type 为 0(它是 BEP 0009 片段的 request 消息指示符请求.
piece 是您请求的片段的索引(0 将是第一片段)
总的来说:
不给 <len>
正确的值将导致消息被同行错误地解释,因此得不到正确的答案,没有得到任何答案并最终关闭连接(由同行或通过你自己消息)
我正在使用 Node.js 构建一个 Bittorrent 客户端,但无法通过 PWP 元数据扩展 (BEP 0009)
从同行那里获得答案我从 DHT (BEP 0005)(我宣布的地方)获得对等点,然后使用网络套接字通过 PWP 发送握手和扩展握手。
buildHandshake = (torrent, ext) => { // torrent contains mainly infoHash
const buf = Buffer.alloc(68)
buf.writeUInt8(19, 0)
buf.write('BitTorrent protocol', 1)
if (ext) {
const big = new Uint64BE(1048576)
big.toBuffer().copy(buf, 20)
} else {
buf.writeUInt32BE(0, 20)
buf.writeUInt32BE(0, 24)
}
torrent.infoHashBuffer.copy(buf, 28)
anon.nodeId().copy(buf, 48) // tool that generates a nodeId once.
return buf
}
buildExtRequest = (id, msg) => {
const size = msg.length + 1
const buf = Buffer.alloc(size + 5)
buf.writeUInt32BE(size, 0)
buf.writeUInt8(20, 4)
buf.writeUInt8(id, 5)
msg.copy(buf, 6)
return buf
}
const client = new net.Socket()
client.connect(peer.port, peer.ip, () => {
client.write(buildHandshake(torrent, true))
const extHandshake = bencode.encode({
m: {
ut_metadata: 2,
},
metadata_size: self.metaDataSize, // 0 by default
p: client.localPort,
v: Buffer.from('Hypertube 0.1')
})
client.write(buildExtRequest(0, extHandshake))
})
从这里,我得到握手和扩展的 Hanshake(有时还有位域),然后我需要元数据片段:
const req = bencode.encode({ msg_type: 0, piece: 0 })
// utMetadata is from extended Handshake dictionary m.ut_metadata
client.write(message.buildExtRequest(utMetadata, req))
之后,我再也听不到同行的消息了。 2分钟后没有保持活动状态,连接超时。
有没有人知道为什么我没有得到回复?
如果您像我一样是初学者,可能会不清楚 BitTorrent 协议消息格式。
消息结构始终如下(握手除外):
<len><message>
其中 len 是值 message.length 的 UInt32 大端字节序, 消息 是您发送的除握手之外的任何内容。
例如:
扩展协议块请求:ut_metadata块消息
<len><id><extId><ut_metadata dict>
其中:
- len 是一个 UInt32 big endian of value: size of ()
- Id 是一个值为 20 的 Uint8(它是协议扩展指示符)
- extId 是一个 UInt8。它的值取决于从对端收到的extended handshake(其中给出了ut_metadata交换的extId)
ut_metadata dict 是一个编码字典:
{ 'msg_type': 0, 'piece': 0 }
d8:msg_typei0e5:piecei0ee
(第一行是对象 - 字典 - 第二行是编码后的同一个对象)
msg_type 为 0(它是 BEP 0009 片段的 request 消息指示符请求.
piece 是您请求的片段的索引(0 将是第一片段)
总的来说:
不给 <len>
正确的值将导致消息被同行错误地解释,因此得不到正确的答案,没有得到任何答案并最终关闭连接(由同行或通过你自己消息)