Was verwenden Sie, wenn Sie zuverlässiges UDP benötigen?

92

Wenn Sie eine Situation haben, in der eine TCP-Verbindung möglicherweise zu langsam und eine UDP-Verbindung möglicherweise zu unzuverlässig ist, was verwenden Sie? Es gibt verschiedene standardmäßige zuverlässige UDP-Protokolle. Welche Erfahrungen haben Sie damit?

Bitte besprechen Sie ein Protokoll pro Antwort. Wenn jemand anderes das von Ihnen verwendete bereits erwähnt hat, sollten Sie es abstimmen und bei Bedarf einen Kommentar verwenden, um dies zu erläutern.

Ich interessiere mich für die verschiedenen Optionen hier, von denen sich TCP an einem Ende der Skala und UDP am anderen befindet. Es stehen verschiedene zuverlässige UDP-Optionen zur Verfügung, von denen jede einige Elemente von TCP zu UDP bringt.

Ich weiß, dass TCP oft die richtige Wahl ist, aber eine Liste der Alternativen ist oft hilfreich, um zu diesem Schluss zu kommen. Dinge wie Enet, RUDP usw., die auf UDP basieren, haben verschiedene Vor- und Nachteile. Haben Sie sie verwendet? Welche Erfahrungen haben Sie gemacht?

Um Zweifel zu vermeiden, gibt es keine weiteren Informationen. Dies ist eine hypothetische Frage, von der ich gehofft habe, dass sie eine Liste von Antworten enthält, in denen die verschiedenen Optionen und Alternativen aufgeführt sind, die jemandem zur Verfügung stehen, der eine Entscheidung treffen muss.

Len Holgate
quelle
1
Diese Frage scheint nicht zum Thema zu gehören, da sie nach Technologien fragt
Dave Hillier
Diejenigen, die TCP in allen Fällen für das Beste halten, lesen bitte: en.wikipedia.org/wiki/Bandwidth-delay_product
nullptr
Wikipedia hat eine schöne Tabelle, in der verschiedene Aspekte von UDP, UDP Lite, TCP, Multipath-TCP, SCTP, DCCP und RUDP verglichen werden . SCTP unterstützt die meisten Funktionen in dieser Liste.
Eugene Beresovsky
@EugeneBeresovsky Ich habe ein wenig über SCTP recherchiert, die meisten Informationen, einschließlich der SO-Antworten, stammen aus dem Jahr 2013 und früher. Die meisten Leute haben damals geschrieben, dass die SCTP-Akzeptanz sehr gering war. Ich frage mich, wie es heute ist? Siehe auch diesen Thread stackoverflow.com/questions/1171555/…
Michael IV
@ MichaelIvanov Adoption ist in der Tat gering. Wenn Sie es jedoch in Ihrem Rechenzentrum verwenden möchten, ist es Ihnen egal, ob es von außen übernommen wird, solange Switches und Router keine Probleme verursachen (was in einem Rechenzentrum nicht der Fall sein sollte) und Sie über ein Betriebssystem verfügen und Bibliotheksunterstützung, die ein Problem sein kann, wie in einer der Antworten in der Frage beschrieben, auf die Sie verlinkt haben.
Eugene Beresovsky

Antworten:

25

Es ist schwierig, diese Frage ohne zusätzliche Informationen zur Domäne des Problems zu beantworten. Welches Datenvolumen verwenden Sie beispielsweise? Wie oft? Was ist die Art der Daten? (z. B. ist es einzigartig, einmalige Daten? Oder ist es ein Strom von Beispieldaten? usw.) Für welche Plattform entwickeln Sie? (z. B. Desktop / Server / eingebettet) Um festzustellen, was Sie unter "zu langsam" verstehen, welches Netzwerkmedium verwenden Sie?

Aber (sehr!) Allgemein denke ich, dass Sie sich wirklich bemühen müssen, TCP für Geschwindigkeit zu schlagen, es sei denn, Sie können einige harte Annahmen über die Daten treffen, die Sie senden möchten.

Wenn die Daten, die Sie senden möchten, beispielsweise so sind, dass Sie den Verlust eines einzelnen Pakets tolerieren können (z. B. regelmäßig abgetastete Daten, bei denen die Abtastrate um ein Vielfaches höher ist als die Bandbreite des Signals), können Sie dies wahrscheinlich tun opfern Sie eine gewisse Zuverlässigkeit der Übertragung, indem Sie sicherstellen, dass Sie Datenkorruption erkennen können (z. B. durch die Verwendung eines guten CRC)

