sustav ravnopravnih čvorova za razmjenu datoteka

38
–SVEUČILIŠTE U ZAGREBU FAKULTET ORGANIZACIJE I INFORMATIKE V A R A Ž D I N Luka Rajčević SUSTAV RAVNOPRAVNIH ČVOROVA ZA RAZMJENU DATOTEKA ZAVRŠNI RAD Varaždin, 2012.

Upload: luka-rajcevic

Post on 15-Jun-2015

535 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Sustav ravnopravnih čvorova za razmjenu datoteka

–SVEUČILIŠTE U ZAGREBU

FAKULTET ORGANIZACIJE I INFORMATIKE

V A R A Ž D I N

Luka Rajčević

SUSTAV RAVNOPRAVNIH ČVOROVA ZA RAZMJENU DATOTEKA

ZAVRŠNI RAD

Varaždin, 2012.

Page 2: Sustav ravnopravnih čvorova za razmjenu datoteka

SVEUČILIŠTE U ZAGREBU

FAKULTET ORGANIZACIJE I INFORMATIKE

V A R A Ž D I N

Luka Rajčević

38117/09-R

Sustav ravnopravnih čvorova za razmjenu datoteka

ZAVRŠNI RAD

Mentor:

dipl. ing. Nikola Ivković

Varaždin, lipanj 2012.

Page 3: Sustav ravnopravnih čvorova za razmjenu datoteka

I

Sadržaj

1. UVOD .............................................................................................................................................................1

2. P2P TEHNOLOGIJA ....................................................................................................................................3

2.1 UVOD U P2P MREŽE .....................................................................................................................................3 2.2 RAZVOJ P2P MREŽA .....................................................................................................................................4 2.3 PODJELA P2P SUSTAVA ................................................................................................................................6

2.3.1 Decentralizirani P2P sustavi ..............................................................................................................6 2.3.2 Centralizirani P2P sustavi ............................................................................................................... 11 2.3.3 Hibridni P2P sustavi ........................................................................................................................ 14

2.4 ETIČNOST I LEGALNOST ................................................................................................................................. 15

3. APLIKACIJSKO RJEŠENJE ..................................................................................................................... 17

3.1 KORIŠTENE TEHNOLOGIJE .............................................................................................................................. 17 3.2 IMPLEMENTACIJA WCF SERVISA ................................................................................................................... 19 3.3 IMPLEMENTACIJA KLIJENTSKE APLIKACIJE .................................................................................................... 24

3.3.1. Tehnički detalji klijentske aplikacije ..................................................................................................... 24 3.3.2. Grafičko sučelje i opis rada klijentske aplikacije aplikacije.............................................................. 26

4. ZAKLJUČAK .............................................................................................................................................. 34

5. LITERATURA ............................................................................................................................................ 35

Page 4: Sustav ravnopravnih čvorova za razmjenu datoteka

1

1. Uvod

Sustav ravnopravnih čvorova ili možda poznatiji i bliži naziv peer – to – peer (u daljnjem tekstu

p2p) sustav je vrlo popularan način povezivanja sudionika u razmjeni podataka i informacija. Za

razliku od nekih drugih načina povezivanja i komunikacije (npr. klijent – server modela), u

sustavu ravnopravnih čvorova svi sudionici su jednaki, ravnopravni. To znači da nema nekog

glavnog računala (servera) na koji se svi sudionici spajaju i komuniciraju s njime. U sustavu

ravnopravnih čvorova, svaki sudionik je istovremeno i klijent i server. Na taj način se postiže

decentralizacija mreže i prevencija mnogih problema koje centralizirani sustav (klijent - server

model) sa sobom donosi [1]:

Pouzdanost – kada server prestane biti dostupan, nije moguće ostvariti komunikaciju

Skalabilnost – Povećanjem broja korisnika aplikacija mora biti u stanju odgovoriti na

povećani broj upita. Dolazi do potrebe za većim kapacitetima serverskih računala.

Trošak – centralna računala moraju biti snažna (snažni procesori, velika memorija,

mnogo prostora na diskovima), što iziskuje trošak pogotovo kada se govori o većem

broju korisnika

Zagušenje mreže – slabija centralna računala i veliki broj zahtjeva prema istima mogu

dovesti do zagušenja mreže a time i do sporijeg prijenosa podataka pa čak i do pada

samog centralnog računala

„Promet ostvaren peer-to-peer mrežama (procjenjuje se na više od 1.3 petabajta podataka), u

posljednjih 5 godina premašio je promet ostvaren pregledavanjem web stranica i drugim

aktivnostima. Broj sudionika na peer-to-peer mrežama svakodnevno raste.“ [2, str. 4]

Na temelju svih pokazatelja (količine prenesenih podataka, povećanja broja korisnika, povećanja

broja aplikacija za razmjenu podataka itd.) možemo zaključiti kako su P2P sustavi budućnost

interneta, razmjene podataka, umrežavanja i komunikacije općenito. To je jedan od razloga zbog

kojih sam odlučio odabrati ovu temu kao svoj završni rad. P2P sustavi ne samo da su iskoristili

sav potencijal koji su imali te ispunili sva očekivanja koja su pred njih bila postavljena, otišli su

korak dalje te nam učinili gotovo svaki podatak na dohvat ruke. Pojavom Napstera (prvog peer-

to-peer sustava za razmjenu datoteka) dolazi do novog načina za razmjenu podataka, različitog

od svih do tada poznatih široj javnosti. Taj novi način je pokrenuo revoluciju u razmjeni datoteka

među korisnicima. Napster je promjenio arhitekturu učinivši svakog sudionika u komunikaciji

bitnim. Svaki korisnik je bio klijent a u isto vrijeme i server. Taj novi način razmjene datoteka se

Page 5: Sustav ravnopravnih čvorova za razmjenu datoteka

2

jako brzo proširio računalnim svijetom te su se ubrzo počele pojavljivati mnoge druge aplikacije

koje su omogućavale razmjenu datoteka. Danas, 13 godina nakon Napstera postoji na desetke

iznimno kvalitetnih aplikacija za razmjenu datoteka. Između ostalih valja spomenuti torrent

klijente (utorrent, bittorrent, azureus), Limewire, eMule, Shareazu itd. O samoj povijesti razvoja

P2P aplikacija će također biti govora u ovome radu.

Ipak, nije sve „ružičasto“ u svijetu P2P aplikacija. Postoji veliki broj rasprava o pitanjima

legalnosti i etičnosti besplatne razmjene podataka među korisnicima. Svakodnevno se pokreću

nove tužbe i parnice protiv web stranica koje podržavaju razmjenu podataka (najpoznatiji

primjeri se odnose na tužbe protiv torrent trackera – web stranica koje koordiniraju P2P

razmjenu datoteka i omogućavaju preuzimanje .torrent datoteka koje sadrže popis korisnika od

kojih se može preuzeti određena datoteka kao i korisnika koji upravo preuzimaju datoteku [3]).

Sami spomen na P2P sustave i/ili aplikacije aludira na nešto negativno, nelegalno, a mnogo puta

i nešto loše, no s druge strane postoji i ogroman broj pobornika upravo ovakvog načina razmjene

datoteka.

U ovom završnom radu ću pokušati opisati P2P mreže, njihov nastanak, svrhu te način

distribucije datoteka. Biti će govora o vrstama P2P mreža, načinima povezivanja te

karakteristikama svakog od načina. Biti će govora i o trenutno najpoznatijim aplikacijama za

razmjenu podataka i načinu na koji one ostvaruju razmjenu te naposlijetku ću reći nešto o temi

koje sam se ukratko dotaknuo u uvodu a to je etičnost i legalnost P2P razmjene datoteka. To je

samo jedan dio mog završnog rada. U drugom dijelu će biti govora o aplikaciji za razmjenu

datoteka preko koju sam izradio koristeći P2P principe i arhitekturu. Reći ću nešto o

tehnologijama koje sam koristio za izradu aplikacije, prikazati ću način na koji se razmjena

datoteka implementirala, komentirati ću najbitnije dijelove programskog koda koji ostvaruju

komunikaciju i sve to popratiti slikama aplikacije uz detaljne opise svih funkcionalnosti.

Page 6: Sustav ravnopravnih čvorova za razmjenu datoteka

3

2. P2P tehnologija

2.1 Uvod u P2P mreže

„Sustav ravnopravnih čvorova sustav podrazumijeva umrežavanje i komunikaciju računala

na način da ne postoji centralno računalo na koje se svi ostali spajaju, nego je svako računalo

