9.9. UDP – lähetä paketti ja toivo parasta¶
UDP, User Datagram Protocol, on yksinkertaisempi kuljetuskerroksen tarjoamista kahdesta palvelusta. Jokainen UDP-lähetys on yksi datagrammi – itsessään täydellinen tavujoukko, joka on osoitettu IP-osoitteeseen ja porttiin ja pudotettu verkkoon omillaan. Protokolla toimittaa sen, jos voi; jos se ei voi, se ei yritä uudelleen, ei varoita lähettäjää eikä säilytä mitään järjestystä datagrammien välillä.
9.9.1. Mitä UDP lisää IP:hen¶
UDP on ohut kerros IP:n päällä. Se lisää kolme asiaa pelkkään IP-toimitukseen:
Porttinumerot kummassakin päässä, jotta datagrammi voidaan toimittaa oikealle ohjelmalle kohdekoneessa, ei vain koneelle (katso Portit).
Pituuskentän, jotta vastaanottaja tietää tarkalleen, kuinka monta hyötykuorman tavua sen on luettava.
Pienen tarkistussumman otsikon ja hyötykuorman yli, jotta vastaanottaja voi havaita vioittuneen datagrammin ja hylätä sen.
Siinä se. Kaiken muun, mitä IP teki tai ei tehnyt, UDP säilyttää. Datagrammeja ei yritetä uudelleen. Ne voivat saapua väärässä järjestyksessä. Ne voivat kahdentua taustalla olevan verkon erikoisuuksien vuoksi. Ne voidaan pudottaa hiljaisesti, jos verkko on ruuhkautunut, kohteen puskuri on täynnä tai jokin välissä olevista reitittimistä niin päättää.
Jokainen UDP-datagrammi lähetetään itsenäisesti. Jos jokin katoaa matkalla, mikään ei kerro siitä lähettäjälle tai vastaanottajalle – aukko on hiljainen.¶
9.9.2. Miksi kukaan käyttäisi sitä¶
Jos UDP on niin epäluotettava, miksi sitä ylipäätään on? Kolme syytä.
Nopeus ja yleisrasite. UDP-lähetys on yksi ulos lähtevä paketti; ei kättelyä, ei kuittauksia, ei ylläpidettävää yhteystilaa. Viive ja kaistanleveyskustannus ovat minimaaliset.
Itsenäiset viestit. Osa liikenteestä on tilapäivitysten virtaa, jossa jokainen viesti on tuore tilannekuva ja vanha on arvoton. Kamera, joka julkaisee ”olen yhä elossa, tässä on nykyinen lukemani” joka sekunti, välittää kunkin uuden lukeman toimittamisesta, ei kadonneiden lukemien toistamisesta.
Multicast. Yksi UDP-datagrammi voidaan lähettää monelle vastaanottajalle kerralla. (TCP ei voi tehdä sitä; jokainen TCP-yhteys on täsmälleen kahden päätepisteen välillä.) Hyödyllinen palvelujen löytämiseen, telemetriaan monelle kuuntelijalle ja videon suoratoistoon.
Kun verkko on hyvä ja lähettäjän sietokyky häviölle on suuri, UDP on oikea vastaus. Kun toimitus ja järjestys on taattava, UDP tarvitsee joko toisen luotettavuuskerroksen päälleen, tai sovelluksen tulisi vain käyttää TCP:tä sen sijaan.
9.9.3. Milloin sitä ei pidä käyttää¶
Myös päinvastaisesta kannattaa olla selkeä. UDP on väärä valinta, kun:
Jokaisella tavulla on merkitystä. Asetustiedot, koodipäivitykset, allekirjoitetut transaktiot – mikä tahansa tapaus, jossa puuttuva tavu tekee tuloksesta väärän.
Järjestyksellä on merkitystä. UDP-datagrammi 2 saattaa saapua ennen datagrammia 1.
Viesti on suuri. Suuret hyötykuormat on sovelluksen jaettava pienemmiksi datagrammeiksi; kuljetuskerros ei tee sitä. Jos jokin osa katoaa, koko viesti jää epätäydelliseksi.
Jos mikä tahansa näistä pätee, turvaudu TCP:hen sen sijaan.
9.9.4. Konkreettisia esimerkkejä kamerassa¶
Kameran puolen esimerkkejä UDP-liikenteestä käytännössä:
Löytäminen. Kamera lähettää käynnistyessään paikallisverkkoon ”kuka on täällä” -datagrammin; muut laitteet vastaavat.
Telemetria. Kerran sekunnissa kamera lähettää pienen datagrammin nykyisillä sensorilukemillaan keräimelle. Satunnaisen näytteen häviämisellä ei ole väliä, koska seuraava saapuu joka tapauksessa sekunnin kuluttua.
Ajan synkronointi. NTP, verkon aikaprotokolla, toimii UDP:n yli. Client lähettää pienen pyynnön, server vastaa nykyisellä ajalla; jos vastaus katoaa, client vain kysyy uudelleen myöhemmin.
DNS-haut. Verkolta kysyminen ”mihin IP-osoitteeseen tämä nimi viittaa?” toimii UDP:n yli. (Käsitelty sivulla Nimet ja DNS.)
Python-API datagrammien lähettämiseen ja vastaanottamiseen on sivulla UDP-socketit, sen jälkeen kun loput kuljetuskerroksen tarinasta on käyty läpi.