Upload
luka-rajcevic
View
535
Download
3
Embed Size (px)
Citation preview
–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.
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.
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
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
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.
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.
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.
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...
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
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
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
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
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.
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)
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
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.
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]
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
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
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.
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
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
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
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
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:
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
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
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.
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
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:
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.
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]
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
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]
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.
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.
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.
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