„inteligentna i ravnopravna stanica u mreži sposobna pronaći druga računala i izravno s njima

komunicirati, bez potrebe autorizacije na nekom centralnom poslužitelju“. [4, str. 3]. Ovakvi

sustavi, koji za svoj rad ne koriste poslužitelje, su poznati i pod nazivom „čisti P2P sustavi“.

Osim njih postoje i P2P sustavi koji koriste i poslužitelje za svoj rad, ali glavninu komunikacije

obavljaju po P2P principu.

P2P sustav možemo promatrati i u odnosu na model komunikacije u stvarnom životu. Kada ljudi

žele komunicirati s nekim, čine to, najčešće, direktno. Kada nešto trebaju, upitaju svoje prijatelje

(čvorove) koji imm mogu dati potrebne informacije ili ih mogu uputiti na nekoga tko bi mogao

imati informacije koje su im potrebne. P2P tehnologija nam omogućava da takav način

komunikacije prenesemo u računalni svijet i nastavimo komunicirati s drugima koristeći računala

na isti način kako to činimo i u stvarnom svijetu.

U P2P mrežama svi sudionici (čvorovi) se nalaze na istoj razini i, možemo to tako reći, jednako

su važni u ostvarivanju razmjene podataka. Najbitniji aspekti P2P sustava i mreža su navedeni u

nastavku[4, str.3]:

1. Simetričnost uloga – Svaki sudionik u sustavu obično ima ulogu i servera i klijenta.

Ustvari, svaki čvor na svoje računalo instalira aplikaciju koja u sebi sadrži kod i za klijent

i za server. Kao takav, svaki čvor može postavljati upite drugim čvorovima u sustavu

(kao klijent), ali i odgovarati na upite koje mu postavljaju drugi čvorovi (kao server).

2. Skalabilnost – Za razliku od tradicionalnih distribuiranih sustava i drugih arhitektura,

P2P sustavi se mogu skalirati na tisuće čvorova. Kao rezultat toga, oni mogu koristiti

snagu svih računala zajedno bez potpune povezanosti svih čvorova (svakog čvora sa

svakim drugim). Za taj problem postoji više različitih načina otkrivanja drugih čvorova u

mreži.

3. Heterogenost – P2P sustav može biti heterogen u smislu hardvera koji čvorovi koriste.

Čvor može biti jako sporo računalo sa zastarjelim hardverom, ali može biti i neko

superračunalo. P2P ne pravi razliku između njih.

Page 7: Sustav ravnopravnih čvorova za razmjenu datoteka

4

4. Distribuirana kontrola – U svojoj najstrožoj definiciji, P2P zahtjeva da sve bude

decentralizirano. U idealnom slučaju ne bi smjela postojati niti jedna centralizirana

struktura (središnji server i sl.).

5. Dinamičnost – P2P aplikacije vrlo često rade u jako dinamičnoj okolini. Topologija P2P

sustava se može mijenjati jako brzo zbog dolaska novih čvorova ili odlaska postojećih.

Sadržaj i količina datoteka u P2P sustavima se također mijenja ovisno o čvorovima koji

su u nekom trenutku spojeni na sustav.

2.2 Razvoj P2P mreža

Iako se u uvodu spominje Napster kao začetnik P2P sustava, to nije potpuno točno. Napster je taj

koji je pokrenuo revoluciju i radi kojeg se P2P aplikacije danas nalaze u samom vrhu najčešće

korištenih aplikacija, ali sama povijest P2P sustava seže u same početke razvoja interneta, u doba

ARPANET-a.

„ARPANET mreža je bila dizajnirana za dijeljenje računalnih resursa i dokumenata između

raznih američkih istraživačkih ustanova. Taj početni sustav nije bio klijent – server sustav. Svaki

korisnik je bio ravnopravno tretiran. Upravo radi toga bi se ova mreža mogla nazvati i P2P

mrežom. 1979. je razvijen Usenet protokol. To je bila aplikacija vezana za interesne grupe

(newsgroups). Imala je neka svojstva P2P mreža iako je ustvari bila obična klijent – server

aplikacija. Devedesetih godina dolazi do naglog razvoja mreža pojavom WWW-a, emaila i

streaminga. I dalje je osnova komuniciranja bila klijent - server arhitektura, do pojave

Napstera.“[6]

Razvoj P2P sustava se okvirno može podijeliti na 3 razdoblja, na 3 osnovne generacije.

a) Prva generacija klijenata - centralizirana

Oko 1999. godine, dolazi do pojave prve generacije P2P aplikacija. To su bili klijenti koji

nisu bili dovoljno samostalni da dijele podatke bez nekog središnjeg entiteta. Radi toga se

nazivaju centralizirani. Postojao je središnji poslužitelj na kojeg su se svi korisnici spajali i sa

kojeg su dobivali popis svih drugih korisnika i datoteka koje su oni imali. Bitna značajka ove

generacije je ta što su kućna računala prvi put bila nešto više od običnih konzumatora

sadržaja. Postala su aktivni sudionik u razmjeni, bitan kotačić u sveopćem razvoju P2P-a.

Najpoznatiji, a ujedno i prvi takav klijent je bio Napster. On je bio centralizirana aplikacija

za dijeljenje glazbenih datoteka među korisnicima.

Page 8: Sustav ravnopravnih čvorova za razmjenu datoteka

5

b) Druga generacija klijenata – decentralizirana

Nakon prve generacije i njene centralizacije sve više se pokušava maknuti od tog koncepta

poslužitelja te nastaju aplikacije kojima se sadržaj dijeli bez prisustva ikakvog središnjeg

računala. Njihove osobine su te da svi čvorovi imaju jednake mogućnosti i obaveze prema

drugim čvorovima, nema centralnog poslužitelja na kojemu se nalaze metapodaci o drugim

korisnicima itd. Najpoznatiji predstavnik druge generacije P2P mreža je svakako Gnutella.

Gnutella je sa svojim emitiranjem (broadcasting) napravila priličan iskorak u odnosu na do

tada korištene sustave. Za korištenje Gnutelle nije bio potreban poslužitelj nego se svaki čvor

morao u određenom vremenskom intervalu „javljati“ susjednim čvorovima da je prisutan.

Pretraga podataka se vršila na sličan način, na mrežu se emitirala poruka o traženom podatku

svim susjednim čvorovima. Oni su na tu poruku odgovarali ukoliko posjeduju traženi

podatak, i proslijeđivali ju dalje svojim susjednim čvorovima. Na taj način se jako brzo

pretraživala mreža.

c) Treća generacija klijenata

Trenutne P2P mreže su izgrađene na optimiziranim verzijama prethodnih mreža, mreža iz

prethodnih generacija. Uz optimizaciju, iskorištene su sve dobre stvari svake od prethodnih

generacija. Tako trenutno postoje 2 tipa P2P mreža[7]:

Friend to Friend – mreža koja je definirana stupnjem poznavanja i odnosa između

korisnika. Korisnici ovise o dozvolama drugih korisnika za pristup podacima.

Primjeri ovakvih mreža su Metaner, WASTE i MUTE

Anonymous – slično kao u prvoj i drugoj generaciji P2P mreža, korisnici su

anonimni i međusobno mogu dijeliti datoteke bez nekih ograničenja. Primjeri

mreža su: GNUnet, Entropy, Freenet...

Page 9: Sustav ravnopravnih čvorova za razmjenu datoteka

6

2.3 Podjela P2P sustava

Najjednostavniji način podjele (gledajući aktualne P2P aplikacije i sustave) je onaj na dvije

kategorije:

1. Centralizirane P2P sustave i

2. Decentralizirane P2P sustave

Osim ovih osnovnih kategorija, često se dodaje još jedna a to je

3. Hibridni P2P sustav

Hibridni P2P sustav kombinira arhitekturu centraliziranog i decentraliziranog sustava kako bi što

bolje iskoristio sve prednosti jedne i druge arhitekture. U nastavku će biti riječi o svakoj od ovih

kategorija.

2.3.1 Decentralizirani P2P sustavi

U decentraliziranim P2P sustavima čvorovi imaju jednaka prava i obveze. Na taj način nijedan

čvor nije superioran drugom. Svaki čvor ima samo djelomičan pregled P2P mreže i nudi podatke

ili servise koji odgovaraju ili su potrebni samo nekim upitima i čvorovima. Upravo zbog toga

lociranje drugih čvorova koji nude podatke koji su nam potrebni je kritični problem ovakvih

