Funkce trackeru a node

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *


Tato stránka používá Akismet k omezení spamu. Podívejte se, jak vaše data z komentářů zpracováváme..