UDP (User Datagram Protocol) — protocol de transmitere a datelor fără stabilirea conexiunii, care funcționează peste IP și asigură o întârziere minimă la trimiterea de datagrame. Spre deosebire de TCP, UDP nu garantează livrarea, ordinea pachetelor sau protecția împotriva duplicării. Conform datelor IETF RFC 768 (2024), UDP procesează peste 40% din traficul global de internet datorită apelurilor video, streamingului și cererilor DNS.
Principalele puncte
UDP (User Datagram Protocol) — unul dintre protocoalele cheie ale stratului de transport al modelului TCP/IP, dezvoltat de David Reed în 1980. Acesta oferă un mecanism minim de transmitere a datelor: aplicația trimite o datagramă, iar protocolul nu urmărește dacă a ajuns la destinatar.
Antetul UDP este format din doar patru câmpuri: portul sursă, portul destinație, lungimea și suma de control. Fiecare câmp ocupă 2 octeți, deci dimensiunea totală a antetului este de 8 octeți. Pentru comparație, antetul TCP fără opțiuni ocupă 20 de octeți, iar cu opțiuni — până la 60 de octeți.
Protocolul nu suportă fragmentarea la nivelul său — dacă datagrama depășește MTU (Maximum Transmission Unit), este fragmentată la nivelul IP. La pierderea unui fragment, întreaga datagramă este eliminată, deoarece UDP nu poate solicita retransmisia fragmentelor individuale. Dezvoltatorii trebuie să controleze dimensiunea datagramei — pentru rețelele mobile, MTU este adesea de 1400 de octeți, deci dimensiunea maximă nu trebuie să depășească această valoare.
Aplicația care utilizează UDP creează un socket de tip SOCK_DGRAM, specifică portul și adresa IP de destinație și trimite datagrama. Protocolul adaugă un antet minim și transmite pachetul la nivelul IP. Destinatarul ascultă pe portul său și extrage datele din datagramele primite.
UDP nu efectuează controlul de congestie — aplicația poate trimite datagrame cu viteza maximă pe care o suportă rețeaua. Acest lucru poate duce la suprasolicitarea canalului, dar în scenariile de timp real, o astfel de agresivitate este justificată: pentru un apel video, fluxul de date cu posibile pierderi este mai important decât oprirea transmisiei.
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(b'Hello, UDP!', ('192.168.1.100', 8888))
sock.close()
În exemplu, se creează un socket SOCK_DGRAM pentru UDP. Metoda sendto trimite datagrama fără stabilirea conexiunii — este suficient să cunoaștem IP-ul și portul destinatarului. Metoda recvfrom pe partea serverului returnează atât datele, cât și adresa expeditorului pentru răspuns. Socketurile UDP pe platformele mobile se configurează similar, dar necesită permisiuni suplimentare: pe iOS trebuie adăugat NSAppTransportSecurity pentru conexiunile UDP necriptate, iar pe Android — permisiunea INTERNET în manifest.
Alegerea UDP este justificată în scenariile unde viteza este mai importantă decât fiabilitatea. Protocolul nu pierde timp cu stabilirea conexiunii, confirmările și retransmisiile — acest lucru oferă o întârziere minimă, dar necesită ca dezvoltatorul să gestioneze independent pierderile.
| Avantaje | Dezavantaje |
|---|---|
| Întârziere redusă — fără handshake | Fără garanția livrării |
| Antet mai mic — 8 octeți | Fără control de congestie |
| Suport pentru broadcast și multicast | Posibile duplicate de pachete |
| Independența datagramelor — fără cozi | Dimensiunea datagramei limitată de MTU |
În aplicațiile mobile, UDP este utilizat prin frameworkuri precum WebRTC, care adaugă peste UDP controlul pierderilor, debitul adaptiv și jitter buffer. Acest lucru oferă avantajele vitezei fără dezavantajele protocolului brut.
Un alt aspect important al UDP este absența controlului de congestie. În TCP, algoritmii Slow Start și Congestion Avoidance reduc viteza de transmisie la pierderea pachetelor pentru a nu suprasolicita rețeaua. UDP nu are astfel de mecanisme, prin urmare dezvoltatorii trebuie să își implementeze propriile strategii de control al vitezei — de exemplu, debit adaptiv în apelurile video sau limitare de rată pe serverele de jocuri pentru a preveni suprasolicitarea excesivă a canalului de rețea.
UDP este indispensabil în scenariile unde toleranța la întârziere este mai importantă decât toleranța la pierderea pachetelor. Să examinăm principalele domenii de aplicare ale protocolului în dezvoltarea mobilă și web.
Protocoalele RTP și RTSP, care funcționează peste UDP, sunt utilizate pentru transmiterea fluxurilor audio și video în timp real. WebRTC — standardul pentru apeluri video în browsere și aplicații mobile — folosește UDP ca transport principal pentru datele media și TCP pentru semnalizare. Pierderea unui singur pachet într-un video de 30 fps este imperceptibilă pentru utilizator, spre deosebire de întârzierea retransmisiei care cauzează o înghețare vizibilă a imaginii.
Jocurile de tip shooter multiplayer și MOBA necesită o întârziere sub 50 ms pentru sincronizare corectă. UDP transmite pozițiile jucătorilor, împușcăturile și evenimentele mai rapid decât TCP, iar pierderea unui pachet este pur și simplu ignorată — următoarea actualizare va sosi în 16–33 ms. Motoarele de jocuri populare, inclusiv Unity și Unreal Engine, utilizează UDP prin propriile lor straturi de transport cu adăugarea de fiabilitate pentru evenimente critice prin confirmări la nivelul aplicației.
Cererile DNS utilizează UDP pe portul 53, deoarece fiecare cerere este o singură datagramă mică (de obicei până la 512 octeți). Dacă răspunsul nu sosește, clientul pur și simplu repetă cererea după un timeout, ceea ce este mai rapid decât stabilirea unei conexiuni TCP cu strângerea sa de mână în trei pași. DHCP funcționează, de asemenea, peste UDP, deoarece clientul nu are încă o adresă IP și nu poate stabili o conexiune TCP, iar pachetele UDP de broadcast permit găsirea serverului DHCP în rețeaua locală.
Alegerea între UDP și TCP este un compromis între viteză și fiabilitate. Fiecare protocol este optim pentru clasa sa de sarcini, iar înțelegerea diferențelor lor ajută la luarea deciziilor arhitecturale corecte în proiectarea interacțiunilor de rețea în aplicațiile mobile.
| Criteriu | UDP | TCP |
|---|---|---|
| Stabilirea conexiunii | Nu este necesară | Strângere de mână în trei pași |
| Antet | 8 octeți | 20–60 octeți |
| Garanția livrării | Nu | Da, cu confirmare |
| Ordonare | Nu | Da |
| Control de congestie | Nu | Da (AIMD, Slow Start) |
| Aplicare | Streaming, jocuri, DNS | Web, email, fișiere, API |
În proiectele mobile se folosește adesea o abordare hibridă: TCP pentru cererile fiabile (autentificare, încărcare date) și UDP pentru fluxurile media. QUIC — protocolul modern Google care funcționează peste UDP — combină viteza UDP cu fiabilitatea TCP și este deja utilizat în HTTP/3.
Să examinăm un server UDP simplu în Python care primește mesaje de la clienți și trimite răspunsuri. Serverul ascultă pe portul 8888 și procesează datagramele primite într-o buclă infinită.
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('0.0.0.0', 8888))
print('Serverul UDP a pornit pe portul 8888')
while True:
data, addr = server.recvfrom(1024)
print(f'Primit de la {addr}: {data.decode()}')
server.sendto(b'OK', addr)
Serverul creează un socket UDP, se leagă de portul 8888 și așteaptă datagrame primite. recvfrom returnează datele și adresa clientului, permițând să se răspundă prin sendto. Spre deosebire de TCP, serverul nu stochează starea conexiunii — fiecare datagramă este procesată independent. Acest lucru face serverele UDP scalabile: un singur server poate gestiona milioane de clienți fără a aloca memorie pentru fiecare conexiune separată, ceea ce este important pentru serverele DNS și sistemele de matchmaking pentru jocuri.
În dezvoltarea mobilă, UDP este adesea utilizat prin biblioteci de nivel înalt. De exemplu, CocoaAsyncSocket pentru iOS oferă socketuri UDP cu delegati și GCD pentru procesarea asincronă a evenimentelor. Pe Android, clasa DatagramSocket face parte din biblioteca standard java.net și nu necesită dependențe suplimentare. Pentru Flutter există pachetul udp, care oferă o interfață simplă pentru trimiterea și primirea de datagrame fără configurarea socketurilor native.
Este important de menționat că multe rețele mobile și firewalluri corporative blochează traficul UDP, în special pe porturile peste 1024. Dacă aplicația dvs. utilizează UDP, trebuie să prevedeți un fallback pe TCP sau verificarea disponibilității protocolului prin servere STUN, așa cum face WebRTC. Pe iOS, frameworkul de sistem Network.framework cu NWConnection suportă atât TCP, cât și UDP, selectând automat protocolul optim pe baza disponibilității. Pentru aplicațiile de timp real, se recomandă, de asemenea, implementarea debitului adaptiv, care reduce calitatea fluxului la pierderea pachetelor, asigurând continuitatea redării chiar și pe canale instabile cu un nivel ridicat de erori.
Întrebări frecvente
UDP nu stabilește o conexiune și nu garantează livrarea pachetelor, ceea ce îl face mai rapid decât TCP. Antetul UDP — 8 octeți față de 20–60 octeți la TCP. UDP este potrivit pentru streaming și jocuri, TCP — pentru cereri web și transfer de fișiere.
Datagrama — un pachet de date independent cu antet UDP (port sursă, port destinație, lungime, sumă de control). Fiecare datagramă este procesată independent, fără legătură cu cele anterioare. Dimensiunea datagramei este limitată de MTU-ul rețelei și, conform specificației, până la 65507 octeți.
UDP nu asigură fiabilitatea la nivelul de transport — aceasta este implementată de aplicație. Dezvoltatorii adaugă numere de ordine, sume de control, cereri repetate și corectare de erori. FEC (Forward Error Correction) permite recuperarea pachetelor pierdute fără retransmitere.
UDP nu este potrivit pentru scenariile unde integritatea datelor este critică: transfer de fișiere, tranzacții bancare, REST-API. În aceste cazuri, TCP garantează că fiecare octet va sosi în ordinea corectă. UDP nu este, de asemenea, recomandat pe canale instabile cu un nivel ridicat de pierderi.
QUIC — un protocol de transport care funcționează peste UDP, dezvoltat de Google și standardizat de IETF ca RFC 9000. Acesta combină viteza UDP cu fiabilitatea TCP, suportă multiplexarea fără blocare și criptarea integrată. HTTP/3 utilizează QUIC ca strat de transport.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și