9.9. UDP – verstuur een pakket, hoop op het beste

UDP, het User Datagram Protocol, is de eenvoudigere van de twee diensten die de transportlaag biedt. Elke UDP-verzending is één datagram – een op zichzelf staand stuk bytes geadresseerd aan een IP en een poort, dat op zichzelf in het netwerk wordt gedropt. Het protocol levert het af als het kan; als het dat niet kan, probeert het het niet opnieuw, waarschuwt het de verzender niet, en bewaart het geen enkele volgorde tussen datagrammen.

9.9.1. Wat UDP toevoegt aan IP

UDP is een dunne laag bovenop IP. Het voegt drie dingen toe aan de ruwe IP-aflevering:

  • Poortnummers aan beide uiteinden, zodat een datagram kan worden afgeleverd bij het juiste programma op de bestemmingshost, niet alleen bij de host (zie Poorten).

  • Een lengteveld, zodat de ontvanger precies weet hoeveel bytes payload hij moet lezen.

  • Een kleine checksum over de header en de payload, zodat de ontvanger een beschadigd datagram kan detecteren en weggooien.

Dat is het. Al het andere dat IP wel of niet deed, behoudt UDP. Datagrammen worden niet opnieuw geprobeerd. Ze kunnen in de verkeerde volgorde aankomen. Ze kunnen worden gedupliceerd door eigenaardigheden van het onderliggende netwerk. Ze kunnen stilletjes worden weggegooid als het netwerk overbelast is, de buffer op de bestemming vol is, of een van de routers ertussen daartoe besluit.

Een diagram met de verzender links en de ontvanger rechts. Drie pijlen wijzen van verzender naar ontvanger, met de labels "datagram 1", "datagram 2", "datagram 3". De pijl voor datagram 2 wordt weergegeven als een stippellijn met een X erover, wat verlies aangeeft.

Elk UDP-datagram wordt onafhankelijk verstuurd. Als er één onderweg verloren gaat, wordt noch de verzender noch de ontvanger daarvan op de hoogte gesteld – het gat is stil.

9.9.2. Waarom iemand het zou gebruiken

Als UDP zo onbetrouwbaar is, waarom het dan überhaupt hebben? Drie redenen.

  • Snelheid en overhead. Een UDP-verzending is één enkel pakket dat uitgaat; geen handshake, geen bevestigingen, geen verbindingstoestand om te onderhouden. De kosten in latentie en bandbreedte zijn minimaal.

  • Onafhankelijke berichten. Sommig verkeer is een stroom van statusupdates waarbij elk bericht een verse momentopname is en een oude waardeloos is. Een camera die elke seconde publiceert “ik leef nog, hier is mijn huidige meting” geeft erom dat elke nieuwe meting wordt afgeleverd, niet om het opnieuw afspelen van de metingen die verloren zijn gegaan.

  • Multicast. Eén enkel UDP-datagram kan tegelijk naar veel ontvangers worden verstuurd. (TCP kan dat niet; elke TCP-verbinding loopt tussen precies twee eindpunten.) Nuttig voor dienstontdekking, telemetrie naar veel luisteraars, videostreaming.

Waar het netwerk goed is en de tolerantie van de verzender voor verlies hoog is, is UDP het juiste antwoord. Waar aflevering en volgorde gegarandeerd moeten zijn, heeft UDP ofwel een extra laag betrouwbaarheid erbovenop nodig, of zou de applicatie gewoon TCP moeten gebruiken.

9.9.3. Wanneer het niet te gebruiken

Het tegenovergestelde is het ook waard om expliciet te maken. UDP is de verkeerde keuze wanneer:

  • Elke byte telt. Configuratiegegevens, code-updates, ondertekende transacties – elk geval waarin een ontbrekende byte het resultaat verkeerd maakt.

  • Volgorde telt. UDP-datagram 2 kan vóór datagram 1 aankomen.

  • Het bericht is groot. Grote payloads moeten door de applicatie in kleinere datagrammen worden opgesplitst; de transportlaag doet dat niet. Als ook maar één stuk verloren gaat, is het hele bericht onvolledig.

Als een van deze van toepassing is, grijp dan in plaats daarvan naar TCP.

9.9.4. Concrete voorbeelden op een camera

Voorbeelden aan de camerakant van UDP-verkeer in de praktijk:

  • Ontdekking. Een camera zendt bij het opstarten een “wie is hier”-datagram uit naar het lokale netwerk; andere apparaten antwoorden.

  • Telemetrie. Eens per seconde stuurt de camera een klein datagram met zijn huidige sensorwaarden naar een verzamelaar. Het verliezen van een incidenteel monster doet er niet toe, omdat het volgende sowieso binnen een seconde aankomt.

  • Tijdsynchronisatie. NTP, het network time protocol, draait via UDP. De client stuurt een klein verzoek, de server antwoordt met de huidige tijd; als het antwoord verloren gaat, vraagt de client het gewoon later opnieuw.

  • DNS-opzoekingen. Het netwerk vragen “naar welk IP wordt deze naam vertaald?” draait via UDP. (Behandeld op Namen en DNS.)

De Python-API voor het versturen en ontvangen van datagrammen staat op UDP-sockets, nadat de rest van het verhaal van de transportlaag op zijn plaats staat.