sustava. Prednosti ovakvih sustava su prilično očite:

a) Ne postoji središnja točka sustava te je tako otežano i rušenje samog sustava (ako jedan

čvor padne sustav nastavlja s radm kao da se ništa nije ni dogodilo)

b) Ranije navedene prednosti P2P sustava (kao npr. visoke performanse, skalabilnost,

robusnost) dolaze do izražaja kod ovog tipa P2P sustava

Slika 1: Podjela P2P sustava

Page 10: Sustav ravnopravnih čvorova za razmjenu datoteka

7

Slika 2: Decentralizirani P2P sustavi

U potpuno decentraliziranoj arhitekturi, ne postoji centralizirani server niti drugi „istaknutiji“

član mreže (superčvor) koji bi koordinirao svim ostalim čvorovima i upravljao operacijama

među čvorovima. Sustav može neometano raditi i prilikom priključivanja novih čvorova ili

odlaska postojećih. Nekoliko postojećih P2P sustava pripadaju ovoj kategoriji, kao npr. Gnutella,

FreeNet, FreeHaven, Chord itd. Potpuno decentralizirani sustavi se mogu podijeliti na dvije

podkategorije:

1. Nestrukturirani P2P sustavi

2. Strukturirani P2P sustavi

Podjela je nastala na temelju strukture mreže, tj. povezanosti strukture mreže s čvorovima koji se

u njoj nalaze.

U nestrukturiranim P2P sustavima sadržaj koji se nalazi na svakom čvoru nema veze sa

strukturom mreže u kojoj se čvor nalazi. Jednostavnije rečeno, svaki čvor sam bira sadržaj koji

će spremiti na svoje računalo. Ako pošaljemo upit za nekom datotekom u ovakvom tipu mreže,

jako teško je znati točnu lokaciju gdje bi se ta datoteka trebala nalaziti. Upravo zbog toga,

potrebno je pretražiti sve ili određene podskupove čvorova u mreži. Obično je potrebno

pregledati puno čvorova kako bi se pronašli potrebni podaci. Većina nestrukturianih P2P sustava

je prihvatila emitiranje kao način pretrage mreže i slanja upita u mreži. U takvom načinu

pretrage upit se odašilje svim čvorovima s kojima je čvor povezan. Ukoliko oni sadrže datoteku

koja se traži, oni šalju odgovor čvoru od kojeg su dobili upit. Ukoliko to nije slučaj, čvorovi

proslijeđuju upit novim čvorovima te se na taj način pretražuje mreža. Na ovaj način je pretraga

mreže prilično brza i jednostavna, ali s druge strane ima i svoje nedostatke. Jedan od glavnih

nedostataka je i zagušenje mreže. Pošto se može dogoditi da veliki broj čvorova u istom trenu

traži određenu datoteku, broj upita koji se šalju u mreži može postati jako velik, a svakim novim

Page 11: Sustav ravnopravnih čvorova za razmjenu datoteka

8

upitom se povećava. Najpoznatiji alat koji koristi ovakav način pretrage je Gnutella. Ona koristi

svoju inačicu emitiranja koja se razlikuje od standardnih načina. Kod Gnutelle se zahtjev ne šalje

beskonačno dugo svim susjedima pojedinog čvora nego se takvo stanje vrši u vrlo ograničenom

broju koraka – 7. Sa tako dozvoljenim brojem koraka postoji vrlo velika vjerojatnost da će

nekakav zahtjev biti pozitivno obrađen bez da pretjerano zakrčava mrežu.

Neke od osnovnih karakteristika nestrukturiranog P2P sustava su:

Jednostavnost – protokol iza cijele mreže je vrlo jednostavan

Generira se veliki mrežni promet prilikom pretraživanja

Odličan za pronalaženje podataka koji su replicirani na velikom broju peerova, ali

vrlo loše za podatke pohranjene na malome broju peerova (pogotovo ako su udaljeni

od nas veći broj „koraka“)

Ne postoji jedna točka raspada. Ukoliko jedan čvor propadne, ostali čvorovi su

dovoljno „inteligentni„ da to shvate i povežu se jedni na druge.

Strukturirani sustavi se razlikuju od gore opisanih decentraliziranih po smještaju datoteka. Kod

njih je topologija mreže usko kontrolirana. Postoji točno određeni mehanizam za određivanje

lokacije podataka u mreži, tj. podaci su spremljeni na točno određene lokacije. Čvorovi rade

skupa kako bi održali strukturu mreže usprkos dinamičnosti sustava (dinamičkog spajanja i

odspajanja korisnika). Postoji više načina za postizanje strukture mreže, npr. korištenjem hash

funkcija (recimo SHA-1) na imenu podatka kao i imenu čvora, podaci se postavljaju na čvorove

čija je hash vrijednost numerički blizu onoj od podatka. Na taj način se ostvaruje mapiranje

između podataka i čvorova. Slanjem upita u ovakav tip mreže, lokacija podatka koji se traži

može biti određena jako brzo i to bez potrebe za slanjem velikog broja upita kao kod emitiranja.

Strukturirani P2P sustav najčešće se zasniva na ideji DHT-a (Distribuirane hash tablice). Hash

tablica je struktura podataka koja se sastoji od ključa i vrijednosti. DHT ima dvije osnovne

metode:

put (k,d) – metoda za pridruživanje jedinstvenog ključa k identifikatoru d.

get(k) – metoda za dohvaćanje identifikatora iz poznatog ključa

Glavni predstavnici zasnovani na DHT-u su Chord i CAN. Chord je jedan od prvih koji je počeo

koristiti DHT. [5]

Neka od osnovnih svojstava strukturiranih P2P sustava su činjenica da sustav:

garantira pronalaženje podataka u O(log n) koraka (gdje je n broj čvorova u mreži),

što je bolje nego kod nestrukturiranih sustava.

Ima povećanu cijenu objavljivanja novog podatka u odnosu na nestrukturirane P2P

sustave

Page 12: Sustav ravnopravnih čvorova za razmjenu datoteka

9

Održava dodatne strukture podataka (tablica usmjeravanja) radi usmjeravanja upita

prema čvorovima koji pohranjuju tražene podatke.

Gnutella

Najpoznatiji primjer decentraliziranog P2P sustava je zasigurno Gnutella. Gnutela je potpuno

decentraliziran sustav. Nema središnjeg entiteta koji bi bio zadužen za organizaciju mreže niti

postoji diskriminacija između klijenta i poslužitelja. Čvorovi u mreži se spajaju jedan na drugi

direktno uz pomoć posebne aplikacije. Gnutella mreža se širi spajanjem novih čvorova a isto

tako se i smanjuje odlaskom postojećih. To konstantno odlaženje i dolaženje novih čvorova

stvara dinamičku mrežu sa varijabilnim brojem članova. Upravo zato su spajanje i odlazak s

mreže među najbitnijim operacijama Gnutelle (uz pretraživanje i preuzimanje podataka).

„Kada se čvor spoji na Gnutella mrežu šalje tzv. „PING“ poruku kako bi objavio svoju

prisutnost. „PING“ poruka se prosljeđuje svim ostalim čvorovima emitiranjem. Kada neki čvor

primi „PING“ poruku, on je dužan odgovoriti tzv. „PONG“ porukom koja označava da je čvor

svjestan prisutnosti novopridošlog čvora. Iz „PONG“ poruke, novopridošli čvor može dobiti

informacije o čvorovima i uspostaviti vlastito „susjedstvo“ s nekima od njih. Kada čvor odlazi s

mreže nije potrebno obavještavati susjede. Također, svaki čvor je dužan u regularnim

vremenskim intervalima slati svojim susjedima „PING“ poruke kako bi provjerio jesu li oni još

prisutni na mreži. Ako čvor ne primi odgovor, smatra se da je određeni čvor napustio mrežu i

osvježava se lista susjednih čvorova.

O pretraživanju mreže u Gnutelli smo već nešto rekli (emitiranje) ali je bitno dodati još neke

stvari. Kada čvor želi pronaći određeni podatak on šalje „lookup“ poruku susjednim čvorovima.

Susjedni čvorovi šalju tu poruku svojim susjedima itd. Oni čvorovi koji sadrže traženi podatak

odgovaraju sa „hit“ porukom koja se šalje natrag putem kojim je „lookup“ poruka išla“.[4,

str.22]

Slika 3: Mehanizam pretraživanja kod Gnutelle

Page 13: Sustav ravnopravnih čvorova za razmjenu datoteka

10

