webentwicklung-frage-antwort-db.com.de

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

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 zuverlässige UDP-Standardprotokolle. Welche Erfahrungen haben Sie mit diesen?

Bitte besprechen Sie ein Protokoll pro Antwort. Wenn bereits jemand anderes das von Ihnen verwendete Protokoll 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 TCP an einem Ende der Skala und UDP am anderen ist. Verschiedene zuverlässige UDP-Optionen sind verfügbar und jede bringt einige Elemente von TCP zu UDP.

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

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

89
Len Holgate

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

Aber in (sehr!) Allgemeinen Begriffen denke ich, dass Sie sich wirklich sehr bemühen müssen, tcp für Geschwindigkeit zu schlagen, es sei denn, Sie können einige harte Annahmen über die Daten machen, die Sie zu senden versuchen.

Wenn beispielsweise die Daten, die Sie senden möchten, 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 Beeinträchtigen Sie die Übertragungszuverlässigkeit, indem Sie sicherstellen, dass Sie Datenkorruption erkennen können (z. B. durch die Verwendung eines guten CRC).

Aber wenn Sie den Verlust eines einzelnen Pakets nicht tolerieren können, müssen Sie damit beginnen, die Techniken für die Zuverlässigkeit einzuführen, die tcp bereits besitzt. Und ohne einen angemessenen Arbeitsaufwand zu betreiben, stellen Sie möglicherweise fest, dass Sie diese Elemente in eine User-Space-Lösung mit all den damit verbundenen Geschwindigkeitsproblemen einbauen.

25

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

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

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

Update: a Netter Einführungsartikel .

27
philant

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

Ich habe mit ENET als zuverlässigem UDP-Protokoll gearbeitet und eine für asynchrone Sockets geeignete 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 das Peer-to-Peer-Ping zu anderen inaktiven Verbindungen hinzufügt. Wenn Sie viele Verbindungen haben, ist es viel zu tun, wenn Sie regelmäßig alle anpingen.

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

20
Len Holgate

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

14
Chris Markle

RUDP - Reliable User Datagram Protocol

Dies bietet:

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

Es scheint etwas konfigurierbarer zu sein, um am Leben zu bleiben, als ENet, aber es gibt Ihnen nicht so viele Optionen (d. H. Alle Daten sind zuverlässig und sequenziert, nicht nur die Bits, für die Sie sich entscheiden sollten). Es sieht ziemlich einfach zu implementieren aus.

10
Len Holgate

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

TCP ist in der Regel so schnell wie nie zuvor, um Daten zuverlässig von einem Host auf einen anderen zu übertragen. Wenn Ihre Anwendung jedoch viele kleine Datenströme ausführt und auf Antworten wartet, ist UDP möglicherweise besser geeignet, um die Latenz zu minimieren.

Es gibt einen einfachen Mittelweg. Nagles 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 und ordnungsgemäße Zustellung von TCP sowie die schnelle Reaktion von UDP benötigen und sich keine Sorgen über die Überlastung durch das 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");
9
smo

Wer der Meinung ist, dass die oben aufgeführte Liste nicht ausreicht und dass er sein eigenes zuverlässiges UDP entwickeln möchte, sollte sich unbedingt 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 benötigen möglicherweise nicht alles, was es bietet, aber das Dokument ist es wert, gelesen zu werden, bevor Sie sich auf ein neues "zuverlässiges" UDP-Design einlassen.

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

Das aktuelle QUIC-Designdokument finden Sie hier .

7
Len Holgate

Das in RFC 434 , "Datagram Congestion Control Protocol" standardisierte Protokoll DCCP ist möglicherweise das, wonach Sie suchen.

Es scheint in Linux implementiert .

4
bortzmeyer

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 zuverlässige UDP-Standardprotokolle. Welche Erfahrungen haben Sie mit diesen?

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

Wenn Sie UDP verlässlicher machen möchten, implementieren Sie einige der TCP-Funktionen zusätzlich zu UDP neu. Dies führt wahrscheinlich dazu, dass die Verwendung von TCP möglicherweise langsamer wird.

4
17 of 26

Möglicherweise ist RFC 5405 "Unicast-UDP-Verwendungsrichtlinien für Anwendungsentwickler" hilfreich für Sie.

3
bortzmeyer

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

Wie bereits erwähnt, fehlen uns Informationen über die genaue Art Ihres Problems. Eine Komprimierung der Daten zum Transport kann jedoch hilfreich sein.

2
philant

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

2
Engineer