Objavljeno: 26.9.2023 | Avtor: Simon Peter Vavpotič | Monitor Oktober 2023

Brez zanesljive komunikacije ne gre

Minili so časi, ko se je vsa družina gnetla ob edinem domačem računalniku. Danes imamo poceni računalnikov, kolikor hočemo, vendar jih lahko docela izkoristimo le, če jih znamo medsebojno zanesljivo in učinkovito povezati.

Včasih smo podatke med računalniki prenašali ob pomoči disket in plošč CD (kasneje tudi DVD), kar so mnogi poimenovali kar »frizbinet«. Ta je najdlje preživel v domačih okoljih, smo si pa nekateri računalniški navdušenci že takrat omislili sorazmerno draga ethernetna omrežja tudi za doma.

V računalnike je bilo treba vgraditi omrežne kartice in po stanovanju napeljati koaksialne kable. Vseeno menim, da se je izplačalo, saj bil prenos podatkov neprimerno hitrejši kot z disketami ali s ploščami CD. Kljub temu sem že čez približno desetletje koaksialne kable zamenjal z zmogljivejšimi UTP, prav tako pa tudi omrežne kartice in omrežne spojnike, s čimer se je hitrost prenosa podatkov povečala za desetkrat (na 100 Mb/s), kasneje pa z novimi računalniki ter s hitrejšimi omrežnimi spojniki in usmerjevalniki še za desetkrat (na 1 Gb/s).

Komunikacija med odjemalci in strežnikom. Vir: Wikipedia

Danes si lahko omislimo tudi ožičeni ethernet z 10 Gb/s. K sreči se je omrežna komunikacijska oprema v zadnjem času znatno pocenila, obenem pa danes za žično komunikacijo med dvema računalnikom z vgrajenima vmesnikoma zadošča čisto običajen kabel UTP.

Kako deluje prenos podatkov s TCP/IP?

Princip komunikacije s protokolom TCP/IP različic 4 in 6 že leta ostaja enak, vseeno pa nova programska razvojna okolja in številni novi skladi programskih knjižnic programerju nudijo obilico novih možnosti. Čeprav nam pri pisanju strežniške in aplikacijske programske opreme ni treba poznati vseh njihovih potankosti, se poznavanju osnovnih programskih struktur in funkcij za vzpostavitev povezav in prenos podatkov ne moremo izogniti.

Doma narejen spletni radio, ki se lahko z internetom poveže prek brezžičnega omrežja Wi-Fi ali ožičenega etherneta.

Protokol TCP/IP omogoča paketni prenos podatkov, pri čemer je največja dolžina podatkovnih paketov omejena na nekaj manj kot 64 kB, a imajo v omrežje povezani usmerjevalniki in računalniki možnost, da najdaljšo dolžino paketov, ki jih lahko sprejmejo ali oddajo, dodatno omejijo glede na svoje zmogljivosti, denimo na 1.500 bajtov. To ne predstavlja ovire za prenos zelo dolgih podatkovnih zapisov, saj skladi programskih knjižnic v posameznih računalnikih te pri oddaji razdelijo na krajše pakete, pri sprejemu pa jih ponovno sestavijo v originalne podatkovne zapise.

Toda kako računalnik z (navadno) enim samim naslovom IP ve, kako naj obdela prejeti paket iz oddaljenega računalnika oziroma h kateri strežniški aplikaciji naj ga usmeri? Vsaka spletna storitev v strežniški aplikaciji ob vzpostavitvi delovanja operacijskemu sistemu sporoči, prek katere številke priključka (od 1 do 65535, angl. port) je dosegljiva, medtem ko mora odjemalska aplikacija pri vzpostavitvi omunikacije poleg številke IP strežnika navesti tudi številko priključka. Kljub temu nam zadnjega v internetnem brskalniku ni treba navajati, če za komunikacijo s strežniško storitvijo uporabljamo privzeta vrata (npr. 80 za nekodirano komunikacijo in 443 za varnostno kodirano komunikacijo), vendar pod pogojem, da to pravilo upošteva tudi strežniška aplikacija. V nasprotnem primeru je lahko na katerihkoli vratih katerakoli vrsta spletne storitve ...

Komunikacija v internetnih omrežjih

Vzpostavitev, vzdrževanje in prekinitev omrežne komunikacije med programskima aplikacijama v istem računalniku ali v različnih so kompleksne funkcije iz vrste manjših operacij, ki zagotavljajo sinhronizacijo in varen prenos podatkov. K sreči mora programer za uspešno vzpostavitev in vzdrževanje komunikacije poznati le osnovne koncepte in komunikacijske protokole na najvišji ravni.

Osnova je komunikacija odjemalec–strežnik, kar pomeni, da strežniška aplikacija v omrežju ponudi storitev, odjemalske aplikacije v različnih računalnikih ali istem računalniku pa se lahko z njo povežejo in prenašajo podatke. Strežniške aplikacije omogočajo delovanje različnih vrst storitev, kot so FTP, FTPS, telnet, HTTP, HTTPS, video strežnik, oddaljeno namizje, SSH, DNS in DHCP itn.

Majhno omrežno stikalo s petimi priključki in hitrostjo 1 Gb/s, ki je primerno tudi za domačo rabo. Foto: Wikipedia

Za domačo rabo je najprimernejših prvih pet, ki so sorazmerno preproste za osnovno implementacijo. Res pa je, da omogoča strežnik HTTP ali HTTPS s pestrejšo funkcionalnostjo lepši grafični prikaz v spletnem brskalniku, vendar si k sreči lahko pri njegovi implementaciji pomagamo z obsežnimi že izdelanimi skladi programskih knjižnic. Prednost uporabe HTTP in HTTPS je predvsem ta, da nam ni treba načrtovati odjemalske programske opreme, saj se lahko z njima poveže vsak spletni brskalnik. Čeprav HTTPS podpira številne protokole za varnostno šifriranje podatkov, moramo ustrezno funkcionalnost za šifriranje in dešifriranje zagotoviti tako na strežniški kot odjemalski strani.

Manj zmogljivi računalniki, še posebej tisti v mikrokrmilniških napravah IoT (internet stvari, angl. Internet of things), lahko za šifriranje in dešifriranje porabijo dobršen del svojih zmogljivosti.

Kaj je programska nit?

Sodobni operacijski sistemi lahko ob pomoči dodeljevalnikov nalog, ki programe (oziroma njihove programske niti) ciklično dodeljujejo v delno izvajanje razpoložljivim procesnim enotam oziroma procesorskim jedrom, vzporedno poganjajo na stotine programov in njihovih programskih niti. Vsak program ima vsaj glavno programsko nit, lahko pa med delovanjem vzpostavi tudi dodatne, ki se izvajajo skoraj neodvisno od glavne programske.

Vendar programska nit ni isto kot program, saj operacijski sistem vsak program izvaja ločeno od drugih, kot da bi ta tekel v svojem računalniku, medtem ko imajo vse programske niti enega programa lahko neposreden dostop do vseh programskih struktur v njem. Denimo, vidijo iste globalne programske spremenljivke in polja za hrambo podatkov, prek katerih si lahko podatke tudi izmenjujejo, kot pomoč pri sinhronizaciji dostopov pa uporabljajo posebne programske strukture, imenovane semaforji.

Upravljanje omrežnih povezav

Potek komunikacije lahko razdelimo na štiri operacije: prijava novega odjemalca strežniku, izmenjava podatkov s strežnikom, procesiranje podatkov na strežniku in prekinitev povezave. V večopravilnem operacijskem sistemu lahko v strežniški aplikaciji vsako od operacij podpremo s svojo programsko nitjo. Tako se izognemo nuji po kompleksni implicitni vzporednosti znotraj glavne programske niti, ki jo je obenem manj izkušenemu programerju na začetku navadno zelo težko razumeti, je pa tudi veliko več možnosti za hude programerske napake in pomanjkljivosti v programski kodi.

Strežniška omara v velikem računalniškem centru. Foto: Wikimedia

Sprejem novih odjemalcev strežniku po vzpostavitvi delovanja omogoča programska nit poslušalec (angl. listener). Po uspešni prijavi za vsakega novega odjemalca ustvari vse potrebne podatkovne strukture za komunikacijo, nakar spremlja njegovo aktivnost.

Ker TCP/IP ne pozna standardnega mehanizma, s katerim bi lahko strežnik neposredno ugotovil, ali je določen odjemalec trajno prekinil komunikacijo, je treba vnaprej določiti dolžino neaktivnosti, po kateri strežnik zapre komunikacijsko povezavo in sprosti zanjo rezervirana sistemska sredstva. Obenem lahko strežnik z vnaprej definiranimi sporočili periodično preverja aktivnost odjemalca in prekine komunikacijo, ko ta preneha odgovarjati.

Je omrežje tudi znotraj računalnika?

Seveda! Omrežna komunikacija med aplikacijami poteka ne glede na to, v katerih računalnikih te dejansko delujejo. Denimo, če v enem od računalnikov vzpostavimo spletni strežnik, bomo tega lahko dosegli iz spletnih brskalnikov v oddaljenih računalnikih kakor tudi iz spletnega brskalnika v omenjenem računalniku. To pomeni, da se tok podatkov lahko zaključi tudi v drugi aplikaciji znotraj računalnika. Obenem je omrežna komunikacija med aplikacijami znotraj računalnika zanesljivejša, saj ne potrebuje fizične omrežne infrastrukture.

Vzpostavitev prenosa podatkov

Po vzpostavitvi povezave lahko podatki potujejo v obe smeri, od odjemalca k strežniku in obratno. Podprogrami za prenos podatkov so sicer pri obeh simetrični, vendar mora imeti strežnik vseeno možnost hkratne komunikacije z več odjemalci, katerih število je navadno navzgor omejeno. Izjema je le komunikacija točka–točka, pri kateri sta strežnik in odjemalec enakovredna, saj lahko strežnik odjemalec sprejme zgolj enega strežnika odjemalca oziroma sta oba računalnika v obeh vlogah.

