Précédent   Forum du club des développeurs et IT Pro > Applications > Développement 2D, 3D et Jeux > Réseau et multijoueurs
Réseau et multijoueurs Forum d'entraide pour le réseau et le multijoueur pour les jeux vidéo
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 19/09/2011, 11h36   #1
Hydrargyrum
Membre du Club
 
Inscription : janvier 2011
Messages : 28
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 28
Points : 40
Points : 40
Par défaut Architecture d'un MMO et serveur d'authentification

Bonjour,

Je programme actuellement un squelette de MMO en C# et j'aurais besoin de conseils pour l'architecture réseau de ma nouvelle version.

Actuellement j'ai un seul exécutable qui fait tout - communication client / déroulement du monde / base de données / physique / etc ... Cependant j'aimerais le rendre "scalable" en le subdivisant en plusieurs exécutables pouvant être distribués sur plusieurs machines :

- Un serveur d'authentification
- Un "Master" serveur qui dispatche les instructions des clients aux serveurs de jeux / centralise les mises à jours des serveurs de jeux vers le client approprié.
- Des serveurs de jeux qui font "tourner le jeux" proprement dit, à raison de un par Région/Monde/Planète/Autres.
- Une base de données centrale unique dans laquelle tout les serveurs de jeux viennent lire / écrire les différents objets (avec probablement un système "Read/Write" Lock pour éviter les conflits)

(Plus ou moins basé sur une interview des créateurs d'EvE et de pas mal d'autres jeux).
Le tout communiquant en TCP avec un format de données binaires (au lieu de messages XML) pour gagner en vitesse.

Mes interrogations portent principalement sur le serveur d'authentification : j'ai déjà un système de gestion de compte avec mot de passe (plus ou moins) sécurisé, mais après ?
a) Le client se reconnecte-t-il directement au Master Serveur, celui-ci ayant été prévenu par le serveur d'authentification d'accepter l'IP Client X.X.X.X ?
b) Le client reste-t-il sur le serveur d'authentification, qui se charge de faire passer les commandes au reste du réseau (auquel cas je me tâte à le fusionner avec le "Master Serveur"), faisant au final office de filtre ?
c) Un autre système ?
d) La réponse d.

Quasiment toutes les architectures que j'ai trouvé sur internet possède un serveur d'authentification, mais impossible de savoir ce que fait ce machin ... (A part authentifier, mais faut bien faire "circuler l'authentification" dans les autres machines à un moment).

Merci de votre aide.
Hydrargyrum est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 01h42   #2
LittleWhite
Responsable 2D/3D/Jeux


 
Avatar de LittleWhite
 
Homme Alexandre Laurent
Ingénieur développement logiciels
Inscription : mai 2008
Messages : 10 428
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Laurent
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : mai 2008
Messages : 10 428
Points : 40 031
Points : 40 031
Bonjour,

C'est une assez bonne question (pour ne pas dire, une bonne tout court).
Pour moi, le serveur d'authentification, doit:
- Servir de plateforme pour se connecter (vérification mot de passe / login)
- Charger les données sur le joueur (lecture DB)
- Servir d'endroit pour que le joueur puisse modifier des infos sur son profil.

Bon, il est vrai que le serveur Maitre pourrait aussi le faire.

Après, la grande question, c'est comment passé un client connecté à partir du serveur d'authentification, au serveur Maitre. Là je ne sais pas trop.
On peut imaginer que le serveur d'authentification, dise, qu'un ID va bientôt arriver au serveur Maitre. Après, le client reçoit une notification comme quoi il peut se connecter.
Encore mieux, le serveur d'authentification passe l'adresse IP du client, afin que ce soit encore plus prudent. Quitte à faire en sorte que le serveur, déclenche la connexion.
__________________
Vous souhaitez participer à la rubrique 2D / 3D / Jeux ? Contactez-moi
La rubrique a aussi un blog !

Ma page sur DVP
Mon Portfolio

Qui connaît l'erreur, connaît la solution.
LittleWhite est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/09/2011, 21h37   #3
Hydrargyrum
Membre du Club
 
Inscription : janvier 2011
Messages : 28
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 28
Points : 40
Points : 40
Donc personne ne sait comment ça marche "pour de vrai" ? Bon tant pis, on va improviser alors.

Sinon, pas bête le coup de faire lancer la connection par le serveur. J'ai une certaine paranoïa envers les attaques DDoS et ça me gênait un peu de devoir laisser le Serveur Maître ouvert sur Internet. Mais si c'est lui qui se connecte au client ça veut dire qu'il peut refuser sans réfléchir toutes les demandes de connections autre que celle de mes machines, j'adore

Hum ... par contre avec juste l'IP ça ne va pas poser problème pour ceux qui se connectent depuis un réseau local ? De ce que je me rappelle (vaguement) de mes cours de réseau, un réseau local avec une connection unique à internet possède une seule "vraie" adresse IP et la machine exacte est codé quelque part dans la trame. Y a un moyen de récupérer ça ? (Enfin, si ça se passe bien comme ça).
Hydrargyrum est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 21h56   #4
LittleWhite
Responsable 2D/3D/Jeux


 
Avatar de LittleWhite
 
Homme Alexandre Laurent
Ingénieur développement logiciels
Inscription : mai 2008
Messages : 10 428
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Laurent
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : mai 2008
Messages : 10 428
Points : 40 031
Points : 40 031
Citation:
Envoyé par Hydrargyrum Voir le message
Donc personne ne sait comment ça marche "pour de vrai" ? Bon tant pis, on va improviser alors.
Avez vous chercher sur Google Scholar, ou les docs de programmeur de Jeux Vidéo (même pro).

Citation:
Hum ... par contre avec juste l'IP ça ne va pas poser problème pour ceux qui se connectent depuis un réseau local ? De ce que je me rappelle (vaguement) de mes cours de réseau, un réseau local avec une connection unique à internet possède une seule "vraie" adresse IP et la machine exacte est codé quelque part dans la trame. Y a un moyen de récupérer ça ? (Enfin, si ça se passe bien comme ça).
Vous pouvez surement faire mieux. Moi, je ne donnais qu'un exemple
__________________
Vous souhaitez participer à la rubrique 2D / 3D / Jeux ? Contactez-moi
La rubrique a aussi un blog !

Ma page sur DVP
Mon Portfolio

Qui connaît l'erreur, connaît la solution.
LittleWhite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 23h14   #5
Mat.M
Expert Confirmé Sénior
 
Développeur informatique
Inscription : novembre 2006
Messages : 4 445
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : novembre 2006
Messages : 4 445
Points : 5 864
Points : 5 864
Citation:
Envoyé par Hydrargyrum Voir le message
Bonjour,

Je programme actuellement un squelette de MMO en C# et j'aurais besoin de conseils pour l'architecture réseau de ma nouvelle version.

j'aimerais le rendre "scalable" en le subdivisant en plusieurs exécutables pouvant être distribués sur plusieurs machines :

très très mauvaise idée; comment vas-tu faire pour synchroniser les traitements effectués par les exécutables ?
En général un jeu via réseau c'est du client/Serveur.
Est-ce que tu connais la programmation mulithread ? En C# tu peux faire des threads


Citation:
Envoyé par Hydrargyrum Voir le message
Hum ... par contre avec juste l'IP ça ne va pas poser problème pour ceux qui se connectent depuis un réseau local ? De ce que je me rappelle (vaguement) de mes cours de réseau, un réseau local avec une connection unique à internet possède une seule "vraie" adresse IP et la machine exacte est codé quelque part dans la trame. Y a un moyen de récupérer ça ? (Enfin, si ça se passe bien comme ça).
Avec les sockets y'a pas de problèmes ; il suffit de donner le numéro de port et l'adresse IP du serveur, tu ouvres un socket et voilà...
http://msdn.microsoft.com/en-us/libr...ts.socket.aspx
Ensuite tu envoies tes données sur les sockets.
Sinon tu dois pouvoir utiliser Windows Communication Foundation que je ne connais pas trop ( je connais plus le C++)
Niveau serveur le programme va créer plusieurs threads qui répondront aux clients.
Ou alors tu peux faire un webservice en C#


Citation:
Envoyé par Hydrargyrum Voir le message
- Un serveur d'authentification
- Un "Master" serveur qui dispatche les instructions des clients aux serveurs de jeux / centralise les mises à jours des serveurs de jeux vers le client approprié.
- Des serveurs de jeux qui font "tourner le jeux" proprement dit, à raison de un par Région/Monde/Planète/Autres.
- Une base de données centrale unique dans laquelle tout les serveurs de jeux viennent lire / écrire les différents objets (avec probablement un système "Read/Write" Lock pour éviter les conflits)
avant de construire une usine à gaz , de se prendre pour Blizzard Entertainment,par pitié commencer par faire un petit projet simple sans serveur d'authentification ou je ne sais quoi...
tu commences par faire un jeu relativement simple et à bien étudier la problèmatique des échanges réseaux, le problème de synchronisation des événements c.a.d. lorsqu'un joueur tire sur les autres il faut répercuter cela sur les autres clients.
Parce que avec la manière dont tu nous décris les choses tu vas te lancer dans un truc totalement improbable que tu abandonneras très vite
Mat.M est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 01h08   #6
Hydrargyrum
Membre du Club
 
