<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>Vedant</title>
      <link>https://vednt.me</link>
      <description></description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://vednt.me/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Sat, 28 Feb 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>Peer Wire Protocol for BitTorrent</title>
          <pubDate>Sat, 28 Feb 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://vednt.me/notes/pwp-spec/</link>
          <guid>https://vednt.me/notes/pwp-spec/</guid>
          <description xml:base="https://vednt.me/notes/pwp-spec/">&lt;p&gt;PWP is the TCP-level protocol two BitTorrent peers use to exchange pieces once a connection is established. It sits after the tracker (which hands you a list of peers) and before whatever piece-assembly &#x2F; disk-write logic you have. Everything here is binary, big-endian, over a raw TCP stream.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;ref: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiki.theory.org&#x2F;BitTorrentSpecification&quot;&gt;wiki.theory.org&#x2F;BitTorrentSpecification&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;1-handshake&quot;&gt;1. Handshake&lt;&#x2F;h2&gt;
&lt;p&gt;Before any messages flow, both sides exchange a handshake. It is &lt;strong&gt;not&lt;&#x2F;strong&gt; framed like regular messages - it has its own fixed layout.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #FFFFFF; background-color: #101010;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;pstrlen&amp;gt;&amp;lt;pstr&amp;gt;&amp;lt;reserved&amp;gt;&amp;lt;info_hash&amp;gt;&amp;lt;peer_id&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;timeline&quot;&gt;
    &lt;div class=&quot;timeline-major-ruler&quot;&gt;
        &lt;div&gt;0&lt;&#x2F;div&gt;
        &lt;div&gt;1&lt;&#x2F;div&gt;
        &lt;div&gt;2&lt;&#x2F;div&gt;
        &lt;div&gt;3&lt;&#x2F;div&gt;
    &lt;&#x2F;div&gt;
    &lt;!-- ruler --&gt;
    &lt;div class=&quot;timeline-ruler&quot;&gt;
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;2&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;3&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;4&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;5&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;6&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;7&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;8&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;9&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;2&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;3&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;4&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;5&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;6&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;7&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;8&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;9&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;2&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;3&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;4&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;5&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;6&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;7&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;8&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;9&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
    &lt;&#x2F;div&gt;

    &lt;!-- rows --&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 9;&quot;
                &gt;
                    pstrlen=19
                &lt;&#x2F;div&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment &quot;
                    style=&quot;grid-column: 9 &amp;#x2F; 34;&quot;
                &gt;
                    pstr: &amp;quot;BitTorrent protocol&amp;quot; (19 bytes)
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 34;&quot;
                &gt;
                    ...
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 34;&quot;
                &gt;
                    reserved (8 bytes)
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 34;&quot;
                &gt;
                    ...
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 34;&quot;
                &gt;
                    info_hash (20 bytes)
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 34;&quot;
                &gt;
                    ...
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 34;&quot;
                &gt;
                    peer_id (20 bytes)
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 34;&quot;
                &gt;
                    ...
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    

&lt;&#x2F;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pstrlen&lt;&#x2F;code&gt;     = &lt;code&gt;19&lt;&#x2F;code&gt; (always)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;pstr&lt;&#x2F;code&gt;        = &lt;code&gt;&quot;BitTorrent protocol&quot;&lt;&#x2F;code&gt; (literal ASCII)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;reserved&lt;&#x2F;code&gt;    = 8 zero bytes. extension bits, leave zeroed unless you implement extensions&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;info_hash&lt;&#x2F;code&gt;   = SHA-1 of the bencoded info dict, 20 bytes&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;peer_id&lt;&#x2F;code&gt;     = your client&#x27;s self-assigned 20-byte ID&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Total: &lt;strong&gt;68 bytes&lt;&#x2F;strong&gt;, fixed.&lt;&#x2F;p&gt;
&lt;p&gt;Send yours, read theirs. Validate: &lt;code&gt;pstr&lt;&#x2F;code&gt; must match, &lt;code&gt;info_hash&lt;&#x2F;code&gt; must match what you expect. If either fails, drop the connection.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2-message-framing&quot;&gt;2. Message framing&lt;&#x2F;h2&gt;
&lt;p&gt;All messages after the handshake share one wire format:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #FFFFFF; background-color: #101010;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;length prefix&amp;gt;&amp;lt;message ID&amp;gt;&amp;lt;payload&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;timeline&quot;&gt;
    &lt;div class=&quot;timeline-major-ruler&quot;&gt;
        &lt;div&gt;0&lt;&#x2F;div&gt;
        &lt;div&gt;1&lt;&#x2F;div&gt;
        &lt;div&gt;2&lt;&#x2F;div&gt;
        &lt;div&gt;3&lt;&#x2F;div&gt;
    &lt;&#x2F;div&gt;
    &lt;!-- ruler --&gt;
    &lt;div class=&quot;timeline-ruler&quot;&gt;
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;2&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;3&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;4&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;5&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;6&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;7&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;8&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;9&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;2&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;3&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;4&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;5&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;6&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;7&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;8&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;9&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;2&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;3&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;4&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;5&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;6&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;7&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;8&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;9&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
    &lt;&#x2F;div&gt;

    &lt;!-- rows --&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 34;&quot;
                &gt;
                    length prefix (4 bytes, big-endian uint32)
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 9;&quot;
                &gt;
                    message_id (1 byte)
                &lt;&#x2F;div&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment &quot;
                    style=&quot;grid-column: 9 &amp;#x2F; 34;&quot;
                &gt;
                    payload (length - 1 bytes)
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 34;&quot;
                &gt;
                    ...
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    

&lt;&#x2F;div&gt;
&lt;p&gt;&lt;code&gt;length&lt;&#x2F;code&gt; = bytes that follow = &lt;code&gt;1 (id) + len(payload)&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Parse loop:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #FFFFFF; background-color: #101010;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;read 4 bytes -&amp;gt; decode uint32 -&amp;gt; length&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;if length == 0 -&amp;gt; keep-alive, stop&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;read length bytes -&amp;gt; id = first byte, payload = rest&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;dispatch on id&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Two reads per message, no delimiters.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;3-message-types&quot;&gt;3. Message types&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;ID&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Name&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Payload&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;-&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;keep-alive&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;none&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;0&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;choke&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;none&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;1&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;unchoke&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;none&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;2&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;interested&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;none&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;3&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;not interested&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;none&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;4&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;have&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;piece index&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;5&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;bitfield&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;bitfield bytes&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;6&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;request&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;index, begin, length&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;7&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;piece&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;index, begin, block&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;8&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;cancel&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;index, begin, length&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;3-1-keep-alive&quot;&gt;3.1. keep-alive&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #FFFFFF; background-color: #101010;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;len=0x00000000&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Zero-length frame. No id byte, no payload. Peers send these periodically to hold the TCP connection open. On receive: do nothing, reset your timeout counter. If nothing arrives (including keep-alives) for ~2 min, close the connection.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;3-2-choke-id-0-unchoke-id-1-interested-id-2-not-interested-id-3&quot;&gt;3.2. choke (ID 0) &#x2F; unchoke (ID 1) &#x2F; interested (ID 2) &#x2F; not interested (ID 3)&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #FFFFFF; background-color: #101010;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;len=0x00000001&amp;gt;&amp;lt;id&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;timeline&quot;&gt;
    &lt;div class=&quot;timeline-major-ruler&quot;&gt;
        &lt;div&gt;0&lt;&#x2F;div&gt;
        &lt;div&gt;1&lt;&#x2F;div&gt;
        &lt;div&gt;2&lt;&#x2F;div&gt;
        &lt;div&gt;3&lt;&#x2F;div&gt;
    &lt;&#x2F;div&gt;
    &lt;!-- ruler --&gt;
    &lt;div class=&quot;timeline-ruler&quot;&gt;
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;2&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;3&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;4&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;5&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;6&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;7&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;8&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;9&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;2&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;3&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;4&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;5&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;6&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;7&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;8&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;9&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;2&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;3&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;4&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;5&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;6&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;7&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;8&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;9&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
    &lt;&#x2F;div&gt;

    &lt;!-- rows --&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 34;&quot;
                &gt;
                    length = 0x00000001
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 9;&quot;
                &gt;
                    0x00 | 0x01 | 0x02 | 0x03
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    

