TCP oder UDP für ein Multiplayer-Spiel?

17

Das ist eine Frage, die ich oft sehe. Die meisten Leute sagen, UDP sei für Echtzeitspiele immer besser als TCP. Ich verstehe, dass TCP versucht, Pakete immer wieder neu zu senden, bis die andere Seite sie erhält, während UDP das egal ist.

Die meisten Dinge, die ich gelesen habe, sind, dass UDP ein Muss für jedes Echtzeitspiel ist und TCP schrecklich ist. Aber die Sache ist, die meisten Leute scheinen sowieso irgendeine Form von TCP auf UDP zu implementieren. Und ich habe auch gehört, dass der Unterschied zwischen den beiden vernachlässigbar ist, da wir nicht mehr in den 80ern sind und das Internet jetzt ziemlich schnell und zuverlässig ist.

Ist mein allgemeines Verständnis hier falsch? Kann das jemand für mich klären?

Flooblebit
quelle
7
internet is now pretty fast and reliableNein, ist es nicht. Die Bandbreite hat sich zwar dramatisch erhöht, aber die Latenz ist immer noch recht hoch. Bei reinem TCP muss die Server-Tick-Zeit länger als die maximal erschwingliche Latenz sein, es sei denn, Sie führen Paket-Squishing durch - am besten auf dem Client über UDP. Das Problem ist, dass einige Informationen in einem Spiel zuverlässig sein müssen, während andere schnell sein müssen. Benutzerdefinierte Protokolle auf UDP ermöglichen dies ebenso wie eine Reihe von proprietären Protokollen, die Ihnen alles bieten, was Sie in einem netten Paket benötigen.
Ordous
4
Sie implementieren TCP über UDP nicht genau. Es gibt einige Funktionen, die TCP bietet, die wünschenswert sind und die zusätzlich zu UDP implementiert werden. Ein wichtiger Punkt bei der Verwendung von UDP ist, dass Sie nicht warten müssen, bis der Client das erste Paket tatsächlich empfängt , wenn Sie ein Paket senden, das den Weltstatus zu einem Zeitpunkt enthält t0, der nie empfangen t1wurde. das ist schon veraltet.
Vincent Savard
@Ordous Ich denke, dies beantwortet meine Frage :) Danke
flooblebit
4
Beachten Sie auch, dass UDP anfällig für IP-Spoofing ist, wodurch Ihr Server für DDoS-Angriffe offen sein kann, wenn dies ein Problem darstellt. Sie könnten dies vermeiden, indem Sie eine TCP-Verbindung "steuern", die die IP-Adresse des Clients und andere Details an den Server sendet, der dann UDP-Pakete von der "authentifizierten" Adresse akzeptiert. Außerdem müssen Sie möglicherweise Ihre eigene Verschlüsselungsschicht implementieren, da es für diese über UDP keine offenen Standards gibt.
ARau
@ Blownie55 gute Punkte gibt
Naresh Kumar

Antworten:

12

Hängt davon ab, ob es sich um Peer-to-Peer, Client / Server mit den Benutzern handelt, die den Server ausführen, oder Client / Server mit einem Rechenzentrum, in dem der Server ausgeführt wird. Nur im letzteren Fall ist das Internet wirklich schnell und zuverlässig. Es ist nicht garantiert, dass die Computer Ihrer Benutzer schnell sind, und sie sind auch nicht zuverlässig.

Mit UDP können Sie die Art der TCP-ähnlichen Implementierung besser steuern. Dies gibt Ihnen mehr Flexibilität bei der Ausführung von Paketen außerhalb der angegebenen Reihenfolge. Verwerfen Sie Pakete, die Sie für unnötig halten, und wiederholen Sie Pakete, die Sie für wichtig halten. Dies sollte jedoch nur erfolgen, wenn dies erforderlich ist und Sie über das erforderliche Fachwissen verfügen.

Wenn Sie auf diese Flexibilität verzichten können, funktioniert TCP gut genug und spart Ihnen viel Zeit. Sogar professionelle Studios (wie eines, bei dem ich gearbeitet habe) verwenden TCP, wenn sie UDP nicht unbedingt benötigen, und sie haben Leute, die sich der Netzwerkprogrammierung widmen .

Kevin Fee
quelle
Ich würde auch vorschlagen, dass "für was" wichtig ist - zB für ein In-Game-Chat-System würde ich UDP nicht einmal in Betracht ziehen. Die andere Sache, die ich (zumindest für "Client-Server") in Betracht ziehen würde, ist, wie effizient Server den Datenverkehr verarbeiten können - moderne NICs verfügen über eine Menge integrierter "Offloading" -Stoffe für TCP (Aufteilen und Zusammenführen von Paketen, Sortieren von Paketen in Streams, etc), die entwickelt wurden, um den CPU-Overhead zu reduzieren, und die meisten davon funktionieren nicht für UDP.
Brendan
1
Die Dinge können sich jetzt ändern, da QUIC ( en.wikipedia.org/wiki/QUIC ) Teil von HTTP / 3 ist, das UDP verwendet und standardmäßig mit TLS verschlüsselt ist. Es wird einige Zeit dauern, bis dies allgemein verfügbar ist, und es ist etwas, worauf man sich freuen kann. Weitere Details zu einigen Problemen, die behandelt werden müssen, finden Sie hier blog.cloudflare.com/the-road-to-quic
ARau
3

Es wäre eine Vermutung, zu sagen, "Internet ist jetzt ziemlich schnell und zuverlässig", wie @Ordous betonte, und eine gefährliche auch.

Der Grund, warum das benutzerdefinierte UDP + -Protokoll für übermittlungskritische Pakete bei den meisten Spielen magisch ist, besteht darin, dass es manchmal "in Ordnung" sein kann, wenn Sie ein Paket verlieren (nur für z. B. sekundäre unkritische Ereignisse, um das Spiel zu beenden). Es gibt auch Zeiten, in denen es "überhaupt nicht in Ordnung" ist, Daten für z. B. Cursorbewegung usw. zu verlieren. (Ich mache keine Spieleentwicklung, um meine vagen Beispiele zu verzeihen.)

Standardmäßig verschwendet UDP keine Zeit damit, sie immer wieder zu pushen.

Übrigens scheinen viele Spiele das "Okay, manchmal zu verlieren" -Paket mehr zu haben als "immer ohne Fehler liefern zu müssen" -Pakete. Damit machen Sie sich auf natürliche Weise fit für diese Aufgabe.

Alles, was für UDP benötigt wurde, war die Verwendung eines benutzerdefinierten Protokolls, das nur dazu beiträgt, dass die "Immer ohne Fehler zu liefern" -Pakete ordnungsgemäß zugestellt werden müssen, und die restlichen Spieldaten der Gnade der Netzwerkverbindung überlässt.

Wenn Sie jetzt entscheiden, welche Art von Verkehr die meisten Ihrer zu übertragenden Daten ausmacht, können Sie eine bessere Entscheidung treffen.

Der Punkt gegen TCP wäre, dass die für Wiederholungsversuche aufgewendete Zeit eher für das Senden von Paketen verwendet werden könnte, die JETZT von Bedeutung sind.

Es besteht auch die Möglichkeit, dass TCP bei Problemen während der Übertragung zu einem heruntergekommenen Gameplay-Szenario für den Benutzer führt, das seine Erfahrung im Vergleich zu UDP + Custom Stack beeinträchtigt dies an andere Experten hier, um dies zu kommentieren. Würde gerne mehr über die Möglichkeiten dieses Szenarios erfahren).

Naresh Kumar
quelle