Inscription : janvier 2011
Messages : 28
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 28
Points : 40
Points : 40
Citation:
Envoyé par Mat.M
très très mauvaise idée; comment vas-tu faire pour synchroniser les traitements effectués par les exécutables ?
Parce que le découpage de cette architecture sépare justement les traitements qui n'ont pas besoin d'être synchronisés et peuvent tourner dans leur coin en s'envoyant seulement des messages ponctuels (dont la majorité n'ont même pas besoin de réponse en retour).
La seule interface ayant besoin d'une interaction poussé est celle entre les serveurs de Jeux et le serveur BdD, mais on ne peut pas les fusionner sans se retrouver avec une BdD par serveur de Jeux ... ce qui irait à l'encontre de mon objectif de MMO "ShardLess". Pour ce cas précis il n'y aura même pas vraiment de synchronisation, mais un système de requête avec traitement asynchrone des réponses, de façon à gaspiller le moins de temps possible des deux cotés.
Je ne répond pas au reste, apparemment tu as lu le fil de discussion en diagonale ...
Citation:
Envoyé par LittleWhite
Avez vous chercher sur Google Scholar, ou les docs de programmeur de Jeux Vidéo (même pro).
Je ne connaissais pas Scholar, ça à l'air un peu compliqué à utiliser mais je vais voir si je peut en tirer quelque chose (dommage que PubMed n'ai pas de section informatique). Pour les docs de programmeurs sur le sujet, malheureusement je n'arrive pas à mettre la main dessus. Au meilleur des cas je tombe sur des interviews de concepteurs expliquant très grossièrement leur architecture.

Cependant, je vais en priorité approfondir votre suggestion "Serveur se connectant au client". Si je trouve un moyen de le faire fonctionner même dans le cas de clients planqués à plusieurs derrière la même IP publique, cela résoudrait mon problème de façon originale et simple
Hydrargyrum est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2011, 21h03   #7
Elendhil
Membre éclairé
 
Inscription : juin 2006
Messages : 331
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 331
Points : 330
Points : 330
Ya rien de plus simple. Pour répondre à ta question c'est exactement pareil que pour le web classique.

Tu prends par exemple facebook l'utilisateur s'authentifie sur leur serveur qui renvoi à ton application/serveur une chaîne de caractères dont la première partie est la signature en utilisant(hmac-sha256) , la deuxième partie après le point correspond au paramètres fournis comme l'identifiant de l'utilisateur encodé en base64. Avec la signature et ta clé privé tu vérifies que le message est authentique.

Sinon tu as reddwarf bon c'est du java côté serveur, mais un client est disponible en c#.

J'en parle ici sur une autre discussion sur l'architecture serveur:
Discussion sur les architectures de serveur de MMO

Et ici le site web :
Reddwarf server
Elendhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 11h47   #8
SuperBidi
Membre régulier
 
Homme
Architecte serveur
Inscription : septembre 2011
Messages : 49
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Architecte serveur
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2011
Messages : 49
Points : 75
Points : 75
Au cas où, je te dirigerai vers ce thread. Les réponses tournent autour du sujet à un niveau de conception proche du tien. Tu y trouveras certainement quelques réponses basiques.

Pour répondre directement à ta question, l'authentification est souvent exportée sur un serveur dédié car :
- C'est couteux en CPU (surtout si elle est cryptée, mais peut-il en être autrement sur un gros jeu comme EvE).
- C'est le premier serveur à prendre les DoS, avoir un serveur d'authentification permet donc de ne pas faire tomber tout le serveur en cas d'attaque. Juste, plus personne ne peut se connecter (ce qui a moyen terme revient à perdre le serveur, mais si l'attaque est courte, ça peut passer presque inaperçu).

Pour ma part, ce que je te conseillerai (je pars du principe que tu recherches plutôt une archi simple), c'est de mettre l'authentification sur le master server. Si tu fais en sorte d'exporter un maximum de tes traitements sur les serveurs de jeu, ton master server ne servira globalement plus que de serveur d'authentification.

Ensuite, supprime toute connexion partagée sur la base de données. Tu vas te générer des pbs de synchro potentiellement atroce pour pas un rond. Tu mets une bdd sur chaque serveur. Tes serveurs de jeu n'ont accès qu'aux données qui les intéresse (monstres dans la zone, marchands dans la zone). Et pour toutes les données potentiellement partagées (genre les profils des joueurs), tu charges tout sur le master server, et tu envoies les données aux serveurs de jeu en les sérialisant.

Après, si tu souhaites générer des données partagées et y accéder en permanence (exemple un hôtel de vente partagé entre tes serveurs de jeu) tu exportes ça sur un autre serveur encore, qui aura lui aussi sa bdd propre.

Pour finir, plutôt que d'avoir le serveur de jeu qui demande une connexion au client une fois authentifié, ce que je trouve assez étrange, je laisserai un système logique ou le client demande la connexion. Si tu veux te protéger contre le DoS, il existe des équipements réseau qui peuvent bloquer des IPs si elles n'ont pas suivi une séquence de connexion basique. En gros, le mec qui tente d'avoir accès directement au serveur de jeu sera jeté s'il ne s'est pas d'abord authentifié. Enfin, je me suis jamais penché sur ce problème là, mais je pense que ça se résout.
SuperBidi est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 19h28.


 
 
 
 
Partenaires

Hébergement Web