&lt;&#x2F;div&gt;
&lt;p&gt;No payload. Four messages, same format.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;3-3-have-id-4&quot;&gt;3.3. have (ID 4)&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #FFFFFF; background-color: #101010;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;len=0x00000005&amp;gt;&amp;lt;id=0x04&amp;gt;&amp;lt;piece index&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;timeline&quot;&gt;
    &lt;div class=&quot;timeline-major-ruler&quot;&gt;
        &lt;div&gt;0&lt;&#x2F;div&gt;
        &lt;div&gt;1&lt;&#x2F;div&gt;
        &lt;div&gt;2&lt;&#x2F;div&gt;
        &lt;div&gt;3&lt;&#x2F;div&gt;
    &lt;&#x2F;div&gt;
    &lt;!-- ruler --&gt;
    &lt;div class=&quot;timeline-ruler&quot;&gt;
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;2&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;3&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;4&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;5&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;6&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;7&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;8&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;9&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;2&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;3&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;4&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;5&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;6&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;7&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;8&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;9&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;2&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;3&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;4&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;5&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;6&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;7&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;8&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;9&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
    &lt;&#x2F;div&gt;

    &lt;!-- rows --&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 34;&quot;
                &gt;
                    length = 0x00000005
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 9;&quot;
                &gt;
                    id=0x04
                &lt;&#x2F;div&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment &quot;
                    style=&quot;grid-column: 9 &amp;#x2F; 34;&quot;
                &gt;
                    piece index (4 bytes)
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    

&lt;&#x2F;div&gt;
&lt;p&gt;Sent after you successfully download and verify a piece. Tells the peer you now have it.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;3-4-bitfield-id-5&quot;&gt;3.4. bitfield (ID 5)&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #FFFFFF; background-color: #101010;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;len=0x00000001+X&amp;gt;&amp;lt;id=0x05&amp;gt;&amp;lt;bitfield&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;timeline&quot;&gt;
    &lt;div class=&quot;timeline-major-ruler&quot;&gt;
        &lt;div&gt;0&lt;&#x2F;div&gt;
        &lt;div&gt;1&lt;&#x2F;div&gt;
        &lt;div&gt;2&lt;&#x2F;div&gt;
        &lt;div&gt;3&lt;&#x2F;div&gt;
    &lt;&#x2F;div&gt;
    &lt;!-- ruler --&gt;
    &lt;div class=&quot;timeline-ruler&quot;&gt;
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;2&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;3&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;4&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;5&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;6&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;7&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;8&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;9&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;2&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;3&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;4&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;5&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;6&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;7&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;8&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;9&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;2&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;3&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;4&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;5&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;6&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;7&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;8&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;9&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
    &lt;&#x2F;div&gt;

    &lt;!-- rows --&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 34;&quot;
                &gt;
                    length = 0x00000001 + X
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 9;&quot;
                &gt;
                    id=0x05
                &lt;&#x2F;div&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment &quot;
                    style=&quot;grid-column: 9 &amp;#x2F; 34;&quot;
                &gt;
                    bitfield (X bytes)
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 34;&quot;
                &gt;
                    ...
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    

&lt;&#x2F;div&gt;
&lt;p&gt;Sent right after the handshake. Declares which pieces the sender already has. One bit per piece, MSB first. Bit &lt;code&gt;i&lt;&#x2F;code&gt; is in byte &lt;code&gt;floor(i&#x2F;8)&lt;&#x2F;code&gt;, at position &lt;code&gt;7 - (i % 8)&lt;&#x2F;code&gt;. Trailing bits (if &lt;code&gt;num_pieces&lt;&#x2F;code&gt; is not a multiple of 8) are zero. X = &lt;code&gt;ceil(num_pieces &#x2F; 8)&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Only sent if you have at least one piece. Optional - a peer with nothing won&#x27;t send it.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;3-5-request-id-6&quot;&gt;3.5. request (ID 6)&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #FFFFFF; background-color: #101010;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;len=0x0000000D&amp;gt;&amp;lt;id=0x06&amp;gt;&amp;lt;index&amp;gt;&amp;lt;begin&amp;gt;&amp;lt;length&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;timeline&quot;&gt;
    &lt;div class=&quot;timeline-major-ruler&quot;&gt;
        &lt;div&gt;0&lt;&#x2F;div&gt;
        &lt;div&gt;1&lt;&#x2F;div&gt;
        &lt;div&gt;2&lt;&#x2F;div&gt;
        &lt;div&gt;3&lt;&#x2F;div&gt;
    &lt;&#x2F;div&gt;
    &lt;!-- ruler --&gt;
    &lt;div class=&quot;timeline-ruler&quot;&gt;
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;2&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;3&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;4&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;5&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;6&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;7&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;8&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;9&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;2&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;3&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;4&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;5&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;6&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;7&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;8&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;9&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;2&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;3&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;4&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;5&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;6&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;7&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;8&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;9&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
    &lt;&#x2F;div&gt;

    &lt;!-- rows --&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 34;&quot;
                &gt;
                    length = 0x0000000D
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 9;&quot;
                &gt;
                    id=0x06
                &lt;&#x2F;div&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment &quot;
                    style=&quot;grid-column: 9 &amp;#x2F; 34;&quot;
                &gt;
                    index (4 bytes)
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 9;&quot;
                &gt;
                    ...
                &lt;&#x2F;div&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment &quot;
                    style=&quot;grid-column: 9 &amp;#x2F; 34;&quot;
                &gt;
                    begin (4 bytes)
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 9;&quot;
                &gt;
                    ...
                &lt;&#x2F;div&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment &quot;
                    style=&quot;grid-column: 9 &amp;#x2F; 34;&quot;
                &gt;
                    length (4 bytes)
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 9;&quot;
                &gt;
                    ...
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    