Slika 3. prikazuje jednostavan primjer pretraživanja mreže u Gnutelli. Recimo da čvor A želi

neki podatak koji imaju samo čvorovi D i H. On će poslati „lookup“ poruku svojim susjednom

čvorovima (B, E i F). Oni će taj upit slati dalje drugim čvorovima sve dok svi čvorovi nisu

ispitani. Oni čvorovi koji sadrže traženi podatak (D i H) će odgovoriti čvoru A sa „hit“ porukom

te se na temelju te poruke čvor A može povezati sa čvorovima D i H.

Svojstva Gnutella mreže:

1. Skalabilnost – emitiranje kao mehanizam pretraživanja je „dvosjekli mač“. S jedne

strane, pošto svaki upit može biti poslan svim čvorovima u mreži u kratkom vremenu,

Gnutella je snažna u otkrivanju potencijalnih čvorova i rezultata. Međutim, spajanjem

više čvorova u mrežu i konstantnim slanjem upita drugim čvorovima mreža se može

zakrčiti. Upravo zbog toga je skalabilnost veliki problem ove mreže.

2. Samoorganizacija – Kada se čvor spoji na Gnutella mrežu to je kao kad osoba dolazi u

novu okolinu. U početku nezna tko su mu susjedni čvorovi ali kako vrijeme prolazi,

upoznaje okolinu i čvorove oko sebe. Isto tako stvara i veze s susjednim čvorovima, iako

one nisu trajne. Kako bi osigurao da će njegovi upiti biti odgovoreni što brže i uspješnije,

čvor sam mora odlučiti koje nove veze stvoriti a koje postojeće prekinuti. Naravno, čvor

pokušava održati veze s drugim čvorovima koji su mu već odgovorili na „PING“ poruke,

ali također i s onima koji imaju veliku propusnost.

3. Anonimnost – Gnutella je sustav sa visokim stupnjem anonimnosti. Koristi emitiranje

poruka kako bi dostavilo upit svima u mreži. Slanje poruka se temelji na tablicama

usmjeravanja Gnutellinih čvorova a ne na IP adresama pojedinog čvora. Na taj način nije

moguće otkriti tko točno traži određeni podatak sve do trenutka kad se čvor želi direktno

spojiti s drugim čvorom radi razmjene. Tada se im međusobno vidljive IP adrese i

anonimnost je narušena.

4. Dostupnost – pošto je Gnutella prilično dinamična mreža i čvorovi se mogu spajati i

odspajati bez ikakvog upozorenja, i pošto nema nekog mehanizma za provjeru

dostupnosti, ista nije garantirana. Nije moguće garantirati da će upiti koji su poslani biti

odgovoreni isto kao niti da će podatak koji se započeo preuzimati biti preuzet do kraja.

Kada preuzimanje propadne jedini način je pokrenuti novo od drugog čvora.

Page 14: Sustav ravnopravnih čvorova za razmjenu datoteka

11

2.3.2 Centralizirani P2P sustavi

Centralizirani P2P sustavi kombiniraju mogućnosti i centraliziranih i decentraliziranih

arhitektura. Baš kao i kod klijent - server arhitekture postoji jedan ili više središnjih servera koji

pomažu čvorovima u pronalasku željenih podataka. Kako bi locirao podatke čvor šalje upit

centralnom računalu. Međutim, kao i kod decentraliziranog sustava, jednom kada čvor dobije

informaciju o tome gdje se nalazi podatak koji mu treba, on može direktno komunicirati s

drugim čvorovima (bez potrebe za serverom).

Za razliku od decentralizirane P2P mreže u kojoj su svi čvorovi bili jednaki i nije bilo razlike

između njih kao ni posebnih uloga nekog čvora, kod centraliziranih je situacija drukčija. U

centraliziranom P2P sustavu se nasljeđuju neki koncepti iz klijent-server arhitekture. Točnije,

postoji jedan poslužitelj. Taj poslužitelj upravlja s metapodacima o datotekama koje čvorovi

dijele u mreži. Svaki upit koji se šalje je prvo usmjeren prema centralnom računalu koje vraća

popis čvorova koji imaju određeni podatak. Nakon toga čvor može direktno komunicirati i

preuzeti podatke koji su mu potrebni. Ukratko rečeno, ono što centralizirani sustav donosi sa

sobom je:

a) Ubrzanje procesa pronalaska resursa – šalje se samo jedan upit i to centralnom računalu

koje sadrži podatke o svim čvorovima

b) Garancija pronalaska svih čvorova koji sadrže traženi podatak – kako se na serveru

nalaze svi čvorovi, može se garantirati da će svi oni koji imaju traženi podatak biti

pronađeni.

c) Jednostavnije održavanje, organizacija i administracija sustava uz pomoć centralnog

servera

Slika 4: Centralizirani P2P sustav (1)

Page 15: Sustav ravnopravnih čvorova za razmjenu datoteka

12

Slika 5: Centralizirani P2P sustav (2)

Na slici 5. možemo vidjeti skicu centraliziranog P2P sustava. Recimo da čvor A želi pronaći

određeni podatak koji imaju samo čvorovi C i B. Čvor A će poslati upit centralnom serveru.

Server će obraditi upit i čvoru A vratiti popis svih čvorova u mreži koji imaju traženi podatak.

Nakon toga čvor A može direktno komunicirati sa čvorovima iz dobivenog popisa.

Jedan od najpoznatijih a definitivno jedan od prvih centraliziraniih P2P sustava je bio Napster. U

Napsteru, svaki čvor je pridodavao sadržaj. Svaki čvor je svoju osobnu kolekciju glazbe dijelio

svim ostalim čvorovima u mreži. Kako bi korisnici mogli locirati glazbene datoteke, Napster je

koristio centralizirani server u kojemu su bile premljene lokacije čvorova koji su bili vlasnici

podataka. Općenito, Napster je pružao tri osnovne funkcije: pretraživanje, razmjenu podataka i

IRC (čavrljanje). Za pretraživanje se koristio centralni poslužitelj na već objašnjen način.

Razmjena podataka se obavljala bez prisustva poslužitelja i bez korištenja njegovog kapaciteta i

diskovnog prostora. Najjednostavnija razmjena korištenjem Napstera podijeljena je na tri glavne

faze:

1.) Spajanje na Napster – korisnik je bio obavezan spojiti se na centralni poslužitelj i obaviti

proces registracije

Page 16: Sustav ravnopravnih čvorova za razmjenu datoteka

13

2.) Otkrivanje podataka – vršeno je slanjem „lookup“ poruke prema centralnom poslužitelju.

Poslužitelj bi nakon toga pregledao indeksirani popis korisnika koji se nalaze u bazi i

vratio korisniku popis onih koji sadrže traženi podatak (ukoliko ih ima). Bitno za

napomenuti je činjenica da se na serveru ne nalaze datoteke koje se preuzimaju. Na

njemu se nalaze samo metapodaci (podaci o podacima), tj. popis korisnika s

korespondirajućim IP adresama i popisom datoteka dostupnih za razmjenu.

3.) Preuzimanje podataka – se obavljalo bez prisutnosti centralnog računala. Nakon

dobivenog popisa korisnika koji imaju traženu datoteku, njih se kontaktira direktno i od

njih traži datoteka za preuzimanje.

Što se tiče svojstava Napstera (općenito centraliziranih P2P sustava), ona su navedena u

slijedećem popisu:

a) Ranjivost na napade – pošto Napster koristi centralni server ranjiv je na maliciozne

napade koji za njega imaju katastrofalne posljedice.

b) Slaba privatnost korisnika – svaki čvor može vrlo jednostavno doći do IP adrese bilo

kojeg drugog čvora u mreži pošto se sve one nalaze na centralnom računalu. Upravo radi

toga je smanjena anonimnost. Privatnost korisnika nije na visokoj razini kao kod

Gnutelle.

c) Skalabilnost sustava – pošto je kod Napstera obaveza svakog korisnika da se spoji na

centralni server, i pošto svaki upit mora proći kroz njega to može stvoriti popriličnu

količinu upita, tj. prometa koji se generira prema središnjem računalu. Povećanjem broja

korisnika, a samim time i upita prema serveru, dolazi do sporije reakcije i kašnjenja u

odgovoru na upite. Upravo radi toga je Napster prilično slab kad je u pitanju robusnost i

skalabilnost, tj. povećanjem broja korisnika se smanjuju performanse sustava.

d) Dostupnost – nakon što neki korisnik preuzme datoteku, na njegovo računalo se spremi

