Tcp Zuverlässigkeit im Vergleich zu Udp Burdens für seriöse, leistungsstarke Server

8

Geschwindigkeit, Optimierung und Skalierbarkeit sind die typischen Vergleiche zwischen den Protokollen Udp und Tcp. Tcp bietet Zuverlässigkeit mit dem Nachteil eines kleinen zusätzlichen Aufwands, aber die Geschwindigkeit ist gut bis ausgezeichnet. Sobald ein Tcp-Socket instanziiert wird, erfordert das Öffnen des Sockets einige Overhead. Aber im Vergleich zu den oft beschriebenen Belastungen von Udp, welches Protokoll hat eigentlich mehr Overhead ?. Ich habe auch gehört, dass es Probleme mit der Skalierbarkeit von Tcp gibt ... aber das Internet (Webseiten / Server) läuft auf Tcp - was hemmt also die Skalierbarkeit von Tcp?

Okay ... Udp benötigt also keinen Overhead, um eine Verbindung offen zu halten. Aber es erfordert, dass Sie zusätzliche Methoden schreiben, um sicherzustellen, dass alle Pakete dorthin gelangen, hoffentlich in der Reihenfolge, in der sie empfangen werden sollen. Wenn ein Paket nicht vollständig empfangen wird, müssen Sie dem Client oder Server mitteilen, dass er erneut senden soll. Außerdem müssen Sie eine Art Nachrichtensammlung für Teilpakete aufbewahren, die Teilnachrichten neu erstellen und nach einer vollständigen Nachricht suchen, bevor die Nachricht schließlich verarbeitet werden kann. Ganz zu schweigen davon, wenn der zweite Teil einer Nachricht es nie schafft, müssen Sie entweder sagen, dass Sie die gesamte Sache erneut senden oder den Teil, den wir verpassen, oder was auch immer, erneut senden.

Grundsätzlich sind meine Fragen:

  1. Warum sollte ich Udp über Tcp für einen seriösen, leistungsstarken Server mit dem zusätzlichen "Overhead" der Nachricht wählen? Überprüfung und manuelle ACK gegen den "Overhead" eines kontinuierlichen Streams?
  2. Wenn Tcp für World of Warcraft gut genug ist, warum wird Tcp nicht mehr allgemein als das Protokoll für einen Spieleserver akzeptiert?

Hinweis: Ich bin nicht dagegen, Udp-Optionen für einen Server zu implementieren. Wir verwenden C # auf .NET 3.5-Framework. Daher wäre ich auch an den Best Practices für den Umgang mit Udp Belastungen interessiert. Ich verwende auch die asynchronen Methoden auf der Ebene socket , anstatt TcpListener, TcpClient usw. zu verwenden.

    
IAbstract 01.03.2010, 05:40
quelle

5 Antworten

11

Nun, ich würde empfehlen, mehr zu lesen. Es gibt viele Orte, um die Pro und Con zu sehen von TCP vs. UDP und umgekehrt, hier sind ein paar:

Dieser Link mag Sie aber am meisten interessieren, da es direkt um die vernetzte Spieleprogrammierung geht:

Wenn ich etwas Kleines zitieren würde:

  

Die Entscheidung scheint dann ziemlich klar zu sein,   TCP macht alles was wir wollen und es   super einfach zu bedienen, während UDP ist ein großer   Schmerz in den Arsch und wir müssen programmieren   alles von Grund auf neu. Damit   offensichtlich benutzen wir nur TCP richtig?

     

Falsch.

     

Mit TCP ist das schlimmste möglich   Fehler, den Sie bei der Entwicklung eines machen können   vernetztes Spiel! Um zu verstehen, warum, du   muss sehen, was TCP eigentlich macht   über IP, damit alles so aussieht   einfach!

