2017-06-01 46 views
1

我對bittorrent中的位域消息有點混淆。我已經注意到下面問題形式的混亂。Bitfield Torrent周圍的混亂

  1. 可選VS必需

位字段握手序列 完成

後發送立即我假設這是強制性的,即握手後,必須遵循一個位域消息。正確?

  1. 何時期望位域?

位域消息可以在 握手序列完成後,僅被立即發送和任何其它消息之前 發送

假設我閱讀此明確雖然是可選的消息。對方仍然可以在任何消息(如請求,扼流器,解焦等)之前廣播位域消息。正確嗎?

  • 在第一字節中的高位對應於片索引0
  • 如果我正確位字段表示的狀態,即對等體是否具有給定片用它。假設我的位域爲[1,1,1,1,1,1,1,1,1,1 ..]。我建立了這樣一個事實,即同行有第10件遺失,並且如果該位域看起來像這樣[1,1,0,1,1,1,1,1,1,1 ..]對方有第三件遺漏。那麼什麼是高位在第一個字節對應的塊索引0的意思。

    1. 備用在端位

    備用比特被設置爲零

    是什麼意思?我的意思是說,如果有一點在最後,因爲0並不意味着同行有這樣的缺失。爲什麼使用備用位。

    1. 最重要的是位域的目的是什麼。

    我對此的預測是,位域可以更容易地找到一個知道可用於同行的片段的正確對等點,但我對此是否正確?

    @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

    '0xFFFF ... FFFE = 0b1111111111111111 ... 1111111111111110'那個位域有效載荷的意思;有片斷0 - 1126 – Encombe

    +0

    @Encombe是我現在很清楚,我想我一直在想的是正確的。非常感謝您的幫助。 – Ratatouille

    回答

    2

    我假設這是強制性的即握手之後就必須遵循位域的消息。正確?

    不,位域消息是可選的,但是如果客戶端發送它,它必須是握手後的第一條消息。

    此外,同行都必須派出了完整的握手(即握手序列完成),在他們面前的人開始發送任何類型的常規信息,包括位域的消息。

    假設我明白這一點雖然是可選的消息。對方仍然可以在任何消息(如請求,扼流器,解焦等)之前廣播位域消息。正確嗎?

    是的,見上文。如果客戶端在其他地方發送位域消息,則連接必須關閉。

    假設我的位域是[1,1,1,1,1,1,1,1,1,1 ..]。我建立同行中有10件失蹤

    不,這是我不清楚,如果你的號碼是位(0b1111111111)或字節(​​)的事實。

    如果它是比特(0b11111111):這意味着有片0到9

    如果它的字節(​​):這意味着有片7,15,23,31,39,47,55,63,71和79

    如果位域看起來像這樣[1,1,0,1,1,1,1,1,1,1 ..]對等體有第三塊丟失。

    不,零件是零索引的。 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

    什麼是位域的目的

    目的是告訴客戶有什麼樣的東西,所以其他同行知道它可以請求什麼樣的東西。

    +0

    '0b11111111'和'0x0101010101010101010'的解釋。這個'0b11111111'不應該是0到7塊,'0x0101010101010101010'如何代表'7,15,23,31,39,47,55,63,71' – Ratatouille

    +0

    我已經通過Bitfield添加了超過 – Ratatouille

    +0

    的二進制有效載荷' 0b11111111' => 0-7'0b1111111111' => 0-9'0x010101 = 0b000000010000000100000001' => 7,15和23 – Encombe