udp(7)

NUME
udp - protocolul de datagramă-utilizator pentru IPv4

SINOPSIS
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/udp.h>

udp_socket = socket(AF_INET, SOCK_DGRAM, 0);

DESCRIERE
Aceasta este o implementare a protocolului de dategramă de utilizator descris în RFC 768. Acesta implementează un serviciu de pachete de date fără conexiune, nesigur. Pachetele pot fi reordonate sau duplicate înainte de a ajunge la destinație. UDP generează și verifică sumele de control pentru a detecta erorile de transmisie.

Atunci când se creează un soclu UDP, adresele sale locale și la distanță nu sunt specificate. Datagramele pot fi trimise imediat folosind sendto(2) sau sendmsg(2) cu o adresă de destinație validă ca argument. Atunci când connect(2) este apelat pe soclu, adresa de destinație implicită este definită, iar datagramele pot fi acum trimise utilizând send(2) sau write(2) fără a specifica o adresă de destinație. Este în continuare posibilă trimiterea către alte destinații prin transmiterea unei adrese către sendto(2) sau sendmsg(2). Pentru a primi pachete, soclul poate fi legat mai întâi la o adresă locală utilizând bind(2). În caz contrar, stratul de soclu va atribui automat un port local liber din intervalul definit de /proc/sys/net/ipv4/ip_local_port_range și va lega soclul la INADDR_ANY.

Toate operațiile de recepție returnează un singur pachet. Atunci când pachetul este mai mic decât tamponul transmis, se returnează doar acea cantitate de date; atunci când este mai mare, pachetul este trunchiat și se activează fanionul MSG_TRUNC. MSG_WAITALL nu este acceptat.

Opțiunile IP pot fi trimise sau primite utilizând opțiunile de soclu descrise în ip(7). Acestea sunt prelucrate de nucleu numai atunci când parametrul /proc corespunzător este activat (dar sunt transmise utilizatorului chiar și atunci când acesta este dezactivat). A se vedea ip(7).

Atunci când fanionul MSG_DONTROUTE este activat la trimitere, adresa de destinație trebuie să se refere la adresa unei interfețe locale, iar pachetul este trimis numai către acea interfață.

În mod implicit, Linux UDP face descoperirea traseului MTU (Maximum Transmission Unit). Aceasta înseamnă că nucleul va ține evidența MTU către o anumită adresă IP țintă și va returna EMSGSIZE atunci când scrierea unui pachet UDP îl depășește. Atunci când se întâmplă acest lucru, aplicația ar trebui să reducă dimensiunea pachetului. Descoperirea MTU a rutei poate fi, de asemenea, dezactivată utilizând opțiunea de soclu IP_MTU_DISCOVER sau fișierul /proc/sys/net/ipv4/ip_no_pmtu_disc; consultați ip(7) pentru detalii. Atunci când este dezactivat, UDP va fragmenta pachetele UDP ieșite care depășesc MTU-ul interfeței. Cu toate acestea, dezactivarea nu este recomandată din motive de performanță și fiabilitate.

  Formatul adreselor
UDP utilizează formatul de adresă IPv4 sockaddr_in descris în ip(7).

  Gestionarea erorilor
Toate erorile fatale vor fi transmise utilizatorului ca răspuns la eroare, chiar și atunci când soclul nu este conectat. Aceasta include erorile asincrone primite din rețea. Puteți primi o eroare pentru un pachet anterior care a fost trimis pe același soclu. Acest comportament diferă de multe alte implementări de soclu BSD care nu transmit nicio eroare decât dacă soclul este conectat. Comportamentul Linux este impus de RFC 1122.

Pentru compatibilitate cu codul vechi, în Linux 2.0 și 2.2 a fost posibilă definirea opțiunii SO_BSDCOMPAT SOL_SOCKET pentru a primi erori la distanță numai atunci când soclul a fost conectat (cu excepția EPROTO și EMSGSIZE). Erorile generate la nivel local sunt întotdeauna transmise. Suportul pentru această opțiune de soclu a fost eliminat în nucleele ulterioare; consultați socket(7) pentru informații suplimentare.

Atunci când opțiunea IP_RECVERR este activată, toate erorile sunt stocate în coada de erori a soclului și pot fi primite de recvmsg(2) cu fanionul MSG_ERRQUEUE activat.

  Interfețe „/proc”
Reglajele parametrilor UDP la nivelul întregului sistem pot fi accesate de fișierele din directorul /proc/sys/net/ipv4/.

udp_mem (începând cu Linux 2.6.25)
    Acesta este un vector format din trei numere întregi care guvernează numărul de pagini permise pentru coada de așteptare de către toate soclurile UDP.

    min Sub acest număr de pagini, UDP nu este preocupat de apetitul său pentru memorie. Atunci când cantitatea de memorie alocată de UDP depășește acest număr, UDP începe să modereze utilizarea memoriei.

    pressure
        Această valoare a fost introdusă pentru a respecta formatul tcp_mem (a se vedea tcp(7)).

    max Numărul de pagini admise în coada de așteptare de către toate soclurile UDP.

    Valorile implicite pentru aceste trei elemente sunt calculate la pornire din cantitatea de memorie disponibilă.

