Nein, UDP ist in Bezug auf die Leistungslatenz immer noch überlegen und wird aufgrund der Philosophie der beiden Protokolle immer schneller sein - vorausgesetzt, Ihre Kommunikationsdaten wurden mit Blick auf UDP oder eine andere verlustbehaftete Kommunikation entwickelt.
TCP erstellt eine Abstraktion, in der alle Netzwerkpakete in der genauen Reihenfolge ankommen, in der sie gesendet wurden. Um eine solche Abstraktion auf einem verlustbehafteten Kanal zu implementieren, müssen Neuübertragungen und Zeitüberschreitungen implementiert werden, die Zeit verbrauchen. Wenn Sie zwei Updates über TCP senden und ein Paket des ersten Updates verloren geht, wird das zweite Update erst angezeigt, wenn:
- Der Verlust des ersten Updates wird erkannt.
- Eine erneute Übertragung des ersten Updates wird angefordert.
- Die erneute Übertragung ist eingetroffen und wurde verarbeitet.
Es spielt keine Rolle, wie schnell dies in TCP geschieht, denn bei UDP verwerfen Sie einfach das erste Update und verwenden das zweite, aktuellere. Im Gegensatz zu TCP garantiert UDP nicht, dass alle Pakete ankommen, und es garantiert nicht, dass sie in der richtigen Reihenfolge ankommen.
Dazu müssen Sie die richtigen Daten senden und Ihre Kommunikation so gestalten, dass ein Datenverlust akzeptabel ist.
Wenn Sie Daten haben, bei denen jedes Paket ankommen muss und die Pakete von Ihrem Spiel in der Reihenfolge verarbeitet werden müssen, in der sie gesendet wurden, ist UDP nicht schneller. In diesem Fall ist die Verwendung von UDP wahrscheinlich langsamer, da Sie TCP rekonstruieren und mithilfe von UDP implementieren. In diesem Fall können Sie auch TCP verwenden.
BEARBEITEN - Hinzufügen einiger zusätzlicher Informationen, um einige der Kommentare aufzunehmen / zu adressieren:
Normalerweise ist die Paketverlustrate bei Ethernet sehr niedrig, aber sie wird viel höher, wenn WiFi beteiligt ist oder wenn der Benutzer einen Upload / Download ausführt. Nehmen wir an, wir haben einen vollkommen gleichmäßigen Paketverlust von 0,01% (einfache Fahrt, keine Hin- und Rückfahrt). Bei einem Ego-Shooter sollten Kunden Aktualisierungen senden, wenn etwas passiert, z. B. wenn der Mauszeiger den Spieler dreht, was ungefähr 20 Mal pro Sekunde geschieht. Sie könnten auch Aktualisierungen pro Frame oder in einem festen Intervall senden, dh 60-120 Aktualisierungen pro Sekunde. Da diese Aktualisierungen zu unterschiedlichen Zeiten gesendet werden, sollten / werden sie in einem Paket pro Aktualisierung gesendet. In einem 16-Spieler-Spiel senden alle 16 Spieler diese 20-120 Pakete pro Sekunde an den Server, was insgesamt 320-1920 Pakete pro Sekunde ergibt. Bei unserer Paketverlustrate von 0,01% gehen wir davon aus, dass alle 5,2-31,25 Sekunden ein Paket verloren geht.
Für jedes Paket, das wir nach dem verlorenen Paket erhalten, senden wir ein DupAck, und nach dem dritten DupAck sendet der Absender das verlorene Paket erneut . Die Zeit, die TCP benötigt, um die erneute Übertragung einzuleiten, beträgt 3 Pakete zuzüglich der Zeit, die das letzte DupAck benötigt, um beim Absender anzukommen. Dann müssen wir warten, bis die erneute Übertragung eintrifft, sodass wir insgesamt 3 Pakete + 1 Roundtrip-Latenz warten. Die Roundtrip-Latenz beträgt in einem lokalen Netzwerk in der Regel 0-1 ms und im Internet 50-200 ms. 3 Pakete treffen normalerweise in 25 ms ein, wenn wir 120 Pakete pro Sekunde senden, und in 150 ms, wenn wir 20 Pakete pro Sekunde senden.
Im Gegensatz dazu erholen wir uns mit UDP von einem verlorenen Paket, sobald wir das nächste Paket erhalten, und verlieren 8,3 ms, wenn wir 120 Pakete pro Sekunde senden, und 50 ms, wenn wir 20 Pakete pro Sekunde senden.
Mit TCP werden die Dinge unübersichtlicher, wenn wir auch Nagle berücksichtigen müssen (wenn der Entwickler das Deaktivieren der Sende-Koaleszenz vergisst oder verzögertes ACK nicht deaktivieren kann ), die Vermeidung von Netzwerkstaus oder wenn der Paketverlust so schlimm ist, dass wir mehrere berücksichtigen müssen Paketverluste (einschließlich verlorener Ack und DupAck). Mit UDP können wir schnelleren Code schreiben, weil es uns einfach egal ist, wie TCP ein guter Netzwerkbürger zu sein.