Do ogólnej wymiany komunikatów w protokole, która może tolerować utratę niektórych pakietów. O ile bardziej wydajne jest UDP przez TCP?
Do ogólnej wymiany komunikatów w protokole, która może tolerować utratę niektórych pakietów. O ile bardziej wydajne jest UDP przez TCP?
Odpowiedzi:
UDP jest szybszy niż TCP, a prostym powodem jest to, że jego nieistniejący pakiet potwierdzający (ACK), który zezwala na ciągły strumień pakietów, zamiast TCP, który potwierdza zestaw pakietów, obliczony na podstawie rozmiaru okna TCP i czasu podróży w obie strony (RTT).
Aby uzyskać więcej informacji, polecam proste, ale bardzo zrozumiałe wyjaśnienie Skullbox (TCP vs. UDP)
Ludzie mówią, że najważniejszą rzeczą, jaką daje Ci TCP, jest niezawodność. Ale to nie do końca prawda. Najważniejszą rzeczą, jaką daje Ci TCP, jest kontrola przeciążenia: możesz uruchomić 100 połączeń TCP przez łącze DSL, wszystkie pracują z maksymalną prędkością, a wszystkie 100 połączeń będzie produktywnych, ponieważ wszystkie one „wyczuwają” dostępną przepustowość. Wypróbuj to dzięki 100 różnym aplikacjom UDP, wszystkie pchające pakiety tak szybko, jak to możliwe, i przekonaj się, jak dobrze ci idzie.
Na większą skalę to zachowanie TCP powstrzymuje Internet przed „zawaleniem się zatorów”.
Rzeczy, które mają tendencję do popychania aplikacji w kierunku UDP:
Semantyka dostarczania grupowego: możliwe jest niezawodne dostarczanie do grupy ludzi znacznie wydajniej niż potwierdzenie TCP z punktu do punktu.
Dostawa poza kolejnością: w wielu aplikacjach, dopóki otrzymujesz wszystkie dane, nie przejmujesz się, w jakiej kolejności je otrzymujesz; możesz zmniejszyć opóźnienie na poziomie aplikacji, akceptując blokadę braku zamówienia.
Nieprzyjaźń: na imprezie w sieci LAN możesz nie przejmować się, czy Twoja przeglądarka działa dobrze, o ile aktualizujesz sieć tak szybko, jak to możliwe.
Ale nawet jeśli zależy Ci na wydajności, prawdopodobnie nie chcesz korzystać z UDP:
Teraz zależy Ci na niezawodności, a wiele rzeczy, które możesz zrobić, aby wprowadzić niezawodność, może być wolniejsze niż to, co już robi TCP.
Teraz jesteś nieprzyjazny dla sieci, co może powodować problemy we współdzielonych środowiskach.
Co najważniejsze, zapory będą Cię blokować.
Możesz potencjalnie rozwiązać niektóre problemy z wydajnością i opóźnieniami TCP poprzez „trunking” wielu połączeń TCP razem; iSCSI robi to, aby obejść kontrolę nad przeciążeniami w sieciach lokalnych, ale możesz to również zrobić, aby utworzyć kanał komunikatów o pilnych komunikatach o niskim opóźnieniu (zachowanie „PILNE” protokołu TCP jest całkowicie zepsute).
listen
-> accept
-> stan klienta jest oczywiście niezależny od innych klientów). W szczególności obsługa wielu połączeń z jednego klienta staje się bardzo prosta dzięki UDP. A zaletą UDP jest to, że stosy UDP są naprawdę łatwe do wdrożenia, co jest ogromnym plusem w systemach wbudowanych (mikrokontrolery, FPGA itp.), W szczególności implementacja TCP dla FPGA jest ogólnie rzeczą, którą po prostu chcesz kupić od kogoś innego i nie myśl o tym).
W niektórych aplikacjach protokół TCP jest szybszy (lepsza przepustowość) niż protokół UDP.
Jest tak w przypadku wykonywania wielu małych zapisów w stosunku do rozmiaru MTU. Na przykład czytam eksperyment, w którym strumień 300 bajtów pakietów był przesyłany przez Ethernet (1500 bajtów MTU), a TCP był o 50% szybszy niż UDP .
Powodem jest to, że TCP spróbuje buforować dane i zapełnić pełny segment sieci, efektywniej wykorzystując dostępną przepustowość.
Z drugiej strony UDP natychmiast umieszcza pakiet na kablu, co powoduje przeciążenie sieci dużą ilością małych pakietów.
Prawdopodobnie nie powinieneś używać UDP, chyba że masz bardzo konkretny powód. Zwłaszcza, że możesz zapewnić TCP taki sam opóźnienie jak UDP, wyłączając algorytm Nagle (na przykład, jeśli przesyłasz dane z czujników w czasie rzeczywistym i nie martwisz się o przeciążenie sieci dużą ilością małych pakietów).
z tolerancją na straty
Masz na myśli „z tolerancją strat”?
Zasadniczo UDP nie jest „odporny na straty”. Możesz wysłać komuś 100 pakietów, a oni mogą otrzymać tylko 95 takich pakietów, a niektóre mogą być w niewłaściwej kolejności.
W przypadku takich rzeczy, jak przesyłanie strumieniowe wideo i gry wieloosobowe, w których lepiej jest przegapić pakiet niż opóźnić wszystkie pozostałe pakiety za nim, jest to oczywisty wybór
Jednak w przypadku większości innych rzeczy brakujący lub „przestawiony” pakiet ma kluczowe znaczenie. Będziesz musiał napisać dodatkowy kod, który będzie działał na UDP, aby spróbować ponownie, jeśli coś pominie, i wymusić prawidłowe zamówienie. W niektórych miejscach spowodowałoby to niewielki narzut.
Na szczęście niektórzy bardzo inteligentni ludzie to zrobili i nazwali to TCP.
Pomyśl o tym w ten sposób: jeśli brakuje pakietu, wolisz po prostu pobrać następny pakiet tak szybko, jak to możliwe i kontynuować (użyj UDP), czy rzeczywiście potrzebujesz tych brakujących danych (użyj TCP). Koszty ogólne nie będą miały znaczenia, chyba że znajdziesz się w naprawdę wyjątkowym scenariuszu.
Który protokół działa lepiej (pod względem przepustowości) - UDP lub TCP - naprawdę zależy od charakterystyki sieci i ruchu w sieci. Na przykład Robert S. Barnes wskazuje na scenariusz, w którym TCP działa lepiej (zapisy w małych rozmiarach). Rozważmy teraz scenariusz, w którym sieć jest przepełniona i ma zarówno ruch TCP, jak i UDP. Nadawcy w sieci korzystający z protokołu TCP wyczują „zatłoczenie” i obniżą szybkość wysyłania. Jednak UDP nie ma żadnych mechanizmów unikania i kontroli przeciążenia, a nadawcy używający UDP nadal pompują dane z tą samą prędkością. Stopniowo nadawcy TCP zmniejszają szybkość wysyłania do absolutnego minimum, a jeśli nadawcy UDP mają wystarczającą ilość danych do wysłania przez sieć, zwiększają większość dostępnej przepustowości. W takim przypadku Nadawcy UDP będą mieli większą przepustowość, ponieważ uzyskają większą przepustowość przepustowości sieci. W rzeczywistości jest to aktywny temat badawczy - Jak poprawić przepustowość TCP w obecności ruchu UDP. Jednym ze znanych mi sposobów wykorzystania aplikacji TCP do zwiększenia przepustowości jest otwarcie wielu połączeń TCP. W ten sposób, mimo że przepustowość każdego połączenia TCP może być ograniczona, suma przepustowości wszystkich połączeń TCP może być większa niż przepustowość aplikacji korzystającej z UDP.
Mówiąc o „tym, co jest szybsze” - istnieją co najmniej dwa bardzo różne aspekty: przepustowość i opóźnienie.
Mówiąc o przepustowości - kontrola przepływu TCP (jak wspomniano w innych odpowiedziach), jest niezwykle ważna i robienie czegokolwiek porównywalnego w stosunku do UDP, choć na pewno możliwe, byłoby dużym bólem głowy (tm). W rezultacie - korzystanie z UDP, gdy potrzebujesz przepustowości , rzadko kwalifikuje się jako dobry pomysł (chyba że chcesz uzyskać nieuczciwą przewagę nad TCP).
Jeśli jednak mówimy o opóźnieniach - cała sprawa jest zupełnie inna. Podczas gdy przy braku utraty pakietów TCP i UDP zachowują się bardzo podobnie (wszelkie różnice, jeśli występują, są marginalne) - po utracie pakietu cały wzorzec zmienia się drastycznie.
Po każdej utracie pakietu TCP będzie czekać na retransmisję przez co najmniej 200 ms (1 s na paragraf 2.4 RFC6298, ale praktyczne nowoczesne implementacje mają tendencję do zmniejszania go do 200 ms). Co więcej, dzięki TCP nawet te pakiety, które dotarły do hosta docelowego - nie zostaną dostarczone do Twojej aplikacji, dopóki nie zostanie odebrany brakujący pakiet (tj. Cała komunikacja zostanie opóźniona o ~ 200 ms) - BTW, ten efekt, znany jako Head-of Blokowanie linii jest nieodłącznym elementem wszystkich niezawodnych uporządkowanych strumieni, czy to TCP, czy niezawodnych + uporządkowanych UDP. Co gorsza - jeśli retransmitowany pakiet również zostanie utracony, będziemy mówić o opóźnieniu ~ 600 ms (z powodu tak zwanego wykładniczego wycofania, 1. retransmisja to 200 ms, a drugi 200 * 2 = 400 ms). Jeśli nasz kanał ma 1% utraty pakietów (co nie jest złe według dzisiejszych standardów), i mamy grę z 20 aktualizacjami na sekundę - takie 600 ms opóźnienia będą występować średnio co 8 minut. A ponieważ 600 ms to więcej niż wystarczająca ilość, aby zabić Cię w szybkiej grze - no cóż, jest całkiem zła dla rozgrywki. Te efekty właśnie dlatego gamedevs często wolą UDP niż TCP.
Jednak w przypadku korzystania z UDP w celu zmniejszenia opóźnień - ważne jest, aby zdawać sobie sprawę, że samo „użycie UDP” nie jest wystarczające, aby uzyskać znaczną poprawę opóźnień, wszystko zależy od tego, JAK używasz UDP. W szczególności, podczas gdy biblioteki RUDP zwykle unikają tego „wykładniczego wycofania” i używają krótszych czasów retransmisji - jeśli są używane jako „niezawodny uporządkowany strumień”, nadal muszą cierpieć z powodu blokowania na początku linii (tak w przypadku podwójnego utrata pakietu, zamiast 600 ms otrzymamy około 1,5 * 2 * RTT - lub dla całkiem niezłego 80 ms RTT, opóźnienie to ~ 250 ms, co jest poprawą, ale nadal można to zrobić lepiej). Z drugiej strony, jeśli używa się technik omówionych w http://gafferongames.com/networked-physics/snapshot-compression/ i / lub http: // ithare. , możliwe jest całkowite wyeliminowanie blokowania Head-of-Line (więc w przypadku utraty podwójnego pakietu dla gry z 20 aktualizacjami na sekundę opóźnienie wyniesie 100 ms niezależnie od RTT).
Na marginesie - jeśli zdarza się, że masz dostęp tylko do TCP, ale nie ma UDP (np. W przeglądarce lub jeśli Twój klient stoi za jedną z 6-9% brzydkich zapór blokujących UDP) - wydaje się, że istnieje sposób na zaimplementuj UDP-over-TCP bez nadmiernych opóźnień, patrz tutaj: http://ithare.com/almost-zero-additional-latency-udp-over-tcp/ (pamiętaj, aby przeczytać komentarze również (!)).
Każde połączenie TCP wymaga wstępnego uzgodnienia przed przesłaniem danych. Ponadto nagłówek TCP zawiera dużo narzutu przeznaczonego na różne sygnały i wykrywanie dostarczania wiadomości. W przypadku wymiany komunikatów prawdopodobnie wystarczy protokół UDP, jeśli dopuszczalna jest niewielka szansa na awarię. Jeśli potwierdzenie musi zostać zweryfikowane, TCP jest najlepszą opcją.
@Andrew , błagam się różnić. UDP jest wyborem w niektórych rodzajach aplikacji ze względu na wymagania dotyczące wydajności. Klasycznym przykładem jest wideokonferencja. Ten rodzaj aplikacji nie reaguje dobrze na sterowanie TCP.
Innym aspektem, który należy wziąć pod uwagę, jest to, czy będziesz potrzebować multiemisji. Jeśli tak, użyj UDP.
Wyjaśnię wszystko. TCP / UDP to dwa samochody jeżdżące po drodze. załóżmy, że znaki drogowe i przeszkody są błędami TCP dba o znaki drogowe, szanuje wszystko dookoła. Wolna jazda, ponieważ coś może się stać z samochodem. Podczas gdy UDP po prostu odjeżdża, pełna prędkość bez względu na znaki drogowe. Nic, szalony kierowca. UDP nie ma funkcji odzyskiwania po błędzie. Jeśli napotka przeszkodę, po prostu zderzy się z nią, a następnie kontynuuje. Podczas gdy TCP upewnia się, że wszystkie pakiety są wysyłane i odbierane idealnie, nie ma błędów, więc samochód po prostu mija przeszkody bez kolizji. Mam nadzieję, że to dobry przykład na zrozumienie, dlaczego UDP jest preferowane w grach. Gra wymaga szybkości. Preferowane jest pobieranie TCP , lub pobrane pliki mogą być uszkodzone.
UDP jest nieco szybszy z mojego doświadczenia, ale niewiele. Wybór nie powinien zależeć od wydajności, ale od treści wiadomości i technik kompresji.
Jeśli jest to protokół z wymianą wiadomości , sugerowałbym, że bardzo niewielki spadek wydajności, jaki bierzesz za pomocą TCP, jest więcej niż warty. Masz połączenie między dwoma punktami końcowymi, które zapewnią ci wszystko, czego potrzebujesz. Nie próbuj tworzyć własnego niezawodnego dwukierunkowego protokołu na bazie protokołu UDP, chyba że naprawdę, naprawdę pewny tego, co podejmujesz.
Należy pamiętać, że TCP zwykle przechowuje wiele wiadomości w sieci. Jeśli chcesz zaimplementować to w UDP, będziesz mieć sporo pracy, jeśli chcesz to zrobić niezawodnie. Twoje rozwiązanie będzie albo mniej niezawodne, mniej szybkie, albo niewiarygodne. Istnieją prawidłowe aplikacje UDP, ale jeśli zadajesz to pytanie, prawdopodobnie nie masz.
Wykonano pewne prace, aby umożliwić programistom czerpanie korzyści z obu światów.
SCTP
Jest to niezależny protolol warstwy transportowej, ale może być używany jako biblioteka zapewniająca dodatkową warstwę w stosunku do UDP. Podstawową jednostką komunikacji jest wiadomość (zmapowana na jeden lub więcej pakietów UDP). Wbudowana jest kontrola przeciążenia. Protokół ma pokrętła i pokrętła do włączenia
jeśli którykolwiek z tych elementów jest potrzebny do konkretnego zastosowania.
Jednym z problemów jest to, że nawiązywanie połączenia jest skomplikowanym (a zatem powolnym procesem)
Inne podobne rzeczy
Jeszcze jedna podobna zastrzeżona rzecz eksperymentalna
To również próbuje poprawić potrójny uścisk dłoni TCP i zmienić kontrolę przeciążenia, aby lepiej radzić sobie z szybkimi liniami.
Nie ma sensu rozmawiać o TCP lub UDP bez uwzględnienia stanu sieci. Jeśli sieć między dwoma punktami ma bardzo wysoką jakość, UDP jest absolutnie szybszy niż TCP, ale w niektórych innych przypadkach, takich jak sieć GPRS, TCP może być szybszy i bardziej niezawodny niż UDP.
Konfiguracja sieci ma kluczowe znaczenie dla wszelkich pomiarów. Ma to ogromną różnicę, jeśli komunikujesz się przez gniazda na lokalnej maszynie lub na drugim końcu świata.
Trzy rzeczy, które chcę dodać do dyskusji: