Gnutella smerovací algoritmus
Obsah
Úvod
Gnutella sa ako názov používa pre označenie softvéru alebo protokolu, ktorý tento softvér využíva. My budeme tento názov používať ako názov siete a smerovacieho algoritmu, ktorý sa v týchto sieťach využíva. Protokol Gnutella je stále vyvíjaný a tu sa mu budeme venovať len okrajovo.
Gnutella bola prvá mainstrímová superponovaná sieť, ktorá je rozšírene používaná. Koncept Gnutelly môžme definovať ako distribuovaný systém pre ukladanie a vyhľadávanie dát. Každý uzol v sieti je súčasne serverom aj klientom. Na pripojenie k sieti klient potrebuje poznať adresu aspoň jedného uzla, ktorý je už pripojený k sieti Ako náhle má klient pripojenie k tomuto uzlu, môže vysielať "Ping", aby našiel adresy ostatných uzlov. Základná myšlienka spočíva v tom, že každý uzol udržuje spojenie s určitým počtom iných uzlov, zvyčajne s piatimi. Pri hľadaní zdroja v sieti klient posiela "Query" správu každému uzlu, s ktorým je spojený. Tieto potom túto správu prepošlú ďalej. Keď je zdroj nájdený, výsledok obsahujúci názov zdroju a jeho adresu je spätne šírený po trase, ktorou prišiel. Počet uzlov, ktoré dostanú "Query" správu môže byť obmedzený pomocou TTL počítadla. Tento typ smerovania je najjednoduchší možný pre superponované siete, spôsobuje však aj problémy.
Tento smerovací algoritmus, podobný záplave, funguje skvelo pre malé a stredné siete. Bolo dokázané, že "cena" hľadania pomocou tohto algoritmu rastie viac než lineárne pri lineárnom raste počtu uzlov. Ak sa vyskytne saturácia uzlov, sieť sa môže stať fragmentovaná. Gnutella je síce jednoduchá, ale ťažko škálovateľná. Sieť Gnutella je zhruba exponenciálne náročná. Každé hľadanie zaberie nd krokov, kde n je TTL parameter a d je počet peerov na uzol. Záplavový algoritmus nie je optimálny pre smerovanie a čoskoro po Gnutelle sa vyvinuli nové algoritmy ako sémantické smerovanie a distribuované hašovacie tabuľky, ktoré boli ďaleko efektívnejšie.
Funkcie Gnutelly
Gnutella pracuje podľa modelu distribuovaného prostredia. Uzol X ponúka súbory, ktoré chce zdieľať s ostatnými uzlami. Iný uzol Y, môže tieto súbory zároveň z uzla X získavať. Obyčajne každý uzol plní funkcie serveru aj klienta.
Sieť Gnutella je tvorená veľkým počtom uzlov distribuovanými po celom svete. Nemá hierarchickú štruktúru, keďže všetky funkcie si sú funkčne rovnaké. Jednou z vlastností uzlu je ponúkaná šírka pásma pre sťahovanie dát. Uzly s väčšou šírkou pásma sú preferované a tvoria tak funkcie hubov alebo funkciu centrálneho pripojenia k sieti. Každý uzol vie len o uzloch s ktorými je priamo spojený. Ostatné uzly sú neviditeľné, pokým na seba neupozornia odpoveďou na "Ping" alebo na "Query" správu. Táto vlastnosť poskytuje vysoký stupeň anonymity. Sieť Gnutella pracuje podľa modelu nazývaného "vírové šírenie". Klient pošle správu uzlu a tento ju rozpošle všetkým uzlom, ktoré sú k nemu pripojené. Takto môže ktokoľvek, kto pozná adresu aspoň jedného pripojeného uzla, vstúpiť do siete. Adresa pozostáva z IP adresy a TCP portu pripojeného uzla.
Uzol, ktorý inicializuje spojenie oznámi svoju prítomnosť zaslaním správy. Uzol, ku ktorému bol pôvodný uzol pripojený a dostal túto správu, rozpošle túto všetkým uzlom s ktorými je v priamom spojení atď.. Každý uzol odpovie na túto správu ďalšou správou obsahujúcou počet a celkovú veľkosť archivovaných súborov.
Gnutella prináša vysoký stupeň stability a nezávislosti. Toto je vidno na nasledujúcom prípade: Predpokladajme, že uzol-1 sa pripája k uzlu-2. Všetko, čo zdieľa uzol-1, môže uzol-2 stiahnuť a naopak. Teraz sa uzol-3 pripojí k uzlu-2 a tento mu podá správu o uzloch, ktoré sú k nemu priamo pripojené. Následne sa uzol-2 odpojí. Sieť pracuje normálne ďalej, keďže uzol-3 už predtým získal alternatívne sieťové adresy od uzla-2. Pripojí sa teda k týmto uzlom a stále je prítomný v sieti.
Typy správ
Správy v sieti Gnutella sú prenášané pomocou TCP protokolu. Každá správa obsahuje nasledovné polia:
- Identifikácia uzla
- Funkcia
- TTL
- Počet hopov
- Dĺžka dátovej časti správy
Funkcia určuje akciu, ktorú má vykonať uzol, ktorý túto správu dostane. Hlavička správy má fixnú dĺžku, dĺžka dátovej časti závisí od funkcie.
Aktuálna verzia Gnutelly operuje s piatimi funkciami na udržanie uzla v sieti, na vyhľadávanie podľa zdroja a sťahovanie dát.
1. Ping funkcia
Je využívaná pri oznamovaní prítomnosti uzla v sieti. Neobsahuje dáta. Keď uzol dostane Ping správu, musí odpovedať Pong správou. Táto oznamuje jeho prítomnosť alebo obsahuje informáciou o uzloch, ktoré pozná.
2. Pong funkcia
Uzol posiela Pong správu ako odpoveď na Ping správu. Dátová časť Pong správy je tvorená z nasledujúcich polí:
- Port
- IP adresu
- Počet zdieľaných súborov
- Počet zdieľaných KB
Je dôležité zdôrazniť, že uzol, keď obdrží takúto správu, môže vytvoriť nové spojenie. Toto mu umožní rozšíriť jeho pole pôsobenia a zároveň aj dá väčšiu stabilitu na udržanie prítomnosti v sieti. Uzol môže odoslať viacero Pong správ ako odpoveď na jednu Ping správu, keďže informuje aj o iných uzloch, ktoré má uložené v cache pamäti.
3. Push funkcia
Je využívaná uzlami, ktoré pristupujú k sieti cez firewall a nemôžu sťahovať dáta umiestnené v uzloch na druhej strane firewallu. Uzol, ktorý dáta vyžaduje, odošle Push správu uzlu, ktorý tieto dáta má s nasledovným formátom dátovej časti správy:
- Index
- IP adresa
- Port
Po prijatí správy, uzol server vytvorí spojenie s uzlom klientom a pošle mu dáta s použitím IP adresy a portu. Odpoveď na Push správu nie je definovaná. Uzol môže spätne poslať dáta alebo neodpovedať na požiadavku.
4. Query funkcia
Je využívaná uzlom pri žiadostiach ďalším uzlom o určité dáta. Dátová časť správy využívaná touto funkciou má dve polia:
- Minimálna rýchlosť potrebná pre sťahovanie
- Vyhľadávacie kritérium premennej dĺžky
Ak uzol dostane túto správu a nezistí žiadnu zhodu vo svojej súborovej štruktúre, nevygeneruje na túto správu odpoveď.
5. Query Hit funkcia
Je používaná ako odpoveď na Query správu. Skladá sa z nasledovných častí:
- Množstvo zásahov alebo zhôd
- Port
- IP adresa pre sťahovanie
- Operačná rýchlosť
- Výsledky
- Identifikátor uzla
Výsledky, ktorých môže byť n, sú štruktúrované ako zoznam z nasledovnou syntaxou:
- Index alebo číslo odpovede
- Veľkosť súboru v KB
- Názov súboru
- Oddeľovač (0x0000)
Uzol pošle v odpovedi svoju identifikáciu, ktorú klient použije ak musí poslať Push správu.
Pravidlá šírenia
P2P model použitý v Gnutelle potrebuje aby uzly mali schopnosť šíriť prijaté správy cez ich otvorené spojenia. Aby mohli fungovať efektívne, berúc do úvahy topológiu, nehierarchiu a existenciu slučiek, musia mať uzly implementované určité pravidlá:
Pravidlo a.
Uzol bude šíriť Ping a Query správy všetkým uzlom, ku ktorým je priamo pripojený, okrem tej od ktorej správu dostal.
Pravidlo b.
Pong, Query Hit a Push správy sa musia šíriť po tej istej ceste, po ktorej sa šírili inicializačné prislúchajúce správy (Ping alebo Query). Toto je možné, lebo pred preposlaním správy uzol prezrie interné tabuľky o smerovaní týchto správ a podľa toho prepošle aj s nimi súvisiace správy.
Pravidlo c.
Uzol zníži hodnotu TTL poľa a zvýši hodnotu Hops poľa, skorej než bude správu ďalej šíriť príslušnými spojeniami. Ak TTL nadobudne nulovú hodnotu je práva zahodená
.Pravidlo d.
Ak uzol obdrží správu s identickou identifikáciou uzla a rovnakou funkciou ako už predtým prijal (v krátkom čase, nie je formálne špecifikovaný), mal by sa vyhnúť jeho šíreniu.
V jednom momente môže byť k sieti pripojených aj tisíce uzlov, ale akcie každého jedeného uzla sú vždy obmedzené len na množstvo vytvorených spojení a v dosahu jeho správ (TTL). Kvôli dynamickosti topológie a existencii dočasných používateľov je možné, že odpoveď na tú samú požiadavku sa zmení časom.
Sťahovanie súborov
Keď uzol obdrží výsledok na predchádzajúcu požiadavku, môže byť zvolený súbor na stiahnutie zo vzdialeného uzla. Súbory sú prijímané priamo bez zásahu medziuzlov a Gnutella siete. Na prenos súborov sa používa HTTP 1.0 protokol. Keď uzol obdrží Query Hit správu, táto obsahuje tieto dáta: IP adresu a port, kde uzol, ktorý obsahuje dáta, je pasívne otvorený, index, veľkosť súboru a názov súboru. Na začatie sťahovania klientský uzol otvorí TCP spojenie so serverovým uzlom na porte obsiahnutom v správe. Následne pomocou GET metódy protokolu http požiada o daný súbor. Metóda GET umožňuje aj funkciu "obnovenia" sťahovania v prípade predchádzajúceho prerušenia sťahovania.
Bibliografia
[1] Gnutella: Distributed system, http://www.unlu.edu.ar/~tyr/TYR-publica/paper-final-gnutella-english-v2.pdf
[2] http://rfc-gnutella.sourceforge.net/index.html
[3] Peer to Peer Routing, http://ntrg.cs.tcd.ie/undergrad/4ba2.05/index.html
[4] Routing Algorithms, http://www.ivs.tu-berlin.de/Lehre/SS04/VS/Routing.pdf