&lt;&#x2F;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;index&lt;&#x2F;code&gt; - zero-based piece index&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;begin&lt;&#x2F;code&gt; - byte offset within the piece&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;length&lt;&#x2F;code&gt; - block size. conventionally &lt;strong&gt;16 KiB&lt;&#x2F;strong&gt; (&lt;code&gt;16 * 1024&lt;&#x2F;code&gt;). last block of a piece may be smaller&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;You can only send this when the peer has unchoked you (&lt;code&gt;peer_choking == false&lt;&#x2F;code&gt;).&lt;&#x2F;p&gt;
&lt;h3 id=&quot;3-6-piece-id-7&quot;&gt;3.6. piece (ID 7)&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #FFFFFF; background-color: #101010;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;len=0x00000009+X&amp;gt;&amp;lt;id=0x07&amp;gt;&amp;lt;index&amp;gt;&amp;lt;begin&amp;gt;&amp;lt;block&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;timeline&quot;&gt;
    &lt;div class=&quot;timeline-major-ruler&quot;&gt;
        &lt;div&gt;0&lt;&#x2F;div&gt;
        &lt;div&gt;1&lt;&#x2F;div&gt;
        &lt;div&gt;2&lt;&#x2F;div&gt;
        &lt;div&gt;3&lt;&#x2F;div&gt;
    &lt;&#x2F;div&gt;
    &lt;!-- ruler --&gt;
    &lt;div class=&quot;timeline-ruler&quot;&gt;
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;2&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;3&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;4&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;5&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;6&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;7&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;8&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;9&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;2&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;3&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;4&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;5&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;6&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;7&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;8&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;9&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;2&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;3&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;4&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;5&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;6&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;7&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;8&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;9&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
    &lt;&#x2F;div&gt;

    &lt;!-- rows --&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 34;&quot;
                &gt;
                    length = 0x00000009 + X
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 9;&quot;
                &gt;
                    id=0x07
                &lt;&#x2F;div&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment &quot;
                    style=&quot;grid-column: 9 &amp;#x2F; 34;&quot;
                &gt;
                    index (4 bytes)
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 9;&quot;
                &gt;
                    ...
                &lt;&#x2F;div&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment &quot;
                    style=&quot;grid-column: 9 &amp;#x2F; 34;&quot;
                &gt;
                    begin (4 bytes)
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 9;&quot;
                &gt;
                    ...
                &lt;&#x2F;div&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment &quot;
                    style=&quot;grid-column: 9 &amp;#x2F; 34;&quot;
                &gt;
                    block (X bytes)
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 34;&quot;
                &gt;
                    ...
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    

