Transmission Control Protocol - TCP

TCP este un protocol standard cu STD numarul 7. TCP este descris in RFC 793 Transmission Control Protocol. Statatul sau este de recomandat, dar in practica orice implementare a TCP/IP care nu este folosita exclusiv pentru rutare va include TCP. TCP asigura considerabil mai multe facilitati pentru aplicatii decat UDP, mai ales recuperarea erorilor, controlul transmisiei si siguranta. TCP este un protocol orientat pe conexiune spre deosebire de UDP care este fara conexiune. Cele mai multe aplicatii protocol, precum Telnet si FTP, utilizeaza TCP. Cele doua procese comunica unul cu celalalt printr-o conexiune TCP (InterProcess Communication - IPC), asa cum se arata in figura urmatoare.

TCP se poate compara cu o comunicatie telefonica. In aceasta analogie, un birou al unei firme este calculatorul host, numarul de telefon este portul, un apel telefonic este conexiunea, un angajat al firmei ce lucreaza in acest birou este o aplicatie (sau un protocol aplocatie). Mergand mai departe cu analogia, compania de telefonie este IP. O parte a telefoanelor din birou au numere publice (binecunoscute), iar alta parte sunt folosite pentru comunicatii curente. Firma realizeaza pentru public o serie de servicii, fiecarui serviciu fiindui alocate unul sau mai multe telefoane publice. La telefoanele publice destinate unui serviciu poate raspunde oricare dintre angajatii din birou care are activitati legate de acel serviciu. Atunci cand un angajat are de discutat mai mult cu un client, pentru a elibera linia telefonica publica, el comuta apelul pe o linie de comunicatie obisnuita. Analog procedeaza si aplicatiile server atunci cand accepta o conexiune cu o aplicatie client.

Conceptul TCP

Principalul scop al TCP este de a asigura circuit logic sigur sau serviciu de conexiune intre doua procese pereche. El nu se bazeaza pe siguranta altor protocoale de nivel inferior (cum este IP), asa ca TCP trebuie sa garanteze el insusi siguranta transmisiei. TCP poate fi caracterizat prin urmatoarele facilitati pe care le asigura pentru aplicatiile care il utilizeaza:

Transfer de date in flux (Stream Data Transfer)

Din punctul de vedere al aplicatiei, TCP transfera un sir (stream) continuu de octeti prin retea. Aplicatia nu trebuie sa-si faca griji cu segmentarea datelor in blocuri de baza sau datagrame. O face TCP prin gruparea octetilor in fragmente TCP, care sunt transferati IP pentru a fi transmisi la destinatie. De asemenea, insusi TCP decide cum sa segmenteze datele si poate trimite datele mai departe intr-un mod convenabil.

Uneori, o aplicatie are nevoie sa fie sigura ca toate datele trasnsmise catre TCP au fost in realitate transmise la destinatie. Pentru aceasta, o functie push este definita. Ea va forta transmiterea tuturor segmentelor TCP ramase in memorie catre destinatie. Functia de inchidere (close) normala forteaza si ea transmiterea datelor la destinatie.


Siguranta

TCP atribuie un numar de secventa fiecarui octet transmis si asteapta o confirmare (acknowledgment - ACK) de la aplicatia care receptioneaza datele TCP. Daca confirmarea nu vine intr-un interval de timp prestabilit, datele sunt transmise din nou. Deoarece datele sunt transmise in blocuri (segmente TCP) numai numarul de secventa al primului octet este trimis calculatorului destinatie. Aplicatia TCP destinatie foloseste numerele de secventa pentru a le ordona atunci cand sosesc neordonate si sa elimine segmentele duplicate.

Controlul transmisiei (Flow Control)

Aplicatia TCP destinatie, cand trasmite o confirmare (ACK) catre emitent, indica de asemenea numarul de octeti pe care ii poate receptiona pe langa ultimul segment TCP primit, fara sa se suprancarce sau sa apara depasirea memoriilor tampon (internal buffers) ale sale. Aceasta este trimis in ACK sub forma numarului cel mai mare de secventa pe care-l poate receptiona fara probleme. Acest mecanism este cunoscut sub numele de fereastra glisanta (window-mechanism) si va fi discutat in detaliu in acest capitol.