kopija datoteke te ona automatski bude dostupna drugim čvorovima za preuzimanje. Na

taj način se dostupnost podataka povećava i lakše je doći do njih čak i ako originalni

djelitelj sadržaja povuče svoje podatke s mreže li bude nedostupan.

e) Cijena održavanja – za razliku od klijent – server modela u kojemu se pravi podaci koji

se preuzimaju nalaze na poslužiteljima koji radi toga trebaju imati jako velike

performanse i kapacitete diskova, kod ovakvih poslužitelja je ipak potrebna manja snaga.

Pošto se podaci ne nalaze na središnjem poslužitelju, količina prostora kao i ostale

performanse mogu biti puno manje, a s tim je i manja cijena održavanja.

Page 17: Sustav ravnopravnih čvorova za razmjenu datoteka

14

2.3.3 Hibridni P2P sustavi

Sam naziv ovih P2P sustava nam otkriva da oni nastaju kombinacijama već postojećih sustava.

Hibridni P2P sustavi koriste sve prednosti drugih P2P arhitektura, tj. centraliziranih i

decentraliziranih dok se u isto vrijeme od njih i razlikuju po svojim „elegantnim pomoćnim

mehanizmima koji olakšavaju lociranje resursa“. [4, str. 31.] Kod nekih P2P sustava hibridne

arhitekture postoje čvorovi koji posjeduju više kapaciteta i imaju više odgovornosti od ostalih

čvorova. Ti čvorovi se nazivaju superčvorovi (super korisnici). Ovi čvorovi predstavljaju „višu

razinu“ hibridnog sustava. Ova „viša razina“ pruža običnom čvoru usluge slične onima koje npr.

server pruža svojim čvorovima u centraliziranim sustavima. Superčvor ima jako bitnu ulogu u

hibridnom sustavu, pogotovo kada je riječ o lociranju resursa. Na slijedećoj slici je prikazana

skica hibridne P2P mreže sa običnim i super – čvorovima.

Sa slike 6. se može vidjeti jednostavna topologija hibridne P2P mreže. U mreži postoje obični

čvorovi (oni koji samo razmjenjuju datoteke) i superčvorovi (oni koji, osim što razmjenjuju

datoteke, sudjeluju u organizaciji mreže i u pretraživanju iste te otkrivanju podataka).

„Hibridne mreže koriste efikasnost u pretraživanju od centraliziranih arhitektura. To čine na

način da svakom od čvorova daju određeni dio mreže. Taj superčvor je dužan indeksirati sve

datoteke koje se nalaze u njegovom dijelu mreže. Indeks je potrebno konstantno održavati

svježim (zbog dinamičkog spajanja i odlaska čvorova iz mreže). Kada neki čvor želi preuzeti

datoteku, šalje zahtjev svom superčvoru. Superčvor pretražuje indeks i odgovara čvoru s listom

korisnika koji sadrže traženu datoteku. “ [7, str. 169.]

Slika 6: Hibridna P2P mreža [7]

Page 18: Sustav ravnopravnih čvorova za razmjenu datoteka

15

Tu se u priču ubacuje još jedna značajka hibridnih P2P mreža, a to je emitiranje upita drugim

superčvorovima s kojima su oni povezani. Ovo neodoljivo podsjeća na Gnutellu i njeno

emitiranje upita svim povezanim čvorovima u mreži. Na taj način se koristi prednost

decentralizirane arhitekture, njena brza pretraga svih čvorova.

2.4 Etičnost i legalnost

Nakon što smo se upoznali sa P2P mrežama, s njihovom strukturom, vrstama i načinom rada reći

ćemo nešto o temi koja je uvijek prisutna kada god se govori o P2P mrežama. naravno, radi se o

etičnosti i legalnosti korištenja P2P mreža.

P2P, kao arhitektura, je u potpunosti legalna i kao takva se može potpuno legalno koristiti za

preuzimanje podataka koji se na internetu (na računalima drugih korisnika) nalaze legalno.

Bitno je napomenuti da se ona dosta često koristi u ilegalne svrhe, i to na način da se vrši

preuzimanje stvari za koje korisnici koji ih preuzimaju nemaju autorsko pravo. Puno je

kontroverzi korištenja P2P aplikacija i postoji mnogo zagovornika ove tehnologije i slobode

širenja podataka, ali također velik je broj i onih koji smatraju da P2P narušava autorska prava te

da se tako oštećuju vlasnici (autori) datoteka koje se razmjenjuju ovim putem. Bitno je

spomenuti i činjenicu da se, kada je riječ o P2P sustavima, datoteke niti u jednom trenutku ne

Slika 7: Anti piratska kampanja

Page 19: Sustav ravnopravnih čvorova za razmjenu datoteka

16

nalaze na serverima tvrtki i wer stranica koje nude razmjenu ili koje su razvile software, pa ipak

je kroz povijest bilo dosta slučajeva u kojima su aplikacije morale biti ugašene i prestati s radom

zbog kršenja autorskih prava Posljednji takav primjer je vezan za nekad najpoznatiju P2P

aplikaciju Limewire koja je prestala s radom zbog tužbi u vezi kršenja autorskih prava. Osim

P2P aplikacija, velike probleme imaju i torrent trackeri. Iako kroz njih također direktno ne

prolaze podaci, niti se oni nalaze na njima, vrlo često su upravo oni optuženi za širenje piratstva i

kršenje autorskih prava. Kao što je slučaj s P2P-om i njegovim aplikacijama, i trackeri kao i

torrent klijenti su u potpunosti legalni i posao koji oni obavljaju, posrednik između krajnjijh

korisnika, je legalan sam po sebi.

Postoje i pokazatelji koji govore da P2P tehnologija ustvari jako dobro utječe na npr. glazbenu

industriju nego se to prikazuje u javnosti [8]:

Većina korisnika koji preuzimaju glazbu putem P2P-a nisu „lopovi“ niti „pirati“ nego

ljubitelji glazbe koji su voljni i platiti za glazbu.

Izvođači su zaradili više novca od tih novih ljubitelja glazbe nego što bi to uspjeli bez

njih

Pravo značenje razmjene podataka P2P-om nije povreda intelektualnog vlasništva nego

stvaranje novog načina za širenje i razvoj tržišta

Page 20: Sustav ravnopravnih čvorova za razmjenu datoteka

17

3. Aplikacijsko rješenje

Ovaj završni rad je osim teoretskog dijela zahtjevao i implementaciju P2P aplikacije za razmjenu

podataka između čvorova. U slijedećim stranicama biti će riječi o načinu na koji je

implementirana P2P aplikacija i koje tehnologije su korištene za implementaciju. Biti će

prikazani glavni dijelovi programskog koda, popraćeni slikama aplikacije u najbitnijim

trenucima njenog rada.

Općenito, aplikacija je implementacija centraliziranog P2P sustava sa centralnim „računalom“ na

koji se spajaju svi čvorovi. Na tom centralnom računalu su spremljeni podaci o spojenim

korisnicima kao i o datotekama koje oni dijele, njihovoj veličini itd. Slijedi detaljniji opis samog

projekta.

3.1 Korištene tehnologije

„Sustav distribuiranih čvorova za razmjenu datoteka“ ili kraće P2P aplikacija je implementirana

u cijelosti na Microsoftovoj .NET platformi.

„.NET je platforma razvijena od strane Microsofta i prvenstveno se koristi na Windows

operacijskom sustavu. Platforma uključuje veliku biblioteku klasa i omogućava interoperabilnost

programskih jezika (svaki jezik može koristiti kod napisan u nekom drugom jeziku). Programi

napisani u .NET platformi se izvršavaju u programskom okruženju zvanom CLR – Common

Language Runtime. Okruženje koje aplikacijama daje na korištenje mnoge usluge (sigurnost,

upravljanje memorijom i upravljanje izuzecima (exception handling)). Biblioteka klasa i CLR

skupa čine .NET platformu.“

Osobno sam najbolje upoznat s tom platformom te jezicima i servisima korištenima na njoj pa je

to bio logičan odabir. Aplikacija je u cijelosti napisana u C# programskom jeziku, izuzevši upite

prema bazi koji su napisani u SQL-u.

„C# je namijenjen da bude jednostavan, moderan, objektno-orijentirani programski jezik opće

namjene“.[9]

Kao i .NET platforma, i C# je odabran iz istih razloga. Kao razvojno okruženje (IDE) je korišten

Microsoftov Visual Studio 2010. Za bazu podataka sam također koristio usluge Microsoftovih