Wenn Sie jedoch den Verlust eines einzelnen Pakets nicht tolerieren können, müssen Sie mit der Einführung der Techniken für die Zuverlässigkeit beginnen, über die TCP bereits verfügt. Und ohne angemessenen Arbeitsaufwand stellen Sie möglicherweise fest, dass Sie diese Elemente in eine User-Space-Lösung mit all den damit verbundenen Geschwindigkeitsproblemen einbauen.

Andrew Edgecombe
quelle
4
Ok, ich werde die Frage anpassen. Ich interessiere mich mehr für die Vor- und Nachteile der verschiedenen zuverlässigen UDP-Protokolle als für eine Antwort zum Verwenden von TCP;)
Len Holgate,
9
@ Andrew - es ist sehr EINFACH, TCP in zwei Fällen zu schlagen: (1) Ihre Anwendung hat geringere Zuverlässigkeitsanforderungen als "alle Daten, immer in Ordnung, keine Duplikate, keine übermäßige Warteschlange". Oder (2) Sie verwenden Multicast. Zuverlässiges UDP ist in Multicast-Umgebungen sehr verbreitet.
Tom
4
Außerdem leidet TCP schrecklich, wenn es über eine WAN-Verbindung verwendet wird (Langstreckenprobleme). Einfach. TCP verwendet Fenster, in denen die Pakete im Fenster bestätigt werden müssen. ACK-Protokolle leiden unter der Latenz aufgrund der Leitungsentfernung. Google: WAN TCP "Lichtgeschwindigkeit"
Ajaxx
3
@ Ajaxx, Sie haben diesbezüglich sehr Recht, TCP / IP tut dies jedoch absichtlich aufgrund der letzten Internet-Kernschmelze. Wenn Sie ein Protokoll mit hoher Bitrate ohne Überlastungskontrolle durchführen, schämen Sie sich im Grunde. Wenn Sie das Netzwerk besitzen, dann gehen Sie wild.
Kevin Nisbet
2
"wenn die Abtastrate signifikant höher ist als die Nyquist-Rate" - die Abtastrate ist per Definition immer doppelt so hoch wie die Nyquist-Rate.
Steve
27

Was ist SCTP . Es ist ein Standardprotokoll der IETF (RFC 4960)

Es hat Chunking-Fähigkeit, die für die Geschwindigkeit helfen könnte.

Update: Ein Vergleich zwischen TCP und SCTP zeigt, dass die Leistungen vergleichbar sind, sofern nicht zwei Schnittstellen verwendet werden können.

Update: ein schöner Einführungsartikel .

Philant
quelle
Das ist gut, ich interessiere mich mehr für Dinge, die auf UDP als auf IP aufgebaut werden können, aber es ist sicherlich etwas, das in den Lösungsbereich passt.
Len Holgate
SCTP bietet viele großartige Funktionen (z. B. Multihoming) und ist mit der teilweisen Zuverlässigkeitserweiterung (RFC 3758) eine unglaublich flexible Option. Es ist in den neuesten Linux-Kernel-Versionen enthalten, aber für Windows müssen Sie Ihren eigenen SCTP-Stack installieren.
Andrew Johnson
6
SCTP kann über UDP getunnelt werden. tools.ietf.org/id/draft-ietf-sigtran-sctptunnel-00.txt
Meilen
Danke Miles, das ist ein nützlicher Link!
Len Holgate
1
Ja ... Aber etwas, das auf UDP basiert und nicht auf der gleichen Ebene wie UDP, ist wahrscheinlich einfacher im Benutzerbereich zu implementieren, zumindest unter Windows ...
Len Holgate
21

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

Ich habe mit ENET als zuverlässigem UDP-Protokoll gearbeitet und eine asynchrone Sockets-freundliche Version für einen Client von mir geschrieben, der sie auf seinen Servern verwendet. Es funktioniert ganz gut, aber ich mag den Overhead nicht, den Peer-to-Peer-Ping zu ansonsten inaktiven Verbindungen hinzufügt. Wenn Sie viele Verbindungen haben, die regelmäßig alle pingen, ist dies eine Menge Arbeit.

