Vartotojo Datagramų Protokolas (UDP) yra vienas iš pagrindinių interneto protokolo rinkinio ryšių protokolų, naudojamų žinutėms (transportuojamoms kaip datagramos paketai) siųsti į kitus IP tinklo mazgus. UDP yra be ryšio protokolas, o tai reiškia, kad žinutės siunčiamos be ryšio derinimo ir UDP neseka, ką jis išsiuntė. UDP teikia kontrolinius sumos laukus duomenų vientisumui ir prievadų numerius, skirtus skirtingoms funkcijoms šaltiniame ir paskirties datagramos taškuose adresuoti. Jam nebūdingi tarpusavio susitarimo dialogai, todėl vartotojo programai tenka prisiimti bet kokį pagrindinio tinklo patikimumo trūkumą; nėra garantijos dėl pristatymo, tvarkos ar dublikatų apsaugos. UDP tinka paskirtims, kuriose klaidų tikrinimas ir pataisymas yra nereikalingi arba atliekami programoje; UDP vengia tokių apdorojimo išlaidų protokolo rinkinyje. Šį protokolą sukūrė David P.
UDP yra paprastas, žinutes orientuotas transporto sluoksnio protokolas, aprašytas RFC 768. Nors UDP teikia vientisumo patikrinimą (per kontrolinę sumą) antraštės ir naudingosios apkrovos atžvilgiu, jis nesuteikia jokių garantijų viršutinio sluoksnio protokolui dėl žinučių pristatymo, o UDP sluoksnis neišlaiko jokios UDP žinučių būsenos po jų išsiuntimo. Programos gali naudoti datagramų lizdus (sockets) ryšiui tarp mazgų užmegzti. Programa susieja lizdą su savo duomenų perdavimo galiniu tašku, kuris yra IP adreso ir prievado derinys. Tokiu būdu UDP suteikia programų multipleksavimą. Prievadas yra programinė struktūra, identifikuojama prievado numeriu - 16 bitų skaitine reikšme, leidžiančia turėti prievado numerius nuo 0 iki 65535. Internetinė numerių autoritetas (IANA) suskirstė prievadų numerius į tris diapazonus. Prievadų numeriai nuo 0 iki 1023 naudojami bendroms, gerai žinomoms paslaugoms. Unix tipo operacinėse sistemose šių prievadų naudojimui reikia administratoriaus privilegijų. Prievadų numeriai nuo 1024 iki 49151 yra registruoti prievadai, naudojami IANA registruotoms paslaugoms. Prievadai nuo 49152 iki 65535 yra dinaminiai prievadai, kurie nėra oficialiai paskirti jokiai konkrečiai paslaugai ir gali būti naudojami bet kokiam tikslui.
UDP Datagramos Struktūra ir Dydis
UDP datagrama susideda iš UDP antraštės (header), po kurios seka duomenų dalis (naudingoji apkrova programai). Kontrolinės sumos (Checksum) ir šaltinio prievado (Source Port) laukų naudojimas IPv4 yra neprivalomas (šviesiai violetinis fonas lentelėje). IPv6 tik šaltinio prievado laukas yra neprivalomas.
- Šaltinio prievadas (Source Port): Šis laukas identifikuoja siuntėjo prievadą, jei jis naudojamas, ir turėtų būti laikomas prievadu, į kurį atsakyti, jei reikia. Jei šaltinio mazgas yra klientas, prievado numeris greičiausiai bus efemeriškas prievadas.
- Paskirties prievadas (Destination Port): Šis laukas identifikuoja imtuvo prievadą ir yra privalomas.
- Ilgis (Length): Šis laukas nurodo UDP datagramos dydį baitais, įskaitant antraštės laukus ir duomenų lauką. Minimalus ilgis yra 8 baitai - tai tik antraštės dydis. Laukų dydis nustato teorinę UDP datagramos ribą iki 65 535 baitų (8 baitų antraštė + 65 527 baitų duomenys). Naudojant IPv6 jumbogramas, galima turėti didesnes nei 65 535 baitų UDP datagramas.
- Kontrolinė suma (Checksum): Šis laukas gali būti naudojamas antraštės ir duomenų klaidų tikrinimui. Kitaip tariant, visi 16 bitų žodžiai sumuojami naudojant vienetų papildymo aritmetiką. Sumuojami 16 bitų vertės. Kai UDP veikia virš IPv4, kontrolinė suma apskaičiuojama naudojant pseudopatraštę, kuri turi dalį informacijos iš tikrosios IPv4 antraštės. Pseudopatraštė nėra ta tikroji IPv4 antraštė, naudojama IP paketui siųsti; ji naudojama tik kontrolinės sumos apskaičiavimui. UDP kontrolinės sumos apskaičiavimas IPv4 yra neprivalomas.
Kadangi UDP trūksta patikimumo, UDP programos gali susidurti su paketų praradimu, netvarka, klaidomis ar dublikatais. Jei naudojamas UDP, galutinio vartotojo programos turi teikti bet kokius reikiamus tarpusavio susitarimus, pavyzdžiui, realaus laiko patvirtinimą, kad žinutė buvo gauta. Dažniausiai UDP programos nenaudoja patikimumo mechanizmų ir netgi gali būti jais stabdomos. Transliacinis media, realaus laiko daugelio žaidėjų žaidimai ir balsas per IP (VoIP) yra tipinės programos, naudojančios UDP. Šiose konkrečiose programose paketų praradimas paprastai nėra mirtina problema. Pavyzdžiui, VoIP atveju svarbiausi yra vėlavimas ir drebėjimas. Balso ir vaizdo srautai paprastai perduodami naudojant UDP. Realaus laiko vaizdo ir garso transliacijos protokolai yra sukurti taip, kad galėtų tvarkyti atsitiktinius prarastus paketus, todėl kokybės pablogėjimas yra nedidelis, palyginti su dideliais vėlavimais, kurie atsirastų, jei prarasti paketai būtų persiunčiami. Kai kurios VPN sistemos, pvz., OpenVPN, palaiko veikimą per UDP ir teikia taikomojo sluoksnio klaidų tikrinimą bei mechanizmus, skirtus perdavimo patikimumui didinti.