Kakorkoli, klasični strežnik mora voditi kontekste za vse hkrati povezane odjemalce, kar mnogi uspešni programerji rešijo z vzpostavitvijo programskega objekta za vsakega na novo povezanega odjemalca (npr. objektno programiranje omogoča programski jezik C++). Pogosto je to tudi najenostavnejši način, vendar zahteva natančno delo z rezervacijami in s sproščanji pomnilnika, saj ga hitro zmanjka, strežnik pa zato postane neodziven ali se celo sesuje.

Ena od rešitev je tudi uporaba sodobnejšega programskega jezika C#, pri katerem je sproščanje pomnilnika po prenehanju rabe samodejno. Vsekakor pa to ne pomeni, da je objektno programje obvezno, saj lahko namesto tega uporabimo programska polja, kjer strežnik hrani dele kontekstov komunikacije s posameznimi odjemalci.

Načrtovanje komunikacijske programske opreme v Microsoftovem Visual studiu.

Zanesljivi sprejem in oddaja podatkov

Običajno tako na strežniku kot v odjemalcu za prenos podatkov skrbijo programske niti (ena ali več). Če odjemalce obravnavamo enakovredno, je dovolj ena programska nit, pogosto poimenovana bralec (angl. reader), ki ciklično zaporedno obdeluje vse programske strukture s strežnikom povezanih odjemalcev. Ker so podatkovni paketi kratki, obenem ni bojazni, da bi zakasnitev pri sprejemu paketa enega od odjemalcev lahko bistveno vplivala na odzivnost strežnika pri drugih odjemalcih.

Podobno tudi v odjemalcu potrebujemo posebno programsko nit za sprejem podatkov, saj nočemo, da bi glavni program (skoraj) blokiral med omrežnim podatkovnim prenosom, ali pa, da bi ga morali zelo natančno načrtovati in vanj vgraditi implicitno vzporednost.

Načrtovanje programskih struktur za procesiranje sprejetih podatkov in njihovo oddajo je podobno kot pri branju. Za obdelavo podatkov ali izvajanje rutinskih opravil lahko vzpostavimo posebno programsko nit – celo tako, ki uporablja metode umetne inteligence.

Zadnji korak je povratna komunikacija, prek katere strežnik vrne odjemalcu odgovor in/ali status komunikacijske povezave. Denimo, strežnik FTP vrne zahtevane vsebino iz zahtevanih datotek. A ker mora pri tem prenesti sorazmerno veliko podatkov, je dobro, če vzpostavimo dodatno programsko nit, ki jo lahko poimenujemo pisec (angl. writer). Ta po vrstnem redu sprejme vse zahteve za prenos podatkov in poskrbi, da se ti glede na zmogljivost komunikacijskega kanala tudi dejansko prenesejo s strežnika v odjemalca ali obratno.

Zanesljivost, varnost in šifriranje podatkov

Med prenosom podatkov lahko pride tudi do napak ali prekinitev povezav, zato je zelo pomembno, da tako strežnik kot odjemalec hranita status prenosa podatkov oziroma vesta, kateri deli enote podatkov (npr. dolge datoteke) so že preneseni in katere bo še treba. Ob ponovni vzpostavitvi povezave tako prenosa ni treba ponoviti v celoti.

Zelo pomembno je tudi sprotno preverjanje pravilnosti sprejetih podatkov ob pomoči kontrolne kode CRC, hash, paritete ali druge varnostne kode. Zadnja je navadno del vsakega podatkovnega paketa, pri čemer programska nit bralec ob sprejemu paketa najprej preveri ujemanje vsebine in varnostne kode. Če se ne ujemata, zahteva ponovni prenos paketa.

Zadnja raven zaščite podatkov je varnostno šifriranje/dešifriranje, s katerim želimo preprečiti, da bi morebitni napadalec (heker), ki bi v podatkovnem omrežju prestregel tok podatkov med strežnikom in odjemalcem, lahko prebral vsebino njune komunikacije. Za šifriranje/dešifriranje uporabljamo algoritme s simetričnimi in z asimetričnimi šifrirnimi ključi, pri čemer so prvi primernejši za zaprte sisteme, kjer upravljamo vse odjemalce in strežnik ter lahko nanje predhodno fizično namestimo kopije šifrirnih ključev, drugi pa za odprte sisteme, kjer do strežnika dostopajo naključni odjemalci, ki podatke šifrirajo z javnim ključem, strežnik pa jih dešifrira s svojim zasebnim ključem.

Raspberry Pi 4 z vgrajenim mikrokrmilniškim modulom za daljinski vklop in izklop, ki se predstavi kot telnetni strežnik, in dostopna točka Wi-Fi.

Naroči se na redna tedenska ali mesečna obvestila o novih prispevkih na naši spletni strani!

Komentirajo lahko le prijavljeni uporabniki

 
  • Polja označena z * je potrebno obvezno izpolniti
  • Pošlji