TCP/IP - implementare a modelului ISO-OSI

      Să încercăm să definim nişte termeni:

  • suită de protocoale - o colecţie de protocoale complementare care cooperează între ele,
  • stivă de protocoale - o suită de protocoale asociată unui model de reţea modular. Modelul ISO/OSI reprezintă reţeaua ca fiind o stivă de niveluri (module) aşezate pe verticală. Fiecărui nivel îi este asociat cel puţin un protocol.

      După cum am spus şi în articolul anterior: un internet (cu i mic) este o reţea de reţele. Cel mai cunoscut internet este Internet-ul (cu I mare). Pentru a realiza comunicarea în Internet se foloseşte suita de protocoale TCP/IP, prezentate, în numărul din iulie 1999, al revistei e-mail REPORT la rubrica Internet.
      Modelul ISO/OSI reprezintă un model ideal de reţea. În realitate implementările reţelelor respectă într-o mai mare sau mai mică măsură specificaţiile acestui model. Suita TCP/IP foloseşte doar cinci dintre nivelurile ISO/OSI.
      Să facem o scurtă descriere a nivelurilor TCP/IP şi a protocoalelor care le deservesc.

1. Nivelul fizic

      Este identic cu nivelul fizic din modelul ISO/OSI, fiind compus din mediile de transmisie: cabluri, fibră optică, legături radio, legături laser, infraroşu, etc. Acum câţiva ani Internetul era mai mult text, în prezent este text şi grafică, iar în viitor va fi cât mai mult multimedia (sunet şi film). Asta înseamnă că nevoia de lărgime de bandă a crescut şi va creşte continuu, căutând noi soluţii pentru mediile de transmisie.
      Majoritatea reţelelor locale sunt realizate în conformitate cu normele elaborate de două instituţii: IEEE (Institute of Electrical and Electronics Engineers) şi ANSI (American National Standards Institute). În acest sens au fost standardizate normele IEEE 802 care definesc, în principal, modul de utilizare a suportului de comunicaţie, ocupându-se de modul de interconectarea diferitelor dispozitive: calculatoare, terminale, imprimante, plottere, telecopiatoare, echipamente de legătură cu alte reţele, etc.
      Reţeaua de tip Ethernet (soluţie adoptată de marea majoritate a reţelelor locale) are ca protocol de acces CSMA (Carrier Sense Multiple Access) descris în standardul IEEE 802.3

2. Nivelul legătură de date

      Controlează schimburile de date între nivelul fizic şi nivelul reţea, comunicând direct cu modulul IP de pe nivelul reţea. Cu alte cuvinte, nivelul legătură, "ascunde" nivelului reţea detaliile de implementare ale nivelului fizic (chiar dacă se foloseşte tehnologia Ethernet sau Token Ring). O aplicaţie scrisă, folosind protocoalele TCP/IP va putea fi utilizată indiferent de tehnologia care stă la baza construcţiei reţelei. Acest nivel este reprezentat de placa de reţea.
      Pe acest nivel se află protocoalele ARP şi RARP. Protocolul ARP (Address Resolution Protocol) realizează translatarea adreselor IP în adrese ale nivelului legătură de date (la reţele Ethernet au o dimensiune de 6 octeţi). RARP (Reverse Address Resolution Protocol) este o variantă a protocolului ARP ce face conversia unei adrese a nivelului legătură de date în adresă IP.
      Tot pe acest nivel se află şi o serie de protocoale utilizate pentru comunicaţia dintre două calculatoare pe linia telefonică standard. În acest caz se utilizează un modem iar comunicaţia se realizează pe portul serial al calculatorului şi nu pe placa de reţea. Putem aminti protocoalele:

  • SLIP - Serial Line IP,
  • CSLIP - Compressed SLIP,
  • PPP - Point-to-Point Protocol.
