Ist es sinnvoll, TCP und UDP gleichzeitig zu verwenden?


10

Nach dem Lesen Ist UDP für datenintensive Echtzeitspiele immer noch besser als TCP? Ich frage mich, ob es sinnvoll ist, TCP und UDP gleichzeitig zu verwenden, aber für verschiedene Zwecke:

  • TCP zum Senden von Informationen, die selten gesendet werden, deren Zuverlässigkeit jedoch garantiert sein sollte.
    Zum Beispiel Punkteaktualisierungen, der Name eines Spielers oder sogar der Ein / Aus-Zustand eines Lichts in der Spielwelt.

  • UDP zur Übertragung von Informationen, die ständig aktualisiert werden und gelegentlich verloren gehen können, da immer neuere Informationen unterwegs sind.
    Wie Position, Drehung usw.

Ist das eine vernünftige Idee? Was sind die möglichen Nachteile?
Gibt es bessere Möglichkeiten, damit umzugehen?


Lesen Sie unbedingt die restlichen Themen auf dieser Site zu udp und tcp. Sie finden einige Details, die sich im Wesentlichen mit Ihren Fragen befassen. Als Hypothese: Ich vermute, dass es Hybridprotokolle über UDP gibt, die versuchen, das Beste aus beiden Welten herauszuholen, dh geringere Latenz, Konfliktstrategie, Lastausgleich und Bereitstellungsgarantien. Suchen Sie wie vorgeschlagen nach verwandten Fragen zum Thema und beschränken Sie Ihre Frage auf etwas, von dem Sie glauben, dass es hier noch nicht angesprochen wurde.
Teodron

@teodron Du brauchst nicht zu ahnen. Wie in meiner Antwort angegeben, ist es eine Tatsache.
Ingenieur

Antworten:


8

Dies führt zu einem Paketverlust für UDP aufgrund von Konflikten zwischen den beiden Protokollen. Denken Sie daran, dass UDP keine garantierte Zustellung ist, während TCP dies ist. Weitere TCP-Pakete werden durchkommen, während UDP leidet - TCP führt zu einem Verlust von UDP- Paketen . Es gab auch die (historische) Idee, dass die Router-Infrastruktur TCP gegenüber UDP bevorzugt, obwohl ich bezweifle, dass dies zu diesem späten Zeitpunkt noch zutrifft.

Ich denke, Sie sind besser dran, wenn Sie eines der verbindungsorientierten UDP-Protokolle finden, das für die Verwendung in Spielen und dergleichen verfügbar ist und Ihnen einige der Vorteile von TCP ohne Nachteile bietet. Es gibt einige davon, normalerweise mit einem Whitepaper, in dem jedes Konzept detailliert beschrieben wird.

Ein Beispiel hierfür ist die Open-Source- Enet-Bibliothek , deren Hauptmerkmal die optionale zuverlässige, ordnungsgemäße Zustellung von Paketen über UDP ist.


1
Könnten Sie eine kurze (sehr kurze) Liste von Optionen / Referenzen für UDP-basierte Transportbibliotheken bereitstellen, um die Antwort etwas "fleischiger" zu gestalten? (vielleicht ENET, RakNet, zeroMQ, UDT?). Nach meinem obigen Kommentar bin ich sicher, dass ich irgendwo auf dieser Site eine Diskussion darüber gesehen habe, aber es könnte sich lohnen, ein Fragment dieser Informationen zu replizieren.
Teodron

1
@Arcane Engineer Was ist, wenn die UDP- und TCP-Sockets an verschiedenen Ports ausgeführt werden?
KaareZ

@KaareZ Sollte überhaupt keinen Unterschied machen. Die durchgeführten Studien (siehe Link in Bearbeitung) wären nicht gültig, wenn es sich lediglich um eine Aufteilung in Ports handeln würde. Letztendlich ist ein Port nur ein Software-Port. Es hat keinen wirklichen Einfluss auf die Netzwerkeigenschaften, worauf es ankommt.
Ingenieur

Was Sie sagen, macht Sinn, aber ich frage mich, ob dies immer noch gilt, wenn nur sehr wenig TCP-Verkehr vorhanden ist. Wenn nur kleine Informationsmengen über TCP übertragen werden, beispielsweise durchschnittlich ein- oder zweimal alle ~ 10 Sekunden, würde sich dies wirklich spürbar auf den UDP-Verkehr auswirken?
Gandalf3

2
Das Papier "TCP induziert UDP-Paketverlust" hat kein Datum. Die jüngsten Referenzen stammen aus dem Jahr 1996. Ab wann ist das Papier? Sind die Schlussfolgerungen noch gültig?
Andreas

4

Hier ist ein Zitat von Sam Jansen aus einem Kommentar auf gafferongames.com :

Als Netzwerkforscher und nicht als Spieleentwickler scheint die Schlussfolgerung, TCP und UDP niemals zusammen zu verwenden, ein wenig stark zu sein. TCP hat nur dann einen Paketverlust, wenn zu viele Daten gesendet werden. in gewisser Weise genau wie die UDP-Daten, die Sie senden. Der Unterschied besteht darin, dass Sie keine direkte Kontrolle über die Rate haben, mit der TCP sendet. Dies ist Ihnen verborgen.

