Przejdź do treści

Protokół UDP - lekki i szybki, ale bez gwarancji

User Datagram Protocol (UDP) jest protokołem warstwy transportowej. Cechuje się prostotą, niskim narzutem oraz brakiem mechanizmów gwarantujących dostarczenie danych.

Cechy charakterystyczne

UDP jest protokołem bezpołączeniowym - nie ustanawia sesji między nadawcą a odbiorcą. Każdy pakiet (datagram) jest wysyłany niezależnie, co oznacza:

  • brak potwierdzeń (ACK),
  • brak retransmisji utraconych pakietów,
  • brak kontroli przeciążenia,
  • brak kontroli kolejności,
  • brak negocjacji połączenia - dane są po prostu wysyłane.

Dzięki temu UDP jest bardzo szybki i idealny w sytuacjach, gdzie ważniejszy jest czas niż niezawodność, np. transmisje wideo/audio, VoIP, DNS czy tryb multiplayer w grach (jakbyś przypadkiem programował grę w trybie klient/serwer).

Struktura pakietu UDP

Pole Rozmiar (bitów) Opis
Port źródłowy 16 Numer portu wysyłającego (opcjonalny)
Port docelowy 16 Numer portu odbiorcy
Długość 16 Długość całego segmentu UDP (nagłówek + dane)
Suma kontrolna 16 Kontrola błędów (opcjonalna)

Note

Nieco mniejszy niż w TCP, co nie ? :)

Dane w UDP

Dane w UDP są przesyłane jako ciąg bajtów. Protokół nie interpretuje ich zawartości ponieważ jest to zadanie aplikacji. Dzięki temu można przesyłać różne typy danych, np. tekst, obrazy czy dźwięki. Maksymalny rozmiar zarezerwowany dla danych to 65,507 bajtów (65535 - 8 bajtów nagłówka UDP).

Diagram: Jak działa UDP?

Poniżej przepływ danych w UDP. Nie ma potwierdzenia ani retransmisji, więc pakiety mogą dotrzeć w różnej kolejności lub wcale.

sequenceDiagram
    participant Aplikacja
    participant UDP
    participant Sieć
    participant Odbiorca

    Aplikacja->>UDP: dane do wysłania
    UDP->>Sieć: datagram UDP
    Sieć-->>Odbiorca: datagram UDP
    Note over Sieć,Odbiorca: brak potwierdzenia<br>brak retransmisji

Czy można numerować pakiety w UDP?

UDP sam z siebie nie posiada pola do numeracji pakietów - nie wie, który pakiet był pierwszy, a który ostatni. Ale to nie znaczy, że aplikacje nie mogą sobie z tym radzić.

Przykład: TFTP

Trivial File Transfer Protocol (TFTP) działa na UDP i numeruje pakiety samodzielnie w warstwie aplikacji. Każdy blok danych ma numer bloku, który odbiorca musi potwierdzić. W razie braku odpowiedzi - nadawca retransmituje dany blok.

Inne przykłady aplikacji, które implementują własną logikę numerowania pakietów:

  • RTP (Real-time Transport Protocol) - używa numerów sekwencyjnych do odtwarzania dźwięku lub wideo we właściwej kolejności
  • QUIC - zbudowany nad UDP, implementuje własną logikę gwarantowanego transportu i szyfrowania

Kiedy używać UDP?

UDP sprawdza się świetnie, gdy:

  • opóźnienie jest ważniejsze niż niezawodność (VoIP, streaming, DNS),
  • można sobie pozwolić na utratę pojedynczych pakietów,
  • aplikacja może samodzielnie zarządzać retransmisją (np. TFTP),
  • urządzenia IoT gdzie działamy na minimalnych zasobach

Jak to działa w Linuxie?

W systemie Linux UDP jest obsługiwany przez jądro, które implementuje cały protokół. Procesy użytkownika korzystają z interfejsu socketów, aby wysyłać i odbierać dane przez UDP, ale nie zajmują się samą logiką protokołu - to robi jądro systemu operacyjnego, identycznie jak w przypadku TCP.

Przechwytywanie i analiza ruchu UDP

Możesz użyć narzędzia tcpdump, aby przechwycić i analizować ruch UDP. Przykładowe polecenie:

tcpdump -i eth0 udp port 53

Podsumowanie

UDP to szybki i lekki protokół bez gwarancji dostarczenia, który działa na zasadzie wyślij i zapomnij. Brak wbudowanej logiki transmisji niezawodnej nie oznacza, że nie da się tego osiągnąć - wiele aplikacji radzi sobie z tym samodzielnie, dodając własną warstwę kontroli.

Jeśli potrzebujesz maksymalnej szybkości, a aplikacja może obsłużyć ewentualne braki, UDP będzie świetnym wyborem.