Protokół UDP (User Datagram Protocol) i TCP (Transmission Control Protocol) to dwa fundamentalne protokoły warstwy transportowej w modelu TCP/IP, które stanowią podstawę komunikacji w nowoczesnych sieciach komputerowych. UDP jest prostym, bezpołączeniowym protokołem stawiającym na niskie opóźnienia i mały narzut, dlatego świetnie sprawdza się w streamingu, grach online i transmisji głosu. TCP zapewnia niezawodne dostarczenie danych dzięki nawiązywaniu połączenia, kontroli przepływu i retransmisjom, co czyni go niezbędnym tam, gdzie integralność danych jest krytyczna (np. WWW, poczta, transfery plików). Niniejszy materiał omawia kluczowe cechy obu protokołów, ich mechanizmy oraz praktyczne zastosowania.

Fundamenty warstwy transportowej w modelu TCP/IP

Warstwa transportowa (warstwa 4 modelu OSI) łączy aplikacje działające na różnych urządzeniach z niższymi warstwami odpowiedzialnymi za przesyłanie pakietów. Zapewnia komunikację między procesami, niezależnie od tego, czy znajdują się w tej samej sieci lokalnej, czy w Internecie. Odpowiada m.in. za adresację portów, kontrolę przepływu i – w przypadku odpowiednich protokołów – niezawodność transmisji.

TCP powstał, aby zapewnić niezawodność ponad warstwą IP, która sama z siebie nie gwarantuje dostarczenia pakietów. UDP zaprojektowano jako lżejszą alternatywę dla aplikacji, w których ważniejsza od gwarancji dostarczenia jest szybkość i niska latencja. Oba działają nad IP, lecz stosują odmienne mechanizmy, co przekłada się na różne zastosowania.

Porty w warstwie transportowej to numery identyfikujące usługi i procesy na tym samym urządzeniu. Porty dzielą się na trzy kategorie:

  • porty dobrze znane (0–1023) – zarezerwowane dla standardowych usług, takich jak HTTP czy DNS;
  • porty zarejestrowane (1024–49151) – używane przez zainstalowane aplikacje;
  • porty dynamiczne (49152–65535) – przydzielane tymczasowo podczas nawiązywania połączeń.

Kombinacja adresu IP i portu nadawcy oraz adresu IP i portu odbiorcy tworzy gniazdo (socket), które jednoznacznie identyfikuje dany przepływ.

Protokół UDP – charakterystyka i fundamenty działania

Definicja i podstawowe cechy UDP

UDP to prosty, bezpołączeniowy protokół datagramów zdefiniowany w RFC 768. Nie wymaga zestawiania połączenia, nie utrzymuje stanu i nie gwarantuje dostarczenia w kolejności. Minimalizm protokołu przekłada się na niski narzut i bardzo małą latencję – każdy datagram jest niezależną jednostką danych.

Struktura datagramu UDP jest wyjątkowo prosta. Nagłówek UDP ma stałą długość 8 bajtów i zawiera: port źródłowy, port docelowy, długość datagramu oraz sumę kontrolną. W porównaniu z TCP (co najmniej 20 bajtów nagłówka), UDP pozwala na większy udział danych użytkownika w pakiecie.

Port źródłowy w UDP jest opcjonalny (może wynosić zero), natomiast port docelowy jest obowiązkowy. Pole długości określa rozmiar całego datagramu (nagłówek + dane) do teoretycznego maksimum 65 535 bajtów. Suma kontrolna weryfikuje poprawność danych na podstawie pseudonagłówka z adresami IP źródła i celu. W IPv4 suma kontrolna jest opcjonalna, natomiast w IPv6 – obowiązkowa.

Charakterystyka bezpołączeniowości

Bezpołączeniowość oznacza, że nadawca po prostu wysyła datagram do wskazanego portu odbiorcy bez uprzednich uzgodnień. W odróżnieniu od TCP, nie zachodzi tu trójfazowe uzgadnianie (three-way handshake) przed rozpoczęciem transmisji.

Analogicznie do codziennej komunikacji: TCP przypomina rozmowę telefoniczną (najpierw połączenie, potem rozmowa), a UDP – wysłanie wiadomości bez oczekiwania na potwierdzenie. To podejście obniża latencję, ale przenosi odpowiedzialność za niezawodność na warstwę aplikacji.

