Czego używasz, gdy potrzebujesz niezawodnego UDP?

Jeśli masz sytuację, w której połączenie TCP jest potencjalnie zbyt wolne, a "połączenie" UDP jest potencjalnie zbyt zawodne, czego używasz? Istnieją różne standardowe niezawodne protokoły UDP, jakie masz doświadczenia z nimi?

Proszę omówić jeden protokół na odpowiedź, a jeśli ktoś już wspomniał o tym, którego używasz, rozważ głosowanie i użycie komentarza do rozwinięcia, jeśli jest to wymagane.

Interesują mnie tu różne opcje, z który TCP jest na jednym końcu skali, a UDP na drugim. Dostępne są różne niezawodne opcje UDP, z których każda przenosi pewne elementy TCP do UDP.

Wiem, że często TCP jest właściwym wyborem, ale posiadanie listy alternatyw jest często przydatne w pomaganiu dojść do tego wniosku. Rzeczy takie jak Enet, RUDP itp, które są zbudowane na UDP mają różne plusy i minusy, czy korzystałeś z nich, jakie są Twoje doświadczenia?

Dla uniknięcia wątpliwości nie ma więcej informacji, jest to hipotetyczne pytanie, które miałem nadzieję, że wywoła listę odpowiedzi, które wyszczególniają różne opcje i alternatywy dostępne dla kogoś, kto musi podjąć decyzję.

Author: Len Holgate, 2008-09-20

13 answers

Trudno jest odpowiedzieć na to pytanie bez dodatkowych informacji na temat domeny problemu. Na przykład, jakiej ilości danych używasz? Jak często? Jaki jest charakter danych? (np. czy to unikalne, jednorazowe dane? Czy jest to strumień przykładowych danych? itd.) Na jakiej platformie pracujesz? (np. desktop / server / embedded) Aby określić, co masz na myśli przez "zbyt wolny", jakiego medium sieciowego używasz?

Ale w (bardzo!) Ogólne warunki myślę, że będziesz musiał spróbować naprawdę trudno pokonać tcp dla szybkości, chyba że można dokonać pewnych trudnych założeń dotyczących danych, które próbujesz wysłać.

Na przykład, jeśli dane, które próbujesz wysłać, są takie, że możesz tolerować utratę pojedynczego pakietu (np. regularnie pobierane dane, gdzie częstotliwość próbkowania jest wielokrotnie wyższa niż przepustowość sygnału) wtedy prawdopodobnie można poświęcić pewną niezawodność transmisji, zapewniając, że można wykryć uszkodzenie danych(np. dzięki wykorzystaniu dobra crc)

Ale jeśli nie możesz tolerować utraty pojedynczego pakietu, będziesz musiał zacząć wprowadzać rodzaje technik niezawodności, które TCP już ma. Bez nakładania rozsądnej ilości pracy może się okazać, że zaczynasz budować te elementy w rozwiązanie przestrzeni użytkownika ze wszystkimi nieodłącznymi problemami z prędkością.

 25
Author: Andrew Edgecombe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-07 01:20:17

A co z SCTP . Jest to standardowy protokół IETF (RFC 4960)

Posiada funkcję chunking, która może pomóc w szybkości.

Update: a porównanie TCP i SCTP pokazuje, że wydajność jest porównywalna, chyba że można użyć dwóch interfejsów.

Update: a ładny artykuł wprowadzający .

 26
Author: philant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-23 08:05:36

ENET - http://enet.bespin.org/

Pracowałem z ENETEM jako niezawodny protokół UDP i napisałem asynchroniczną wersję przyjazną dla gniazd dla mojego klienta, który używa go na swoich serwerach. Działa to całkiem ładnie, ale nie podoba mi się narzut, który peer to peer ping dodaje do innych bezczynnych połączeń; gdy masz wiele połączeń pingowanie wszystkich z nich regularnie jest dużo pracy.

ENET daje możliwość wysyłania wielu 'kanałów' z danych, a przesyłane dane są niewiarygodne, wiarygodne lub uporządkowane. Zawiera również wspomniany peer to peer ping, który działa jako keep alive.

 20
Author: Len Holgate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-20 09:37:18

Mamy klientów z branży obronnej, którzy używają UDT (UDP-based Data Transfer) (zobacz http://udt.sourceforge.net/) i są z niego bardzo zadowoleni. Widzę, że is ma również przyjazną licencję BSD.

 14
Author: Chris Markle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-30 22:10:14

RUDP - niezawodny protokół Datagramowy użytkownika

To zapewnia:

  • potwierdzenie odebranych pakietów
  • Kontrola okien i zatorów
  • retransmisja utraconych pakietów
  • Overbuffering (szybszy niż przesyłanie strumieniowe w czasie rzeczywistym)

Wydaje się nieco bardziej konfigurowalny w odniesieniu do keep alives niż ENet, ale nie daje tak wielu opcji(tzn. wszystkie dane są wiarygodne i uporządkowane, a nie tylko te bity, które zdecydujesz, że powinny być). Informatyka wygląda dość prosto do wdrożenia.

 10
Author: Len Holgate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-25 14:41:14

Jak zauważyli inni, twoje pytanie jest bardzo ogólne i to, czy coś jest "szybsze" od TCP, zależy w dużej mierze od rodzaju aplikacji.

TCP jest na ogół tak szybki, jak to możliwe, aby zapewnić niezawodne przesyłanie danych z Jednego Hosta do drugiego. Jeśli jednak Twoja aplikacja wykonuje wiele małych impulsów ruchu i czeka na odpowiedzi, UDP może być bardziej odpowiedni, aby zminimalizować opóźnienia.

Jest łatwy środek. algorytm Nagle ' a jest częścią TCP pomaga to zapewnić, że nadawca nie przytłacza odbiorcy dużego strumienia danych, co powoduje zatory i utratę pakietów.

Jeśli potrzebujesz niezawodnego, uporządkowanego dostarczania TCP, a także szybkiej reakcji UDP i nie musisz martwić się o zatory związane z wysyłaniem dużych strumieni danych, możesz wyłączyć algorytm Nagle ' a:

int opt = -1;
if (setsockopt(sock_fd, IPPROTO_TCP, TCP_NODELAY, (char *)&opt, sizeof(opt)))
  printf("Error disabling Nagle's algorithm.\n");
 9
Author: smo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-20 15:17:20

Każdy, kto uzna, że powyższa lista nie wystarczy i że chcą rozwijać swoje własne niezawodne UDP, powinien zdecydowanie spojrzeć na specyfikację QUIC Google, ponieważ obejmuje ona wiele skomplikowanych przypadków narożnych i potencjalnych ataków typu denial of service. Nie grałem jeszcze z implementacją tego i możesz nie chcieć lub nie potrzebować wszystkiego, co zapewnia, ale dokument jest wart przeczytania przed rozpoczęciem nowego" niezawodnego " projektu UDP.

Dobry punkt skokowy dla QUIC jest TUTAJ , na blogu Chromium.

Aktualny dokument projektu QUIC można znaleźć TUTAJ .

 7
Author: Len Holgate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-01 08:50:57

Jeśli masz sytuację, w której połączenie TCP jest potencjalnie zbyt wolne, a "połączenie" UDP jest potencjalnie zbyt zawodne, czego używasz? Istnieją różne standardowe niezawodne protokoły UDP, jakie masz doświadczenia z nimi?

Słowem kluczowym w Twoim zdaniu jest "potencjalnie". Myślę, że naprawdę musisz udowodnić sobie, że TCP jest w rzeczywistości zbyt powolny dla Twoich potrzeb, jeśli potrzebujesz niezawodności w swoim protokole.

Jeśli chcesz uzyskać niezawodność z UDP to w zasadzie będziesz ponownie wdrażać niektóre funkcje TCP na górze UDP, które prawdopodobnie sprawią, że rzeczy będą wolniejsze niż tylko używanie TCP w pierwszej kolejności.

 4
Author: 17 of 26,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-20 12:27:26

Protokół DCCP, standaryzowany w RFC 4340 , "Datagram Congestion Control Protocol" może być tym, czego szukasz.

Wydaje się zaimplementowane w Linuksie.

 4
Author: bortzmeyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-15 14:34:59

Może Być RFC 5405 , "Unicast UDP Usage Guidelines for Application Designers" będzie dla Ciebie przydatne.

 3
Author: bortzmeyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-15 14:32:19

Rozważałeś kompresję swoich danych ?

Jak wspomniano powyżej, brakuje nam informacji o dokładnej naturze problemu, ale kompresja danych w celu ich transportu może pomóc.

 2
Author: philant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-20 15:03:47

RUDP . Wiele serwerów socket dla gier implementuje coś podobnego.

 2
Author: Arcane Engineer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-09 12:44:00

Najlepszym sposobem osiągnięcia niezawodności przy użyciu UDP jest zbudowanie niezawodności w samym programie aplikacji (na przykład poprzez dodanie mechanizmów potwierdzenia i retransmisji)

 -3
Author: kushan singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-26 10:59:04