&lt;&#x2F;div&gt;
&lt;p&gt;Response to a &lt;code&gt;request&lt;&#x2F;code&gt;. &lt;code&gt;block&lt;&#x2F;code&gt; is the raw bytes. X = block length.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;3-7-cancel-id-8&quot;&gt;3.7. cancel (ID 8)&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #FFFFFF; background-color: #101010;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;len=0x0000000D&amp;gt;&amp;lt;id=0x08&amp;gt;&amp;lt;index&amp;gt;&amp;lt;begin&amp;gt;&amp;lt;length&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;timeline&quot;&gt;
    &lt;div class=&quot;timeline-major-ruler&quot;&gt;
        &lt;div&gt;0&lt;&#x2F;div&gt;
        &lt;div&gt;1&lt;&#x2F;div&gt;
        &lt;div&gt;2&lt;&#x2F;div&gt;
        &lt;div&gt;3&lt;&#x2F;div&gt;
    &lt;&#x2F;div&gt;
    &lt;!-- ruler --&gt;
    &lt;div class=&quot;timeline-ruler&quot;&gt;
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;2&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;3&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;4&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;5&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;6&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;7&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;8&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;9&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;2&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;3&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;4&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;5&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;6&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;7&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;8&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;9&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;2&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;3&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;4&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;5&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;6&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;7&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;8&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;9&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;0&lt;&#x2F;div&gt;
            
        
            
                &lt;div class=&quot;timeline-tick&quot;&gt;1&lt;&#x2F;div&gt;
            
        
    &lt;&#x2F;div&gt;

    &lt;!-- rows --&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 34;&quot;
                &gt;
                    length = 0x0000000D
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 9;&quot;
                &gt;
                    id=0x08
                &lt;&#x2F;div&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment &quot;
                    style=&quot;grid-column: 9 &amp;#x2F; 34;&quot;
                &gt;
                    index (4 bytes)
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 9;&quot;
                &gt;
                    ...
                &lt;&#x2F;div&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment &quot;
                    style=&quot;grid-column: 9 &amp;#x2F; 34;&quot;
                &gt;
                    begin (4 bytes)
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 9;&quot;
                &gt;
                    ...
                &lt;&#x2F;div&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment &quot;
                    style=&quot;grid-column: 9 &amp;#x2F; 34;&quot;
                &gt;
                    length (4 bytes)
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    
        &lt;div class=&quot;timeline-track&quot;&gt;

            

                
                
                

                
               
                
                    
                

                
                &lt;div
                    class=&quot;timeline-segment first&quot;
                    style=&quot;grid-column: 1 &amp;#x2F; 9;&quot;
                &gt;
                    ...
                &lt;&#x2F;div&gt;

            

        &lt;&#x2F;div&gt;
    

