Beej-ov vodič za mrežno programiranje

Prethodno

 

Dalje


2. Šta je soket?

Čuo si da se priča o "soketima" čitavo vrijeme, a možda se sve vrijeme pitaš šta je to ustvari tačno. Pa, oni su sledeće: način komuniciranja sa ostalim programima koristeći standardne UNIX-ove fajl-deskriptore.

Dobro, možda si čuo izjavu nekog UNIX hakera: "Bog te, sve u UNIX-u je datoteka!" Ono što je ta osoba ustvari pričala je činjenica da kada UNIX programi čine bilo kakav U/I, čine ga čitanjem ili pisanjem po fajl-deskriptoru. Fajl-deskriptor je mali cijeli broj pridružen otvorenom fajlu (datoteci). Ali (i baš tu je caka), datoteka može biti mrežna konekcija, FIFO, cijev, terminal, prava datoteka na disku, ili uostalom bilo šta. Sve u UNIX-u je datoteka! Na taj način, komunikacija sa drugim programom preko interneta se obavlja preko fajl-deskriptora, vjerovao ili ne.

"Kako dobijem ovaj deskriptor za mrežnu komunikaciju, Gosp. Pametni?" je vjerovatno poslednje pitanje koje ti je sad na umu, ali svejedno ću da odgovorim na njega: Koristiš poziv sistemske funkcije socket(). Ona vraća soket-deskriptor, i onda komuniciraš preko njega koristeći specijalizovane soket pozive send() i recv() (man send, man recv).

"Hej, čekaj!" mogao bi sad da uzvikuješ. "Ako je to fajl-deskriptor, zašto ne bih mogao, u ime Neptuna, jednostavno koristiti read() i write() da komuniciram preko soket-deskriptora?" Kratak odgovor je "Pa mogao bi!" Dug odgovor je, "Mogao bi, ali send() i recv() pružaju mnogo veću kontrolu razmjene podataka."

Šta dalje? Šta misliš o ovome: Ima mnogo vrsta soketa. Postoje DARPA Internet adrese (internet soketi), staze do datoteka kao nodova na disku (UNIX soketi), CCITT X.25 adrese (X.25 soketi koje slobodno možeš da ignorišeš), i vjerovatno mnogi drugi zavisno od toga kakav UNIX koristiš. Ovaj dokument obrađuje samo one prve: internet sokete.

2.1. Dva tipa internet soketa

Šta je ovo? Postoje dva tipa internet soketa? Da. Pa, dobro, ne. Lažem. Ima ih više, ali nisam htio da te preplašim. Ovdje ću  pričati samo o dva tipa. Osim u ovoj rečenici kad ću da kažem da su "sirovi soketi (raw sockets)" takođe jako moćni i trebalo bi da ih pogledaš.

Da počnemo već jednom. Koja su to dva tipa? Prvi je "stream socket"; drugi je "datagram socket", koje ćemo ubuduće vjerovatno zvati "SOCK_STREAM" i "SOCK_DGRAM", tim redom. Datagram soketi se ponekad nazivaju "nepovezani soketi". (Iako mogu biti connect()-ovani ako to stvarno hoćeš. Pogledaj connect(), dalje dole.)

Stream soketi su pouzdani dvosmjerni povezani komunikacioni provodnici. Ako pošalješ dva objekta u soket, rasporedom "1, 2", oni će i da stignu u rasporedu "1, 2" na odredište. Takođe, ti objekti tamo neće sadržati greške. Sve greške s kojim se suočiš su plod tvog sopstvenog poremećenog uma, i neće se o njima ovdje raspravljati.

Šta koristi stream soket? Pa vjerovatno si čuo za program telnet? On koristi stream soket. Sve što otkucaš treba da stigne u istom rasporedu na drugi kraj, je li tako? Takođe, svi web brauzeri koriste HTTP protokol koji koristi stream sokete da dođu do internet stranica. Zaista, ako se "telnetuješ" na web-site na portu 80, i otkucaš "GET /", dobićeš zauzvrat  HTML stranu!

Kako stream soketi dobijaju ovaj visoki nivo kvaliteta protoka podataka? Oni koriste protokol "The Transmission Control Protocol (Protokol za kontrolu prenosa podataka)", poznat u narodu kao "TCP" (vidi RFC-793 za izvanredno detaljne podatke o TCP-u.) TCP osigurava da podaci stignu u istom rasporedu i bez grešaka. Možda si već čuo za "TCP" kao dio skraćenice "TCP/IP" gdje "IP" znači "Internet Protocol" (vidi RFC-791.) IP prvenstveno radi sa Internet usmjeravanjem i nije odgovoran za integritet podataka.

Super. Šta ima da se kaže za datagram sokete? Zasto se kaže za njih da su "nepovezani"? O čemu se tu, uopšte, radi? Zašto oni nisu pouzdani? Pa evo nekih činjenica: Ako pošalješ datagram, možda i stigne. Možda stigne u drugačijem rasporedu. Ako stigne, podaci u paketu će biti bez grešaka, ipak.

Datagram soketi takođe koriste IP za usmjeravanje, ali oni ne koriste TCP; oni pak koriste"User Datagram Protocol (Protokol za korisničke datagrame)", ili "UDP" (vidi RFC-768.)