UDP nie utrzymuje stanu połączenia (jest bezstanowe), dlatego świetnie sprawdza się w IoT oraz w modelu „wyślij i zapomnij”.

Struktura i pola UDP

Datagram UDP składa się z 8-bajtowego nagłówka i danych aplikacji. 16-bitowe pola portu źródłowego i docelowego umożliwiają multipleksowanie/demultipleksowanie danych między procesami.

Pole długości obejmuje cały datagram (min. 8 bajtów, maks. 65 535 bajtów), choć w praktyce limituje go MTU. Pole sumy kontrolnej chroni integralność danych i pseudonagłówka IP; w razie błędu datagram jest odrzucany bez powiadomienia nadawcy.

Protokół TCP – niezawodna alternatywa

Definicja i architektura połączeniowa

TCP to protokół zorientowany na połączenie: wymaga zestawienia połączenia przed transmisją i formalnego zamknięcia po zakończeniu. Utrzymuje stan, śledzi postęp dostarczania danych i gwarantuje ich uporządkowanie.

Niezawodność TCP zapewnia mechanizm pozytywnego potwierdzania z retransmisją (PAR): odbiorca wysyła ACK, a nadawca ponawia transmisję po braku potwierdzenia.

Struktura segmentu TCP

Segment TCP zawiera nagłówek o długości 20–60 bajtów i dane aplikacji. Pola portu źródłowego i docelowego (po 16 bitów) są analogiczne do UDP.

Kluczowe pola to 32-bitowe: numer sekwencji (Sequence Number) i numer potwierdzenia (Acknowledgement Number). Umożliwiają one odbudowę kolejności danych i potwierdzanie ich odbioru.

Pole długości nagłówka (Header Length) określa jego rozmiar w jednostkach 32-bitowych. Flagi kontrolne to jednobitowe znaczniki: SYN, ACK, FIN, RST, PSH, URG.

Pole rozmiaru okna (Window Size) służy kontroli przepływu, a suma kontrolna – wykrywaniu błędów. Dostępny jest też wskaźnik pilności (Urgent Pointer) i pole opcji (Options), m.in. dla skalowania okna, znaczników czasu i selektywnych potwierdzeń.

Nawiązywanie i zamykanie połączeń

Trójfazowy proces uzgadniania TCP

Przed transmisją danych strony wykonują trójfazowy handshake ustalający parametry połączenia i synchronizujący numery sekwencji.

Etap 1: klient wysyła segment z flagą SYN i początkowym numerem sekwencji (ISN). Etap 2: serwer odpowiada SYN-ACK, potwierdzając ISN klienta i wysyłając własny ISN. Etap 3: klient wysyła ACK, po czym obie strony przechodzą do stanu ESTABLISHED i mogą wymieniać dane.

Czterofazowy proces zamykania połączenia

Zamykanie jest pełnodupleksowe i odbywa się niezależnie w obu kierunkach przy użyciu flagi FIN.

Faza 1: inicjujący wysyła FIN (stan FIN-WAIT-1). Faza 2: druga strona potwierdza ACK (CLOSE-WAIT / FIN-WAIT-2). Faza 3: druga strona wysyła własny FIN (LAST-ACK). Faza 4: inicjujący potwierdza ACK i przechodzi w TIME-WAIT, po czym połączenie się domyka.

Mechanizmy niezawodności i kontroli błędów

Sekwencjonowanie i potwierdzenia w TCP

TCP numeruje każdy bajt, co pozwala na odtworzenie kolejności i wykrywanie braków. Potwierdzenia mają charakter kumulacyjny (cumulative ACK) – odbiorca podaje numer kolejnego oczekiwanego bajtu, potwierdzając wszystkie wcześniejsze.

Wielokrotne ACK tego samego numeru (duplicate ACK) sygnalizują potencjalną utratę, co umożliwia wczesną retransmisję.

Retransmisja i detekcja błędów

Utraty wykrywane są przez timeout oraz duplikaty ACK. Fast retransmit ponawia wysyłkę po trzech zduplikowanych ACK, bez czekania na timeout. Integralność weryfikuje suma kontrolna obejmująca nagłówek, dane i pseudonagłówek IP.

Kontrola przepływu przez mechanizm sliding window

Kontrola przepływu zapobiega przepełnieniu bufora odbiorcy. Okno przesuwne (sliding window) określa, ile danych nadawca może wysłać bez dodatkowych potwierdzeń. Gdy bufor odbiorcy się zapełnia, ogłasza on mniejsze okno lub 0, wstrzymując nadawcę.

