|
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.
|