&lt;&#x2F;div&gt;
&lt;p&gt;Same payload as &lt;code&gt;request&lt;&#x2F;code&gt;. Cancels an in-flight block request. Used in end-game mode when the same block has been requested from multiple peers and one already responded.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;4-parsing&quot;&gt;4. Parsing&lt;&#x2F;h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #FFFFFF; background-color: #101010;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;read_message(stream):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    len_buf = read_exact(stream, 4)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    length  = decode_uint32_be(len_buf)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    if length == 0:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        return KeepAlive&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    msg_buf = read_exact(stream, length)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    id      = msg_buf[0]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    payload = msg_buf[1:]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    switch id:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        0 -&amp;gt; Choke&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        1 -&amp;gt; Unchoke&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        2 -&amp;gt; Interested&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        3 -&amp;gt; NotInterested&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        4 -&amp;gt; Have       { index = uint32_be(payload[0:4]) }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        5 -&amp;gt; Bitfield   { bits = payload }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        6 -&amp;gt; Request    { index, begin, length = three uint32_be }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        7 -&amp;gt; Piece      { index, begin = uint32_be; block = payload[8:] }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        8 -&amp;gt; Cancel     { index, begin, length = three uint32_be }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        _ -&amp;gt; error: unknown id&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;read_exact&lt;&#x2F;code&gt; must loop until the full byte count is received - TCP does not guarantee a single read returns everything requested.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;5-serialization&quot;&gt;5. Serialization&lt;&#x2F;h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #FFFFFF; background-color: #101010;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;serialize(msg):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    payload = msg.payload()          &#x2F;&#x2F; empty slice for no-payload messages&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    length  = 1 + len(payload)       &#x2F;&#x2F; id byte + payload&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    buf = uint32_be(length) + [msg.id()] + payload&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    return buf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;serialize_keepalive():&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    return uint32_be(0)              &#x2F;&#x2F; 4 zero bytes, no id&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Every message type exposes &lt;code&gt;id()&lt;&#x2F;code&gt; and &lt;code&gt;payload()&lt;&#x2F;code&gt;. Serialization is uniform - no special cases except keep-alive.&lt;&#x2F;p&gt;
&lt;p&gt;Handshake is serialized separately (fixed layout, not length-prefixed):&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #FFFFFF; background-color: #101010;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;serialize_handshake(info_hash, peer_id):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    buf = [19] + &amp;quot;BitTorrent protocol&amp;quot; + [0]*8 + info_hash + peer_id&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    return buf   &#x2F;&#x2F; 68 bytes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;6-connection-lifecycle&quot;&gt;6. Connection lifecycle&lt;&#x2F;h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #FFFFFF; background-color: #101010;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;client                              peer&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  |                                  |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  |-------- handshake --------------&amp;gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  |&amp;lt;------- handshake ---------------|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  |                                  |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  |&amp;lt;------- bitfield (5) ------------|  peer declares what it has&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  |&amp;lt;------- keep-alive --------------|  may arrive between any messages&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  |                                  |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  |-------- interested (2) ---------&amp;gt;|  we want pieces from them&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  |                                  |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  |&amp;lt;------- unchoke (1) -------------|  peer allows us to request&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  |                                  |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  |-------- request (6) ------------&amp;gt;|  ask for a block&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  |&amp;lt;------- piece (7) ---------------|  receive block data&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  |-------- request (6) ------------&amp;gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  |&amp;lt;------- piece (7) ---------------|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  |         ...                      |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  |-------- have (4) ---------------&amp;gt;|  tell peer we completed a piece&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;State per connection (both directions):&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #FFFFFF; background-color: #101010;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;am_choking      = true   &#x2F;&#x2F; we are choking the peer&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;am_interested   = false  &#x2F;&#x2F; we are not interested in the peer&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;peer_choking    = true   &#x2F;&#x2F; peer is choking us&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;peer_interested = false  &#x2F;&#x2F; peer is not interested in us&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Default on connect: both sides choking, neither interested. Update these as the corresponding messages arrive. Gate &lt;code&gt;request&lt;&#x2F;code&gt; sends on &lt;code&gt;peer_choking == false&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;7-blocks-vs-pieces&quot;&gt;7. Blocks vs pieces&lt;&#x2F;h2&gt;
&lt;p&gt;Pieces (from torrent metadata) are large - 256 KiB, 512 KiB, sometimes more. &lt;code&gt;request&lt;&#x2F;code&gt; and &lt;code&gt;piece&lt;&#x2F;code&gt; messages work at &lt;strong&gt;block&lt;&#x2F;strong&gt; granularity:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;standard block size: &lt;strong&gt;16 KiB&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;last block of a piece: &lt;code&gt;min(16384, remaining_bytes_in_piece)&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;last block of the last piece: may be smaller if total file size is not piece-aligned&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Reassemble received blocks into the full piece, then SHA-1 verify against the hash in the torrent metadata before writing to disk.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;8-implementation-notes&quot;&gt;8. Implementation notes&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Two reads per message&lt;&#x2F;strong&gt; - read the 4-byte length prefix first, then read exactly &lt;code&gt;length&lt;&#x2F;code&gt; bytes for the rest. Use a buffered reader on the raw connection to avoid a syscall per byte.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Block length clamping&lt;&#x2F;strong&gt; - &lt;code&gt;block_length(piece_remaining)&lt;&#x2F;code&gt; returns &lt;code&gt;16384&lt;&#x2F;code&gt; unless &lt;code&gt;piece_remaining &amp;lt; 16384&lt;&#x2F;code&gt;, then returns &lt;code&gt;piece_remaining&lt;&#x2F;code&gt;. Handles tail blocks without special-casing the request loop.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Peer state as four booleans&lt;&#x2F;strong&gt; - &lt;code&gt;am_choking&lt;&#x2F;code&gt;, &lt;code&gt;am_interested&lt;&#x2F;code&gt;, &lt;code&gt;peer_choking&lt;&#x2F;code&gt;, &lt;code&gt;peer_interested&lt;&#x2F;code&gt;. Keep these in sync with arriving messages. Everything else (piece selection, queueing) reads from them.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Hello World!</title>
          <pubDate>Sun, 11 May 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://vednt.me/notes/helloworld/</link>
          <guid>https://vednt.me/notes/helloworld/</guid>
          <description xml:base="https://vednt.me/notes/helloworld/">&lt;p&gt;&lt;br &#x2F;&gt;
