9.9. UDP – wyślij pakiet i miej nadzieję na najlepsze

UDP, czyli User Datagram Protocol, to prostsza z dwóch usług oferowanych przez warstwę transportową. Każde wysłanie UDP to jeden datagram – samowystarczalny kawałek bajtów zaadresowany do IP i portu, wrzucony do sieci samodzielnie. Protokół dostarcza go, jeśli może; jeśli nie może, nie ponawia próby, nie ostrzega nadawcy i nie zachowuje żadnej kolejności między datagramami.

9.9.1. Co UDP dodaje do IP

UDP to cienka warstwa na szczycie IP. Do surowego dostarczania IP dodaje trzy rzeczy:

  • Numery portów na obu końcach, dzięki czemu datagram może zostać dostarczony do właściwego programu na hoście docelowym, a nie tylko do hosta (zobacz Porty).

  • Pole długości, dzięki któremu odbiorca wie dokładnie, ile bajtów ładunku ma odczytać.

  • Niewielką sumę kontrolną obejmującą nagłówek i ładunek, dzięki czemu odbiorca może wykryć uszkodzony datagram i go odrzucić.

I tyle. Wszystko inne, co IP robiło lub czego nie robiło, UDP zachowuje. Datagramy nie są ponawiane. Mogą dotrzeć w niewłaściwej kolejności. Mogą zostać zduplikowane przez osobliwości sieci leżącej u podstaw. Mogą zostać po cichu odrzucone, jeśli sieć jest przeciążona, bufor w miejscu docelowym jest pełny lub jeden z routerów pośrednich tak zdecyduje.

Diagram z nadawcą po lewej i odbiorcą po prawej. Trzy strzałki wskazują od nadawcy do odbiorcy, oznaczone "datagram 1", "datagram 2", "datagram 3". Strzałka dla datagramu 2 jest pokazana jako linia przerywana z krzyżykiem X na niej, wskazując utratę.

Każdy datagram UDP jest wysyłany niezależnie. Jeśli jeden zgubi się w drodze, nic nie powiadomi o tym nadawcy ani odbiorcy – luka jest cicha.

9.9.2. Dlaczego ktokolwiek miałby go używać

Skoro UDP jest tak zawodny, po co go w ogóle mieć? Z trzech powodów.

  • Szybkość i narzut. Wysłanie UDP to pojedynczy pakiet wychodzący na zewnątrz; bez uścisku dłoni, bez potwierdzeń, bez stanu połączenia do utrzymania. Koszt w postaci opóźnienia i przepustowości jest minimalny.

  • Niezależne wiadomości. Część ruchu to strumień aktualizacji statusu, w którym każda wiadomość jest świeżym zrzutem, a stara jest bezwartościowa. Kamera publikująca co sekundę „wciąż żyję, oto mój bieżący odczyt” dba o dostarczenie każdego nowego odczytu, a nie o powtarzanie odczytów, które się zgubiły.

  • Multicast. Pojedynczy datagram UDP może zostać wysłany do wielu odbiorców naraz. (TCP tego nie potrafi; każde połączenie TCP jest między dokładnie dwoma punktami końcowymi.) Przydatne do wykrywania usług, telemetrii do wielu słuchaczy, strumieniowania wideo.

Tam, gdzie sieć jest dobra, a tolerancja nadawcy na utratę wysoka, UDP jest właściwą odpowiedzią. Tam, gdzie dostarczanie i kolejność muszą być gwarantowane, UDP potrzebuje albo dodatkowej warstwy niezawodności na wierzchu, albo aplikacja powinna po prostu użyć TCP.

9.9.3. Kiedy go nie używać

Warto też wyraźnie powiedzieć o przeciwnej sytuacji. UDP jest złym wyborem, gdy:

  • Każdy bajt ma znaczenie. Dane konfiguracyjne, aktualizacje kodu, podpisane transakcje – każdy przypadek, w którym brakujący bajt sprawia, że wynik jest błędny.

  • Kolejność ma znaczenie. Datagram UDP numer 2 może dotrzeć przed datagramem numer 1.

  • Wiadomość jest duża. Duże ładunki muszą zostać podzielone na mniejsze datagramy przez aplikację; warstwa transportowa tego nie zrobi. Jeśli jakikolwiek fragment zostanie utracony, cała wiadomość jest niekompletna.

Jeśli którakolwiek z tych sytuacji zachodzi, sięgnij zamiast tego po TCP.

9.9.4. Konkretne przykłady na kamerze

Przykłady ruchu UDP po stronie kamery w praktyce:

  • Wykrywanie. Kamera przy uruchomieniu rozgłasza do sieci lokalnej datagram „kto tu jest”; inne urządzenia odpowiadają.

  • Telemetria. Raz na sekundę kamera wysyła do kolektora niewielki datagram ze swoimi bieżącymi odczytami sensora. Utrata sporadycznej próbki nie ma znaczenia, bo następna i tak dotrze za sekundę.

  • Synchronizacja czasu. NTP, protokół czasu sieciowego, działa przez UDP. Klient wysyła małe żądanie, serwer odpowiada bieżącym czasem; jeśli odpowiedź zostanie utracona, klient po prostu pyta ponownie później.

  • Wyszukiwanie DNS. Pytanie sieci „na jaki IP mapuje się ta nazwa?” działa przez UDP. (Omówione na Nazwy i DNS.)

Interfejs API Pythona do wysyłania i odbierania datagramów znajduje się na Gniazda UDP, gdy reszta opowieści o warstwie transportowej jest już na miejscu.