3. Nivelul reţea

      Este reprezentat, în principal, de protocolul IP, un protocol fără conexiune (vezi articolul anterior). Pachetele IP se mai numesc şi datagrame. Se spune ca IP asigură o transmisie nefiabilă a pachetelor de date. Să vedem de ce este caracterizat IP a fi un protocol nefiabil.
      IP consideră fiecare pachet ca o entitate independentă, fără legătură cu alte pachete. Orice asociere între pachetele IP trebuie să fie tratată de nivelele superioare. Fiecare datagramă conţine atât adresa calculatorului sursă cât şi adresa calculatorului destinaţie, astfel încât ea poate fi transmisă şi rutată independent de celelalte. IP este nefiabil pentru că nu garantează ajungerea la destinaţie a datagramelor şi nici dacă conţinutul lor este corect. Nivelul IP verifică, totuşi, o sumă de control a propriilor antete (20 de bytes). Dacă un antet IP nu este corespunzător, întregul pachet este anulat şi nu mai este transmis nivelului superior, nivel care verifică toate datele conţinute de datagramă. Nivelul IP este responsabil cu rutarea pachetelor în Internet şi cu o posibilă fragmentare a datelor. Fragmentarea unui pachet este făcută de un Gateway, atunci când pachetul este prea mare pentru a parcurge în continuare reţeaua (depăşeşte valoarea MTU a reţelei). Fragmentele rezultate sunt transmise în continuare ca pachete IP independente şi sunt reasamblate la destinaţie, formând datagrama iniţială. Dacă unul dintre fragmente este eronat sau pierdut se anulează întreaga datagramă.
      Pe motiv că IP nu garantează livrarea pachetelor de reţea şi nici nu realizează semnalizarea eşecului atunci când se pierd sau alterează pachetele de date, s-a elaborat protocolul : ICMP (Internet Control Message Protocol). Chiar dacă este considerat un protocol pe nivelul reţea, utilizează tot IP pentru livrarea datelor.
      Pe acest nivel se află şi IGMP (Internet Group Management Protocol - protocol de gestiune a grupurilor di Internet). şi acesta se bazează pe IP pentru a transmite mesaje în reţea.

4. Nivelul transport

      Acest nivel este deservit, în principal de două protocoale: UDP şi TCP.
      UDP este considerat tot un protocol nefiabil şi tot din aceleaşi motive. Pachetele UDP sunt denumite tot datagrame. Este recomandată folosirea acestui protocol în reţele LAN. Atunci când se utilizează UDP în reţele WAN este necesar ca aplicaţiile să-şi asigure propriile mecanisme de control.
      La prima vedere nu există diferenţe foarte clare între nivelul reţea şi cel de transport respectiv între protocoalele IP şi TCP (UDP). La o analiză mai atentă descoperim că IP se ocupă cu distribuirea datelor între calculatoarele reţelei, pe când TCP distribuie datele între aplicaţii.
      Să presupunem că un calculator (vom folosi, în continuare, şi termenul de host pentru a desemna un calculator aparţinând unei reţele) legat într-o reţea stabileşte o conexiune cu un alt host. Practic, în prima fază, o aplicaţie de pe primul calculator, adresează o cerere de comunicaţie cu o altă aplicaţie, de pe cel de-al doilea. Acum intră în acţiune protocolul IP care stabileşte legătura între cele două calculatoare. Cum, în ultimul timp, sistemele de operare rulate pe calculatoare sunt multitasking, ne punem întrebarea: cum ştie cel de-al doilea host să livreze pachetele de date aplicaţiei cerute de primul calculator. Din acest considerent s-a introdus noţiunea de port. Oricărei aplicaţii, care are capacitatea de a lucra în reţea, îi este asignat un număr de port.
      În comunicaţia dintre două aplicaţii, de pe hosturi diferire, protocolul IP are sarcina să memoreze adresele IP ale celor două calculatoare, pe când protocolul de transport (TCP sau UDP) trebuie să reţină numerele porturilor sursă şi destinaţie.
      În Internet, fiecărui protocol îi este asociat un număr de port. Prezentăm mai jos cele mai cunoscute protocoale şi numărul portului pe care acestea comunică între ele.