first post, just to test if everything is working.&lt;&#x2F;p&gt;
&lt;p&gt;here are a few cool pictures I clicked &amp;lt;⁠(⁠￣ ⁠︶ ⁠￣⁠)⁠&amp;gt;&lt;&#x2F;p&gt;
&lt;br&gt;
&lt;div style=&quot;position: relative; width: 100%;&quot;&gt;
    &lt;img src=&quot;stars.jpeg&quot; style=&quot;width: 100%; object-fit: cover; filter: brightness(5) contrast(1.5) saturate(0.5);&quot; &#x2F;&gt;
    &lt;img src=&quot;16077843.jpeg&quot; style=&quot;position: absolute; inset: 0; width: 100%; object-fit: cover; filter: brightness(5) contrast(1.5) saturate(0.5); opacity: 0; transition: opacity 0.3s;&quot;
        onmouseover=&quot;this.style.opacity=1&quot;
        onmouseout=&quot;this.style.opacity=0&quot;
    &#x2F;&gt; 
&lt;&#x2F;div&gt;
&lt;br&gt;
&lt;div style=&quot;display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px;&quot;&gt;
    &lt;style&gt;
        img {
            width: 100%;
            &#x2F;* aspect-ratio: 3&#x2F;4; *&#x2F;
            object-fit: cover;
        }
    &lt;&#x2F;style&gt;
    &lt;div&gt;&lt;&#x2F;div&gt;
    &lt;img src=&quot;dusk.jpeg&quot; alt=&quot;First Light&quot; title=&quot;First Light&quot; &#x2F;&gt;
    &lt;img src=&quot;tide.jpg&quot; alt=&quot;Horse&quot; title=&quot;just a horse&quot; &#x2F;&gt;
    &lt;div&gt;&lt;&#x2F;div&gt;
    &lt;div&gt;&lt;&#x2F;div&gt;
    &lt;img src=&quot;beacon.jpeg&quot; alt=&quot;Evening Star&quot; title=&quot;Evening Star&quot; &#x2F;&gt;
&lt;&#x2F;div&gt;
&lt;br&gt;
&lt;!-- ## i like stargazing


&lt;div style=&quot;position: relative; width: 100%; aspect-ratio: 3&#x2F;4;&quot;&gt;
    &lt;img src=&quot;stargazing.jpeg&quot; style=&quot;width: 100%; object-fit: cover;&quot; &#x2F;&gt;
    &lt;img src=&quot;constellation.jpeg&quot; style=&quot;position: absolute; inset: 0; width: 100%; object-fit: cover; opacity: 0; transition: opacity 0.3s;&quot;
        onmouseover=&quot;this.style.opacity=1&quot;
        onmouseout=&quot;this.style.opacity=0&quot;
    &#x2F;&gt;
&lt;&#x2F;div&gt; --&gt;
&lt;!--
## canvas html
&lt;div style=&quot;border: 1px solid #000;&quot;&gt;
&lt;canvas id=&quot;myCanvas&quot; width=&quot;300&quot; height=&quot;300&quot;&gt;&lt;&#x2F;canvas&gt;

&lt;script&gt;
  const canvas = document.getElementById(&quot;myCanvas&quot;);
  const ctx = canvas.getContext(&quot;2d&quot;);

  &#x2F;&#x2F; Rectangle
  ctx.fillStyle = &quot;steelblue&quot;;
  ctx.fillRect(20, 20, 100, 60);

  &#x2F;&#x2F; Text
  ctx.fillStyle = &quot;black&quot;;
  ctx.font = &quot;16px Arial&quot;;
  ctx.fillText(&quot;Hello Canvas&quot;, 20, 110);

  ctx.beginPath();
  ctx.arc(150, 150, 50, 0, Math.PI * 2);
  ctx.fillStyle = &quot;orange&quot;;
  ctx.fill();
  ctx.stroke();

  ctx.fillStyle = &quot;red&quot;;
  ctx.fillRect(299, 0, 1, 300);

&lt;&#x2F;script&gt;
&lt;&#x2F;div&gt; --&gt;
</description>
      </item>
    </channel>
</rss>
