Protokół Datagramów Użytkownika (UDP)
Bezpołączeniowy, 'najlepszy wysiłek' transport dla aplikacji czasu rzeczywistego i jego prosty nagłówek.
Wprowadzenie: Pocztówka Internetu
W świecie protokołów internetowych, jeśli TCP jest odpowiednikiem formalnej, śledzonej i wymagającej podpisu usługi kurierskiej, to User Datagram Protocol (UDP) jest prostą, pozbawioną fanaberii pocztówką. Piszesz swoją wiadomość, podajesz adres i wrzucasz ją do skrzynki. Zakładasz, że dotrze, ale nie masz potwierdzenia odbioru, gwarancji, że się nie zgubi, ani pewności, czy dotrze przed inną pocztówką, którą wysłałeś w tym samym czasie.
Może to brzmieć wadliwie, ale ta prostota jest największą siłą UDP. UDP jest podstawowym członkiem Stosu Protokołów Internetowych i działa w Warstwie Transportowej, tak samo jak TCP. Służy jednak zupełnie innemu celowi. Podczas gdy TCP dokłada wszelkich starań, aby każdy bajt został dostarczony niezawodnie i w odpowiedniej kolejności, UDP rezygnuje z całego tego narzutu. Zapewnia minimalistyczny mechanizm wysyłania wiadomości, zwanych , z jednej aplikacji do drugiej.
UDP dokonuje świadomego kompromisu: poświęca niezawodność, uporządkowanie i kontrolę przepływu TCP w zamian za szybkość, niskie opóźnienia i minimalny narzut. Dla wielu nowoczesnych aplikacji internetowych jest to dokładnie właściwy wybór. Aplikacje wrażliwe na opóźnienia, takie jak streaming wideo czy gry online, często preferują szybkość UDP nad gwarancjami TCP, decydując się na samodzielne obsługiwanie ewentualnych strat danych na warstwie aplikacji. UDP to protokół na sytuacje, w których szybkie dostarczenie danych jest ważniejsze niż zagwarantowanie, że każdy pojedynczy fragment danych dotrze idealnie.
Podstawowe Cechy Protokołu UDP
UDP jest zdefiniowany przez to, czego nie robi. Jego minimalistyczny projekt odzwierciedla się w jego podstawowych cechach, które stoją w ostrym kontraście do cech TCP.
- Bezpołączeniowy
UDP jest protokołem bezpołączeniowym. W przeciwieństwie do TCP, nie ma formalnego procesu ustanawiania połączenia przed wysłaniem danych. Nie ma trójetapowego uzgadniania. Aplikacja używająca UDP może po prostu stworzyć datagram, dodać adres docelowy i port, i wysłać go w sieć. Pierwszy pakiet wysłany do serwera to same dane.
Analogia z pocztówką działa tu idealnie. Nie musisz dzwonić do odbiorcy, aby potwierdzić, że jest gotów odebrać pocztówkę; po prostu ją wysyłasz. Brak fazy nawiązywania połączenia znacznie zmniejsza początkowe opóźnienie komunikacji.
- Niezawodne Dostarczanie na Zasadzie Najlepszego Wysiłku
To najważniejsza cecha UDP. Działa on w modelu najlepszego wysiłku (ang. best-effort). Oznacza to, że UDP i bazowa sieć IP dołożą wszelkich starań, aby dostarczyć Twój datagram, ale nie oferują absolutnie żadnych gwarancji. UDP nie implementuje:
- Potwierdzeń: Odbiorca nie odsyła żadnego potwierdzenia do nadawcy, że datagram został odebrany.
- Retransmisji: Jeśli datagram zaginie w tranzycie, UDP go automatycznie nie retransmituje. Dane po prostu przepadają.
- Porządkowania Danych: Datagramy UDP są wysyłane jako niezależne jednostki. Jeśli wyślesz datagram A, a potem datagram B, sieć może dostarczyć B przed A, dostarczyć oba, lub żaden. UDP nie robi nic, aby je uporządkować w miejscu docelowym.
- Niski Narzut i Wysoka Szybkość
Główną korzyścią z poświęcenia niezawodności jest minimalny narzut. Nagłówek TCP jest skomplikowany i ma co najmniej 20 bajtów. Nagłówek UDP jest niezwykle prosty i ma stały rozmiar zaledwie 8 bajtów. Oznacza to, że z każdym fragmentem danych aplikacji wysyłanych jest mniej danych kontrolnych, co skutkuje wyższą wydajnością.
Ponadto, brak stanu połączenia, liczników retransmisji, śledzenia potwierdzeń i buforów okienkowych oznacza, że system może wysyłać i przetwarzać datagramy UDP przy znacznie mniejszym wysiłku obliczeniowym i zużyciu pamięci, co prowadzi do wyższych prędkości i niższych opóźnień.
- Brak Kontroli Przepływu i Przeciążenia
UDP nie ma wbudowanych mechanizmów kontroli przepływu ani kontroli przeciążenia. Aplikacja używająca UDP może wysyłać dane tak szybko, jak chce, niezależnie od zdolności odbiorcy do ich przetwarzania czy ogólnego przeciążenia w sieci. Może to być zarówno korzyścią (dla aplikacji, które muszą utrzymywać stałą szybkość wysyłania), jak i zagrożeniem (ponieważ źle zachowująca się aplikacja UDP mogłaby zalać sieć i sprawić problemy innym użytkownikom). Z tego powodu aplikacje zbudowane na UDP często muszą implementować własne mechanizmy kontroli.
Nagłówek UDP: Wzór Prostoty
Minimalistyczna filozofia UDP jest doskonale uchwycona w formacie jego nagłówka. Zawiera on tylko cztery pola, każde o długości 16 bitów (2 bajty), co daje łączny stały rozmiar nagłówka 8 bajtów.
Szczegółowy Opis Pól
1. Port Źródłowy (16 bitów)
To pole identyfikuje numer portu aplikacji wysyłającej. Choć kluczowe w TCP do utrzymywania połączenia stanowego, w UDP to pole jest, co ciekawe, opcjonalne. Nadawca może ustawić to pole na same zera. Jednak prawie zawsze jest ono wypełnione. Dlaczego? Informuje ono odbiorcę, dokąd wysłać odpowiedź. Jeśli klient DNS wysyła zapytanie do serwera, serwer używa portu źródłowego z przychodzącego datagramu jako portu docelowego dla swojej odpowiedzi. Gdyby port źródłowy był zerowy, serwer nie wiedziałby, dokąd wysłać odpowiedź.
2. Port Docelowy (16 bitów)
Jest to pole obowiązkowe, które identyfikuje numer portu aplikacji odbiorczej. Jest to klucz do zdolności UDP do przeprowadzania . System operacyjny odbiorcy sprawdza to pole, aby dostarczyć datagram do właściwej aplikacji spośród wielu, które mogą być uruchomione.
3. Długość (16 bitów)
To pole określa całkowitą długość datagramu UDP w bajtach. Długość ta obejmuje 8-bajtowy nagłówek UDP oraz długość danych aplikacji (ładunku). Minimalna możliwa wartość to 8, co odpowiada datagramowi UDP z pustym ładunkiem. Maksymalna długość jest determinowana przez bazowy protokół IP, ale teoretycznie jest ograniczona przez 16-bitowe pole do 65 535 bajtów.
4. Suma Kontrolna (16 bitów)
To pole zapewnia podstawowy mechanizm wykrywania błędów. Jego celem jest sprawdzanie uszkodzeń danych zarówno w nagłówku UDP, jak i w ładunku danych. Podobnie jak w TCP, jest obliczana przy użyciu dodawania w kodzie dopełnień do jedności na nagłówku UDP, ładunku oraz specjalnym, koncepcyjnym pseudo-nagłówku.
Pseudo-nagłówek zawiera źródłowe i docelowe adresy IP. Włączenie tej informacji jest kluczowe, ponieważ chroni przed błędnym dostarczeniem datagramu przez sieć i przypadkowym zaakceptowaniem go przez niewłaściwego hosta.
Kluczowa kwestia dotycząca sumy kontrolnej to zasady jej stosowania:
- W IPv4, użycie sumy kontrolnej UDP jest opcjonalne. Jeśli nie jest obliczana, pole jest ustawiane na same zera. Zezwolono na to, aby zaoszczędzić cykle procesora na starszych, wolniejszych routerach.
- W IPv6, suma kontrolna UDP jest obowiązkowa. IPv6 zostało zaprojektowane z filozofią upraszczania przetwarzania w routerach, a uczynienie sumy kontrolnej obowiązkową oznacza, że routery nie muszą obsługiwać specjalnego przypadku jej braku.
Kiedy UDP Jest Właściwym Wyborem? Aplikacje i Przypadki Użycia
Konstrukcja UDP sprawia, że jest on idealny dla aplikacji, w których terminowość jest ważniejsza niż doskonała niezawodność, lub gdzie aplikacja sama woli zarządzać niezawodnością.
Aplikacje Czasu Rzeczywistego i Streamingowe
Dla usług takich jak Voice over IP (VoIP), wideokonferencje i streaming wideo na żywo, otrzymanie danych z niewielkim opóźnieniem jest często gorsze niż nieotrzymanie ich wcale. Retransmisja utraconego pakietu głosowego przez TCP dotarłaby zbyt późno, by można ją było odtworzyć w rozmowie i spowodowałaby tylko uciążliwą przerwę. Lepiej, żeby aplikacja po prostu pominęła utracony pakiet i odtworzyła następny, co skutkuje drobnym, często niezauważalnym zakłóceniem audio. UDP zapewnia niskie opóźnienia potrzebne, aby te aplikacje sprawiały wrażenie "na żywo".
Gry Online
W szybkich grach online najważniejsza jest najnowsza informacja o pozycji lub działaniach gracza. Stary, retransmitowany pakiet zawierający pozycję gracza sprzed pół sekundy jest całkowicie bezużyteczny i spowodowałby "lagowanie" gry. Twórcy gier prawie zawsze używają UDP i budują na nim własną, wysoce zoptymalizowaną logikę do obsługi aktualizacji i synchronizacji.
Proste Protokoły Zapytanie-Odpowiedź
Protokoły obejmujące małe, proste zapytanie i małą, prostą odpowiedź są idealne dla UDP. Klasycznym przykładem jest System Nazw Domenowych (DNS). Klient wysyła pojedynczy datagram UDP z nazwą domeny, a serwer odpowiada pojedynczym datagramem zawierającym adres IP. Jeśli któryś z nich zaginie, klient po prostu może poczekać na timeout i wysłać zapytanie ponownie. Narzut związany z nawiązywaniem i zrywaniem połączenia TCP dla tak trywialnej wymiany byłby ogromnym marnotrawstwem. Innym przykładem jest DHCP.
Usługi Multicast i Broadcast
UDP jest podstawą usług multicast i broadcast, gdzie pojedynczy datagram jest wysyłany z jednego źródła do wielu miejsc docelowych. TCP jest protokołem fundamentalnie typu jeden-do-jednego; ustanowienie indywidualnych, niezawodnych połączeń z tysiącami odbiorców dla transmisji wideo na żywo byłoby niemożliwe. Bezpołączeniowa natura UDP pozwala nadawcy na wysyłanie jednego strumienia datagramów, który może być efektywnie replikowany przez sieć, aby dotrzeć do dużej widowni.
Kwestia Niezawodności: Czy UDP Może Być Niezawodny?
Niezawodność UDP to nie wyrok, to wybór. UDP przekazuje odpowiedzialność za niezawodność warstwie aplikacji. Oznacza to, że deweloperzy mogą, i często to robią, budować własne mechanizmy niezawodności na szybkiej usłudze datagramowej UDP.
Aplikacja może zaimplementować własny, niestandardowy system numerów sekwencyjnych, potwierdzeń i liczników retransmisji. Daje to ogromną elastyczność. Na przykład gra może potrzebować niezawodnego przesyłania wiadomości na czacie, jednocześnie zawodnie przesyłając pozycje graczy. Budując na UDP, deweloper może stworzyć system hybrydowy, zapewniając retransmisję utraconych wiadomości czatu, podczas gdy aktualizacje pozycji nie będą retransmitowane. Ta selektywna niezawodność, dostosowana do specyficznych potrzeb aplikacji, jest niemożliwa do osiągnięcia przy uniwersalnym podejściu TCP.
Ta filozofia używania UDP jako bazy i budowania na nim inteligentniejszych protokołów to przyszłość transportu internetowego. Najwybitniejszym przykładem jest QUIC (Quick UDP Internet Connections), protokół stanowiący podstawę HTTP/3. QUIC działa na UDP i reimplementuje wiele funkcji TCP, takich jak niezawodność i kontrola przeciążenia, ale w sposób bardziej wydajny i elastyczny, który unika wielu historycznych problemów TCP.