Zarządzanie przeciążeniem i unikanie zatorów

Slow start i unikanie przeciążenia

TCP stosuje kontrolę przeciążenia w podejściu AIMD (Additive Increase, Multiplicative Decrease), łącząc fazy slow start i congestion avoidance.

W slow start rozmiar okna przeciążeniowego (cwnd) rośnie wykładniczo od 1 MSS, aby szybko sondować przepustowość. Po wykryciu ryzyka strat TCP przechodzi do congestion avoidance – wzrost liniowy (o 1 MSS na RTT) zmniejsza ryzyko przeciążenia.

Przy potwierdzonej stracie cwnd redukowany jest multiplikatywnie (zwykle o połowę), co natychmiast obniża obciążenie sieci.

Fast recovery i TCP Tahoe vs Reno

TCP Tahoe resetuje cwnd do 1 MSS po każdej stracie i zaczyna slow start. TCP Reno wprowadza fast recovery – po trzech duplikatach ACK zmniejsza okno o połowę i przechodzi do congestion avoidance, szybciej odzyskując przepustowość po incydentalnych stratach.

Porównanie UDP i TCP – kluczowe różnice

Niezawodność i gwarancje dostarczenia

TCP gwarantuje dostarczenie wszystkich danych we właściwej kolejności i bez duplikacji dzięki numerom sekwencji, potwierdzeniom i retransmisjom.

UDP nie zapewnia takich gwarancji: datagramy mogą zaginąć, nadejść z błędem lub poza kolejnością. Suma kontrolna wykrywa błędy, ale nie uruchamia retransmisji – uszkodzony datagram jest odrzucany.

Dla krytycznej integralności (WWW, poczta, pliki) wybierz TCP; dla czasu rzeczywistego i niskich opóźnień – UDP.

Rozmiar nagłówka i narzut protokołu

UDP ma mniejszy narzut dzięki prostszemu nagłówkowi. Nagłówek UDP: 8 bajtów, podczas gdy TCP: 20–60 bajtów. Różnica jest istotna przy wielu małych pakietach i krótkich transakcjach (w TCP dodatkowy narzut stanowi handshake i zamknięcie).

W praktyce, np. w VPN, TCP bywa „cięższy” względem UDP z powodu potwierdzeń i większych nagłówków.

Opóźnienie i latencja

TCP zwykle ma wyższą latencję, szczególnie przy stratach i dużych odległościach (dodatkowe RTT na retransmisje). UDP nie czeka na potwierdzenia, dzięki czemu zapewnia niższe opóźnienia i płynność w czasie rzeczywistym.

Broadcast i multicast

TCP to komunikacja point-to-point (jeden do jednego) – nie obsługuje transmisji grupowych.

UDP wspiera broadcast i multicast, co jest kluczowe dla IPTV, transmisji live czy odkrywania usług. Multicast używa adresów 224.0.0.0–239.255.255.255 (IPv4), a sieć replikuje pakiety jedynie do zainteresowanych odbiorców.

Tabela porównawcza

Poniżej przedstawiono porównanie kluczowych cech TCP i UDP:

Cecha TCP UDP
Typ usługi Zorientowany na połączenie Bez połączenia
Niezawodność Gwarantuje dostarczenie Brak gwarancji
Błędy Rozbudowana detekcja i korekcja Tylko suma kontrolna
Potwierdzenia Tak Nie
Sekwencjonowanie Tak Nie
Prędkość Wolniejszy Szybszy
Retransmisja Tak Nie
Rozmiar nagłówka 20–60 bajtów 8 bajtów
Waga Ciężki Lekki
Handshake SYN, ACK, SYN-ACK Brak
Broadcast Nie Tak
Aplikacje HTTP, HTTPS, FTP, SMTP, Telnet DNS, DHCP, TFTP, SNMP, RIP, VoIP
Typ strumienia Strumień bajtów Strumień wiadomości
Narzut Niski, ale wyższy niż UDP Bardzo niski

Zastosowania praktyczne UDP

Transmisja danych w czasie rzeczywistym

UDP jest naturalnym wyborem dla VoIP, wideokonferencji, streamingu wideo i gier online. W tych scenariuszach krótkotrwałe straty danych są mniej dotkliwe niż opóźnienia i jitter wynikające z retransmisji.