alata, korišten je MS SQL Server 2012.

Page 21: Sustav ravnopravnih čvorova za razmjenu datoteka

18

Osim standardnog programiranja windows aplikacija, za svoj projekt sam odlučio koristiti nešto

drukčije od svega na što sam naišao u pripremi ovog rada. Pošto je ovo implementacija

centraliziranog P2P sustava, u središu se nalazi aplikacija koja upravlja spojenim korisnicima i

negdje (najčešće u bazu) sprema podatke o njima. Ulogu centralnog servera sam odlučio dati

web servisu implementiranom u C#, uz pomoć WCF tehnologije, koja u posljednje vrijeme

postaje sve više popularna.

„WCF je razvojna platforma i sustav za izradu, konfiguriranje i razvoj mrežnih distribuiranih

servisa. To je jedan od najnovijih servisno-orijentiranih tehnologija. Jedna od glavnih

karakteristika WCF-a je interoperabilnost. WCF je jedinstveni programski model dostupan u

.NET frameworku od verzije 3.0. WCF kombinira svojstva web servisa, udaljenog upravljanja

(remoting), MSMQ (Microsoft Message Queueing) i COM+ (Component Object Modela).“ [10]

Slika 8: Tehnologije koje čine WCF

Page 22: Sustav ravnopravnih čvorova za razmjenu datoteka

19

3.2 Implementacija WCF servisa

Sama implementacija WCF-a se također radi u MS Visual Studiu, samo što je, za razliku od

recimo Windows Forms aplikacije potrebno odabrati WCF servis. Automatski generirani kod

nam daje jednostavne funkcije koje su implementirane na servisu. Implementacija se radi na

način da se u sučelju (IService) definiraju operacije skupa s njihovim argumentima, ali bez

implementacije. Prikaz operacija koje su korištene u ovom projektu može se vidjeti na slici 9.

Prije svake operacije potrebno je napisati da se radi o operaciji pomoću ključnih riječi

[OperationContract]. Postoji i tzv. [DataContract] koji nije bio korišten u ovom projektu.

Implementacija navedenih operacija se radi u posebnoj klasi (može se kreirati nova klasa ili

koristiti već generirana kao što je to napravljeno ovdje). Unutar te klase koja, naravno, nasljeđuje

sučelje ISevice se radi implementacija svih operacija navedenih u [OperationContract] – u.

Slika 9: Operacije korištene u implementaciji WCF-a

Page 23: Sustav ravnopravnih čvorova za razmjenu datoteka

20

Radi količine koda te uzimajući u obzir broj stranica ovog rada, neću prikazati sav kod

implementacije nego samo najbitnije dijelove implementacije WCF-a.

Također, bitno je spomenuti i za što se točno koristi ovaj WCF servis. Dakle, svaki korisnik je

bio obavezan spojiti se na servis sa odabranim nadimkom. Na WCF- u je implementirana

operacija koja je u bazu spremala podatke o korisnicima. Implementacija te operacije vidljiva je

na slici 10.

Slika 11: Upload podataka o korisniku na servis

Slika 10: Class dijagram WCF servisa

Page 24: Sustav ravnopravnih čvorova za razmjenu datoteka

21

Ovo je prilično jednostavna metoda naziva uploadFilesToService. Prima slijedeće parametre:

ime, IP, ime datoteke, putanju do datoteke, veličinu datoteke, hash i UDP port. Ova se metoda

poziva za svaku datoteku koja se dijeli. Sama implementacija se sastoji od kreiranja konekcije na

SQL Server. Ukoliko je moguće spojiti se na bazu, u istu se upisuju podaci pomoću INSERT

naredbe. Na kraju se zatvara konekcija s bazom kako se ne bi bespotrebno trošili resursi.

Servis je, osim mogućnosti spremanja podataka u bazu, zadužen za još neke poslove. Jedan od

njih je i provjera postojećeg imena. Ukoliko se korisnik želi spojiti na servis s već korištenim

imenom, servis mu to zabrani. Kod za to se vidi na slijedećoj slici:

Ova metoda prima kao parametar ime s kojim se korisnik želi prijaviti. Upitom u bazu (SELECT

naredba) se provjerava postojanost sloga sa imenom koje je prenešeno kao parametar. Ukoliko to

nije slučaj, metoda vraća 0, a ukoliko postoji rezultat vraća se 1.

Također, servis je bio zadužen i za pretragu baze. Kad se u aplikaciju unese ime datoteke koja se

traži, servis je bio zadužen za pronalazak datoteka koje odgovaraju unesenoj riječi. Za to je bila

zadužena metoda searchFiles koja je kao parametar primala unesenu riječ i na temelju nje

provjeravala bazu. Slijedi kod:

Slika 12: Provjera postojećih imena u bazi

Page 25: Sustav ravnopravnih čvorova za razmjenu datoteka

22

Slika 13: Pretraživanje baze po ključnoj riječi

Dakle, unesena riječ se koristi prilikom upita bazi. Koristi se naredba LIKE kako bi se pronašli

svi rezultati koji zadovoljavaju unesenu riječ (slovo ili dio riječi su također dozvoljeni). Nakon

što su rezultati pronađeni, vraćeni su u obliku tablice koja je primljena u aplikaciji te prikazana.

Za prikaz svih datoteka koje su stavljene na servis korištena je funkcija koja uvelike nalikuje

gore navedenoj, getData. Dakle, prilikom ulaska u aplikaciju, automatski su iz baze preuzete sve

datoteke koje su dostupne za dijeljenje. One su dohvaćene u obliku tablice i prikazane u

aplikaciji. Kod za tu metodu se, od gore prikazanoga, razlikuje samo po tome što ne koristi

ključnu riječ LIKE i ne pretražuje bazu po nikakvom kriteriju nego samo prikaže sve što se u

njoj nalazi.

Za sam kraj opisa WCF-a biti će opisan način na koji su datoteke brisane iz baze nakon što

korisnik više ne bude u mreži. Naime, nakon što se korisnik odjavi nema potrebe držati njegove

datoteke u bazi pogotovo zato što su onda vidljive drugim korisnicima koji pak nisu u

mogućnosti iste i preuzeti. Prilikom izlaska iz aplikacije, svaki korisnik se mora odjaviti. Taj čin

odjave je ustvari poziv slijedeće metode:

Page 26: Sustav ravnopravnih čvorova za razmjenu datoteka

23

Metoda kao parametar prima naziv korisnika koji se želi odjaviti sa sustava. Za obavljanje

odjave potrebno je otvoriti konekciju, spojiti se na bazu te istoj poslati upit koristeći naredbu

DELETE koja briše svaki slog koji kao ime ima korisnika koji se upravo odspojio iz mreže.

Nakon obavljenog posla, aplikacija vraća vrijednost 1.

Pošto je u prethodnih nekoliko stranica bilo riječi o spajanju na bazu i spremanju podataka u istu,

bilo bi logično reći nešto i o njoj samoj i njenoj strukturi. Dakle, baza je implementirana na

Microsoft SQL Serveru 2012. Baza podataka se sastoji od samo jedne tablice u koju se spremaju

podaci. Naziv tablice je test i ima svoje atribute:

Slika 14: Brisanje datoteka

Slika 15: ERA dijagram baze

Page 27: Sustav ravnopravnih čvorova za razmjenu datoteka

24

3.3 Implementacija klijentske aplikacije

3.3.1. Tehnički detalji klijentske aplikacije

Klijentska aplikacija je, kao što je već navedeno, implementirana u C# jeziku, na .NET platformi

u Visual Studiu. Također, zbog količine koda koji se u njoj nalazi neće biti prikazana cijela

implementacija nego samo najbitniji dijelovi, tj. oni dijelovi koji i jesu suština ove aplikacije.

Pošto je ovo P2P aplikacija i razlikuje se od obične klijent – server arhitekure, u njoj je bilo

potrebno implementirati i klijentsku i serversku stranu. To je bilo potrebno iz razloga što svaki

čvor treba biti u mogućnosti preuzimati datoteke drugih čvorova, i dijeliti vlastite drugima.

Svaka od ovih uloga je implementirana u vlastitim klasama naziva client i server. Osim ovih

klasa, u aplikaciji se nalaze još neke koje će biti opisane u daljnjem tekstu.

Slika 16: Popis klasa klijentske aplikacije

frmMain je početna klasa. Ona prikazuje početni prozor aplikacije. Preko nje se pozivaju

druge klase (frmLogin i frmDataGrid).

