IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau et multijoueurs Discussion :

Architecture d'un MMO et serveur d'authentification


Sujet :

Réseau et multijoueurs

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 32
    Points : 53
    Points
    53
    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.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 815
    Points : 218 179
    Points
    218 179
    Billets dans le blog
    117
    Par défaut
    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

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 32
    Points : 53
    Points
    53
    Par défaut
    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).

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 815
    Points : 218 179
    Points
    218 179
    Billets dans le blog
    117
    Par défaut
    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).

    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

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 347
    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 : 8 347
    Points : 20 347
    Points
    20 347
    Par défaut
    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

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 32
    Points : 53
    Points
    53
    Par défaut
    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

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Points : 432
    Points
    432
    Par défaut
    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

  8. #8
    Membre régulier
    Homme Profil pro
    Architecte serveur
    Inscrit en
    Septembre 2011
    Messages
    64
    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 : 64
    Points : 107
    Points
    107
    Par défaut
    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.

Discussions similaires

  1. Serveur d'authentification CAS
    Par Balashov dans le forum Serveurs (Apache, IIS,...)
    Réponses: 7
    Dernier message: 15/05/2009, 18h00
  2. Définition de serveur d'authentification?
    Par Clotilde dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 10/10/2007, 10h48
  3. [Architecture]Que choisir comme technologie serveur ?
    Par madfu dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 14/12/2006, 13h37
  4. architecture d'un programme client/serveur asynchrone (win)
    Par Heimdall dans le forum Développement
    Réponses: 2
    Dernier message: 06/09/2003, 00h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo