Frage

Für den allgemeinen Protokollnachrichtenaustausch, der einen gewissen Paketverlust tolerieren kann.Wie viel effizienter ist UDP gegenüber TCP?

War es hilfreich?

Lösung

UDP ist schneller als TCP, und der einfache Grund liegt darin, dass es kein Acknowledge Packet (ACK) gibt, das einen kontinuierlichen Paketstrom ermöglicht, im Gegensatz zu TCP, das eine Reihe von Paketen bestätigt, die anhand der TCP-Fenstergröße und der Umlaufzeit (RTT) berechnet werden ).

Für weitere Informationen empfehle ich die einfache, aber sehr verständliche Skullbox-Erklärung (TCP vs.UDP)

Andere Tipps

Man sagt, dass TCP vor allem Zuverlässigkeit bietet.Aber das stimmt nicht wirklich.Das Wichtigste, was TCP Ihnen bietet, ist die Überlastungskontrolle:Sie können 100 TCP-Verbindungen über eine DSL-Verbindung mit maximaler Geschwindigkeit betreiben, und alle 100 Verbindungen sind produktiv, da sie alle die verfügbare Bandbreite „erkennen“.Probieren Sie das mit 100 verschiedenen UDP-Anwendungen aus, die alle Pakete so schnell wie möglich weiterleiten, und sehen Sie, wie gut die Dinge für Sie funktionieren.

Im Großen und Ganzen ist es dieses TCP-Verhalten, das verhindert, dass das Internet in einen „Überlastungskollaps“ gerät.

Dinge, die dazu neigen, Anwendungen in Richtung UDP zu drängen:

  • Semantik der Gruppenzustellung:Es ist möglich, eine zuverlässige Zustellung an eine Gruppe von Personen viel effizienter durchzuführen als mit der Punkt-zu-Punkt-Bestätigung von TCP.

  • Lieferung außerhalb der Bestellung:In vielen Anwendungen ist es Ihnen egal, in welcher Reihenfolge sie eintreffen, solange Sie alle Daten erhalten.Sie können die Latenz auf App-Ebene reduzieren, indem Sie einen Out-of-Order-Block akzeptieren.

  • Unfreundlichkeit:Auf einer LAN-Party ist es Ihnen möglicherweise egal, ob Ihr Webbrowser gut funktioniert, solange Sie Updates so schnell wie möglich in das Netzwerk übertragen.

Aber selbst wenn Ihnen die Leistung am Herzen liegt, möchten Sie sich wahrscheinlich nicht für UDP entscheiden:

  • Sie sind jetzt auf der Suche nach Zuverlässigkeit, und viele Dinge, die Sie tun, um Zuverlässigkeit zu implementieren, können am Ende langsamer sein als das, was TCP ohnehin schon tut.

  • Jetzt sind Sie netzwerkunfreundlich, was in gemeinsam genutzten Umgebungen zu Problemen führen kann.

  • Am wichtigsten ist, dass Firewalls Sie blockieren.

Sie können möglicherweise einige TCP-Leistungs- und Latenzprobleme überwinden, indem Sie mehrere TCP-Verbindungen zusammen „bündeln“.iSCSI tut dies, um die Überlastungskontrolle in lokalen Netzwerken zu umgehen, Sie können es aber auch tun, um einen „dringenden“ Nachrichtenkanal mit geringer Latenz zu erstellen (das „URGENT“-Verhalten von TCP ist völlig fehlerhaft).

In einigen Anwendungen ist TCP schneller (besserer Durchsatz) als UDP.

Dies ist der Fall, wenn im Verhältnis zur MTU-Größe viele kleine Schreibvorgänge ausgeführt werden.Ich habe zum Beispiel ein Experiment gelesen, bei dem ein Strom von 300-Byte-Paketen über Ethernet gesendet wurde (1500-Byte-MTU) und TCP war 50 % schneller als UDP.

Der Grund dafür ist, dass TCP versucht, die Daten zu puffern und ein vollständiges Netzwerksegment zu füllen, wodurch die verfügbare Bandbreite effizienter genutzt wird.

UDP hingegen leitet das Paket sofort auf die Leitung und überlastet so das Netzwerk mit vielen kleinen Paketen.

Sie sollten UDP wahrscheinlich nicht verwenden, es sei denn, Sie haben einen ganz bestimmten Grund dafür.Vor allem, da Sie TCP die gleiche Latenz wie UDP geben können, indem Sie das deaktivieren Nagle-Algorithmus (z. B. wenn Sie Echtzeit-Sensordaten übertragen und keine Angst haben, das Netzwerk mit vielen kleinen Paketen zu überlasten).

mit Verlusttoleranz

