我对bittorrent中的位域消息有点混淆。我已经注意到下面问题形式的混淆。
在握手序列之后立即发送 的位域 完成
我认为这是强制性的,即在握手之后必须遵循位域信息。正确的吗?
位域消息可能只在紧接着之后发送 握手序列已完成,以及任何其他消息之前 发送
假设我读得很清楚虽然是可选的消息。 peer仍然可以在任何消息之前广播位域消息(如请求,阻塞,解决等)。对吗?
如果我正确的位域代表状态,即对等方是否有一个给定的部分。
假设我的位域是[1,1,1,1,1,1,1,1,1,1 ..]
。我确定了对等体丢失了第10个这一事实,如果位域看起来像[1,1,0,1,1,1,1,1,1,1 ..]
,则对等体缺少第3个部分。那么第一个字节中的高位对应于片段索引0 意味着什么。
末尾的备用位设置为零
这是什么意思?我的意思是如果有一点结尾为0,这并不意味着同伴有那个缺失的一块。为什么使用备用位。
我对此的预感是,bitfield可以更容易地找到合适的同伴,因为我知道同行可以使用它,但我对此是否正确?
@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如果
答案 0 :(得分:3)
我认为这是强制性的,即握手后必须遵循一个位域消息。正确?
不,位域消息是可选的,但如果客户端发送它,它必须是握手后的第一条消息。
此外,在他们中的任何人开始发送任何类型的常规消息(包括位域消息)之前,两个对等方必须已发送完整的握手(即握手序列已完成)。
假设我读得很清楚虽然是可选的消息。 peer仍然可以在任何消息之前广播位域消息(如请求,阻塞,解决等)。对吗?
是的,见上文。如果客户端在其他任何地方发送位域消息,则必须关闭连接。
假设我的位域是[1,1,1,1,1,1,1,1,1,1 ..]。我确定同伴丢失了第10件
没有。如果您的数字是位(0b1111111111
)或字节(0x01010101010101010101
),我不清楚。
如果是位(0b11111111
):这意味着有0到9件
如果是字节(0x01010101010101010101
):这意味着有第7,15,23,31,39,47,55,63,71和79个
如果位域看起来像这样[1,1,0,1,1,1,1,1,1,1 ..],那么同伴就会丢失第3个。
不,碎片是零索引的。 0b1101111111
:表示缺少第2部分。
那么第一个字节中的高位对应于片段索引0 是什么意思。
这意味着索引为0的部分由最左边的位表示。 (bigendian中最重要的一点。)
. eight bits = one byte
. 0b10000000 = 0x80
. ^
高位设置意味着客户端有0位
. 0b00000001 = 0x01
. ^
低位设置意味着客户端有第7个
为什么使用备用位
如果洪流中的碎片数量不能被8整除;在位域的最后一个字节中将有位,不代表任何片段。这些位必须设置为零。
以字节为单位的位域大小可以这样计算:
size_bitfield = math.ceil( number_of_pieces / 8 )
并且备用位数是:
spare_bits = 8 * size_bitfield - number_of_pieces
位域的目的是什么
目的是告诉客户端有哪些部分,以便其他同行知道它可以请求的部分。