9.9. UDP – odešli paket a doufej v nejlepší¶
UDP, neboli User Datagram Protocol, je jednodušší ze dvou služeb, které transportní vrstva nabízí. Každé odeslání přes UDP je jeden datagram – samostatný kus bajtů adresovaný na IP a port, vypuštěný do sítě sám o sobě. Protokol jej doručí, pokud může; pokud nemůže, nezkouší to znovu, neupozorní odesílatele a nezachovává žádné pořadí mezi datagramy.
9.9.1. Co UDP přidává k IP¶
UDP je tenká vrstva nad IP. K syrovému doručování IP přidává tři věci:
Čísla portů na obou koncích, takže datagram lze doručit správnému programu na cílovém hostiteli, nikoli pouze hostiteli (viz Porty).
Pole délky, aby příjemce přesně věděl, kolik bajtů užitečného obsahu má přečíst.
Malý kontrolní součet přes hlavičku a užitečný obsah, takže příjemce dokáže rozpoznat poškozený datagram a zahodit jej.
A to je vše. Všechno ostatní, co IP dělalo nebo nedělalo, si UDP ponechává. Datagramy se neopakují. Mohou dorazit mimo pořadí. Mohou být zdvojeny vrtochy podkladové sítě. Mohou být tiše zahozeny, pokud je síť přetížená, buffer na cíli je plný, nebo se tak rozhodne jeden ze směrovačů mezi nimi.
Každý UDP datagram je odeslán nezávisle. Pokud se jeden cestou ztratí, nic to odesílateli ani příjemci neoznámí – mezera zůstane tichá.¶
9.9.2. Proč by ho někdo používal¶
Pokud je UDP tak nespolehlivé, proč ho vůbec mít? Tři důvody.
Rychlost a režie. Odeslání přes UDP je jediný odchozí paket; žádné navázání spojení, žádná potvrzení, žádný stav spojení k udržování. Náklady na latenci a šířku pásma jsou minimální.
Nezávislé zprávy. Některý provoz je proud stavových aktualizací, kde je každá zpráva čerstvý snímek a stará je bezcenná. Kameru, která každou sekundu zveřejňuje „stále žiji, zde je můj aktuální údaj“, zajímá doručení každého nového údaje, nikoli přehrávání údajů, které se ztratily.
Multicast. Jediný UDP datagram lze odeslat mnoha příjemcům najednou. (TCP to nedokáže; každé TCP spojení je mezi přesně dvěma koncovými body.) Užitečné pro objevování služeb, telemetrii mnoha posluchačům, streamování videa.
Tam, kde je síť dobrá a tolerance odesílatele ke ztrátě je vysoká, je UDP správná odpověď. Tam, kde musí být doručení a pořadí zaručeno, UDP buď potřebuje další vrstvu spolehlivosti navrch, nebo by aplikace měla raději rovnou použít TCP.
9.9.3. Kdy ho nepoužívat¶
Stojí za to být explicitní i o opaku. UDP je špatná volba, když:
Záleží na každém bajtu. Konfigurační data, aktualizace kódu, podepsané transakce – jakýkoli případ, kdy chybějící bajt učiní výsledek nesprávným.
Záleží na pořadí. UDP datagram 2 může dorazit před datagramem 1.
Zpráva je velká. Velký užitečný obsah musí aplikace rozdělit na menší datagramy; transportní vrstva to neudělá. Pokud se ztratí jediný kus, je celá zpráva neúplná.
Pokud platí cokoli z toho, sáhněte raději po TCP.
9.9.4. Konkrétní příklady na kameře¶
Příklady UDP provozu na straně kamery v praxi:
Objevování (Discovery). Kamera při startu rozešle do lokální sítě datagram „kdo je tady“; ostatní zařízení odpoví.
Telemetrie. Jednou za sekundu kamera odešle malý datagram se svými aktuálními údaji ze senzoru sběrnému uzlu. Ztráta občasného vzorku nevadí, protože další stejně dorazí za sekundu.
Synchronizace času. NTP, síťový časový protokol, běží přes UDP. Klient odešle malý požadavek, server odpoví aktuálním časem; pokud se odpověď ztratí, klient se prostě zeptá znovu později.
DNS dotazy. Dotaz sítě „na jakou IP se mapuje toto jméno?“ běží přes UDP. (Pokryto na Jména a DNS.)
Python API pro odesílání a přijímání datagramů je na UDP sokety, poté, co je zbytek příběhu transportní vrstvy na svém místě.