Meinen Sie „mit Verlusttoleranz“?

Grundsätzlich ist UDP nicht „verlusttolerant“.Sie können 100 Pakete an jemanden senden, und dieser erhält möglicherweise nur 95 dieser Pakete, und einige sind möglicherweise in der falschen Reihenfolge.

Für Dinge wie Video-Streaming und Multiplayer-Spiele, bei denen es besser ist, ein Paket zu verpassen, als alle anderen Pakete dahinter zu verzögern, ist dies die offensichtliche Wahl

Für die meisten anderen Dinge ist jedoch ein fehlendes oder „neu angeordnetes“ Paket von entscheidender Bedeutung.Sie müssten zusätzlichen Code schreiben, der auf UDP ausgeführt wird, um es erneut zu versuchen, wenn Dinge übersehen wurden, und um die richtige Reihenfolge durchzusetzen.Dies würde an bestimmten Stellen zu einem kleinen Mehraufwand führen.

Zum Glück haben einige sehr, sehr kluge Leute dies getan und es TCP genannt.

Denk darüber so:Wenn ein Paket verloren geht, möchten Sie lieber so schnell wie möglich das nächste Paket abrufen und fortfahren (UDP verwenden), oder benötigen Sie die fehlenden Daten tatsächlich (TCP verwenden)?Der Overhead spielt keine Rolle, es sei denn, Sie befinden sich in einem wirklich Grenzfallszenario.

Welches Protokoll besser abschneidet (im Hinblick auf den Durchsatz) – UDP oder TCP –, hängt wirklich von den Netzwerkeigenschaften und dem Netzwerkverkehr ab.Robert S.Barnes weist beispielsweise auf ein Szenario hin, in dem TCP eine bessere Leistung erbringt (kleine Schreibvorgänge).Stellen Sie sich nun ein Szenario vor, in dem das Netzwerk überlastet ist und sowohl TCP- als auch UDP-Verkehr stattfindet.Absender im Netzwerk, die TCP verwenden, werden die „Überlastung“ erkennen und ihre Senderaten reduzieren.UDP verfügt jedoch nicht über Mechanismen zur Vermeidung von Überlastungen oder zur Überlastungskontrolle, und Absender, die UDP verwenden, würden weiterhin Daten mit der gleichen Geschwindigkeit einpumpen.Allmählich würden TCP-Absender ihre Senderaten auf das Nötigste reduzieren, und wenn UDP-Absender über genügend Daten verfügen, um sie über das Netzwerk zu senden, würden sie den Großteil der verfügbaren Bandbreite beanspruchen.In einem solchen Fall haben UDP-Absender also einen höheren Durchsatz, da sie den größeren Anteil der Netzwerkbandbreite erhalten.Tatsächlich ist dies ein aktives Forschungsthema: Wie kann der TCP-Durchsatz bei Vorhandensein von UDP-Verkehr verbessert werden?Eine mir bekannte Möglichkeit, mit der TCP-Anwendungen den Durchsatz verbessern können, besteht darin, mehrere TCP-Verbindungen zu öffnen.Auch wenn der Durchsatz jeder TCP-Verbindung möglicherweise begrenzt ist, kann die Gesamtsumme des Durchsatzes aller TCP-Verbindungen größer sein als der Durchsatz einer Anwendung, die UDP verwendet.

Jede TCP-Verbindung erfordert einen ersten Handshake, bevor Daten übertragen werden.Außerdem enthält der TCP-Header viel Overhead für verschiedene Signale und die Erkennung der Nachrichtenübermittlung.Für einen Nachrichtenaustausch wird UDP wahrscheinlich ausreichen, wenn eine geringe Fehlerwahrscheinlichkeit akzeptabel ist.Wenn der Empfang überprüft werden muss, ist TCP die beste Option.

@Andrew, Ich bin anderer Meinung.Aufgrund der Leistungsanforderungen ist UDP in manchen Anwendungen die erste Wahl.Ein klassisches Beispiel sind Videokonferenzen.Diese Art von Anwendung reagiert nicht gut auf die TCP-Steuerung.

Ein weiterer zu berücksichtigender Aspekt ist, ob Sie Multicast benötigen.Wenn ja, verwenden Sie UDP.

Wenn man von „was ist schneller“ spricht, gibt es mindestens zwei sehr unterschiedliche Aspekte:Durchsatz und Latenz.

Wenn ich darüber spreche Durchsatz - Die Flusskontrolle von TCP (wie in anderen Antworten erwähnt) ist äußerst wichtig und etwas Vergleichbares über UDP wäre zwar durchaus möglich, aber ein großes Problem (tm).Das Ergebnis: Verwenden Sie UDP, wenn Sie es brauchen Durchsatz, gilt selten als gute Idee (es sei denn, Sie möchten sich einen unfairen Vorteil gegenüber TCP verschaffen).

Wenn jedoch darüber gesprochen wird Latenzen - Das Ganze ist völlig anders.Während sich TCP und UDP ohne Paketverlust äußerst ähnlich verhalten (jegliche Unterschiede, falls vorhanden, sind marginal), ändert sich das gesamte Muster nach dem Verlust des Pakets drastisch.

Nach jedem Paketverlust wartet TCP mindestens 200 ms auf eine erneute Übertragung (1 Sekunde gemäß Absatz 2.4 von RFC6298, aber praktische moderne Implementierungen neigen dazu, die Zeit auf 200 ms zu reduzieren).Darüber hinaus werden bei TCP selbst die Pakete, die den Zielhost erreicht haben, nicht an Ihre App zugestellt, bis das fehlende Paket empfangen wurde (d. h. die gesamte Kommunikation ist um ~200 ms verzögert) – dieser Effekt wird übrigens als Head-of bezeichnet -Line Blocking ist allen zuverlässig geordneten Streams eigen, egal ob TCP oder zuverlässig + geordnetes UDP.Um die Sache noch schlimmer zu machen: Wenn auch das erneut übertragene Paket verloren geht, sprechen wir von einer Verzögerung von ~600 ms (aufgrund des sogenannten exponentiellen Backoffs beträgt die erste erneute Übertragung 200 ms und die zweite 200*2=400 ms).Wenn unser Kanal einen Paketverlust von 1 % aufweist (was nach heutigen Maßstäben nicht schlecht ist) und wir ein Spiel mit 20 Aktualisierungen pro Sekunde haben, treten solche Verzögerungen von 600 ms im Durchschnitt alle 8 Minuten auf.Und da 600 ms mehr als ausreichen, um Sie in einem rasanten Spiel umzubringen, ist das für das Gameplay ziemlich schlecht.Diese Effekte sind genau der Grund, warum Spieleentwickler häufig UDP gegenüber TCP bevorzugen.

Wenn Sie jedoch UDP verwenden, um Latenzen zu reduzieren, ist es wichtig, sich darüber im Klaren zu sein, dass die bloße „Verwendung von UDP“ nicht ausreicht, um eine wesentliche Verbesserung der Latenz zu erzielen. Vielmehr kommt es darauf an, WIE Sie UDP verwenden.Während RUDP-Bibliotheken in der Regel diesen „exponentiellen Backoff“ vermeiden und kürzere Neuübertragungszeiten verwenden, müssen sie, wenn sie als „zuverlässig geordneter“ Stream verwendet werden, immer noch unter Head-of-Line-Blocking leiden (also im Falle eines Doubles). Paketverlust, statt dieser 600 ms erhalten wir etwa 1,5*2*RTT – oder für eine ziemlich gute RTT von 80 ms ist es eine Verzögerung von ~250 ms, was eine Verbesserung darstellt, aber es ist immer noch möglich, es besser zu machen).Auf der anderen Seite, wenn die Techniken verwendet werden, die in besprochen werden http://gafferongames.com/networked-physics/snapshot-compression/ und/oder http://ithare.com/udp-from-mog-perspective/#low-latency-compression ist es möglich, die Head-of-Line-Blockierung vollständig zu eliminieren (also beträgt die Verzögerung bei einem doppelten Paketverlust für ein Spiel mit 20 Updates/Sekunde unabhängig von der RTT 100 ms).

Und als Randbemerkung: Wenn Sie zufällig nur Zugriff auf TCP, aber keinen UDP-Zugriff haben (z. B. im Browser oder wenn sich Ihr Client hinter einer der 6–9 % der hässlichen Firewalls befindet, die UDP blockieren), finden Sie dort scheint Um eine Möglichkeit zu finden, UDP-over-TCP zu implementieren, ohne zu große Latenzen zu verursachen, siehe hier: http://ithare.com/almost-zero-additional-latency-udp-over-tcp/ (Lesen Sie unbedingt auch die Kommentare(!)).

Wenn Sie schnell eine Nachricht über das Netz zwischen zwei IPs senden müssen, die noch nicht einmal gesprochen haben, dann wird ein UDP mindestens dreimal schneller ankommen, normalerweise fünfmal schneller.

UDP ist meiner Erfahrung nach etwas schneller, aber nicht viel.Die Wahl sollte nicht nach der Leistung, sondern nach dem Nachrichteninhalt und den Komprimierungstechniken getroffen werden.