Multiplexarea

Este realizata prin utilizarea porturilor, la fel ca si la UDP.

Conexiunile logice

Siguranta si mecanismele de control ale transmisiei descrise mai inainte necesita ca TCP sa initializeze si mentina cateva informatii referitoare la starea fiecarui flux de date (data stream). Aceasta informatie de stare ce include socketurile, numerele de secventa, dimensiunile ferestrelor se numeste conexiune logica. Fiecare conexiune este unic identificata de catre o pereche de socketuri utilizate de catre procesele emitente si receptoare.

Full Duplex

TCP asigura doua fluxuri concurente de date in ambele sensuri.

Principiul ferestrei glisante

Un protocol de comunicatie simplu ar putea folosi urmatorul principiu: trimite un pachet si apoi asteapta confirmarea de primire de la destinatar inainte de a trimite pachetul urmator.

Daca confirmarea (ACK) nu este primita intr-un interval de timp prestabilit, pachetul este trimis din nou.

Emitent Receptor
Trimite pachetul 1
Primeste pachetul 1 si raspunde cu ACK 1
Trimite pachetul 1
Primeste pachetul 2 si raspunde cu ACK 2

In timp ce acest mecanism asigura siguranta el foloseste numai o mica parte din banda disponibila a retelei.

Sa consideram acum un protocol in care emitentul  grupeaza pachetele sale si utlilizeaza urmatoarele reguli (vezi figura urmatoare):

In momentul in care emitentul receptioneaza confirmarea pentru pachetul 1 (ACK 1), el poate deplasa fereastra sa cu un pachet spre dreapta:

Emitent Receptor
Trimite pachetul 1
Trimite pachetul 2
Trimite pachetul 3
Trimite pachetul 4
Primeste ACK 1 Primeste pachetul 1 si raspunde cu ACK 1
Trimite pachetul 5

In acest moment, emitentul poate deasemenea transmite si pachetul 6.

Sa ne imaginam cateva cazuri speciale:

Pachetul al 2-lea s-a pierdut

Emitentul nu va receptiona ACK 2, asa ca el va ramane pe pozitia 1 (ca in figura anterioare). De fapt, deoarece receptorul nu a primit pachetul 2, el va confirma pachetele 3, 4 si 5 cu un ACK 1, intrucat  pachetul 1 a fost ultimul primit in secventa. La emitent, cronometrul pornit pentru pachetul 2 va semnaliza depasirea timpului de asteptare a confirmarii si acest pachet va fi retransmis. 

De observat ca repectia acestui pachet de catre receptor va determina emiterea confirmarii ACK 5, intrucat acum au fost receptionate cu succes toate pachetele de la 1 la 5 si fereastra emitentului se va deplasa cu patru pozitii dupa receptionarea ACK 5.

Pachetul 2 a ajuns la destinatie, dar confirmareas-a pierdut:

Si acum emitentul nu primesteACK 2, dar va primii ACK 3. ACK 3 este o confirmare pentru toate pachetelepana la 3 (inclusiv pachetul 2) si emitentul poate acum deplasa fereastra la pachetul 4.

Acest mecanism de fereastra glisanta asigura:

Principiul ferestrei glisante aplicat la TCP

Principiul fertestrei glisant este folosit de catre TCP, insa cu cateva diferente:

Fluxul de date al emitentului poate fi reprezent ca in figura urmatoare.

unde:

Trebuie sa ne reamintim ca TCP grupeaza octetii in segmente si numai un segment poata numarul de secventa al primului octet din segment.

Formatul segmentului TCP

Formatul segmentului TCP este prezentat in figura de mai jos.

Unde:

Portul sursa

Numarul portului sursa pe 16 biti folosit de receptor pentru a raspunde.

Portul destinatie

Numarul portului destinatie pe 16 biti.

Numarul de secventa

