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:
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.