Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

21.12.2012, 23:57

Server/Client Kommunikation

Hallo alle miteinander,

seit längerem schon denke ich über den Entwurf von Onlinespielen nach, da dieses Gebiet mehr oder weniger aber für mich 'Neuland' ist hätte ich ein paar theoretische Fragen die man mir hier hoffentlich beantworten kann.

Und zwar habe ich an die generelle Server-Software-Architektur nachgedacht;
Um ein Spiel möglichst vielen Spielern gleichzeitig zugänglich zu machen, ohne dabei sehr Kostspielige Root-Server mit mehreren Clustern zu benötigen, dachte ich daran mit einem UDP Protokoll zu arbeiten, mit ausnahme von 'Kritischen' Interaktionen dann TCP.
Jetzt ist die Frage allerdings ob dieses so von mir erdachte Konzept überhaupt funktionieren 'kann'?

Folgendes habe ich mir ungefähr Vorgestellt:

Client meldet sich erstmalig per TCP beim Server
Server 'registriert' die Anmeldung mit allen Notwendigen Daten (reicht IP/Port?) und schliesst die TCP verbindung wieder.
Per Intervall oder Schleife werden nun alle Serverseitigen berechnungen 'VOM SERVER' per UDP zum Client geschickt.
Worauf der Client, wenn sonst keine Interaktion erfolgt, eine Art 'Ping' schickt.
Ausnahmen (Spieler vs Spieler Handel zB.) werden vom Client per TCP zum Server, berechnen/verarbeitet, und zurück geschickt.
Verbindungsdaten werden Serverseitig nach ablauf einer gewissen Zeit (oder erneuter anmeldung) 'entfernt'

Die Frage eigentlich ist. Kann der Server ohne permanente Verbindung (TCP) einfach per UDP daten zu einem PC schicken schicken?
Welche Daten benötige ich konkret?...

Das wären mal so meine groben Gedanken...
Da so keine permanente Verbindung vorhanden ist, sollte das die theoretisch mögliche Anzahl gleichzeitiger Nutzer von ansonsten per TCP (65535?) weitgehend erhöhen?

Gruss,
EP

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

22.12.2012, 02:06

Woher hast du die Info über das TCP Limit (weil das ist für mich neu)? Nachdem was ich so mitbekam sind gemischte Ansätze nie sonderlich erfolgreich gewesen. Ursachen dafür sind z.B. bei limitierter Bandbreite, dass sich unterschiedliche Droslungsverfahren in die Quere kommen wodurch effektiv ein Protokoll mehr oder weniger tot "gesendet" wird.
Bei UDP bekommt man halt quasi nur das allernötigste geliefert, während TCP für den Fall inorder+reliable sehr gut optimiert ist (aber auch beliebte Fallstricke aufweist; z.b. nagle-ack).
Leider gibt es viele Lösungen im Netz welche auf UDP künstlich ein reliable+inorder Protokoll aufpropfen, welche bei weitem nicht so optimiert sind. Für Netzwerkmodelle, die nicht auf inorder und/oder reliable aber minimale delays angewiesen sind, ist dann wiederum UDP schnell erste Wahl.

Lange Rede kurzer Sinn (persönliche erfahrung/meinung):
-finger weg von gemixten ansätzen (kreuz und quer geht oft nicht gut-weiß jeder der das schon auf einer party ausprobiert hat :D )
-falls du inorder+reliable brauchst nimm TCP
-andernfalls nimm eine fertige UDP lib
-oder bringt sehr viel Zeit/ein kleines Heimnetzwerk/gute Nerven mit wenn du dir eine Lösung selbst entwickeln willst
-check das nochmal mit dem Limit für TCP. Ggf meinst du das limit für die non-server Windowsversionen? Das ist prinzipiell keine Limitierung durch TCP sondern durch das OS.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

3

22.12.2012, 02:39

Zitat

