Začátek
Jak funguje
Tvorba .torrentu
Obsah .torrentu
Komunikace s trackerem
Komunikace mezi klienty
Stahování dat
Provoz
Vylepšení
Zajímavosti
Situace v Čechách
Další p2p sítě
Software
Některé poznatky
Odkazy
Aplikace

Komunikace mezi klienty

Každý klient si musí udržovat informaci o stavu spojení s jiným klientem. Stav těchto spojení může být následující:

  • choked: je-li spojení označeno jako choked, vysílač nechce nic odeslat. Důvodů, kdy klient signalizuje choked je několik. Např. při stahování dat ze seedu (seed nechce nic přijímat),
  • interested: spojení je označeno interested, pokud klient na druhé straně vlastní nějaký kus souboru o který je zájem, jinak je spojení označeno jako not interested.

Klient také uchovává informaci, jak je označeno spojení na druhé straně. Celý seznam tedy vypadá takto:

  • am_choking: klient má spojení označené jako choked,
  • am_interested: klient má spojení označená jako interested,
  • peer_choking: vzdálená strana má spojení označené jako choked,
  • peer_interested: vzdálená strana má spojení označené jako interested.

Klient začíná spojení jako choked a not interested. Tedy: am_choking=1, am_interested=0, peer_choking=1 a peer_interested=0. Blok (část souboru) je stažen klientem pokud má klient nastavené spojení jako interested a peer jako not choking. Blok je uploadován pokud je peer (vzdálená strana) interested a odesílající klient nemá spojení označené jako choked.

Inicializace spojení

Inicializace (handshake) musí být první zpráva, které je klientem odeslána.

Handshake má následující strukturu:

  • pstrlen: délks řetězce pstr v bytech,
  • pstr: identifikátor protokolu (řetězec)
  • reserved: 8 vyhrzených bytů. Každý z bitů nastavuje chování protokolu.
  • info_hash:20 bytový SHA 1 hash info hodnoty z .torrentu
  • peer_id: 20 bytový řetězec obsahující unikátní ID klienta (peer_id).
V původní verzi bittorentu je pstrlen 19 a pstr = "BitTorent protocol".

Konvence kódování peer_id

Existuje několik způsobů, jak zakódovat klienta a jeho verzi do peer_id. Konvence se jmenují podle klientů, které je používají.

Azureus

Ayureus používá: '-',2 znaky pro id klienta, 4 číslo pro verzi, '-', zbytek tvoří náhodná čísla.

Příklad: '-AZ2060-'...

Klienti, kteří používají toto kódování:

Shadow

Shadow používá toto kódování: 1 znak pro identifikaci klienta, 3 čísla pro verzi, '----', zbytek tvoří náhodná čísla.

Příklad: 'S587----'...

Klienti, kteří používají toto kódování:

Zasílané zprávy

Všechny ostatní zprávy jsou zasílany ve formátu:

  • length prefix: prefix určující délku,
  • message id: id zprávy,
  • payload: obsah zprávy.

Všechny celočíselné hodnoty (integer) jsou kódovány na 4 bytech big endian.

Zde je seznam jednotlivých zpráv:

  • keep-alive : <len=0000>
  •                nemá message id ani obsah, zpráva s "nulovou" délkou,
  • choke : <len=0001><id=0>
  • unchoke : <len=0001><id=1>
  • interested : <len=0001><id=2>
  • not interested : <len=0001><id=3>
  • have : <len=0001><id=4><piece index>
  •                piece index: index části, která byla úspěšně stažena,
  • bitfield : <len=0001+X><id=5><bitfield>
  •                tato zpráva může být odeslána pouze okamžitě po inicializační sekvenci (handshake) a před ostatními zprávami. Nemusí být odeslána, pokud klient nevlastní žádné kusy souboru. X je délka bitového pole. Pole reprezentuje kusy, které byly úspěšně staženy. Nejvyšší bit v prvním bytu symbolizuje kus s indexem 0.
  • request : <len=0013><id=6><index><begin><length>
  •                požadavek na blok.
    • index: index kusu souboru,
    • begin: offset v rámci kusu,
    • length: hodnota specifikující požadovanou délku. Hodnota nesmí přesáhnout 2^17 (128k), obvykle je to 2^15(32k).
  • piece : <len=0009+X><id=7><index><begin><block>
    • index: index kusu souboru,
    • begin: offset v rámci kusu,
    • block: blok dat, podmnožina kusu specifikovaného v poli index.
  • cancel : <len=0013><id=8><index><begin><length>
  •      zpráva se používá pro zrušení požadavku na blok. Obsah je stejný jako u zprávy request.

     

    Předchozí Další