Bitfield Torrent周围的混乱

时间:2017-06-01 13:08:55

标签: bittorrent bit-fields

我对bittorrent中的位域消息有点混淆。我已经注意到下面问题形式的混淆。

  1. 可选vs必需
  2.   

    在握手序列之后立即发送 的位域   完成

    我认为这是强制性的,即在握手之后必须遵循位域信息。正确的吗?

    1. 何时期待bitfield?
    2.   

      位域消息可能只在紧接着之后发送   握手序列已完成,以及任何其他消息之前   发送

      假设我读得很清楚虽然是可选的消息。 peer仍然可以在任何消息之前广播位域消息(如请求,阻塞,解决等)。对吗?

      1. 第一个字节中的高位对应于片段索引0
      2. 如果我正确的位域代表状态,即对等方是否有一个给定的部分。

        假设我的位域是[1,1,1,1,1,1,1,1,1,1 ..]。我确定了对等体丢失了第10个这一事实,如果位域看起来像[1,1,0,1,1,1,1,1,1,1 ..],则对等体缺少第3个部分。那么第一个字节中的高位对应于片段索引0 意味着什么。

        1. 备用位
        2.   

          末尾的备用位设置为零

          这是什么意思?我的意思是如果有一点结尾为0,这并不意味着同伴有那个缺失的一块。为什么使用备用位。

          1. 最重要的是bitfield的目的是什么。
          2. 我对此的预感是,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如果

1 个答案:

答案 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

  

位域的目的是什么

目的是告诉客户端有哪些部分,以便其他同行知道它可以请求的部分。