Woher hast du die Info über das TCP Limit (weil das ist für mich neu)?
Du hast recht, hab mich da (mitunter aus Mangel an Erfahrung) falsch ausgedrückt. Ich meinte natürlich die Limitierung von Gleichzeitig verbundenen TCP Sockets (so sollte es richtig heissen, oder?)

Zitat

Nachdem was ich so mitbekam sind gemischte Ansätze nie sonderlich erfolgreich gewesen.
Selbiges habe ich zwar auch gelesen, jedoch nicht wirklich verstanden.

Grundsätzlich ist es so das die Daten (grösstenteils) Serverseitig Verarbeitet werden und dann das 'Ergebnis' wieder zum Client gesendet wird. Meiner Idee nach sind es grösstenteils Daten die keine 100%ige 'empfangsquote' benötigen (ich nenn das einfach mal so ^^) wie zB. Monster HP wärend eines Kampfes, oder Positionsdatenabgleich... also was ich damit meine, wenn per UDP da mal ein paket zwischendrin nicht empfangen wird geht damit die Welt nicht unter. Anders aber wiederum sieht es eben bei 'kritischen' Sachen aus. Handel/Quests und ähnliches, daher dachte ich bei solchen sachen dann an TCP da dieses 'sicherer' ist.

2. Gedanke (kam mir vorhin nach meinem Post hier)
Grundsätzlich könnte man ähnlich vorgehen wie oben beschrieben
TCP: Client schickt TCP anfrage, Server nimmt an, Client schickt Aktuelle Daten, Server verarbeitet, Server schickt Ergebnis an Client, Server trennt verbindung.

Abgesehen davon das es sehr wahrscheinlich viel einfacher umzusetzen sein wird, dürfte das der allgemeinen Performance aber nicht gerade zu gute kommen??

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

22.12.2012, 08:54

Das Limit von gleichzeitig verbundenen Sockets wird nur durch die Anzahl offener File-Handles des Betriebssystems oder die Anzahl möglicher Ports beschränkt. Ich glaube kaum, dass das für Dich auch nur annähernd relevant sein dürfte. Zusätzlich ist es total unabhängig von TCP oder UDP. Socket und Handle bleibt Socket und Handle, egal welches Protokoll Du da durch jagst.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

5

22.12.2012, 09:34

Naja bei UDP kann man quasi über nur einen Socket mit beliebig vielen Parteien kommunizieren, während man bei TCP für jede Verbindung ein Socket braucht. So gesehen hat er schon recht, ABER wenn man Serverbetriebsysteme (z.B. eine entsprechende Linuxdist) nutzt, sollte man deren Limits (zumindest in Hinsicht auf die Socketanzahl) eig nie ankratzen.
Prinzipiell ist das Aufbauen einer TCP recht teuer und langsam, weshalb man das für ein Spiel eher vermeiden sollte. Warum i.A. schlechte Erfahrungen mit der Mischung aus TCP und UDP gemacht wird, kann man eig an deinem Beispiel schön nachvollziehen:
Angenommen man hat eine sehr einfache UDP lib (einfach senden und gut ist) und es gibt mehr Daten zu verschicken/empfangen als die Bandbreite hergibt. UDP wird immer direkt alles schicken, während TCP anfängt zu drosseln, sobald Packet rausfliegen => deine kritischen Daten kommen erst später durch, während primär die "unwichtigen" Daten durchkommen.
Außerdem mach dir jetzt noch nicht darüber Gedanken. Erreich erstmal 65k Mitspieler. Dann kannst zu Linux wechseln und die 100-400k Mitspielergrenze knacken und wenn du da erstmal bist, können wir uns auf Alternativensuche machen ;) .
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

22.12.2012, 10:30

TCP baut man aber nicht ständig auf und ab, daher ist das auch für Spiele kein Problem und je nach Typ des Spiels und der Wichtigkeit der Daten auch absolut Gang und Gebe.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

7

22.12.2012, 10:56



