9.9. UDP – trimite un pachet și speră la ce e mai bun¶
UDP, User Datagram Protocol, este cel mai simplu dintre cele două servicii oferite de nivelul transport. Fiecare trimitere UDP este o datagramă – un fragment autonom de octeți adresat unui IP și unui port, lansat în rețea de unul singur. Protocolul îl livrează dacă poate; dacă nu poate, nu reîncearcă, nu avertizează expeditorul și nu păstrează nicio ordine între datagrame.
9.9.1. Ce adaugă UDP la IP¶
UDP este un strat subțire deasupra IP. El adaugă trei lucruri la livrarea brută IP:
Numere de port la ambele capete, astfel încât o datagramă să poată fi livrată programului corect de pe gazda de destinație, nu doar gazdei (vezi Porturi).
Un câmp de lungime, astfel încât receptorul să știe exact câți octeți de payload să citească.
O sumă de control mică (checksum) peste antet și payload, astfel încât receptorul să poată detecta o datagramă coruptă și să o elimine.
Cam asta e tot. Tot ce a făcut sau nu a făcut IP, UDP păstrează. Datagramele nu sunt reîncercate. Ele pot sosi în dezordine. Pot fi duplicate din cauza particularităților rețelei subiacente. Pot fi eliminate în tăcere dacă rețeaua este congestionată, dacă tamponul (buffer) de la destinație este plin sau dacă unul dintre routerele intermediare decide acest lucru.
Fiecare datagramă UDP este trimisă independent. Dacă una se pierde pe parcurs, nimic nu îi semnalează expeditorului sau receptorului – golul este silențios.¶
9.9.2. De ce ar folosi cineva acest protocol¶
Dacă UDP este atât de nefiabil, de ce să-l avem deloc? Din trei motive.
Viteză și suprasarcină redusă. O trimitere UDP înseamnă un singur pachet care iese; fără strângere de mână, fără confirmări, fără stare de conexiune de întreținut. Costul de latență și de lățime de bandă este minim.
Mesaje independente. O parte din trafic este un flux de actualizări de stare, în care fiecare mesaj este un instantaneu proaspăt, iar unul vechi este lipsit de valoare. O cameră care publică „sunt încă în viață, iată citirea mea curentă” în fiecare secundă se preocupă de livrarea fiecărei citiri noi, nu de redarea citirilor care s-au pierdut.
Multicast. O singură datagramă UDP poate fi trimisă simultan către mai mulți receptori. (TCP nu poate face acest lucru; fiecare conexiune TCP este între exact două capete.) Util pentru descoperirea serviciilor, telemetrie către mulți ascultători, streaming video.
Acolo unde rețeaua este bună și toleranța expeditorului la pierderi este ridicată, UDP este răspunsul corect. Acolo unde livrarea și ordinea trebuie garantate, UDP fie are nevoie de un alt strat de fiabilitate deasupra, fie aplicația ar trebui pur și simplu să folosească TCP în schimb.
9.9.3. Când să nu îl folosești¶
Și opusul merită menționat explicit. UDP este alegerea greșită atunci când:
Fiecare octet contează. Date de configurare, actualizări de cod, tranzacții semnate – orice caz în care un octet lipsă face rezultatul greșit.
Ordinea contează. Datagrama UDP 2 ar putea sosi înaintea datagramei 1.
Mesajul este mare. Payload-urile mari trebuie împărțite în datagrame mai mici de către aplicație; nivelul transport nu o va face. Dacă oricare bucată se pierde, întregul mesaj este incomplet.
Dacă oricare dintre acestea se aplică, apelează la TCP în schimb.
9.9.4. Exemple concrete pe o cameră¶
Exemple de trafic UDP din partea camerei, întâlnite în practică:
Descoperire. O cameră difuzează o datagramă de tip „cine este aici” în rețeaua locală la pornire; alte dispozitive răspund.
Telemetrie. O dată pe secundă, camera trimite o datagramă mică, cu citirile curente ale senzorilor săi, către un colector. Pierderea ocazională a unei mostre nu contează, deoarece următoarea sosește oricum într-o secundă.
Sincronizarea timpului. NTP, protocolul de timp în rețea, rulează peste UDP. Clientul trimite o cerere mică, serverul răspunde cu ora curentă; dacă răspunsul se pierde, clientul pur și simplu întreabă din nou mai târziu.
Căutări DNS. Întrebarea adresată rețelei „la ce IP se mapează acest nume?” rulează peste UDP. (Tratat în Nume și DNS.)
API-ul Python pentru trimiterea și recepționarea datagramelor se află în Socket-uri UDP, după ce restul poveștii nivelului transport este pus la punct.