Tracker
Inicializace
- Načtení dat z .torrentu
- Navázáná session se seedery (přidělení session_id)
- Otevření portu pro leechery
Připojení nového leechera
- Navázání session, získání informací IHAVE, zaslání adresy jednoho seedera
Příjem zpráv
- IHAVE: uložení získaných informací k příslušní session (bitová mapa stažených chunks?)
- INEED: vrátit nějakou adresu leechera/seedera
- U záznamu žádajícího uzlu si pamatovat, které adresy ostatních uzlů mu již byly zaslány (příp. ukládat i informaci o tom, které uzly mají jeho adresu)
- Preferovat málo vytížení leechery. Seedeři mají ještě nižší prioritu.
- TOOFAR – uložit a při vyhledávání zdroje pro nějaký uzel tento vynechat
- NOOP – odpovědět taktéž NOOP a resetovat počítadlo timeoutu session
Spojení TCP
- Zapouzdřující třída.
- Výpadky neřešit a spojení obnovovat, až když chceme něco poslat, nebo umožnit navázání na příslušnou session.
Session timeout nebo BYEBYE
- Ukončení TCP spojení
- Odebrat uzel ze seznamu
- Upravit informaci o referencích na ostatní uzly
Node
Inicializace
- Načtení souboru .torrent
- Načtení stavu souboru
- Kontrola staženého souboru?
- Navázání session s trackerem, odeslání INEED
Hledání dalších zdrojů chunku
- Může běžet několik hledání paralelně (ovšem jen určitý počet chunks dopředu, abychom zbytečně nezískávali infromace, které pak už nebudou aktuální). Požadavky na hledání se budou zařazovat do FIFO fronty
- Dotazy okolním uzlům INEED (u kterých ještě nevíme, že by chunk měli). Pokud v žádné odpovědi IHAVE hledaný chunk nebude, zkusíme se obrátit na tracker pro další adresy uzlů (těm už speciální INEED posílat nemusíme).
Stahování chunku
- Může běžet nekolik paralelně (nezávisle na hledání)
- Udržujeme seznam chunků setříděný podle dostupnosti a zkoušíme stahovat od nejnedostupnějších (ale dostupných). Žádáme postupně od uzlů, od kterých zatím nic nestahujeme (a seeder má nejnižší prioritu).
- U uzlu každá další odpověď NOTNOW ==> zdvojnásobení prodlevy, než umožníme další dotaz jeho směrem.
Session timeout
- Udržujeme seznam IP a počet timeoutů/doba spojení. Pokud je někde překročen threshold, nahlásíme TOOFAR trackeru a odebereme ze seznamu.
Dotažené chunks
- Jednou za čas budeme posílat nové IHAVE trackeru a některým uzlům.
Požadavek na chunk
- GET – vyhovět bez váhání, pokud nejsme přetížení (poslat PUT a dekrementovat prioritu žádajícího uzlu na nulu).
- Pokud je víc požadavků než volných slotů, udržujeme prioritní frontu. Tomu, kdo je ve frontě první, posíláme vždy WAIT, ostatním NOTNOW. V obou případech inkrementujeme prioritu žádajícího uzlu.
Stažený celý soubor
- Budeme si udržovat počet chybějících chunks, abychom měli snadný přehled
- Vyplivneme soubor do cílového umístění
- Odešleme trackeru IHAVE ALL
- Ukončíme session se seedy
This post is also available in: English