udp_rmem_min (număr întreg; valoare implicită: PAGE_SIZE; începând cu Linux 2.6.25)
    Dimensiunea minimă, în octeți, a tampoanelor de recepție utilizate de soclurile UDP în mod moderat. Fiecare soclu UDP este capabil să utilizeze dimensiunea pentru primirea datelor, chiar dacă paginile totale ale soclurilor UDP depășesc pragul udp_mem.

udp_wmem_min (număr întreg; valoare implicită: PAGE_SIZE; începând cu Linux 2.6.25)
    Dimensiunea minimă, în octeți, a tamponului de trimitere utilizat de soclurile UDP în mod moderat. Fiecare soclu UDP este capabil să utilizeze dimensiunea pentru trimiterea de date, chiar dacă numărul total de pagini ale soclurilor UDP depășește pragul udp_mem.

  Opțiuni de soclu
Pentru a defini sau a obține o opțiune de soclu UDP, apelați getsockopt(2) pentru a citi sau setsockopt(2) pentru a scrie opțiunea cu argumentul de nivel al opțiunii stabilit la IPPROTO_UDP. Dacă nu se specifică altfel, optval este un indicator către un int.

În continuare este prezentată o listă a opțiunilor de soclu specifice UDP. Pentru detalii despre alte opțiuni de soclu care sunt de asemenea aplicabile soclurilor UDP, consultați socket(7).

UDP_CORK (începând cu Linux 2.5.44)
    Dacă această opțiune este activată, atunci toate datele transmise pe acest soclu sunt acumulate într-o singură datagramă care este transmisă atunci când opțiunea este dezactivată. Această opțiune nu ar trebui utilizată în codul destinat să fie portabil.

UDP_SEGMENT (începând cu Linux 4.18)
    Activează descărcarea de segmentare UDP. Descărcarea de segmentare reduce costul send(2) prin transferul mai multor datagrame de date sub forma unui singur pachet mare prin ruta de transmisie a nucleului, chiar și atunci când aceasta depășește MTU. Cât mai târziu posibil, pachetul mare este împărțit în funcție de dimensiunea segmentului într-o serie de datagrame. Această etapă de descărcare a segmentării este amânată la hardware dacă este acceptată, în caz contrar fiind efectuată în software. Această opțiune ia o valoare în intervalul [0, USHRT_MAX] care stabilește dimensiunea segmentului: dimensiunea sarcinii utile a datagramelor, excluzând antetul UDP. Dimensiunea segmentului trebuie aleasă astfel încât cel mult 64 de datagrame să fie trimise într-un singur apel și ca datagramele după segmentare să respecte aceleași reguli MTU care se aplică datagramelor trimise fără această opțiune. Descărcarea segmentării depinde de descărcarea sumelor de control, deoarece sumele de control ale datagramelor sunt calculate după segmentare. Opțiunea poate fi, de asemenea, definită pentru apelurile individuale sendmsg(2) prin transmiterea acesteia ca cmsg(3). O valoare de zero dezactivează caracteristica. Această opțiune nu ar trebui utilizată în codul destinat să fie portabil.

UDP_GRO (începând cu Linux 5.0)
    Activează descărcarea recepției UDP. Dacă este activată, soclul poate primi mai multe datagrame de date ca un singur tampon mare, împreună cu un cmsg(3) care conține dimensiunea segmentului. Această opțiune este inversă descărcării de segmentare. Aceasta reduce costurile de recepție prin gestionarea mai multor datagrame de date ca un singur pachet mare în ruta de recepție a nucleului, chiar și atunci când aceasta depășește MTU. Această opțiune nu ar trebui utilizată în codul destinat să fie portabil.

  Ioctl-uri
Aceste ioctl-uri pot fi accesate folosind ioctl(2). Sintaxa corectă este:

    int value;
    error = ioctl(udp_socket, ioctl_type, &value);

FIONREAD (SIOCINQ)
    Obține un indicator la un număr întreg ca argument. Returnează dimensiunea următoarei datagrame în așteptare în număr întreg, în octeți, sau 0 atunci când nu există nicio datagramă în așteptare. Avertisment: Utilizând FIONREAD, este imposibil să se distingă cazul în care nu există nicio datagramă în așteptare de cazul în care următoarea datagramă în așteptare conține zero octeți de date. Este mai sigur să utilizați select(2), poll(2) sau epoll(7) pentru a distinge aceste cazuri.

TIOCOUTQ (SIOCOUTQ)
    Returnează numărul de octeți de date din coada de expediere locală. Compatibil numai cu Linux 2.4 și versiunile ulterioare.

În plus, sunt acceptate toate ioctl-urile documentate în ip(7) și socket(7).

ERORI-IEȘIRE
Toate erorile documentate pentru socket(7) sau ip(7) pot fi returnate de o trimitere sau o primire pe un soclu UDP.

ECONNREFUSED
    Niciun receptor nu a fost asociat cu adresa de destinație. Acest lucru ar putea fi cauzat de un pachet anterior trimis prin soclu.

VERSIUNI
IP_RECVERR a apărut ca o caracteristică nouă în Linux 2.2.

CONSULTAȚI ȘI
ip(7), raw(7), socket(7), udplite(7)

Fișierul sursă al nucleului Documentation/networking/ip-sysctl.rst.

RFC 768 pentru Protocolul Datagramă Utilizator- UDP.
RFC 1122 pentru cerințele privind gazdele.
RFC 1191 pentru o descriere a descoperirii MTU a rutei.

TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.