W VoIP utrata pojedynczego pakietu wywołuje krótką przerwę, podczas gdy retransmisje TCP generowałyby echo i lagi. W grach stan jest aktualizowany tak często, że pojedyncze straty szybko „znikają” pod nowszymi danymi.

DNS i DHCP

DNS typowo używa UDP – zapytania i odpowiedzi są małe i mieszczą się w jednym lub dwóch pakietach, więc TCP byłby nieefektywny.

DHCP (Dynamic Host Configuration Protocol) korzysta z UDP oraz broadcastu. Przepływ wygląda następująco:

  1. Discover – klient ogłasza w sieci, że potrzebuje adresu IP;
  2. Offer – serwer proponuje parametry (adres IP, maska, brama, DNS);
  3. Request – klient wybiera jedną ofertę i prosi o jej przydzielenie;
  4. Acknowledgement – serwer potwierdza i rezerwuje parametry dla klienta.

IoT i urządzenia sensoryczne

W IoT liczy się prostota i oszczędność energii. Urządzenie może się obudzić, wysłać datagram i zasnąć w milisekundy, oszczędzając energię względem kosztownego zestawiania połączenia TCP. W wielu przypadkach sporadyczne straty są akceptowalne, a priorytetem jest terminowość.

Kryteria wyboru między UDP a TCP

Analiza wymagań aplikacji

Przed decyzją odpowiedz na kluczowe pytania:

  • jak ważna jest gwarancja dostarczenia każdego bajtu danych – jeśli krytyczna, wybierz tcp,
  • jak istotne są niskie opóźnienia i płynność – dla czasu rzeczywistego preferuj udp,
  • czy potrzebny jest broadcast lub multicast – to domena udp,
  • jaka jest tolerancja na utratę pakietów – przy niskiej wybierz tcp, przy akceptowalnych stratach udp.

Zaawansowane tematy i rozszerzenia

Utrata pakietów UDP i jej wpływ

Straty mogą wynikać z przeciążenia sieci, błędów sprzętu, problemów routingu lub zbyt małych buforów. UDP nie ma wbudowanej retransmisji – brakujące datagramy są pomijane. Akceptowalny poziom strat zależy od aplikacji: dla wideo ~1% może być niezauważalne, dla VoIP powyżej 3–5% bywa uciążliwe, w grach ~5% wpływa na responsywność. Warstwa aplikacji stosuje często własne mechanizmy, np. interpolację, forward error correction lub tolerancję braków.

TCP keep-alive i monitorowanie połączenia

TCP keep-alive wykrywa „martwe” połączenia przez okresowe wysyłanie segmentów kontrolnych bez danych. Po wielokrotnym braku odpowiedzi połączenie jest zamykane, co zwalnia zasoby.

Opcje TCP i rozszerzenia

Najważniejsze opcje TCP, które zwiększają wydajność i elastyczność, to:

  • Maximum Segment Size (MSS) – określa maksymalny rozmiar danych w segmencie i pomaga uniknąć fragmentacji IP;
  • Selective Acknowledgement (SACK) – pozwala potwierdzać niesąsiadujące zakresy danych, skracając czas odzyskiwania po stratach;
  • Timestamps – znaczniki czasu do precyzyjnego pomiaru RTT i detekcji duplikatów;
  • Window scaling – skalowanie okna ponad limit 64 KB, niezbędne na łączach o dużej przepustowości i wysokim RTT.

Rekomendacje dla praktyków

Wybierz UDP dla aplikacji czasu rzeczywistego, w których minimalne opóźnienie jest kluczowe i dopuszczalna jest niewielka utrata pakietów (wideokonferencje, transmisje na żywo, gry online, VoIP, sensory IoT).

Wybierz TCP tam, gdzie integralność danych jest absolutnie najważniejsza (przeglądarki, poczta, transfery plików, bazy danych, systemy finansowe). TLS/SSL najczęściej działa na TCP, choć nowsze podejścia istnieją także nad UDP.

Warto rozważyć nowoczesne protokoły, takie jak QUIC (Quick UDP Internet Connections), które implementują niezawodność i kontrolę podobną do TCP w oparciu o UDP, łącząc zalety obu podejść.

Zamiast pytać „który jest lepszy?”, pytaj „który jest właściwy dla danego zadania”. Zrozumienie różnic, zalet i ograniczeń TCP oraz UDP jest kluczem do skutecznego projektowania i wdrażania systemów sieciowych.