BitTorrent Bitfield Payload Explained
A BitTorrent bitfield payload is a compact binary representation that a peer sends to advertise which pieces of a shared file it has successfully downloaded and verified. This article explains the technical structure of the bitfield message, its role in the peer-to-peer exchange immediately following the handshake, and the precise mathematical process a BitTorrent client uses to map possessed pieces into a serialized byte array.
What is a Bitfield Payload?
In the BitTorrent protocol, files are split into equal-sized chunks
called pieces. Rather than sending individual notifications for every
piece a client already has upon connecting to a peer, the client sends
an optional bitfield message (Message ID 5).
This payload consists of a sequence of bytes where each individual bit
corresponds to a specific piece index: a bit set to 1
indicates possession of that piece, while a bit set to 0
indicates the piece is missing.
Structure of the Bitfield Message
A complete bitfield network packet follows standard
BitTorrent framing:
- Length Prefix (4 bytes): Specifies the total length
of the remaining message (
1 + Xbytes, whereXis the length of the bitfield payload). - Message ID (1 byte): Set to
5to denote a bitfield message. - Payload (
Xbytes): The raw bit array representing piece availability.
Within the payload, piece indices are mapped from left to right (most
significant bit to least significant bit). The first byte contains piece
indices 0 through 7, where the most
significant bit (bit 7) corresponds to piece 0, and the
least significant bit (bit 0) corresponds to piece 7. The
second byte holds piece indices 8 through 15,
and so forth.
How a Client Constructs the Payload
To construct a bitfield payload, a client executes the following steps:
Calculate Byte Array Length:
The total number of bytes needed is calculated by dividing the total number of pieces in the torrent by 8 and rounding up to the nearest integer:
Payload_Length = ceil(Total_Pieces / 8)Initialize the Buffer:
Allocate a zero-filled byte array of sizePayload_Length.Map Pieces to Bits:
For every piece indexithat the client successfully possesses and has verified:- Determine the target byte index:
byte_index = floor(i / 8) - Determine the bit position within that byte:
bit_position = 7 - (i % 8) - Set the bit to
1using a bitwise OR operation:
buffer[byte_index] = buffer[byte_index] | (1 << bit_position)
- Determine the target byte index:
Zero-Pad Spare Bits:
If the total number of pieces is not evenly divisible by 8, the final byte will contain spare bits at the end. According to the BitTorrent specification, all unused trailing bits in the final byte must remain set to0. Any client that sets spare bits to1can have its connection dropped by strict peers.Assemble the Message:
Prepend the 4-byte length prefix (equal to1 + Payload_Length) and the 1-byte message ID (5) to the front of the generated byte array before transmitting it across the network socket.