Ich empfehle Ihnen dennoch, Ihre eigenen Nachforschungen zu diesem Thema anzustellen und sicherzustellen, welches Protokoll am Ende des Tages für Ihre Bedürfnisse geeignet ist. Allerdings scheint es so zu sein, dass die meisten Spiele UDP für ihre Daten verwenden. Alles, was den gesamten Status kontinuierlich aktualisiert, benötigt nicht den Overhead der garantierten Paketzustellung.

    
Kyle Rozendo 01.03.2010, 05:44
quelle
7

Zuerst werde ich nur Stevens von Unix Network Programming Abschnitt 22.4 "Wann UDP anstelle von TCP zu verwenden ist" umschreiben:

Er sagt im Wesentlichen Folgendes:

  1. UDP ist die einzige Option für Broadcast / Multicast - also müssen Sie sie dort verwenden.
  2. UDP kann für einfache Anfrage- / Antwort-Apps verwendet werden. Aber Sie müssen Ihre eigene Fehlererkennung hinzufügen, die mindestens acks, timeouts und retransmission bedeutet.
  3. UDP sollte nicht für die Massenübertragung von Daten (Dateiübertragungen) verwendet werden, da Sie alle Funktionen in TCP einbauen müssen, damit es richtig funktioniert.
  4. UDP sollte für Echtzeitdaten verwendet werden, bei denen die Geschwindigkeit der Zustellung am wichtigsten ist und einige Datenverluste kein Problem darstellen, wie Echtzeitsensordaten, Live-Multimediaströme, Echtzeit-Aktienkurse usw .

Die Antwort auf Ihre erste Frage hängt sehr von Ihrer Definition von "High-Performance" ab. Wenn es primär darum geht, ist eine geringe Latenz, d. H. Die individuellen Datenpakete / Anforderungen, die so schnell wie möglich ankommen, als UDP, wären der Weg zu gehen. Dafür gibt es zwei Hauptgründe. Unter der Annahme, dass Pakete / Anfragen ziemlich unabhängig voneinander sind, würde die Verwendung von TCP ein Problem mit sich bringen, das als Blockierung der Kopfzeile .

Nehmen wir an, Sie senden zwei unabhängige Pakete / Anfragen. Zuerst A, dann B. Da TCP streambasiert ist, kann, wenn A im Netzwerk verloren geht und erneut übertragen werden muss, selbst wenn B bereits erfolgreich angekommen ist, es nicht durch den Stapel an die Anwendung geliefert werden, bis A ankommt, was unnötige Latenz verursacht . Nicht nur das, sondern bis A ankommt, B kann vom Stack nicht bestätigt werden, was dazu führen könnte, dass B auch erneut übertragen wird, was unnötige Netzwerküberlastung verursacht.

Eine Möglichkeit, dieses Problem zu umgehen, besteht darin, für jede Anfrage separate Verbindungen zu verwenden. Dies führt jedoch auch zu einer Latenz der Systemressourcen und . UDP umgeht all diese Probleme.

Ein weiteres Problem bei Servern mit hoher Latenz (niedriger Latenz) ist der Nagle-Algorithmus , der zu einer erheblichen Latenz in TCP führen kann Kommunikation.

Die Antwort auf Ihre zweite Frage ist, dass WoW wahrscheinlich Datenströme sendet, nicht unabhängige Anfrage / Antwort-Paare. Außerdem kann ein Teil der Latenz von TCP durch Deaktivieren des Nagle-Algorithmus entfernt werden. Wenn sie eine Anfrage / Antwort-Kommunikation verwenden, haben sie möglicherweise einfach eine Designentscheidung getroffen, dass Zuverlässigkeit für sie wichtiger ist als Latenz.

    
Robert S. Barnes 02.03.2010 11:00
quelle
4

Definiere "Serious High Performance" - wie viele gleichzeitige Verbindungen sprichst du und wie viele Daten fließen?

Sehen Sie sich die Antworten auf diese Frage an What do Sie verwenden, wenn Sie zuverlässige UDP benötigen? , die einige der zuverlässigen Protokolle auflisten, die bereits auf UDP erstellt wurden. Vielleicht finden Sie eine, die für Ihre Situation funktioniert, oder Sie finden zumindest einige nützliche Ideen.

