Specifikace torrentoidního protokolu

Budeme mít dva základní typy komunikace.

Node ↔ Tracker

  • Spojení může začít kterákoliv strana. Tracker posílá “HELO NODE” a node odpovídá “HELO TRACKER” (nebo v opačném pořadí). Tím je session považována za započatou.
  • Udržování session probíhá pomocí zprávy “NOOP” (druhá strana odpoví stejně).
  • Požadavky na chunks mohou přijít taktéž z obou směrů. K tomu slouží zpráva INEED v jedné z následujících variant:
    • INEED ALL” je žádost na poslání celého seznamu dostupných chunks (v případě, že zasílá tracker) anebo maximálního přípustného seznamu ostatních uzlů (v případě, že zasílá node; co znamená “maximální přípustný”, to si určuje tracker).
    • INEED SOURCES number_of_sources” zasílá node trackerovi a žádá number_of_sources adres dalších uzlů (které ještě nemá). Tracker může nebo nemusí vyhovět.
    • INEED chunks” zasílá node trackerovi a žádá zdroje, které mají konkrétně chunks.
  • chunks je seznam prvků oddělený mezerami, kde prvek je buď id jednoho chunku (celé kladné číslo) anebo “id_fromid_to” celý interval chunks
  • Na žádost INEED odpovídá uzel zprávou IHAVE, a to některou z variant:
    • IHAVE ALL“, tzn. daný uzel je seeder
    • IHAVE NONE“, tzn. uzel je právě začínající leecher
    • IHAVE chunks” (seznam chunks viz. výše)
  • Tracker na INEED odpovídá zprávou “NODES NONE“, pokud žádné dostupné uzly momentálně nevyhovují dotazu, anebo “NODES node_list“, kde node_list je seznam prvků ip:port oddělených mezerami.
  • Node může trackerovi nahlásit, že je pro něj jiný node nedostupný, pomocí zprávy “TOOFAR node_ip“.
  • Oznámení o ukončení session se provádí zprávou “BYEBYE“. Tu smí zaslat node komukoliv a tracker seederovi.
  • V případě nerozpoznané, špatně formulované nebo nevhodné zprávy je session resetována zprávou “BLAHBLAHBLAH

Node ↔ Node

  • Session je zahájena výměnou zpráv “HELO NODE“, udržuje se zprávou “NOOP” a ukončuje “BYEBYE“.
  • Používají se zprávy INEED, IHAVE stejně jako u komunikace s trackerem.
  • Požadavek na stažení konkrétního chunku je “GET chunk_id“, na což může druhá strana odpovědět následujícími způsoby:
    • PUT chunk_data” – samotný přenos.
    • WAIT” – počkat dvě minuty, pokud nepřijde PUT. Pak zkoušet znova.
    • NOTNOW” – druhý node je příliš zaneprázdněn, zkusit později.
  • Nesrozumitelnost komunikace je druhé straně oznámena zprávou “BLAHBLAHBLAH“.

Pravděpodobnost a statistika

Většina níže uvedených materiálů je poněkud zmatečná, nekompletní či zcela nepokrývající/přesahující látku probíranou v předmětu NMAI059 na MFF UK. Pozor, ať se v PaSTi nechytíte.