Frage

Wenn Sie eine Situation, wo eine TCP-Verbindung ist möglicherweise zu langsam und ein ‚Verbindung‘ UDP ist potenziell zu unzuverlässig, was verwenden Sie? Es gibt verschiedene Standard zuverlässige UDP-Protokolle gibt, welche Erfahrungen haben Sie mit ihnen?

Bitte sprechen Sie ein Protokoll pro Antwort und wenn jemand anderes bereits ein erwähnt verwenden Sie dann betrachten sie und mit einem Kommentar stimmen bei Bedarf auszuarbeiten.

Ich habe Interesse an den verschiedenen Optionen hier, von denen TCP an einem Ende der Skala und UDP ist auf der anderen Seite. Verschiedene zuverlässige UDP Optionen stehen zur Verfügung, und jeder bringt einige Elemente von TCP zu UDP.

Ich weiß, dass oft TCP die richtige Wahl ist, aber eine Liste der Alternativen, die ist oft nützlich, in einem zu diesem Schluss kommen zu helfen. Dinge wie Enet, RUDP, etc., die auf UDP haben verschiedene Vor- und Nachteile gebaut sind, haben Sie verwendet sie, was sind Ihre Erfahrungen?

Zur Vermeidung von Zweifel gibt es keine weiteren Informationen, das ist eine hypothetische Frage und eine, die ich hoffte, würde eine Liste von Antworten hervorrufen, die die verschiedenen Optionen und Alternativen zur Verfügung jemand detailliert, die eine Entscheidung treffen muss.

War es hilfreich?

Lösung

Es ist schwierig, diese Frage ohne einige zusätzliche Informationen über die Domäne des Problems zu beantworten. Zum Beispiel werden welche Datenmengen verwenden Sie? Wie oft? Was ist die Natur der Daten? (Z. B. ist es einzigartig, ein Aus-Daten? Oder ist es ein Strom von Probendaten? Etc.) Welche Plattform entwickeln Sie? (Z. B. Desktop / Server / embedded) Um zu bestimmen, was Sie unter „zu langsam“, welche Netzwerkmedium verwenden Sie?

Aber in (sehr!) Allgemein Ich denke, du wirst wirklich schwer haben, um zu versuchen tcp für Geschwindigkeit zu schlagen, es sei denn, Sie einige harte Annahmen über die Daten machen, die Sie zu senden versuchen.

Zum Beispiel, wenn die Daten, die Sie versuchen, so zu senden, dass Sie den Verlust eines einzelnen Pakets tolerieren kann (z. B. regelmäßig abgetasteten Daten, wo die Abtastrate ein Vielfaches höher ist als die Bandbreite des Signals), dann Sie können sich wahrscheinlich eine gewisse Zuverlässigkeit der Übertragung opfern, indem sichergestellt wird, dass Sie zur Beschädigung von Daten erkennen kann (z. B. durch die Verwendung eines guten crc)

Wenn Sie aber nicht den Verlust eines einzelnen Pakets tolerieren kann, dann, dass Sie gehen beginnen zu müssen die Arten von Techniken für die Zuverlässigkeit der Einführung tcp bereits hat. Und, ohne in einer angemessenen Höhe der Arbeit zu setzen, können Sie feststellen, dass Sie beginnen, diese Elemente in einen User-Space-Lösung mit all den inhärenten Fehlern zu bauen mit ihm zu gehen.

Andere Tipps

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

Es hat Chunking Fähigkeit, die für die Geschwindigkeit helfen.

Update: ein Vergleich zwischen TCP und SCTP zeigt, dass die Leistungen vergleichbar sind, es sei denn, zwei Schnittstellen verwendet werden.

Update: ein schön Einführungsartikel .

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

Ich habe mit ENET als zuverlässigem UDP-Protokoll gearbeitet und einem asynchronen Sockets Version für einen Kunden von mir geschrieben, die sie in ihren Servern verwendet. Es funktioniert ganz gut, aber ich mag es nicht, den Overhead, dass die Peer-to-Peer-Ping an ansonsten inaktiver Verbindungen hinzufügt; wenn Sie viele Verbindungen alle von ihnen haben Pingen ist regelmäßig eine Menge Arbeit beschäftigt.

ENET gibt Ihnen die Möglichkeit, mehrere ‚Kanäle‘ senden von Daten und für die Daten als unzuverlässig, zuverlässig oder sequenziert gesendet. Es enthält auch die oben genannten Peer-to-Peer-ping, die als keep wirken lebendig.