File Transfer Protocol 21
Telnet Protocol 23
Simple Mail Transfer Protocol 25
Trivial File Transfer Protocol 69
Finger Protocol 79
HyperText Transfer Protocol 80
Tabelul 1. Protocoale Internet şi porturi

      Protocoalele TCP şi UDP utilizează porturile în mod diferit. UDP fiind un protocol fără conexiune, lasă pur şi simplu datele pe port. În schimb TCP se concentrează pe conexiune - nu pe port. Prin urmare, aplicaţiile care folosesc TCP pot să deschidă pe acelaşi port mai multe conexiuni fără să apară probleme de transmisie.
      TCP este considerat un protocol fiabil, asigurând integritatea datelor transmise. Utilizând acest protocol, programatorul, nu trebuie să se mai ocupe de aspecte de corectitudine a transmisiei pachetelor, lucru asigurat de protocolul însuşi. Din acest motiv scade, într-o oarecare măsură, viteza de transfer.
      TCP are următoarele caracteristici principale:

  1. Transfer de date în flux continuu - datele circulă în acelaşi timp, în ambele sensuri ale conexiunii. Spunem că TCP este o conexiune duplex.
  2. Siguranţa transmisiei - recuperează pachetele transmise cu erori, pierdute sau cu număr de secvenţă eronat. Această caracteristică este asigurată prin stabilirea unui număr de secvenţă fiecărui octet transmis şi necesitatea unui mesaj de confirmare (ACK) din partea receptorului. Dacă, după un anumit interval de timp, expeditorul nu primeşte un mesaj de confirmare, pachetul este considerat pierdut şi este retransmis.
  3. Controlul fluxului de date - în fiecare mesaj ACK, trimis de receptor, este conţinută o "fereastră" care indică numărul permis de octeţi pe care emiţătorul îi poate transmite. În urma unui astfel de mesaj, emiţătorul îşi va dimensiona pachetele transmise la lungimea indicată de receptor. Această lungime este valabilă până la recepţionarea următorului mesaj ACK, care conţine o altă "fereastră".
  4. Multiplexarea - permite mai multor procese, care rulează pe acelaşi host, să utilizeze facilităţile protocolului TCP simultan.
  5. Controlul conexiunii - în transferul de date dintre două procese putem distinge trei etape: stabilirea conexiunii, controlul conexiunii, închiderea conexiunii. Controlul conexiunii presupune: stabilirea numărului de secvenţă şi a dimensiunii ferestrei, pentru fiecare pachet TCP.

      Prezentăm mai jos un tabel sumar, care prezintă comparativ facilităţile oferite de cele trei protocoale IP, UDP, TCP.

  IP UDP TCP
Orientare pe conexiune nu nu da
Limitarea lungimii mesajului da da nu
Checksum la date nu da da
Răspuns la validare nu nu da
Timeout şi retransmitere nu nu da
Detectarea pachetelor duplicate nu nu da
Secvenţiere nu nu da
Controlul fluxului de date nu nu da


5. Nivelul aplicaţie

      În suita de protocoale TCP/IP acest nivel înglobează nivelele: sesiune (5), prezentare (6), aplicaţie (7), din modelul ISO/OSI. Din acest motiv se mai numeşte şi nivel proces. Pe acest nivel se utilizează, ca mijloc de comunicaţie între procese, mecanismul socket. În prezent aproape toate sistemele de operare au implementat acest mecanism. Asta nu înseamnă ca este singura soluţie pentru programarea în reţea. Un concurent este TLI (Transport Lazer Interface) apărut în jurul anului 1985 cu sistemul de operare UNIX SYSTEM V. Un alt mecanism de programare în reţea este RPC (Remote Procedure Call) văzut ca o extensie a soluţiei socket.
      Un programator de aplicaţii, care va concepe programe în reţea, se va întâlni foarte des cu problema creării unui socket. După ce socket-ul a fost creat, tot greul comunicaţiei între procese revine sistemului de operare prin intermediul implementării stivei TCP/IP. Programatorul va trebui să "stăpânească" doar ce date se vor transmite prin reţea.
      Pentru crearea unui socket, se execută instrucţiunea:

socket_handle = socket( protocol_family, socket_type, protocol) care are aproximativ aceeaşi sintaxă pe toate sistemele de operare.
      Ei ..... şi cum "teoria ca teoria, dar practica ne omoară", vom încerca data viitoare să realizăm un program care utilizează socket-uri (sau mai bine zis două programe: unul client şi celălalt server).