围绕 Bitfield Torrent 的困惑
Confusion around Bitfield Torrent
我对 bittorrent 中的位域消息有点困惑。我注意到下面问题形式的混乱。
- 可选与必需
Bitfield to be sent immediately after the handshaking sequence is
completed
我假设这是强制性的,即在握手之后必须跟随一个位域消息。正确吗?
- 什么时候需要位域?
The bitfield message may only be sent immediately after the
handshaking sequence is completed, and before any other messages are
sent
假设我清楚地阅读了这条消息,尽管它是可选消息。 peer 仍然可以在任何消息之前广播位域消息(如请求、choke、uncoke 等)。正确吗?
- 第一个字节的高位对应片索引0
如果我是正确的,位域代表状态,即对等点是否有给定的部分。
假设我的位域是[1,1,1,1,1,1,1,1,1,1 ..]
。我确定了对等方缺少第 10 块的事实,如果位域看起来像这样 [1,1,0,1,1,1,1,1,1,1 ..]
,则对等方缺少第 3 块。那么第一个字节中的high bit对应的是piece index 0是什么意思。
- 备用位
Spare bits at the end are set to zero
这是什么意思?我的意思是,如果末尾有一点为 0,这并不意味着同行将其视为缺失的部分。为什么要使用备用位。
- 最重要的是位域的用途。
我对此的直觉是,位域可以更轻松地为已知对等方可用的作品找到合适的对等方,但我对此是否正确?
@Encombe
这里是我的位域负载的样子
\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE
I'm assuming this is compulsory i.e after handshake there must follow a bitfield message. Correct?
不,位域消息是可选的,但如果客户端发送它,它必须是握手后的第一条消息。
此外,在任何一方开始发送任何类型的常规消息(包括位域)之前,双方都必须发送完整的握手(即握手序列已完成)信息。
assuming I read this clear although be optional message. peer can still broadcast the bitfield message prior to any message (like request, choke, uncoke etc). correct ?
是的,见上文。如果客户端向其他任何地方发送位域消息,则必须关闭连接。
Assuming that my bitfield is [1,1,1,1,1,1,1,1,1,1 ..]. I establish the fact that the peer has 10th piece missing
没有。我不清楚您的数字是位 (0b1111111111
) 还是字节 (0x01010101010101010101
)。
如果是位(0b11111111
):表示有0到9个
如果是bytes(0x01010101010101010101
):表示有7,15,23,31,39,47,55,63,71,79
if the bitfield look like this [1,1,0,1,1,1,1,1,1,1 ..] the peer has a 3rd piece missing.
不,片段是零索引的。 0b1101111111
:表示第2块缺失。
Then what is the high bit in the first byte corresponds to piece index 0 means.
表示索引为0的片由最左边的位表示。 (bigendian 中的最高有效位。)
. eight bits = one byte
. 0b10000000 = 0x80
. ^
高位设置意味着客户端有块 0
. 0b00000001 = 0x01
. ^
低位设置表示客户端有第 7 块
why is the spare bit used
如果洪流中的片数不能被8整除;在位域的最后一个字节中会有一些位,不代表任何部分。这些位必须设置为零。
位域的字节大小可以这样计算:
size_bitfield = math.ceil( number_of_pieces / 8 )
备用位数为:
spare_bits = 8 * size_bitfield - number_of_pieces
what is the purpose of the bitfield
目的是告诉客户端有哪些片段,以便其他对等方知道它可以请求哪些片段。
我对 bittorrent 中的位域消息有点困惑。我注意到下面问题形式的混乱。
- 可选与必需
Bitfield to be sent immediately after the handshaking sequence is completed
我假设这是强制性的,即在握手之后必须跟随一个位域消息。正确吗?
- 什么时候需要位域?
The bitfield message may only be sent immediately after the handshaking sequence is completed, and before any other messages are sent
假设我清楚地阅读了这条消息,尽管它是可选消息。 peer 仍然可以在任何消息之前广播位域消息(如请求、choke、uncoke 等)。正确吗?
- 第一个字节的高位对应片索引0
如果我是正确的,位域代表状态,即对等点是否有给定的部分。
假设我的位域是[1,1,1,1,1,1,1,1,1,1 ..]
。我确定了对等方缺少第 10 块的事实,如果位域看起来像这样 [1,1,0,1,1,1,1,1,1,1 ..]
,则对等方缺少第 3 块。那么第一个字节中的high bit对应的是piece index 0是什么意思。
- 备用位
Spare bits at the end are set to zero
这是什么意思?我的意思是,如果末尾有一点为 0,这并不意味着同行将其视为缺失的部分。为什么要使用备用位。
- 最重要的是位域的用途。
我对此的直觉是,位域可以更轻松地为已知对等方可用的作品找到合适的对等方,但我对此是否正确?
@Encombe
这里是我的位域负载的样子
\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE
I'm assuming this is compulsory i.e after handshake there must follow a bitfield message. Correct?
不,位域消息是可选的,但如果客户端发送它,它必须是握手后的第一条消息。
此外,在任何一方开始发送任何类型的常规消息(包括位域)之前,双方都必须发送完整的握手(即握手序列已完成)信息。
assuming I read this clear although be optional message. peer can still broadcast the bitfield message prior to any message (like request, choke, uncoke etc). correct ?
是的,见上文。如果客户端向其他任何地方发送位域消息,则必须关闭连接。
Assuming that my bitfield is [1,1,1,1,1,1,1,1,1,1 ..]. I establish the fact that the peer has 10th piece missing
没有。我不清楚您的数字是位 (0b1111111111
) 还是字节 (0x01010101010101010101
)。
如果是位(0b11111111
):表示有0到9个
如果是bytes(0x01010101010101010101
):表示有7,15,23,31,39,47,55,63,71,79
if the bitfield look like this [1,1,0,1,1,1,1,1,1,1 ..] the peer has a 3rd piece missing.
不,片段是零索引的。 0b1101111111
:表示第2块缺失。
Then what is the high bit in the first byte corresponds to piece index 0 means.
表示索引为0的片由最左边的位表示。 (bigendian 中的最高有效位。)
. eight bits = one byte
. 0b10000000 = 0x80
. ^
高位设置意味着客户端有块 0
. 0b00000001 = 0x01
. ^
低位设置表示客户端有第 7 块
why is the spare bit used
如果洪流中的片数不能被8整除;在位域的最后一个字节中会有一些位,不代表任何部分。这些位必须设置为零。
位域的字节大小可以这样计算:
size_bitfield = math.ceil( number_of_pieces / 8 )
备用位数为:
spare_bits = 8 * size_bitfield - number_of_pieces
what is the purpose of the bitfield
目的是告诉客户端有哪些片段,以便其他对等方知道它可以请求哪些片段。