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.
quelle
Antworten:
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.
quelle
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 .
quelle
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.
quelle
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.
quelle
RUDP - Zuverlässiges Benutzer-Datagramm-Protokoll
Dies bietet:
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.
quelle
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:
quelle
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 .
quelle
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.
quelle
Das in RFC 4340 standardisierte Protokoll DCCP "Datagram Congestion Control Protocol" ist möglicherweise das, wonach Sie suchen.
Es scheint in Linux implementiert zu sein .
quelle
Sein kann , RFC 5405 , „Unicast UDP Nutzungsrichtlinien für Anwendungsentwickler“ wird für Sie nützlich sein.
quelle
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.
quelle
RUDP . Viele Socket-Server für Spiele implementieren etwas Ähnliches.
quelle
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).
quelle