Wir haben einige Rüstungsindustrie Kunden, die UDT verwenden (UDP-basierte Datenübertragung) (siehe http: //udt.sourceforge .net / ) und ist sehr zufrieden damit. Ich sehe, dass eine freundliche BSD-Lizenz hat auch.

RUDP - Reliable User Datagram Protocol

Dieses sieht vor:

  • Bestätigung der empfangenen Pakete
  • Windowing und Überlastungssteuerung
  • Neuübertragung von verlorenen Paketen
  • Überpufferung (Schneller als Echtzeit-Streaming)

Es scheint in Bezug etwas mehr konfigurierbar alives zu halten dann ENet aber es macht Dir nicht so viele Optionen geben (das heißt alle Daten zuverlässig und sequenziert nicht nur die Bits, die Sie sollten entscheiden). Es sieht ziemlich einfach zu implementieren.

Wie andere haben darauf hingewiesen, Ihre Frage ist sehr allgemein, und ob oder ob nicht etwas ‚schneller‘ als TCP viel von der Art der Anwendung ab.

TCP ist in der Regel so schnell, wie es für eine zuverlässige Übertragung von Daten von einem Host zum anderen bekommt. Allerdings, wenn Ihre Anwendung eine Menge von kleinen Ausbrüchen von Verkehr tut und dem Warten auf Antworten, kann UDP besser geeignet seine Latenz zu minimieren.

Es gibt eine einfache Mittelweg. Nagle-Algorithmus der Teil des TCP ist, die dazu beiträgt, dass der Absender den Empfänger nicht nicht überwältigen ein großen Datenstrom, was zu einer Überlastung und Paketverlust.

Wenn Sie die zuverlässige benötigen, in Ordnung Lieferung von TCP, und auch die schnelle Reaktion von UDP, und müssen sich nicht um Staus befürchten von großen Datenströme senden, können Sie 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");

Wer entscheidet, dass die obige Liste nicht genug ist, und dass sie wollen ihre eigenen zuverlässige UDP sollte auf jeden Fall einen Blick auf die Google QUIC spec nehmen entwickeln, wie dies viele komplizierte Sonderfälle und mögliche Denial-of-Service-Attacken abdeckt. Ich habe nicht mit einer Implementierung dieses noch gespielt, und Sie können nicht wollen, oder alles, was, die es bietet, aber das Dokument ist lesenswert, bevor sie auf ein neues „zuverlässig“ UDP-Design einsteigen.

Ein guter Startpunkt für QUIC hier , über im Chromium-Blog.

Die aktuelle QUIC Design-Dokument finden Sie hier .

  

Wenn Sie eine Situation, wo eine TCP-Verbindung ist möglicherweise zu langsam und ein ‚Verbindung‘ UDP ist potenziell zu unzuverlässig, was verwenden Sie? Es gibt verschiedene Standard zuverlässige UDP-Protokolle gibt, welche Erfahrungen haben Sie mit ihnen?

Das Schlüsselwort in Ihrem Satz ist ‚potenziell‘. Ich glaube, Sie wirklich brauchen, um zu sich selbst zu beweisen, dass TCP ist in der Tat, zu langsam für Ihre Bedürfnisse, wenn Sie Zuverlässigkeit in Ihrem Protokoll benötigen.

Wenn Sie möchten, Zuverlässigkeit, um aus UDP dann sind Sie im Grunde gehen, um einige der TCP-Funktionen auf UDP Neuimplementierung, die wahrscheinlich langsamer machen Dinge als nur TCP in erster Linie verwendet wird.

Protokoll DCCP, standardisiert in RFC 4340 "Datagram Congestion Control Protocol" kann das, was Sie suchen.

Es scheint, in Linux umgesetzt werden.

Vielleicht RFC 5405 "Unicast UDP Nutzungsrichtlinien für Anwendungsentwickler" wird nützlich für Sie.

Bitte benutzen Sie betrachten Komprimieren Sie Ihre Daten?

Wie bereits erwähnt, fehlen uns Informationen über die genaue Art des Problems, sondern die Daten komprimiert zu transportieren sie helfen könnten.

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

Die beste Art und Weise der Zuverlässigkeit zu erreichen, unter Verwendung von UDP ist, die Zuverlässigkeit in dem Anwendungsprogramm selbst zu bauen (zum Beispiel durch Zugabe von Bestätigungs- und Neuübertragung Mechanismen)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top