Wenn es sich um ein Protokoll mit Nachricht handelt Austausch, würde ich vorschlagen, dass sich der sehr geringe Leistungseinbruch, den Sie mit TCP erleiden, mehr als lohnt.Sie erhalten eine Verbindung zwischen zwei Endpunkten, die Ihnen alles bietet, was Sie brauchen.Versuchen Sie nicht, Ihr eigenes zuverlässiges Zwei-Wege-Protokoll auf UDP aufzubauen, es sei denn, Sie sind wirklich sehr, sehr sicher, was Sie vorhaben.

Bedenken Sie, dass TCP normalerweise mehrere Nachrichten auf dem Kabel hält.Wenn Sie dies in UDP implementieren möchten, haben Sie eine Menge Arbeit, wenn Sie es zuverlässig tun möchten.Ihre Lösung wird entweder weniger zuverlässig, weniger schnell oder mit einem unglaublichen Arbeitsaufwand verbunden sein.Es gibt gültige Anwendungen von UDP, aber wenn Sie diese Frage stellen, ist dies bei Ihrer Frage wahrscheinlich nicht der Fall.

Ich werde die Dinge nur klarstellen. TCP/UDP Es sind zwei Autos, die auf der Straße fahren.Nehmen wir an, dass Verkehrszeichen und Hindernisse Fehler sind TCP kümmert sich um Verkehrszeichen, respektiert alles um ihn herum.Langsames Fahren, da dem Auto etwas passieren könnte.Während UDP fährt einfach los, Vollgas ohne Rücksicht auf Straßenschilder.Nichts, ein verrückter Fahrer. UDP verfügt über keine Fehlerbehebung. Wenn es ein Hindernis gibt, kollidiert es einfach damit und fährt dann fort.Während TCP Stellt sicher, dass alle Pakete perfekt gesendet und empfangen werden, keine Fehler auftreten, sodass das Auto einfach Hindernisse passiert, ohne zusammenzustoßen.Ich hoffe, dies ist ein gutes Beispiel, damit Sie verstehen, warum UDP wird beim Gaming bevorzugt.Gaming braucht Geschwindigkeit. TCP wird bei Downloads bevorzugt, da die heruntergeladenen Dateien sonst möglicherweise beschädigt sind.

Es wurden einige Anstrengungen unternommen, um dem Programmierer die Vorteile beider Welten zu ermöglichen.

SCTP

Es handelt sich um ein unabhängiges Transportschichtprotokoll, das jedoch als Bibliothek verwendet werden kann, die eine zusätzliche Schicht über UDP bereitstellt.Die Grundeinheit der Kommunikation ist eine Nachricht (abgebildet auf ein oder mehrere UDP-Pakete).Es ist eine Staukontrolle eingebaut.Das Protokoll verfügt über Knöpfe und Drehknöpfe zum Einschalten

  • in der Reihenfolge der Zustellung von Nachrichten
  • Automatische Neuübertragung verlorener Nachrichten mit benutzerdefinierten Parametern

wenn dies für Ihre spezielle Anwendung erforderlich ist.

Ein Problem dabei ist, dass der Verbindungsaufbau ein komplizierter (und daher langsamer) Prozess ist.

Andere ähnliche Sachen

Eine weitere ähnliche proprietäre experimentelle Sache

Dadurch wird auch versucht, den Triple-Way-Handshake von TCP zu verbessern und die Überlastungskontrolle zu ändern, um schnellere Leitungen besser bewältigen zu können.

Es ist sinnlos, über TCP oder UDP zu sprechen, ohne den Netzwerkzustand zu berücksichtigen.Wenn das Netzwerk zwischen den beiden Punkten eine sehr hohe Qualität aufweist, ist UDP absolut schneller als TCP, aber in anderen Fällen, beispielsweise im GPRS-Netzwerk, ist TCP möglicherweise schneller und zuverlässiger als UDP.

Der Netzwerkaufbau ist für jede Messung von entscheidender Bedeutung.Es macht einen großen Unterschied, ob Sie über Sockets auf Ihrem lokalen Rechner oder mit dem anderen Ende der Welt kommunizieren.

Drei Dinge möchte ich der Diskussion hinzufügen:

  1. Sie können finden Hier ein sehr guter Artikel über TCP vs.UDP in der Kontext der Spieleentwicklung.
  2. Zusätzlich, iperf (jperf iperf mit einer GUI erweitern) ist ein Sehr schönes Tool, um Ihre Frage selbst durch Messen zu beantworten.
  3. Ich habe einen Benchmark in Python implementiert (siehe diese SO-Frage).Im Durchschnitt von 10^6 Iterationen beträgt der Unterschied beim Senden von 8 Bytes etwa 1–2 Mikrosekunden für UDP.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top