frmLogin je klasa koja služi za prijavu korisnika na WCF servis. Ona otvara novi prozor

u koji korisnik unosi željeno ime. Ona komunicira sa WCF-om na način da provjerava

dostupnost unešenog imena. Ona poziva klasu frmDataGrid.

frmDataGrid je klasa koja prilikom pozivanja (u konstruktoru) stvara novu dretvu koja u

pozadini obavlja posao klase Server. Kreira i mapu u kojoj će se nalaziti preuzete

datoteke, te komunicira sa servisom na način da pošalje sve podatke o korisniku na WCF

skupa sa popisom datoteka za dijeljenje. Osim toga, ova klasa je zadužena i za prikaz

Page 28: Sustav ravnopravnih čvorova za razmjenu datoteka

25

datoteka sa servisa koje dijele drugi korisnici, preko funkcije getData implementirane u

WCF-u [str. 22].

Server klasa je zadužena za obavljanje serverskog posla, tj. osluškivanje zahtjeva za

uspostavom veze na određenom portu. Nakon primljene konekcije, ukoliko je to zahtjev

za download, šalje se datoteka klijentu koji je isti zatražio, a ukoliko je datoteka koju smo

mi tražili, ista se sprema u naš folder kreiran frmDataGrid klasom.

Client je klasa zadužena za obavljanje klijentske zadaće, a to je slanje zahtjeva za

download datoteke. Dakle sve što je u njoj implementirano je funkcija koja odabranom

korisniku šalje zahtjev za preuzimanje odabrane datoteke.

helper je pomoćna klasa koja je kreirana kako bi sadržavala podatke o trenutno

prijavljenom korisniku (ime, IP adresu, putanju do mape s datotekama te UDP i TCP

port). Svaka od varijabli je statička jer se veže za klasu a ne za objekt klase, te kako ne bi

morali instancirati klase jer postoji samo jedan korisnik. Implementacija ove klase se

može vidjeti na slijedećoj slici:

Slika 17: helper klasa

FileHandling je klasa koja nasljeđuje klasu helper. Sam naziv klase objašnjava o čemu se

tu točno radi. Klasa upravlja datotekama na našem računalu. Radi poslove kao što su.

kreiranje direktorija, dohvaćanje popisa datoteka u direktoriju, dohvaćanje imena

datoteka, postavljanje podataka na WCF servis, brisanje datoteka sa servisa, kreiranje

hash funkcije nad datotekama i sl.

Program je automatski generirana klasa Visual Studia. Ona ima veze sa pokretanjem

aplikacije. U njoj se odabire koja forma (prozor) će prvi biti pokrenut. U mojoj aplikaciji

to je frmMain, odnosno početni prozor.

Page 29: Sustav ravnopravnih čvorova za razmjenu datoteka

26

3.3.2. Grafičko sučelje i opis rada klijentske aplikacije aplikacije

Na početnom prozoru nalazi se izbornik [18] kojim se odabiru opcije. Postoji opcija za Login

koja pokreće formu vidljivu na [19]. Odabir gumba Download files prikazuje formu u kojoj se

nalazi popis svih datoteka trenutno na mreži. Naravno, to se dogodi samo ukoliko je korisnik

prijavljen, ukoliko nije, otvara mu se forma za Login.

Slika 20: Popis datoteka dostupnih za preuzimanje

Slika 19: Početni prozor i forma za prijavu

Slika 18: Izbornik

Page 30: Sustav ravnopravnih čvorova za razmjenu datoteka

27

Osim popisa datoteka, postoji mogućnost pretraživanja. Također tu su gumbi Refresh list – koji

služi za osvježavanje popisa datoteka ukoliko se neki čvor priključio mreži ili je neki drugi

otišao. Također tu je i gumb Close za zatvaranje forme.

Slika 21: Pretraživanje datoteka

Slika 22: Gumbi za osvježavanje i zatvaranje forme

U aplikaciji postoji i tab My Files na kojemu se može vidjeti popis datoteka koje se trenutno

nalaze u našem direktoriju koji dijelimo na mreži. Također postoji i tab Downloads koji

prikazuje datoteke koje se trenutno preuzimaju.

Slika 23: My Files tab

Nakon što smo se upoznali s izgledom aplikacije, pogledajmo kako to sve izgleda u

programskom kodu. Dakle, sam proces prijave korisnika je prilično jednostavan. Klikom na

gumb Login izvršava se slijedeći kod:

Page 31: Sustav ravnopravnih čvorova za razmjenu datoteka

28

Slika 24: Login [1]

Potrebno je napraviti instancu WCF servisa koji je prethodno trebao biti dodan u aplikaciju kao

referenca. Instanca se naziva client. Nakon toga slijedeće 4 linije su zadužene za dobivanje IP

adrese računala koje se želi spojiti na servis. Ukoliko korisnik nije spojen na internet, njegova IP

adresa se automatski postavlja na 127.0.0.1. Na taj način je osigurana mogućnost razmjene

datoteka između više instanci na istom računalu.

Kada je to obavljeno provjerava se željeno ime sa onima već postojećima na servisu. Za to se

poziva metoda checkUsername u klasi fileHandling. Radi toga je potrebno instancirati i tu klasu.

Ukoliko ime nije zauzeto instancira se forma frmDataGrid. Iz njenog konstruktora pokreću se

serverske dretve kao na slici 25:

Slika 25: Login[2]

Jedna dretva pokreće metodu startUDPServer dok druga pokreće metodu startTCPServer.

Možda zvuči čudno što se server odvija na 2 dretve, ali to je zamišljeno na slijedeći način:

Kada korisnik želi preuzeti neku datoteku, šalje zahtjev drugom klijentu i to na port na

kojemu radi dretva listeningUDPThread. Dakle slanje zahtjeva za preuzimanje neke

datoteke se radi preko UDP protokola. Upravo zato ta dretva radi cijelo vrijeme. Što se

tiče same datoteke, nju očekuje dretva listeningTCPThread. Za prijenos datoteka se

koristi TCP protokol pošto on osigurava siguran i pouzdan prijenos podataka za razliku

od UDP-a koji radi na principu „pošalji i zaboravi“ te ne osigurava da će podaci stići na

odredište.

Page 32: Sustav ravnopravnih čvorova za razmjenu datoteka

29

Nakon prijave na WCF, automatski se pokreću serverske dretve osiguravajući drugim

korisnicima u mreži da preuzimaju datoteke od ove aplikacije.

Kako bi išli nekim logičnim rasporedom korištenja ove aplikacije, analizirati ćemo postupak

preuzimanja neke datoteke. Dakle, klijent nakon prijave dobije popis datoteka. Klikom na

preuzimanje određene datoteke događa se slijedeće:

Slika 26: Download[1]

Radi se instanca klase Client te se poziva njena metoda connect. Uz to, toj metodi se kao

argumenti šalju ime datoteke koja se želi preuzeti, IP adresa korisnika koji ima tu datoteku te

UDP port. Metoda connect parsira IP adresu iz stringa dobivenog kao parametar, nakon toga se

kreira UDP klijent, koji šalje poruku preko IPEndPointa drugom klijentu.

Slika 27: Download[2]

Page 33: Sustav ravnopravnih čvorova za razmjenu datoteka

30

Poruka se šalje u obliku „D + broj porta na kojemu se očekuje datoteka : naziv datoteke“, kao što

se vidi iz koda. Nakon toga, koristi se metoda GetBytes kako bi se poruka iz stringa pretvorila u

binarni zapis koji se šalje preko metode Send. Metoda Send prima 3 argumenta, podatke koji se

šalju (data), veličinu podataka (data.Length) i odredište na koje se šalje. Sve je obavijeno try –

catch naredbom kako ne bi doslo do rušenja aplikacije ukoliko se pokuša kontaktirati korisnika

koji je otišao s mreže. Nakon što je poruka odaslana, korisnik je završio svoj dio posla. Sada na

red dolazi druga strana, tj. čvor od kojeg želimo preuzeti datoteku. Kao što smo već rekli, server

čeka sa dvije dretve (jedna za prijenos poruke, druga za prijenos podataka). Kako je klijent

poslao poruku da želi datoteku, naš server će tu poruku primiti na dretvi koja čeka UDP poruke

listeningUDPThread. Kako izgleda ova metoda, prikazano je na slici 28.

Slika 28: Download[3]

UDP server radi na slijedeći način. Dretva listeningUDPThread zove metodu

startUDPServer. Unutar te metode se postavlja broj porta na kojemu će UDP server