Zašto su oni nepovezani? Pa, u osnovi, to je zbog toga što ne moraš da održavaš otvorenu konekciju kao što moraš sa stream soketima. Samo napraviš paket, udariš mu IP zaglavlje koje sačinjava adresa odredišta, i pošalješ ga. Nije potreban spoj. Uglavnom se koriste za paket-po-paket protoke informacija. Neke aplikacije koje ih koriste: tftp, bootp, itd.

"Dosta!" možda vrištiš. "Kako ovi programi uopšte rade ako se paketi mogu izgubiti na mreži?!" Pa, zemljanine, svaki od njih ima sopstveni protokol na vrhu UDP-a. Na primjer, protokol  tftp kaže da za svaki paket koji se pošalje, prijemnik mora da pošalje natrag drugi paket koji kaže, "Imam ga!" ("ACK" paket.) Ako pošiljalac prvobitnog paketa ne dobije odgovor u roku, recimo, pet sekundi, slaće paket ponovo dok konačno ne dobije ACK. Ovakva procedura je vrlo bitna kad se ostvaruju SOCK_DGRAM aplikacije.

2.2. Besmislice o niskom nivou i teorija mreža

Pošto sam upravo spomenuo nivoe protokola, vrijeme je da pričamo kako mreže stvarno rade, i da pokažem neke  primjere kako se SOCK_DGRAM paketi izgrađuju. Praktično, vjerovatno možete da preskočite ovu lekciju. Ipak, ovo gradivo čini dobru pozadinu za sledeće.

Slika 1. Enkapsulacija podataka.

[Encapsulated Protocols Diagram]

Hej, djeco, vrijeme je da se uči o enkapsulaciji podataka! Ovo je jako bitno. Toliko je bitno da se o tome već uči ovdje na univerzitetu «Čiko» ;-). U principu, tvrdi se sledeće: paket je rođen, paket je umotan ("enkapsuliran") u zaglavlje (i rijetko u podnožje) od strane prvog protokola (npr, TFTP protokola), a onda se sve to (skupa sa TFTP zaglavljem) enkapsulira ponovo od sledećeg protokola (npr. UDP-a), onda ponovo od sledećeg (IP), i onda ponovo od poslednjeg protokola na hardverskom (fizičkom) sloju (npr, Ethernet-u).

Kad drugi računar primi paket, hardver skida IP i UDP zaglavlja, TFTP program skida TFTP zaglavlje, i taj računar konačno ima prave podatke.

Sad konačno mogu da pričam o neomiljenom modelu mreže u više nivoa (Layered Network Model). Ovaj mrežni model opisuje sistem mrežne funkcionalnosti koja ima mnoge prednosti nad ostalim modelima. Na primjer, možeš pisati soket-programe koji su u potpunosti isti, i da ne brineš kako se podaci ustvari prenose (serijski, tanki Ethernet, AUI, šta god) jer programi na nižem nivou sve to sređuju za tebe. Stvarni mrežni hardver i topologija su transparentni soket-programeru.

Bez daljeg zadržavanja, predstaviću ti slojeve tog modela u punom svjetlu. Zapamti ovo za ispit iz mreža:

·         Aplikacioni (Application)

·         Prezentacijski (Presentation)

·         Sesioni (Session)

·         Transportni (Transport)

·         Mrežni (Network)

·         Spoj spone podataka (Data Link)

·         Fizički (Physical)

Fizički sloj je hardver (serijski, Ethernet, itd.). Aplikacioni je onoliko daleko od fizičkog što god više možeš da zamisliš –  to je  mjesto gdje korisnici imaju dodir sa mrežom.

E sad, ovaj model je toliko uopšten da bi mogao da ga koristiš kao vodič za popravku automobila ako bi htio. Slojeviti model koji je više  u skladu sa UNIX-om bi mogao da bude sledeći:

·         Aplikacioni sloj (telnet, ftp, itd.)

·         "Host-to-Host" (server serveru) transportni sloj (TCP, UDP)

·         Internet sloj (IP i usmjeravanje)

·         Sloj mrežnog pristupa (Ethernet, ATM, ili Šta god)

U ovom trenutku, vjerovatno vidiš kako ovi slojevi odgovaraju enkapsulaciji prvobitnih podataka

Jel' vidiš koliko posla ima oko enkapsuliranja paketa podataka? Gospode! A znaš li da moraš da ukucavaš adresu u zaglavlje koristeći "cat"?! Šalim se, šalim se. Sve što treba da uradiš za stream sokete je da ih pošalješ (send()) vani. Sve što treba da uradiš za datagram sokete je da enkapsuliraš paket metodom koji ti izabereš i da ga pošalješ (sendto()) napolje. Jezgro samo gradi transportni sloj i internet sloj, hardver pravi sloj mrežnog pristupa, takođe sam. Ah, moderna tehnologija.

Tako se završava naš kratki pohod u teoriju mreže. Eh da, zaboravio sam da ti kažem sve što sam htio o usmjeravanju, a to je: ništa. Upravo tako, uopšte neću pričati o usmjeravanju. Usmjeravač "oguli" paket do IP zaglavlja, pogleda u njegovu tabelu usmjeravanja, bla bla bla. Pogledaj IP RFC ako te stvarno zanima. Ako nikad o tome ne naučiš, pa dobro, ostaćeš živ.


Prethodno

Glavna strana

Dalje

Uvod

 

struct-ure i rukovanje podacima