UDP (User Datagram Protocol) — protokół transmisji danych bez ustanawiania połączenia, działający na IP i zapewniający minimalne opóźnienie przy wysyłaniu datagramów. W przeciwieństwie do TCP, UDP nie gwarantuje dostarczenia, kolejności pakietów ani ochrony przed duplikowaniem. Według danych IETF RFC 768 (2024), UDP obsługuje ponad 40% światowego ruchu internetowego dzięki połączeniom wideo, streamingowi i zapytaniom DNS.
Najważniejsze
UDP (User Datagram Protocol) — jeden z kluczowych protokołów warstwy transportowej modelu TCP/IP, opracowany przez Davida Reeda w 1980 roku. Zapewnia minimalny mechanizm transmisji danych: aplikacja wysyła datagram, a protokół nie śledzi, czy dotarł on do odbiorcy.
Nagłówek UDP składa się tylko z czterech pól: port źródłowy, port docelowy, długość i suma kontrolna. Każde pole zajmuje 2 bajty, więc całkowity rozmiar nagłówka to 8 bajtów. Dla porównania, nagłówek TCP bez opcji zajmuje 20 bajtów, a z opcjami — do 60 bajtów.
Protokół nie obsługuje fragmentacji na swoim poziomie — jeśli datagram przekracza MTU (Maximum Transmission Unit), jest fragmentowany na poziomie IP. W przypadku utraty jednego fragmentu odrzucany jest cały datagram, ponieważ UDP nie potrafi żądać retransmisji poszczególnych fragmentów. Deweloperzy muszą kontrolować rozmiar datagramu — dla sieci mobilnych MTU często wynosi 1400 bajtów, więc maksymalny rozmiar nie powinien przekraczać tej wartości.
Aplikacja używająca UDP tworzy gniazdo typu SOCK_DGRAM, określa port i adres IP docelowy i wysyła datagram. Protokół dodaje minimalny nagłówek i przekazuje pakiet do warstwy IP. Odbiorca nasłuchuje swojego portu i wyodrębnia dane z przychodzących datagramów.
UDP nie wykonuje kontroli przeciążenia — aplikacja może wysyłać datagramy z maksymalną prędkością, jaką obsługuje sieć. Może to prowadzić do przeciążenia kanału, ale w scenariuszach czasu rzeczywistego taka agresywność jest uzasadniona: dla połączenia wideo ważniejszy jest strumień danych z możliwymi stratami niż zatrzymanie transmisji.
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(b'Hello, UDP!', ('192.168.1.100', 8888))
sock.close()
W przykładzie tworzone jest gniazdo SOCK_DGRAM dla UDP. Metoda sendto wysyła datagram bez ustanawiania połączenia — wystarczy znać IP i port odbiorcy. Metoda recvfrom po stronie serwera zwraca zarówno dane, jak i adres nadawcy do odpowiedzi. Gniazda UDP na platformach mobilnych konfiguruje się podobnie, ale wymagają dodatkowych uprawnień: na iOS należy dodać NSAppTransportSecurity dla nieszyfrowanych połączeń UDP, a na Android — uprawnienie INTERNET w manifeście.
Wybór UDP jest uzasadniony w scenariuszach, gdzie prędkość jest ważniejsza niż niezawodność. Protokół nie traci czasu na ustanawianie połączenia, potwierdzenia i retransmisje — daje to minimalne opóźnienie, ale wymaga od dewelopera samodzielnego radzenia sobie ze stratami.
| Zalety | Wady |
|---|---|
| Niskie opóźnienie — bez handshake | Brak gwarancji dostarczenia |
| Mniejszy nagłówek — 8 bajtów | Brak kontroli przeciążenia |
| Obsługa broadcast i multicast | Możliwe duplikaty pakietów |
| Niezależność datagramów — bez kolejek | Rozmiar datagramu ograniczony przez MTU |
W aplikacjach mobilnych UDP jest stosowany przez frameworki takie jak WebRTC, które dodają na UDP kontrolę strat, adaptacyjną przepływność i jitter buffer. Daje to zalety szybkości bez wad surowego protokołu.
Kolejnym ważnym aspektem UDP jest brak kontroli przeciążenia. W TCP algorytmy Slow Start i Congestion Avoidance zmniejszają prędkość transmisji przy utracie pakietów, aby nie przeciążać sieci. UDP nie ma takich mechanizmów, dlatego deweloperzy muszą zaimplementować własne strategie kontroli prędkości — na przykład adaptacyjną przepływność w połączeniach wideo lub rate limiting na serwerach gier, aby zapobiec nadmiernemu przeciążeniu kanału sieciowego.
UDP jest niezastąpiony w scenariuszach, gdzie tolerancja opóźnienia jest ważniejsza niż tolerancja utraty pakietów. Przyjrzyjmy się głównym obszarom zastosowania protokołu w rozwoju mobilnym i webowym.
Protokoły RTP i RTSP, działające na UDP, są używane do przesyłania strumieni audio i wideo w czasie rzeczywistym. WebRTC — standard połączeń wideo w przeglądarkach i aplikacjach mobilnych — używa UDP jako głównego transportu dla danych medialnych, a TCP dla sygnalizacji. Utrata jednego pakietu w wideo 30 fps jest niezauważalna dla użytkownika, w przeciwieństwie do opóźnienia retransmisji, które powoduje zauważalne zawieszenie obrazu.
Strzelanki wieloosobowe i MOBA wymagają opóźnienia poniżej 50 ms do poprawnej synchronizacji. UDP przesyła pozycje graczy, strzały i zdarzenia szybciej niż TCP, a utrata pakietu jest po prostu ignorowana — następna aktualizacja nadejdzie za 16–33 ms. Popularne silniki gier, w tym Unity i Unreal Engine, używają UDP przez własne warstwy transportowe z dodaniem niezawodności dla krytycznych zdarzeń poprzez potwierdzenia na poziomie aplikacji.
Zapytania DNS używają UDP na porcie 53, ponieważ każde zapytanie to jeden mały datagram (zwykle do 512 bajtów). Jeśli odpowiedź nie nadejdzie, klient po prostu powtarza zapytanie po czasie oczekiwania, co jest szybsze niż ustanawianie połączenia TCP z jego trójetapowym uzgadnianiem. DHCP również działa na UDP, ponieważ klient nie ma jeszcze adresu IP i nie może ustanowić połączenia TCP, a rozgłoszeniowe pakiety UDP pozwalają znaleźć serwer DHCP w sieci lokalnej.
Wybór między UDP a TCP to kompromis między prędkością a niezawodnością. Każdy protokół jest optymalny dla swojej klasy zadań, a zrozumienie ich różnic pomaga podejmować właściwe decyzje architektoniczne przy projektowaniu komunikacji sieciowej w aplikacjach mobilnych.
| Kryterium | UDP | TCP |
|---|---|---|
| Ustanawianie połączenia | Niewymagane | Trójetapowe uzgadnianie |
| Nagłówek | 8 bajtów | 20–60 bajtów |
| Gwarancja dostarczenia | Nie | Tak, z potwierdzeniem |
| Porządkowanie | Nie | Tak |
| Kontrola przeciążenia | Nie | Tak (AIMD, Slow Start) |
| Zastosowanie | Streaming, gry, DNS | Web, email, pliki, API |
W projektach mobilnych często stosuje się podejście hybrydowe: TCP dla niezawodnych zapytań (autoryzacja, ładowanie danych) i UDP dla strumieni medialnych. QUIC — nowoczesny protokół Google działający na UDP — łączy szybkość UDP z niezawodnością TCP i jest już używany w HTTP/3.
Przyjrzyjmy się prostemu serwerowi UDP w Pythonie, który przyjmuje wiadomości od klientów i wysyła odpowiedź. Serwer nasłuchuje na porcie 8888 i przetwarza przychodzące datagramy w nieskończonej pętli.
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('0.0.0.0', 8888))
print('Serwer UDP uruchomiony na porcie 8888')
while True:
data, addr = server.recvfrom(1024)
print(f'Otrzymano od {addr}: {data.decode()}')
server.sendto(b'OK', addr)
Serwer tworzy gniazdo UDP, wiąże się z portem 8888 i oczekuje na przychodzące datagramy. recvfrom zwraca dane i adres klienta, co pozwala odpowiedzieć przez sendto. W przeciwieństwie do TCP, serwer nie przechowuje stanu połączenia — każdy datagram jest przetwarzany niezależnie. Czyni to serwery UDP skalowalnymi: jeden serwer może obsługiwać miliony klientów bez alokowania pamięci na każde osobne połączenie, co jest ważne dla serwerów DNS i systemów matchmakingu w grach.
W rozwoju mobilnym UDP jest często używany przez biblioteki wysokiego poziomu. Na przykład CocoaAsyncSocket dla iOS zapewnia gniazda UDP z delegatami i GCD do asynchronicznego przetwarzania zdarzeń. Na Androidzie klasa DatagramSocket wchodzi w skład standardowej biblioteki java.net i nie wymaga dodatkowych zależności. Dla Fluttera istnieje pakiet udp, który zapewnia prosty interfejs do wysyłania i odbierania datagramów bez konfigurowania natywnych gniazd.
Należy zauważyć, że wiele sieci mobilnych i firmowych firewalli blokuje ruch UDP, szczególnie na portach powyżej 1024. Jeśli twoja aplikacja używa UDP, należy przewidzieć fallback na TCP lub sprawdzenie dostępności protokołu przez serwery STUN, tak jak robi to WebRTC. Na iOS systemowy framework Network.framework z NWConnection obsługuje zarówno TCP, jak i UDP, automatycznie wybierając optymalny protokół na podstawie dostępności. Dla aplikacji czasu rzeczywistego zaleca się również wdrożenie adaptacyjnej przepływności, która obniża jakość strumienia przy utracie pakietów, zapewniając ciągłość odtwarzania nawet na niestabilnych kanałach z wysokim poziomem błędów.
Często zadawane pytania
UDP nie ustanawia połączenia i nie gwarantuje dostarczenia pakietów, co czyni go szybszym niż TCP. Nagłówek UDP — 8 bajtów w porównaniu do 20–60 bajtów TCP. UDP nadaje się do streamingu i gier, TCP — do zapytań webowych i przesyłania plików.
Datagram — samodzielny pakiet danych z nagłówkiem UDP (port źródłowy, port docelowy, długość, suma kontrolna). Każdy datagram jest przetwarzany niezależnie, bez związku z poprzednimi. Rozmiar datagramu jest ograniczony przez MTU sieci i według specyfikacji — do 65507 bajtów.
UDP nie zapewnia niezawodności na poziomie transportowym — implementuje ją aplikacja. Deweloperzy dodają numery sekwencyjne, sumy kontrolne, ponowne żądania i korekcję błędów. FEC (Forward Error Correction) pozwala odtwarzać utracone pakiety bez ponownego wysyłania.
UDP nie nadaje się do scenariuszy, gdzie krytyczna jest integralność danych: przesyłanie plików, transakcje bankowe, REST-API. W tych przypadkach TCP gwarantuje, że każdy bajt dotrze w prawidłowej kolejności. UDP nie jest również zalecany na niestabilnych kanałach z wysokim poziomem strat.
QUIC — protokół transportowy działający na UDP, opracowany przez Google i znormalizowany przez IETF jako RFC 9000. Łączy szybkość UDP z niezawodnością TCP, obsługuje multipleksowanie bez blokowania i wbudowane szyfrowanie. HTTP/3 używa QUIC jako warstwy transportowej.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również