9.9. UDP – pošalji paket, nadaj se najboljem

UDP, odnosno User Datagram Protocol, jednostavnija je od dviju usluga koje nudi transportni sloj. Svako UDP slanje jest jedan datagram – samostalan komad bajtova adresiran na IP i port, ubačen u mrežu sam za sebe. Protokol ga isporučuje ako može; ako ne može, ne pokušava ponovno, ne upozorava pošiljatelja i ne čuva nikakav redoslijed između datagrama.

9.9.1. Što UDP dodaje IP-u

UDP je tanak sloj povrh IP-a. Sirovoj IP isporuci dodaje tri stvari:

  • Brojeve portova na oba kraja, tako da se datagram može isporučiti pravom programu na odredišnom domaćinu, a ne samo domaćinu (vidi Portovi).

  • Polje duljine kako bi primatelj točno znao koliko bajtova korisnog sadržaja treba pročitati.

  • Mali kontrolni zbroj preko zaglavlja i korisnog sadržaja, kako bi primatelj mogao otkriti oštećeni datagram i odbaciti ga.

To je to. Sve ostalo što je IP radio ili nije radio, UDP zadržava. Datagrami se ne pokušavaju ponovno. Mogu stići izvan redoslijeda. Mogu biti duplicirani zbog osobitosti temeljne mreže. Mogu biti tiho ispušteni ako je mreža zagušena, ako je međuspremnik na odredištu pun ili ako neki od usmjerivača u sredini tako odluči.

Dijagram s pošiljateljem s lijeve strane i primateljem s desne. Tri strelice usmjerene su od pošiljatelja prema primatelju, označene s "datagram 1", "datagram 2", "datagram 3". Strelica za datagram 2 prikazana je kao isprekidana crta s X-om preko nje, što označava gubitak.

Svaki UDP datagram šalje se neovisno. Ako se jedan izgubi u prijenosu, ništa ne kaže pošiljatelju ni primatelju – praznina je tiha.

9.9.2. Zašto bi ga itko koristio

Ako je UDP toliko nepouzdan, zašto ga uopće imati? Tri razloga.

  • Brzina i opterećenje. UDP slanje je jedan paket koji izlazi; nema rukovanja, nema potvrda, nema stanja veze za održavanje. Trošak kašnjenja i propusnosti minimalan je.

  • Neovisne poruke. Neki promet je tok ažuriranja statusa gdje je svaka poruka svježa snimka, a stara je bezvrijedna. Kamera koja svake sekunde objavljuje „još sam živa, evo mog trenutnog očitanja” mari za isporuku svakog novog očitanja, a ne za ponovno reproduciranje očitanja koja su se izgubila.

  • Multicast. Jedan UDP datagram može se poslati mnogim primateljima odjednom. (TCP to ne može; svaka TCP veza je između točno dviju krajnjih točaka.) Korisno za otkrivanje usluga, telemetriju mnogim slušateljima, video streaming.

Gdje je mreža dobra i pošiljateljeva tolerancija na gubitak je visoka, UDP je pravi odgovor. Gdje isporuka i redoslijed moraju biti zajamčeni, UDP-u ili treba još jedan sloj pouzdanosti povrh, ili bi aplikacija jednostavno trebala umjesto toga koristiti TCP.

9.9.3. Kada ga ne koristiti

Vrijedi biti izričit i o suprotnom. UDP je pogrešan izbor kada:

  • Svaki bajt je važan. Konfiguracijski podaci, ažuriranja koda, potpisane transakcije – svaki slučaj gdje jedan bajt koji nedostaje čini rezultat pogrešnim.

  • Redoslijed je važan. UDP datagram 2 mogao bi stići prije datagrama 1.

  • Poruka je velika. Velike korisne sadržaje aplikacija mora podijeliti na manje datagrame; transportni sloj to neće učiniti. Ako se izgubi bilo koji dio, cijela je poruka nepotpuna.

Ako se bilo što od navedenog primjenjuje, posegnite umjesto toga za TCP-om.

9.9.4. Konkretni primjeri na kameri

Primjeri UDP prometa na strani kamere u praksi:

  • Otkrivanje. Kamera pri pokretanju emitira datagram „tko je ovdje” na lokalnu mrežu; drugi uređaji odgovaraju.

  • Telemetrija. Jednom u sekundi kamera šalje mali datagram sa svojim trenutnim očitanjima senzora sakupljaču. Gubitak povremenog uzorka nije važan jer sljedeći ionako stiže za sekundu.

  • Vremenska sinkronizacija. NTP, mrežni vremenski protokol, radi preko UDP-a. Klijent šalje mali zahtjev, poslužitelj odgovara trenutnim vremenom; ako se odgovor izgubi, klijent jednostavno kasnije ponovno pita.

  • DNS traženja. Pitanje mreže „na koji IP se ovo ime preslikava?” radi preko UDP-a. (Obrađeno na Imena i DNS.)

Python API za slanje i primanje datagrama nalazi se na UDP utičnice, nakon što ostatak priče o transportnom sloju bude na svom mjestu.