osluškivati. Osim toga, postavlja se i tzv. IPEndPoint koji predstavlja mjesto na koje se

druge aplikacije spajaju. Prima 2 argumenta (IP adresu i broj porta). U aplikaciji je

postavljena bilo koja adresa što znači da se na klijenta može spojiti aplikacija s bilo

Page 34: Sustav ravnopravnih čvorova za razmjenu datoteka

31

kojom IP adresom i bilo kojim brojem porta. Također, IPEndPoint nam omogućava da

saznamo IP adresu i broj porta osobe koja nam šalje zahtjev za preuzimanje datoteke.

Kada je naš UDP server primio poruku i dekodirao ju (provjerio daje u formatu koji smo odredili

ranije), kreira novu dretvu koja ima zadatak pozvati metodu fileSearch koja treba poslati

datoteku korisniku koji ju je zatražio. To radi na slijedeći način:

1. Metoda fileSearch iz primljenog stringa pronalazi ime datoteke i odlazi u folder gdje se

nalaze datoteke koje ona dijeli.

2. Tu prolazi kroz sve datoteke koje se u njemu nalaze. Ukoliko pronađe datoteku koja

odgovara imenu iz primljene poruke, započinje sa slanjem.

3. Slanje se odvija na način da se

a. Ime datoteke pretvori u binarni zapis (Encoding.ASCII.GetBytes)

b. Sama datoteka (sadržaj) se također pretvara u skup bajtova

c. Stvara se nova varijabla veličine 4B + veličina imena datoteke + veličina datoteke

d. Sve varijable (duljina imena datoteke, ime datoteke i bajtovi koji čine datoteku) se

spremaju u posebnu varijablu koja se šalje korisniku koji je datoteku i zatražio.

Slika 29: Download[4]

Page 35: Sustav ravnopravnih čvorova za razmjenu datoteka

32

Kada je datoteka poslana, red je na klijentu da ju primi, te iz nje uzme sve potrebne podatke.

Podatke prima druga dretva koja se pokreće nakon prijave, tj. listeningTCPThread. Kako je to

napravljeno možemo vidjeti sa slika 30 i 31.

Slika 30: Download[5]

1. Kreira se TcpListener koji osluškuje na nasumično odabranom slobodnom portu.

2. Unutar while petlje koja se obavlja dok aplikacija radi, kreira se Socket. Kada se netko

spoji na Socket, započinje primanje datoteke.

3. Primanje se vrši pozivanjem procedure downloadFile kreiranjem nove dretve. Unutar te

procedure postoje slijedeći koraci:

a. Kreira se varijabla u koju će biti spremljeno ime nove datoteke

b. Pokreće se prijenos podataka sa Socketa pomoću NetworkStreama

c. Određuje se folder u koji će se datoteka spremiti

d. Uz pomoć metode Receive sa socketa se preuzimaju primljeni podaci. Oni se

nakon toga dekodiraju, tj iz originalnih bajtova se uzimaju ime datoteke i njen

sadržaj.

e. Nakon uspješno dekodiranog primljenog sadržaja, isti se zapisuje na disk

primatelja u odabrani folder

f. Tok (stream) se zatvara.

Page 36: Sustav ravnopravnih čvorova za razmjenu datoteka

33

Slika 31: Download[6]

To bi bio jedan primjer preuzimanja datoteke od čvora. Dakle, sve počinje sa spajanjem na

servis. Time se dobije uvid svih korisnika i njihovih datoteka. Odabirom datoteke šalje se poruka

čvoru od kojeg ju želimo preuzeti. Nakon što čvor primi poruku, dekodira ju i šalje nam ju preko

TCP protokola. Naš server konstantno osluškuje na određenom portu i kada dobije zahtjev za

primanje datoteke, prihvati ju i spremi na disk pod istim imenom pod kojim ju je vidio u popisu

sa servisa.

Aplikacija je rađena uz pomoć dretvi (korišten je princip multithreadinga) kako bi čvorovi bili u

mogućnosti simultano primati/slati više datoteka te kako ne bi došlo do zastoja u radu aplikacije

dok se prenosi određena datoteka.

Page 37: Sustav ravnopravnih čvorova za razmjenu datoteka

34

4. Zaključak

P2P mreže koje su se počele razvijati 1999. pojavom Napstera a kasnije Gnutelle i BitTorrenta,

dovele su do revolucije same koncepcije Interneta. Korisnici su prije uglavnom internet koristili

za čitanje maila i pregledavanje weba a sada ih većina aktivno sudjeluje u dijeljenju vlastitih

resursa internetom. Rastom popularnosti P2P mreža došlo je do veće potražnje privatnih

korisnika za širokopojasnim internetom sa velikim download i upload brzinama. To je također

jako utjecalo na P2P tehnologiju jer su sada korisnici u mogućnosti na vlastito računalo spremiti

velike datoteke za jako kratko vrijeme. Naravno, mnogi i zloupotrebljavaju ovakav sustav pa se

P2P dovodi u mnoge rasprave o etičnosti i legalnosti. O tome je bilo riječi i u ovom radu. Kao

zaključak o P2P mrežama možemo reći da su one jedan od najvažnijih a uz to i najviše korišten

način za razmjenu datoteka. Značaj centralnih računala na kojima se drže podaci više nije toliko

velik jer je jako teško održavati servere sa ogromnom količinom podataka, cijena takvog

održavanja je također prevelika, a tu je još i brzina odziva i sl. Tako da, moje skromno mišljenje

o P2P mrežama je to da one svakako imaju budućnost, i to svijetlu. U posljednje vrijeme jača

pojava cloud computinga, držanja datoteka na nekom udaljenom računalu. To je jako korisno i

po meni jedina prijetnja P2P tehnologijama. Osobno su mi draže P2P tehnologije i više volim

imati stvari na vlastitom računalu (gdje bi cloud storage služio eventualno kao backup za

podatke).

Što se tiče aplikacijskog dijela mog završnog rada, mogu reći da sam radeći na aplikaciji naučio

jako puno. Počevši od kreiranja servisa, definiranja metoda u sučelju, njihove implemetacije,

spajanja servisa s aplikacijom pa sve do kreiranja dretvi i višedretvenog rada. Također sam dosta

naučio i o radu s protokolima u jeziku C# (koristio sam i TCP i UDP) kao i o korištenju

streamova za prijenos podataka preko mreže i spremanja podataka na disk. Ovaj rad mi je zbilja

pomogao da shvatim bit P2P mreža, barem ovih centraliziranih. Naravno da ova aplikacija nije

savršena, i da postoji još ogroman broj stvari koje se mogu dodati i sl. ali smatram da je dovoljno

dobra za jednostavni prijenos podataka a to je i bio cilj ovog rada.

Page 38: Sustav ravnopravnih čvorova za razmjenu datoteka

35

5. Literatura

[1] „Disadvantages of client-server“, članak dostupan 27.06.2012. na

http://www.unm.edu/~network/presentations/course/appendix/appendix_k/tsld043.htm

[2] „Peer-to-peer mreže“, NCERT i LS&S, dokument dostupan 27.06.2012. na

http://www.cert.hr/sites/default/files/NCERT-PUBDOC-2009-11-282.pdf

[3] „100, 000 P2P users sued in US Mass Lawsuits“, članak dostupan 27.06.2012. na

http://torrentfreak.com/100000-p2p-users-sued-in-us-mass-lawsuits-110130/

[4] „Peer-to-peer computing: Principles and Applications“, Quang Hieu Vu, Mihai Lupu, Beng

Chin Ooi. Springer, 2010.

[5] „Distributed hash table“, članak dostupan 28. 06. 2012. na

http://en.wikipedia.org/wiki/Distributed_hash_table

[6] „History“, članak dostupan 28.06. 2012. na

http://ast-deim.urv.cat/wiki/History

[7] „P2P Networking and applications“, John F. Buford, Heather Yu, Eng Keong Lua, 2008.

Morgan Kaufmann

[8] „The truth about file-sharing“, članak dostupan 29.06. 2012. na

http://bit.ly/P2dCIf

[9] „C Sharp (Programming language)“, članak dostupan 01.07. 2012. na

http://en.wikipedia.org/wiki/C_Sharp_(programming_language)

[10] „Introduction to WCF“, članak dostupan 01. 07. 2012. na

http://wcftutorial.net/Introduction-to-WCF.aspx

[11] „.NET Framework“, članak dostupan 01.07.2012. na

http://en.wikipedia.org/wiki/.NET_Frameworks