Numarul de secventa al primului octate de date din acest segment. Daca bitul de control SYN este setat, numarul de secventa este numarul de secventa initial (n) si primul octet de date este n+1.

Numarul de confirmare

Daca bitul de control ACK este setat, acest camo contine valoarea urmatorului numar de secventa pe care receptorul se asteapta sa-l primeasca.

Data Offset

Numarul de cuvinte de 32 biti din antetul TCP. El indica unde incep datele.

Reserved

Sase biti rezervati pentru utilizare in viitor; trebuie sa fie zero.

URG

Precizeaza ca articolul pointer de urgenta are semnificatie in acest segment.

ACK

Precizeaza ca articolul de "Numar de secventa confirmat" are semnificatie in acest segment.

PSH

Functia push.

RST

Reseteaza conexiunea.

SYN

Sincronizeaza numerele de secventa.

FIN

Nu mai sunt date de la emitent.

Fereastra

Folosit in segmenteleACK. El specifica numarul de octeti de date incepand cu acela indicat in "numarul de secventa confirmat" pe care receptorul (adica emitentul acestui segment) doreste (si poate) sa accepte.

Suma de control

Complementul fata de unu al sumei in complement fata de unu al tuturor cuvintelor de 16 biti din pseudo- antet, antetul TCP si datele TCP. La calcularea sumei de control, campul "Suma de control" este considerat zero.

Pseudo-antetul este acelasi ca cel folosit de catre UDP pentru calculul sumei sale de control. Este un antet pseudo-IP folosit doar pentru calculul sumei de control cu formatul descris in figura urmatoare.

Pointerul de urgenta

Indica primul octet de date ce urmeaza ce urmeaza datelor urgente. Are semnificatie numai atunci cand bitul de control URG este setat.

Optiuni

La fel ca in cazul optiunilor datagramei IP, optiunile pot avea doua formate:

In prezent sunt definite sapte optiuni:

Optiune Lungime Semnificatie
0

-

Sfarsitul listei de optiuni
1

-

No-Operation
2

4

Segment de dimensiune maxima
3

3

Scala ferestrei
4

2

SACK-Permisa
5

X

SACK
8

10

Time Stamps
Optiunea segment de dimensiune maxima

Aceasta optiune este folosita numai pe durata stabilirii conexiunii (bitul de control SYN setat) si este trimis de acea paret care urmeaza sa receptioneze date pentru a indica ce lungime de segment maxima poate controla. Daca aceasta optiune nu este folosita atunci este permisa orice dimensiune de segment.

Optiunea Scala ferestrei

Aceasta optiune nu este obligatorie. Ambele parti trebuie sa trimita optiunea Scala ferestrei. Este o optiune din segmentele SYN pentru a permite scalarea ferestrei in directia lor. Optiunea Scala ferestrei extinde definitia ferestrei TCP la 32 de biti. Ea defineste dimensiunea ferestrei in unitati de 32 de biti folosind factorul de scala din segmentul SYN. Receptorul redefineste lungimea ferestrei pe 32 biti folosind lungimea ferestrei pe 16 biti si factorul de scala.

Aceasta optiune este determinata la inceputul negocierii conexiunii. Dupa ce conexiunea a fost stabilita nu mai exista nici modalitate de a schimba scala ferestrei.

Optiunea SACK-Permisa

Aceasta optiune este setata atunci cand confirmarea selectiva (Selective ACKnowledgment) este folosita in acea conexiune TCP. Ea are lungime de doar 4 octeti (Optiunea nu are camp de date).

Optiunea SACK

Confirmarea selectiva (SACK) permite receptorului sa informeze emitentul despre toate segmentel care sunt receptionate corect. Astfel, emitentul va trimite numai acele segmente care sau pierdut. Daca numarul segmentelor care sunt pierdute de la ultimul SACK, este mare, urmatoarea optiune SACK va contine camp de date lung. Pentru al reduce, optiunea SACK trebuie sa fie utilizata pentru cele mai recente date receptionate.

Optiunea Time Stamps