QUIC yra transporto protokolas, sukurtas virš UDP. QUIC suteikia patikimą ir saugų ryšį. HTTP/3 naudoja QUIC, skirtingai nei ankstesnės HTTPS versijos, kurios naudoja TCP ir TLS derinį, siekdamos užtikrinti atitinkamai patikimumą ir saugumą.
UDP Prieš TCP: Tinkamumo Palyginimas
Perdavimo Kontrolės Protokolas (TCP) yra orientuotas į ryšį protokolas ir reikalauja tarpusavio susitarimo, kad būtų galima užmegzti ryšį tarp galinių taškų.
- Patikimas - TCP tvarko žinučių pripažinimą, persiuntimą ir laikmačius. Daroma daug bandymų pristatyti žinutę. Jei duomenys pakeliui prarandami, jie bus persiųsti.
- Tvarkingas - Jei dvi žinutės siunčiamos per ryšį nuosekliai, pirmoji žinutė pasieks imtuvo programą pirmiausia.
- Sunkus - TCP reikalauja trijų paketų, kad būtų galima užmegzti lizdo ryšį, prieš išsiunčiant bet kokius vartotojo duomenis.
Vartotojo Datagramų Protokolas yra paprastesnis, žinutes pagrįstas, be ryšio protokolas.
- Bėgimo be ryšio - Nėra užmegztas dedikuotas ryšys tarp galinių taškų.
- Nepatikimas - Kai UDP žinutė išsiunčiama, negalima žinoti, ar ji pasieks paskirties vietą; ji gali pasimesti pakeliui.
- Lengvas - Nėra žinučių tvarkos, nesekami ryšiai ir pan.
- Datagramos - Paketai siunčiami atskirai ir tikrinamas jų vientisumas atvykus.
- Nėra perkrovos kontrolės - UDP pats savaime nesaugo nuo perkrovos.
Viena iš pagrindinių problemų, susijusių su UDP, yra maksimalus leistinas duomenų dydis. IPv4 transporto priemonėje UDP rėmin į naudingąją apkrovą galima sutalpinti iki 65 507 baitų. Tai yra 28 baitais mažiau nei IPv4 maksimali 16 bitų paketo ilgio reikšmė, nes leidžiama 20 baitų IPv4 paketo antraštei ir 8 baitai UDP antraštei. Praktikoje dauguma tinklų visai nesusidoroja su tokiais dideliais IP paketais. IP fragmentacija naudojama dideliam IP paketui pritaikyti, kad jis galėtų būti perduotas per tinklo kelią, kuris naudoja mažesnį maksimalų perdavimo dydį.
TCP vs UDP For Video Streaming
Be to, dabartinis IETF darbas, „IP fragmentacijos vengimas DNS per UDP“, nurodo, kad fragmentuoti DNS atsakymai turi sisteminių trūkumų, kurie DNS užklausos dalyvį atskleidžia DNS talpyklos užteršimui iš išorės atakų. DNS vengia IP fragmentacijos apribodamas maksimalų UDP perduodamos naudingosios apkrovos dydį. DNS atsakyme nustatytas sutrumpinimo (TC) bitas turėjo reikšti, kad imtuvas turėtų atmesti šį UDP atsakymą ir atlikti tą pačią DNS užklausą per TCP transportą. Tai nėra labai efektyvi priemonė. DNS užklausa dabar užtrunka du papildomus Round-Trip Time (RTT) intervalus (vieną DNS sutrumpintam atsakymui ir papildomą mainą TCP tarpusavio susitarimui), o serveris taip pat turi išlaikyti TCP būseną, o tai riboja serverio užklausų apdorojimo pajėgumą. Šis 512 baitų apribojimas tampa problemiškas įvairiose situacijose. Pavyzdžiui, DNSSEC pasirašyta DNSSEC viešųjų raktų užklausa šakniniam domenui (root zone) sukuria 1169 baitų atsakymą. Problema neapsiriboja tik DNSSEC. DNS naudojame įvairioms autentifikacijos formoms, ir įprasta praktika yra įkelti autentifikacijos kodus į DNS kaip TXT įrašus. Keli TXT įrašai bus supakuoti į atsakymą, todėl atsakymai gali būti gana dideli.
Maksimalaus UDP Naudingosios Apkrovos Dydžio Praktiniai Aspektai
Nors protokolas leidžia dideles datagramas, praktiškai UDP žinutes reikėtų laikyti apie 1400-1450 baitų. Dauguma tinklų turi 1500 baitų maksimalų perdavimo vienetą (MTU) Ethernet. Atsižvelgiant į IP antraštę (20 baitų) ir UDP antraštę (8 baitai), lieka maždaug 1472 baitai naudingajai apkrovai. Laikykitės šiek tiek žemiau šio slenksčio, apie 1400-1450 baitų. Jei jūsų UDP datagrama viršija kelio MTU, IP sluoksnis ją suskaido į kelis paketus. Norint užtikrinti patikimą UDP ryšį, dydį nustatykite taip, kad būtų išvengta fragmentacijos.
UDP antraštė yra 8 baitų struktūra kiekvienos UDP datagramos pradžioje. Suprasti UDP antraštę padeda taisant ryšio problemas, konfigūruojant ugniasienės taisykles ir diagnozuojant taikomojo sluoksnio problemas. UDP antraštė, skirtingai nei IPv4 antraštė, neturi parinkčių. Tai fiksuota 8 baitų struktūra. UDP yra be ryšio ir nepatikimas. Jis neužmezga ryšių, negarantuoja pristatymo ar nepalaiko paketų tvarkos.
Pavyzdžiui, DNS (Domain Name System) naudoja UDP. DNS užklausa paprastai yra maža, bet atsakymas gali būti didesnis. 53 prievadas yra gerai žinomas DNS prievadas. Jei UDP datagramos dydis yra 35 baitai, tai apima antraštę ir duomenis. Kitas pavyzdys yra DHCP (Dynamic Host Configuration Protocol). DHCP klientas naudoja 68 prievadą, o serveris - 67 prievadą. Jei DHCP atsakymo dydis yra 309 baitai, tai rodo didesnį UDP datagramos dydį.
UDP antraštės laukų dydis yra 16 bitų, todėl prievadų diapazonas yra nuo 0 iki 65535. Antraštę sudaro 16 bitų šaltinio prievadas, 16 bitų paskirties prievadas, 16 bitų ilgis ir 16 bitų kontrolinė suma. Tai yra informacija, naudojama datagramai siųsti į jos paskirties vietą.
Pagal IPv6 specifikaciją, IPv6 tinklai ir mazgai turi gebėti tvarkyti iki 1280 baitų dydžio IPv6 paketą be fragmentacijos. IPv4 specifikacija numato 68 baitų nefragmentuoto paketo dydį, o IPv4 mazgai turi gebėti surinkti iki 576 baitų ilgio IP paketus. Praktikoje originalūs Ethernet paketo dydžiai (nuo 64 iki 1500 baitų) buvo plačiai priimti internete, ir daugeliu atvejų (kur nėra kapsuliavimo tunelių) paketai iki 1500 baitų praeina per viešąjį internetą be IP fragmentacijos.
Jei pagrindinis tikslas yra išvengti IP paketo fragmentacijos, tada UDP buferio dydis 4096 baitai yra per didelis. DNS Flag Day 2020 patarimai siūlė naudoti EDNS(0) buferio dydį 1232 baitai kaip minimalų saugų dydį, remiantis 1280 baitų nefragmentuotais IPv6 paketais ir numatant IPv6 bei UDP paketo antraštes.

Dabartinis IETF darbas, projektas-dnsop-avoid-fragmentation, siūlo, kad EDNS buferio dydis turėtų atspindėti ne tik užklausos dalyvio maksimalų paketo surinkimo buferio dydį, bet ir gaunamos tinklo sąsajos maksimalų perdavimo vienetą (MTU), ir, jei žinoma, tinklo kelio MTU vertę. Tai kelia klausimą, kaip rekursyvūs resolveryje laikosi šių patarimų.
UDP datagramų dydžio pasirinkimas turi didelę įtaką tinklo našumui ir patikimumui. Nors didesnės datagramos gali sumažinti antraščių dalį ir padidinti efektyvumą, jos taip pat didina fragmentacijos riziką ir vėlavimą, ypač tinkluose su mažesniu MTU. Dėl šios priežasties, praktikoje dažnai rekomenduojama naudoti UDP datagramas, kurių dydis yra apie 1400-1450 baitų, siekiant išvengti fragmentacijos ir užtikrinti geresnį suderinamumą su dauguma tinklų.