ENET bietet Ihnen die Möglichkeit, mehrere Datenkanäle zu senden und die gesendeten Daten unzuverlässig, zuverlässig oder sequenziert zu machen. Dazu gehört auch der oben erwähnte Peer-to-Peer-Ping, der als Keep-Alive fungiert.

Len Holgate
quelle
14

Wir haben einige Kunden aus der Verteidigungsindustrie, die UDT (UDP-based Data Transfer) verwenden (siehe http://udt.sourceforge.net/ ) und sind sehr zufrieden damit. Ich sehe, dass es auch eine freundliche BSD-Lizenz gibt.

Chris Markle
quelle
2
Können Sie Ihre Kunden und ihre Anwendungsfälle, insbesondere im Verteidigungsbereich, näher erläutern? Wahrscheinlich nicht, aber es ist einen Versuch wert. Ich habe meinen Vorgesetzten tatsächlich die Idee über UDT in einer Dateiübertragungsanwendung vorgeworfen, aber sie ist noch nicht wirklich irgendwohin gegangen.
Thomas Owens
10

RUDP - Zuverlässiges Benutzer-Datagramm-Protokoll

Dies bietet:

  • Bestätigung empfangener Pakete
  • Fenster- und Überlastungskontrolle
  • Neuübertragung verlorener Pakete
  • Überpufferung (schneller als Echtzeit-Streaming)

Es scheint etwas konfigurierbarer zu sein, um am Leben zu bleiben als ENet, bietet Ihnen jedoch nicht so viele Optionen (dh alle Daten sind zuverlässig und sequenziert, nicht nur die Bits, für die Sie sich entscheiden sollten). Die Implementierung sieht ziemlich einfach aus.

Len Holgate
quelle
Ich habe mir das angeschaut, aber es scheint nicht viele Implementierungen zu geben. Hast du eine Empfehlung?
Nicholas
Nein Entschuldigung. Ich habe es am Ende nicht benutzt und wollte immer eine Implementierung von Grund auf neu machen.
Len Holgate
9

Wie andere bereits betont haben, ist Ihre Frage sehr allgemein und ob etwas schneller als TCP ist oder nicht, hängt stark von der Art der Anwendung ab.

TCP ist im Allgemeinen so schnell wie möglich, um Daten zuverlässig von einem Host auf einen anderen zu streamen. Wenn Ihre Anwendung jedoch viele kleine Verkehrsstöße ausführt und auf Antworten wartet, ist UDP möglicherweise besser geeignet, um die Latenz zu minimieren.

Es gibt einen einfachen Mittelweg. Der Nagle-Algorithmus ist der Teil von TCP, der sicherstellt, dass der Absender den Empfänger eines großen Datenstroms nicht überfordert, was zu Überlastung und Paketverlust führt.

Wenn Sie die zuverlässige, ordnungsgemäße Bereitstellung von TCP und die schnelle Reaktion von UDP benötigen und sich keine Gedanken über Überlastungen beim Senden großer Datenströme machen müssen, können Sie den Nagle-Algorithmus deaktivieren:

int opt = -1;
if (setsockopt(sock_fd, IPPROTO_TCP, TCP_NODELAY, (char *)&opt, sizeof(opt)))
  printf("Error disabling Nagle's algorithm.\n");
smo
quelle
Wie gesagt, vorausgesetzt, TCP befindet sich an einem Ende der Skala und UDP am anderen, was gibt es sonst noch?
Len Holgate
Wenn Sie pedantisch sein möchten, basieren die meisten der diskutierten Protokolle auf UDP.
Smo
Die Annahme, dass sich TCP an einem Ende und UDP am anderen Ende befindet, ist falsch. Wenn UDP beispielsweise keine Flusskontrolle hat, können Sie Pakete leicht zu schnell senden, wodurch ein dazwischen liegender Router alle verwirft. Was machst du dann ? Die verlorenen Pakete ignorieren oder erneut senden? Wenn Sie sie erneut senden, wird TCP am Ende mehr oder weniger neu implementiert. Eine weitere Option für eine zuverlässige Kommunikation ist SCTP.
Nr.
1
Eine schnelle Antwort entspricht nicht unbedingt einem hohen Durchsatz.
Matt
1
Ich bin nicht einverstanden. Wenn Nagle in TCP-basierten Protokollen mit vielen kleineren Paketen verwendet wird, werden diese zusammengeführt und es werden mehr größere Pakete erstellt. Dies führt zu einer leichten Verzögerung beim Senden, sodass die Verspätung geringfügig zunehmen kann. Der Durchsatz kann jedoch bei ausgeschaltetem Nagle geringer sein, da mehr Pakete = mehr Paket-Header = größerer Overhead. Pakete, die in einem LAN abgelegt werden, haben normalerweise mehr mit dem Füllen von Eingabepuffern zu tun. Wenn viele Clients Daten an denselben Host senden, kann dies keinen Unterschied machen. Ich glaube nicht, dass das Aus- und Einschalten von Nagle dies in der Praxis bewirken wird.
Matt
8

Jeder, der entscheidet, dass die obige Liste nicht ausreicht und dass er sein eigenes zuverlässiges UDP entwickeln möchte, sollte sich auf jeden Fall die Google QUIC-Spezifikation ansehen, da diese viele komplizierte Eckfälle und potenzielle Denial-of-Service-Angriffe abdeckt. Ich habe noch nicht mit einer Implementierung davon gespielt, und Sie möchten oder brauchen möglicherweise nicht alles, was es bietet, aber das Dokument ist es wert, gelesen zu werden, bevor Sie mit einem neuen "zuverlässigen" UDP-Design beginnen.

Ein guter Ausgangspunkt für QUIC ist hier im Chromium Blog.

Das aktuelle QUIC-Designdokument finden Sie hier .

Len Holgate
quelle
4

Wenn Sie eine Situation haben, in der eine TCP-Verbindung möglicherweise zu langsam und eine UDP-Verbindung möglicherweise zu unzuverlässig ist, was verwenden Sie? Es gibt verschiedene standardmäßige zuverlässige UDP-Protokolle. Welche Erfahrungen haben Sie damit?

Das Schlüsselwort in Ihrem Satz ist "potenziell". Ich denke, Sie müssen sich wirklich beweisen, dass TCP tatsächlich zu langsam für Ihre Anforderungen ist, wenn Sie Zuverlässigkeit in Ihrem Protokoll benötigen.

Wenn Sie die Zuverlässigkeit von UDP verbessern möchten, werden Sie im Grunde genommen einige der TCP-Funktionen zusätzlich zu UDP neu implementieren, wodurch die Dinge wahrscheinlich langsamer werden als die erstmalige Verwendung von TCP.

17 von 26
quelle
Ja, Andrew Edgecombe hat das auch gesagt, aber wie gesagt, ich interessiere mich für die Vor- und Nachteile, welche Alternativen es gibt. Ohne diese Liste von Alternativen und ihre Vor- und Nachteile ist es schwer zu entscheiden, was am besten ist.
Len Holgate
Bei einer bekannten Zuverlässigkeitsfunktion kann manchmal ein UDP-Stream von Hand optimiert werden, um den TCP-Stream im Betriebssystem zu übertreffen. Selten.
Joshua
1
@ 17 von 26, ich stimme Len Holgate zu, TCP wird unter bestimmten Umständen langsamer als zuverlässiges UDP sein. Nehmen wir an, Sie haben wie ein Netzwerk mit hohem BDP eine Internetverbindung mit 1 Gbit / s von China nach New York. TCP ist besser für die meisten Verbindungen auf der Erde, jedoch nicht für Netzwerke mit einem Produkt mit hoher Bandbreitenverzögerung.
nullptr
3

Sein kann , RFC 5405 , „Unicast UDP Nutzungsrichtlinien für Anwendungsentwickler“ wird für Sie nützlich sein.

bortzmeyer
quelle
2

Haben Sie darüber nachgedacht, Ihre Daten zu komprimieren?

Wie oben erwähnt, fehlen uns Informationen über die genaue Art Ihres Problems, aber die Komprimierung der Daten zum Transport könnte helfen.

Philant
quelle
1
Besonders bei modernen Komprimierungsbibliotheken. Einige sind so schnell wie ein Memcpy. zB lz4.
Matt
2

RUDP . Viele Socket-Server für Spiele implementieren etwas Ähnliches.

Ingenieur
quelle
-3

Der beste Weg, um mit UDP Zuverlässigkeit zu erreichen, besteht darin, die Zuverlässigkeit im Anwendungsprogramm selbst aufzubauen (z. B. durch Hinzufügen von Bestätigungs- und Neuübertragungsmechanismen).

Kushan Singh
quelle