006
26.07.2009, 02:23 Uhr
0xdeadbeef
Gott (Operator)
|
Wie viel der Overhead ausmacht, hängt davon ab, wie viel pro Paket gesendet wird. Und auch davon, was die Anwendung nachher können soll - wenn du in UDP praktisch TCP-Verbindungen emulieren willst, macht das eher wenig Sinn. Allerdings ist der Paketheader nicht der einzige Overhead, den es zu bedenken gilt (siehe unten).
Der wesentliche Unterschied ist, dass TCP auf Zuverlässigkeit ausgelegt ist, UDP auf Geschwindigkeit.
Bei einer TCP-Verbindung unternehmen beide Seiten einiges, um Datenintegrität sicher zu stellen - zum Beispiel wird jedes Paket bestätigt und erneut gesendet, wenn die Bestätigung nicht schnell genug eintrifft, der Kernel überprüft die Prüfsumme im Header und sortiert die Pakete anhand der Sequenznummer. Das führt zu mehr Rechenarbeit und über unzuverlässige Netze auch zu höheren Latenzzeiten. Wenn jemand zum Beispiel einen kaputten Router hat, kann das deutlich mehr Arbeit bedeuten, allerdings ist auch (ziemlich) sicher gestellt, dass das, was gesendet wird, auch ankommt.
UDP dagegen schickt den Kram stumpf raus, in der Hoffnung, dass er auch ankommt. Das garantiert in kurze Latenzzeiten, nur muss die Anwendung in der Lage sein, mit fehlenden und/oder in falscher Reihenfolge eintreffenden Paketen umzugehen. Das ist vor allem dann sinnvoll, wenn verlustbehaftete Datenübertragung nicht so tragisch und zeitnahe Auswertung essentiell ist (beispielsweise Telefonie oder Radio).
Ich bin jetzt kein Experte, was Spiele angeht, aber meines Wissens benutzen Echtzeit-Internet-Spiele häufig UDP wegen der zeitnahen Auswertung und betreiben üblicherweise eine Art Synchronisation zwischen Server und Client, d.h., der Client rechnet eine bestimmte Zeit für sich selbst und teilt dem Server alle halbe Sekunde oder so mit, was er gemacht hat (und umgekehrt). Gehen Pakete verloren, gibt es Lagging-Effekte. Es liegt dann an der Anwendung, Integrität zwischen Client und Server sicherzustellen.
Was für deinen Use Case angemessen ist, musst du selbst beurteilen - im Wesentlichen solltest du dich fragen, wie der Kram sich verhalten soll, wenn es Netzwerkprobleme gibt. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 26.07.2009 um 02:27 Uhr von 0xdeadbeef editiert. |