Der Schlüssel zur effektiven Verwendung von UDP besteht darin, ein gewisses Maß an Zuverlässigkeit und ein gewisses Maß an Unzuverlässigkeit zu haben, und Sie erhalten einen größeren Vorteil, je mehr Datagramme unabhängig von anderen gehandhabt werden können. Der Vorteil gegenüber TCP besteht darin, dass Sie auf jedes Datagramm reagieren und entscheiden müssen, ob Sie es so verwenden können, wie es ankommt. Deshalb funktioniert es für Action-Spiele.

Also, IMHO, wenn Sie 100% Zuverlässigkeit brauchen UND in der Reihenfolge Lieferung dann mit TCP gehen; Versuchen Sie nicht, TCP in UDP neu zu implementieren.

    
Len Holgate 01.03.2010 10:04
quelle
1

Ich denke, der größte Teil von TCP / IP, der die Skalierbarkeit verhindert, ist, dass es einen Puffer für alle eingehenden / ausgehenden Verbindungen bis zur Größe des Fensters beibehält. Wenn ich also einen Client mit hoher Latenz, aber hohem Durchsatz habe, muss ich alle gesendeten Pakete im Puffer behalten, bis ich eine Bestätigung erhalte. Für einige Verbindungen ist das in Ordnung, aber für die Verarbeitung von 100K-Verbindungen kann es zu einem problematischen Overhead kommen. Wenn auf der Empfängerseite ein Paket gelöscht wird, puffert es erneut alle empfangenen neuen Pakete, bis das erforderliche Paket erneut übertragen wird.

Wenn Sie eine erneute Übertragung implementieren möchten, müssen Sie dasselbe tun und haben daher denselben Overhead. UDP bietet Ihnen jedoch einen Vorteil, wenn Sie die End-to-End-Verbindungsgeschwindigkeiten kennen oder wenn bestimmte Nachrichten außerhalb der Reihenfolge gesendet werden können oder bestimmte Nachrichten nicht erneut übertragen werden müssen. Das Spielszenario beibehalten:

Paket 1 = gehe zu 1,1 Paket 2 = schießen Paket 3 = gehe zu 2,2

Die meisten Spieleentwickler, wenn Paket 1 verloren ist, aber Paket 3 empfangen wird, ist Paket 1 nicht mehr wichtig, weil es sowieso veraltete Informationen enthält. Sie können jedoch auch entscheiden, dass Paket 2 wichtig ist. Wenn es nicht bestätigt ist, senden Sie eine erneute Übertragung.

Wenn Sie einen hohen Datendurchsatz benötigen und zwei Server direkt mit 1000Mbps Ethernet verbinden, benötigt TCP / IP eine gewisse Zeit für die Skalierung und zusätzlichen Overhead und wird wahrscheinlich niemals eine echte Gigabit-Verbindung aufgrund der Überlastungsvermeidungsmechanismen erreichen. Sie wissen jedoch, dass es 1 GBit / s ist. Sie können also festlegen, dass Ihr UDP selbst bis zu 1 GBit / s (abzüglich Overhead) überträgt.

Um zu antworten, sind Ihre Fragen direkter: Wenn Sie trotzdem jedes Paket quittieren, gibt es keinen großen Vorteil für UDP, außer dass Sie einige Nachrichten verarbeiten können, während Sie auf eine erneute Übertragung warten (es sei denn, Sie möchten auch eine In-Order-Zustellung).

Udp wird für Spiele-Server nicht so oft in Betracht gezogen, hauptsächlich außerhalb des obigen Szenarios, und Echtzeit-Kampfsysteme wie Ego-Shooter, bei denen eine Nachricht gelöscht werden kann und die neue Nachricht die abgelegte Nachricht ungültig macht Sowieso. World of Warcraft kann mit TCP auskommen, da sie nicht so genau mit dem Timing sein müssen und wahrscheinlich eine gute Logik haben, die es für Sie schwieriger macht, den Unterschied zu erkennen. Das Kampfsystem benötigt einfach nicht die Geschwindigkeit.