Wenn Sie nur zuverlässige Daten senden müssen und sich keine Gedanken über die erneute Übertragung und Implementierung eines zuverlässigen Protokolls machen möchten und wissen, dass die Rate niedrig ist, treten bei der Verwendung von TCP und UDP keine Probleme auf.

Die Beziehung zwischen den beiden ist eigentlich gar nicht so komplex: TCP erhöht lediglich die Sendegeschwindigkeit (wenn Daten zu senden sind), bis ein Paketverlust auftritt. In diesem Fall wählt es die Übertragungsrate zurück und beginnt dann erneut, die Rate zu erhöhen (dies Zeit langsamer). Wenn die Erhöhung der Rate zu Paketverlusten führt, werden wahrscheinlich auch andere Datenströme getroffen, einschließlich Ihrer UDP-Pakete.

Das Papier Merkmale des UDP-Paketverlusts: Die Auswirkung des TCP-Verkehrs wurde erzielt, indem mehrere TCP-Verbindungen gleichzeitig geöffnet und das Netzwerk mit Daten überflutet wurden. Dies führt zu einer Überlastung, gefolgt von einer globalen Synchronisation , die beide verworfene Pakete verursachen. Offensichtlich wird ein Spieleclient nicht ein Dutzend Verbindungen gleichzeitig öffnen und das Netzwerk mit Daten überfluten, sodass Ihre Ergebnisse unterschiedlich sind.

Zur Beantwortung Ihrer Frage:

Ich frage mich, ob es sinnvoll ist, TCP und UDP gleichzeitig zu verwenden, aber für verschiedene Dinge [...]

Ja, dies ist akzeptabel, vorausgesetzt, Sie halten sich an Ihre Bandbreitengrenzen.

  • TCP zum Senden von Informationen, die selten gesendet werden, deren Zuverlässigkeit jedoch garantiert sein sollte. Zum Beispiel Punkteaktualisierungen, der Name eines Spielers oder sogar der Ein / Aus-Zustand eines Lichts in der Spielwelt.

Wenn Sie sowohl TCP als auch UDP verwenden, sollten Sie immer lieber so viel wie möglich über UDP und so wenig wie möglich über TCP senden.

Nun frage ich Sie Folgendes: Ist es wirklich notwendig, die Punktzahl, den Namen des Spielers und den Zustand eines Lichts über TCP zu senden? Es ist zwar richtig, dass Sie diese Daten irgendwann erhalten müssen, aber ist es wahr, dass Sie diese Daten genau in der richtigen Reihenfolge und genau einmal empfangen müssen?

Wahrscheinlich nicht.

UDP funktioniert in diesen Fällen einwandfrei , und Quake 3 ist ein gutes Beispiel dafür.

Was ist dann ein gutes Beispiel für TCP neben UDP? Denken Sie an die Chatbox eines Spiels. Die Aktualisierungen dieser Chatbox (dh der neuen Textzeilen) müssen sowohl zuverlässig als auch streng in der richtigen Reihenfolge gesendet werden. Somit passt TCP gut.


3

Ist das eine vernünftige Idee?

  • Ja

Was sind die möglichen Nachteile?

  • Paketverlust, mehr Codekomplexität, eine weitere zu verwaltende Verbindung == mehr Wahrscheinlichkeit für Verbindungsabbrüche, Zeitüberschreitungen, Ausnahmen, was auch immer ...

Gibt es bessere Möglichkeiten, damit umzugehen?

  • Verwenden Sie eine vorhandene zuverlässige UDP-Bibliothek. Zwei der beliebtesten sind: Lidgren Network (C #), RakNet (C ++). Aus Erfahrung kann ich sagen, dass Lidgren super einfach zu bedienen, schnell und zuverlässig ist.

1

Es ist eine zusätzliche Ressourcenbeschränkung zu berücksichtigen. Bei den meisten Implementierungen (ich glaube allen, habe aber keine Referenz) von TCP auf dem Server ist die Anzahl der gleichzeitig geöffneten TCP-Verbindungen auf dem Server begrenzt. Dies würde die Anzahl der Spieler begrenzen, die gleichzeitig geöffnet sein können, wenn jeder Spieler eine eigene Verbindung benötigt.

Die Grenzwerte werden durch Einstellungen im Netzwerksystem definiert. Zusätzlich verbraucht jede Verbindung etwas Speicher, der von irgendwo auf dem Server kommen muss.

Eine Lösung besteht darin, eine temporäre TCP-Verbindung nur während der Datenübertragung zu öffnen und sofort zu schließen. Dadurch werden Transaktionen langsamer, und das Öffnen einer TCP-Verbindung ist ein ziemlich "teurer" Prozess. Wie immer geht es darum, von Anfang an ein robustes System zu entwickeln, um ein großes Wachstum zu ermöglichen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.