Optiunea Time Stamps trimite sub forma unui marcaj temporal (Time Stamp) indicatia ceasului calculatorului emitent al datagramei TCP ce trimite optiunea. Valoarea ecou a marcajului de timp (Time Stamp Echo) poate fi folosita daca bitul ACK este setat in antetul TCP.

Unplutura

Toti octeti zero folositi pentru completarea antetului TCP la lungimea reala care este multiplu de 32 de biti.

Stabilirea unei conexiuni TCP

Inainte ca orice data sa fie transmisa, trebuie stabilita intre cele doua procese. Unul dintre procese (de regula serverul) lanseaza un apel OPEN pasiv, celalalt un apel OPEN activ. Apelul OPEN pasiv asteapta pana cand un alt proces incearca sa se conecteze la el printr-un apel OPEN activ.

Prin retea, sunt schimbate trei segmente:

process 1 process 2
Apelul OPEN pasiv,
asteapta cereri active
Apelul OPEN activ trimite SYN, secv = n
Receptioneaza SYN
trimite SYN, secv = m, ACK n+1
Receptioneaza SYN + ACK. Trimite ACK m+1

Conexiunea este acum stabilita si doua fluxuri (streamuri) de date (cate unul pentru fiecare sens) au fost initializate (numerele de seventa).

Intregul proces este cunoscut ca un "three-way handshake". 

De retinut ca segmentele TCP schimbate includ numere de secevnta initiale de la ambele parti pentru a fi folosite la transferurile de date ulterioare. Inchiderea conexiunii este facuata implicit prin trimiterea unui segment TCP cu bitul FIN setat (cu semnificatia nu mai sunt date). deoarece conexiunea este full-duplex (adica, exista doua fluxuri de date, cate unul pentru fiecare sens),segmentul FIN inchide transferul numai intr-o directie. Celalat proces va trimite acum restul de date pe care-l mai are de transmis si termina si el cu un segment in care bitul  FIN este setat. Conexiunea este stearsa (informatiile despre stare ale ambelor parti) odata ce fluxul de date este inchis in ambele directii.

Interfata de programare a aplicatiilor TCP

 Ca si in cazul UDP, interfata de programare a aplicatiilor TCP nu este complet definita. Numai cateva functii de baza pe care trebuie sa le asigure sunt descrise in RFC 793 - Transmission Control Protocol. Asa cum este cazul cu cele mai multe RFC-uri din suita de protocoale TCP/IP, un mare grad de libertate este lasat implementatorilor, Permitand de aceea unor implementari optimale (ce depind de sitemul de operare), ceea ce conduce la o mai buna eficienta (o viteza mai mare de comunicare).

Urmatoarele apeluri de functii sunt descrise in acest RFC:

Open Pentru a stabili o conexiune sunt necesari cativa parametrii precum:
  • activ/pasiv
  • socketul distant (al serverului)
  • un numar de port local
  • o valoare de timp maximala pentru asteptarea confirmarii (optionala)

Aceasta intoarce un nume de conexiune local care este folosit pentru referirea acestei conexiuni particulare in toate celelalte functii.

Send Determina ca datele dintr-un buffer utilizator precizat sa fie trimise prin conexiune. Poate in mod optional sa seteze fanionul URGENT sau PUSH.
Receive Copiaza datele TCP intr-un buffer utilizator.
Close Inchide conexiunea; determina fortarea transmiterii tuturor datelor care au mai ramas (push) si un segment cu fanionul FIN setat.
Status Este un apel dependent de implementare care poate intoarce informatii precum:
  • socketul local si socketul ce descrie celalalt capat al conexiunii
  • dimensiuniel ferestrelor de emisie si receptie
  • starea conexiunii
  • numele local al conexiunii
Abort Face ca toate operatiile Send si Receive in desfasurare sa fie terminate si un RESET sa fie trimis corespondentului TCP.

Mai multe detalii pot fi gasite in RFC 793 - Transmission Control Protocol.

Cornel Mironel Niculae, 2004-2005

25-Mar-2008