Ich behaupte auch, dass ein Teil der Rechtfertigung aus den Jahren her stammt, als alle weniger zuverlässige und langsamere Internetverbindungen hatten. TCP ist auch milder für die Freigabe des Netzwerks. Wenn also viel los ist, wird es langsamer, so dass jeder einen Teil der Verbindung erhält (Stauvermeidung).

TCP / IP ist ein Protokoll, das von Leuten entworfen wurde, die weit mehr als ich seit Jahren in der Forschung sind. Die Optimierung in den letzten Jahren hat es ermöglicht, mit den schnelleren und schnelleren durchschnittlichen Netzwerkgeschwindigkeiten, die wir sehen, besser zu funktionieren, und erfordert kein großes Verständnis für die Verwendung.

Um dies jedoch durch UDP zu ersetzen, ist ein umfassendes Netzwerkverständnis erforderlich. Ich habe schlecht geschriebene UDP-Programme gesehen, die 1 Gbps-Verbindungen sättigen und den gesamten Verkehr auf der Verbindung beenden, weil sie einen ziemlich naiven Neuübertragungsalgorithmus implementiert haben.

Hier ist eine Liste von Dingen, die TCP / IP jetzt tun kann, die Sie verlieren würden, indem Sie UDP gehen: - In der Reihenfolge der Ankunft für Sie Programm - Neuübertragung (Jetzt mit schneller Neuübertragung, selektiver Bestätigung und anderen Funktionen) - Maximale Segmentgröße - Pfad MTU-Erkennung - Black Hole Detection (Erweiterung von Path MTU) - Stauvermeidung

Aus diesem Grund würde ich Ihnen wärmstens empfehlen, bei TCP / IP zu bleiben, wenn es Ihren Anforderungen entspricht.

Auch nicht zu picken, aber Sie sind Kommentar über das Internet auf TCP / IP läuft falsch ist, gibt es in der Tat Dutzende von Internet-Routing-Protokolle überprüfen Sie sie hier . Ich denke, Sie haben sich auf Webseiten bezogen und Webserver laufen alle auf TCP / IP. Was wiederum für das Web toll ist, wo uns Menschen keine Verzögerung auffallen werden, solange die Seite richtig angezeigt wird. Selbst für TCP / IP ist es eine Herausforderung, dass TCP / IP für das Web nicht aggressiv genug ist: Google denkt, dass tcp / ip standardmäßig aggressiver sein sollte

    
Kevin Nisbet 01.03.2010 06:38
quelle
1

Es ist Zuverlässigkeit gegenüber Leistung.

FPS-Spiele erfordern nicht, dass die Pakete das Ziel erreichen, um es in der Reihenfolge zu erreichen, außergewöhnlich groß zu sein oder einen großen Durchsatz sicherzustellen. Sie benötigen nur die Pakete, um den Server so bald wie möglich zu erreichen. Dies ist die ultimative Priorität und der Overhead von TCP ist einfach eine unnötige Last.

WoW, in seiner "nicht ganz in Echtzeit" -Kommunikation und oft Tonnen von Daten zu übertragen (in überfüllten Gebieten), muss mit Paketen über MTU (erfordert Fragmentierung) und erfordert Zuverlässigkeit (weniger größere Pakete = Paket verloren mehr weh zu tun ). Daher ist die Wahl von TCP logisch. Das Gleiche gilt für die meisten rundenbasierten Strategiespiele und ähnliches. In Spielen, wo der Spieler mit Ping von 30ms den Spieler mit Ping 50ms schlägt, ist UDP der König.

    
SF. 02.03.2010 11:27
quelle

Tags und Links