Odată cu creșterea popularității modelelor de inteligență artificială, generarea de cod sursă a devenit mai accesibilă unui public mai larg. Spun generarea de cod și nu de aplicații în sine, pentru că doar generarea de cod nu duce neapărat la obținerea unei aplicații, așa cum nici un set de unelte cumpărat de la magazin nu face pe oricine mecanic.
Pentru că generarea de cod a devenit mai accesibilă și piața de locuri de muncă pentru dezvoltare software e mai competitivă ca niciodată, importanța înțelegerii conceptelor de informatică, în general, este mai mare ca niciodată.
Contrar a ceea ce ar putea crede mulți oameni, că nu mai e nevoie să știi foarte multe pentru că acum ai AI la îndemână, conceptele fundamentale de inginerie și informatică au devenit mai importante ca niciodată și vei observa că vor apărea din ce în ce mai des întrebări de interviu bazate pe aceste concepte fundamentale.
Unul din conceptele despre care vreau să discutăm azi e procesul de transmitere al datelor prin rețea.
Cum se transmit datele prin rețea
La modul foarte general și dacă nu ești foarte atent la întrebare, ai putea spune că prin HTTP, nu? Până la urmă web-ul este fundația pe care este construită toată infrastructura de comunicare între sistemele software moderne.
Răspunsul ar fi unul corect, dar incomplet. Probabil nu trebuie să fii vreun specialist IT să-ți dai seama de asta și să oferi un răspuns similar. Dar noi, ca și specialiști în domeniu, trebuie să înțelegem toate procesele care guvernează comunicarea între sisteme, mult dincolo de protocolul HTTP.
Protocolul HTTP este, într-adevăr, cel care e folosit la nivel înalt, dar este construit peste o structură extrem de complexă de procese și transformări la nivelul rețelei. Dacă stăm să ne gândim o secundă, știm că datele sunt transmise tot timpul sub formă de biți, adică serii de combinații de 0 și 1.
Prin HTTP, în schimb, știm că se transmit date sub formă de:
- HTML
- CSS
- JavaScript
- JSON
- XML etc.
Asta pentru că HTTP e un protocol de nivel înalt, menit să faciliteze comunicarea dintre două sau mai multe sisteme sau aplicații.
Dar până la aplicații, trebuie să înțelegem că într-o rețea de calculatoare, mașinile (sau dispozitivele) care comunică între ele au rolul de noduri în rețea. Fiecare dispozitiv care este conectat la internet, indiferent de modalitatea prin care e conectat, dispune de o adresă IP.
Adresele IP sunt, pentru dispozitivele conectate într-o rețea, ca CNP-ul pentru noi, oamenii. Sunt unice, astfel încât o adresă IP să identifice exact un dispozitiv anume, fie el telefon mobil, server-ul web al unui website, sau un serviciu de backend de tip REST API.
Revenind la formatul datelor, pentru a putea fi transmise prin rețea, ele trebuie să sufere o serie de transformări, ce presupun:
- Criptarea (dacă comunicarea se face pe un canal criptat)
- Compresia
- Reformatarea lor.

Transformarea datelor
Așa cum spuneam, datele cu care noi oamenii, cât și aplicațiile, operăm sunt la nivelul cel mai accesibil. Transformarea și pregătirea datelor pentru a fi transmise prin rețea trece printr-o serie de procese (denumite tehnic „straturi”).

În această serie de procese se „sparge” acel set de date din forma inițială JSON în biți, se compresează, se criptează (dacă avem o comunicare criptată), se stabilește tipul de transport (TCP sau UDP) și ruta, și se trimit sub formă de „pachete” în rețea.
Nu o să intrăm în toate detaliile legate de diferența între tipul de transport TCP (Transmission Control Protocol) vs UDP (User Datagram Protocol), dar ce trebuie să știi acum e că:
- UDP e mai rapid și nu necesită sosirea pachetelor la destinație într-o anumită ordine, dar nici nu garantează sosirea tuturor pachetelor.
- TCP garantează transmiterea tuturor pachetelor, dar ordinea lor e importantă pentru reconstrucția datelor la destinație.
La destinație, datele sunt trecute prin același proces, dar cu pașii executați invers, astfel încât să fie transformate din acele „pachete” sau stream-uri de biți în formatul destinat aplicației care primește datele, să zicem JSON.

Secvența asta de pași care se execută poartă numele de modelul OSI (Open Systems Interconnection), sau Internet Protocol Suite, cunoscut și sub numele de TCP/IP.
Modelul OSI descrie mai în detaliu toate procesele, pe când TCP/IP tratează tot fluxul de transformare și transmitere al datelor ceva mai simplu. Nu este unul mai bun decât altul și nici nu se exclud unul pe celălalt, ci sunt pur și simplu două moduri diferite de a analiza procesele executate pentru ca două noduri de rețea să poată comunica între ele.
Ca să înțelegi mai bine, protocolul HTTP e construit pe toată această infrastructură, folosindu-se de posibilitatea de a cripta datele în cazul în care comunicarea e făcută prin HTTPS în schimb.
Exemplu practic
Uite în termeni mai simpli cum funcționează tot procesul descris anterior. Să zicem că ești acasă și vorbești cu un prieten printr-o aplicație de mesagerie.
- Trimiterea: În momentul în care tu scrii mesajul și apeși „send”, mesajul tău este preluat la nivelul aplicației, datele sunt comprimate, criptate și sparte în „pachete”. Se stabilește ruta pe care trebuie trimise, se face conexiunea și se trimit în rețea prin modulul electronic de rețea al dispozitivului tău (în acest caz, al modulului Wi-Fi al telefonului, să spunem).
- Primirea: Când ajung la destinație, toți pașii se execută în ordine inversă: datele sunt primite prin modulul de rețea al dispozitivului, sunt decomprimate, decriptate și transformate în formatul necesar aplicației pe care o folosești, aplicație care le preia, le interpretează în propriul cod și sunt afișate pe ecran.
Când îți trimite el mesaj, ciclul ăsta se reia și tot așa.
Concluzie
În cele mai multe cazuri, ca inginer software nu vei avea nevoie să lucrezi la un nivel atât de apropiat de infrastructură, decât dacă lucrezi poate pentru un furnizor de servicii cloud, servicii de găzduire sau alte tipuri de servicii ce presupun infrastructură.
Dar e bine să înțelegi și să poți să explici toate detaliile astea, pentru că e foarte posibil să fie una din întrebările de interviu dacă aplici pentru un rol de back-end. De asemenea, ți-ar prinde bine să știi toate astea atunci când încerci să depanezi conexiunea dintre diferite rețele sau resurse de infrastructură, cum ar fi mașini virtuale, clustere de Kubernetes, servere de baze de date etc.
Pe data viitoare!
