TLDR;
- TCP - zorientowany strumieniowo, wymaga połączenia, niezawodny, wolny
- UDP - zorientowany na wiadomości, bezpołączeniowy, zawodny, szybki
Zanim zaczniemy, pamiętajmy, że wszystkie wady czegoś są kontynuacją jego zalet . Jest tylko odpowiednie narzędzie do pracy, nie ma panaceum. TCP / UDP współistnieją od dziesięcioleci nie bez powodu.
TCP
Został zaprojektowany tak, aby był wyjątkowo niezawodny i bardzo dobrze spełnia swoje zadanie. Jest tak złożony, ponieważ wykonuje trudne zadanie: udowodnienie niezawodnego transportu przez zawodny protokół IP.
Ponieważ cała złożona logika TCP jest umieszczona w stosie sieciowym, nie musisz wykonywać wielu pracochłonnych, podatnych na błędy niskopoziomowych czynności w warstwie aplikacji.
Kiedy wysyłasz dane przez TCP, zapisujesz strumień bajtów do gniazda u nadawcy, gdzie są one dzielone na pakiety, przekazywane w dół stosu i przesyłane przez kabel. Po stronie odbiorcy pakiety są ponownie składane w ciągły strumień bajtów.
Utrzymanie tej ładnej abstrakcji kosztuje pod względem złożoności i wydajności. Jeśli pierwszy pakiet ze strumienia bajtów zostanie utracony, odbiornik opóźni przetwarzanie kolejnych pakietów, nawet tych, które już przybyły.
Ponadto, aby być niezawodnym, TCP implementuje to:
- Protokół TCP wymaga nawiązanego połączenia, które wymaga trzech połączeń w obie strony („niesławny” potrójny uzgadnianie).
- Protokół TCP ma funkcję zwaną „powolnym startem”, polegającą na stopniowym zwiększaniu szybkości transmisji po ustanowieniu połączenia, aby umożliwić odbiornikowi nadążanie za danymi.
- Każdy wysłany pakiet musi zostać potwierdzony, inaczej nadawca przestanie wysyłać więcej danych
- I dalej i dalej i dalej ...
Wszystko to pogarsza się w powolnych, zawodnych sieciach bezprzewodowych, podczas gdy protokół TCP został zaprojektowany dla sieci przewodowych, w których można przewidzieć opóźnienia, a utrata pakietów nie jest tak powszechna. Ponadto, jak wiele osób już wspomniało, w niektórych przypadkach TCP po prostu nie działa (DHCP). Jednak w stosownych przypadkach TCP nadal działa wyjątkowo dobrze.
Posługując się analogią do poczty, sesja TCP jest podobna do opowiadania historii sekretarce, która dzieli ją na maile i wysyła przez kiepską usługę pocztową do wydawcy. Po drugiej stronie inny sekretarz łączy wiadomości w jeden fragment tekstu. Niektóre wiadomości gubią się, inne ulegają uszkodzeniu, dlatego niezawodne dostarczenie wymaga bardzo złożonej procedury, a 10-stronicowa historia może zająć dużo czasu, zanim wydawca dotrze.
UDP
Z drugiej strony, UDP jest zorientowany na komunikaty, więc odbiorca zapisuje wiadomość (pakiet) do gniazda, a następnie jest przesyłana do odbiornika w stanie takim, w jakim jest, bez żadnego podziału / składania.
W porównaniu z TCP jego specyfikacja jest bardzo prosta. Zasadniczo wszystko, co robi dla Ciebie, to dodanie sumy kontrolnej do pakietu, aby odbiornik mógł wykryć jego uszkodzenie. Wszystko inne musi zostać wdrożone przez Ciebie, programistę. Przeczytaj teraz obszerną specyfikację TCP i spróbuj pomyśleć o ponownym wdrożeniu niektórych jej części.
Niektórzy poszli tą drogą i uzyskali bardzo przyzwoite wyniki, do tego stopnia, że HTTP / 3 używa QUIC - protokołu opartego na UDP. Jednak jest to raczej wyjątek. Typowe zastosowania UDP to strumieniowanie audio / wideo i aplikacje konferencyjne, takie jak Skype, Zoom lub Google Hangout, w których utrata pakietów nie jest tak ważna w porównaniu z opóźnieniem wprowadzanym przez TCP.