TCP baut man aber nicht ständig auf und ab, daher ist das auch für Spiele kein Problem und je nach Typ des Spiels und der Wichtigkeit der Daten auch absolut Gang und Gebe.

In der Regel wird das wohl so gehandhabt, einmal verbunden sollte es eine ausreichende Performance sowie Sicherheit der Übertragung gewährleisten.

Problem bei der Sache sehe ich hierbei allerdings mit der Geschichte der 'Wieviele Sockets/Threads/Verbindungen' kann ich gleichzeitig handlen...

Wo wir bei meiner grundlegenden Frage sind, was kann ich tun um eine theoretische 'Echtzeit-Massen-Multispieler-Server-Architektur' ohne die hardwareseitigen Ressourcen aufzubauen?

Es geht mir hierbei in erster linie erst einmal um das theoretisch grundlegende Verstaendnis einen sehr guten 'Mittelweg' zu finden, nach möglichkeiten nicht erst dann wenn (falls) es zu spaet ist und die nutzerzahlen 'explodieren' (Im schlimmsten Fall sorgen eben viele gleichzeitige Nutzer zu grösseren 'Verzögerungen' (Lags) welche ansonsten aber nicht limitiert sein 'sollte')

Ich denke am einfachsten ist wirklich ein TCP Protokoll (mit gehaltener verbindung), wobei die Anzahl gleichzeitiger nutzung dann aber Hard- und OSS abhängig bis zu einem gewissen Punkt eingeschränkt sein wird...

Reines UDP scheint mir gerade bei 'kritischen' Sachen nicht ganz ohne in der Programmierung (hier muessten dann recht viele Sicherheitsvorkehrungen getroffen werden?!)

Ich hab im laufe der Wochen zwar immer wieder mal viel gelesen, nur ist dieses Thema doch recht komplex und wie so oft gibt es auch hier nicht 'DIE LÖSUNG' sondern scheinbar endlos viele Möglichkeiten derartiges umzusetzen...

Deine Nachricht enthält folgende zensierte Wörter: res(s)ourcen (sehr komisch :P)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

22.12.2012, 11:04

Threads sollten kein Problem darstellen, da Du mit 3 Threads locker *alle* eingehenden Verbindungen, eingehenden Daten und ausgehenden Daten behandeln kannst. Wichtiger als die Netzwerk-Schnittstelle (welche ohnehin seriell die Daten rein holt und nicht parallel) ist die Auswertung dieser Daten in entsprechenden Thread-Pools, weil die abzuarbeitende Logik bei einem MMO-Spiel deutlich heftiger ist als die eigentlichen Socket-Operationen.

Bis Du Dir über sowas ernsthaft Gedanken machen musst, ist noch ein sehr, seeeehr seeeeeeeeeehr langer Weg. Zu hohe Nutzerzahlen sind für 99.99% aller Hobby-Projekte *nicht* das Problem, sondern das Gegenteil.
Sinnvoller als ein Topic hier im Forum ist ohnehin ein Buch. Verschiedene Spiele erfordern auch verschiedene Ansätze. Selten wird dabei auch so verfahren, dass mehr als 5k User überhaupt über die selbe Server-Instanz verbunden sind. Da gibt's Clustering und Server/Realm-Switching und weiß der Geier was nicht alles, das ist ganz ganz fern von Sockets und auf einer viel höheren Problem/Abstraktionsschicht.

Ressourcen schreibt man im Deutschen mit Doppel-S.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (22.12.2012, 11:10)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

22.12.2012, 11:34

Für maximale Performance unter Windows solltest du vermutlich mal einen Blick auf I/O Completion Ports werfen...

Tobiking

1x Rätselkönig

  • Private Nachricht senden

10

22.12.2012, 17:33

Du könntest mal nach dem C10K Problem suchen. Das ist zwar eher auf Webserver bezogen, aber da geht es auch um die Problemstellung von 10k und mehr gleichzeitigen Verbindungen pro Serverinstanz.

Werbeanzeige