34 votes

Comment mettre en œuvre un protocole de réseau ?

Voici une question générique. Je ne suis pas à la recherche de la meilleure réponse, j'aimerais simplement que vous exprimiez vos pratiques préférées.

Je veux implémenter un protocole réseau en Java (mais c'est une question assez générale, j'ai rencontré les mêmes problèmes en C++), ce n'est pas la première fois, car j'ai déjà fait cela auparavant. Mais je pense qu'il me manque une bonne façon de l'implémenter. En fait, il s'agit généralement d'échanger des messages texte et quelques tampons d'octets entre les hôtes, de stocker l'état et d'attendre l'arrivée du message suivant. Le problème est que je me retrouve généralement avec un tas de switch et d'instructions if plus ou moins complexes qui réagissent à différents statuts/messages. Le tout devient généralement compliqué et difficile à gérer. Sans parler du fait que parfois ce qui en ressort comporte des "angles morts", c'est-à-dire des états du protocole qui n'ont pas été couverts et qui se comportent de manière imprévisible. J'ai essayé d'écrire quelques classes de machine d'état, qui se chargent de vérifier les états de début et de fin pour chaque action de manière plus ou moins intelligente. Cela rend la programmation du protocole très compliquée car je dois écrire des lignes et des lignes de code pour couvrir toutes les situations possibles. Ce que je voudrais, c'est quelque chose comme un bon modèle, ou une meilleure pratique qui est utilisé dans la programmation de protocoles complexes, facile à maintenir et à étendre et très lisible.

Quelles sont vos suggestions ?

16voto

S.Lott Points 207588

Renseignez-vous sur le État pour apprendre comment éviter les nombreuses instructions de commutation.


"parfois ce qui sort a un certain "angle mort", je veux dire des statuts du protocole qui n'ont pas été couverts..."

État peut aider à éviter les lacunes. Il ne peut pas garantir une bonne conception, vous devez encore le faire.

"...car je dois écrire des lignes et des lignes de code pour couvrir toutes les situations possibles."

Cela ne doit pas être considéré comme un fardeau ou un problème : vous doit écrire des lignes de code pour couvrir toutes les situations possibles.

État peut aider parce que vous pouvez tirer parti de l'héritage. Cela ne garantit pas une bonne conception, vous devez toujours le faire.

0 votes

Dans le livre "Desing Patterns" ( fr.wikipedia.org/wiki/Design_Patterns ) ce modèle est appliqué au problème concerné.

0 votes

J'ai jeté un coup d'œil sur wikipedia et cela semble très intelligent et résoudrait de nombreux problèmes que j'ai. Je devrais acheter ce satané livre sur les Design Patterns... :)

0 votes

@gotch4 - Parcourez une bonne librairie. Le GOF est l'un de ces articles devant lequel vous êtes censé faire une génuflexion en public, mais la vérité est qu'il existe de meilleurs livres de modèles aujourd'hui. La plupart d'entre eux couvrent le modèle de l'État, alors faites le tour pour en trouver un avec lequel vous vous sentez à l'aise.

6voto

Zak Points 10160

La conception d'un protocole dépend généralement de l'espace d'application dans lequel vous travaillez. Par exemple, le protocole http permet de gérer les pages web, les graphiques et les messages, tandis que le protocole FTP permet de transférer des fichiers.

En résumé, pour commencer, vous devez décider de l'espace d'application dans lequel vous vous trouvez, puis définir les mesures à prendre. Enfin, avant de commencer à concevoir votre protocole proprement dit, vous devriez sérieusement, sérieusement rechercher une autre pile de protocoles qui fait ce que vous voulez faire et éviter de mettre en œuvre une pile de protocoles altoether. Ce n'est qu'après avoir déterminé que quelque chose d'autre de préconstruit ne fonctionnera absolument pas pour vous que vous devriez commencer à construire votre propre pile de protocoles.

3voto

pm100 Points 8303

La machine à états finis est ce que vous voulez

FSM

Vous définissez donc toute une série d'états dans lesquels vous pouvez vous trouver en tant que récepteur ou émetteur (idle, connecting_phase1, connecting_phase2, packet expected,...).

Définissez ensuite tous les événements possibles (paquet1 arrive, net se ferme, ...)

enfin, vous avez une table qui dit "quand dans l'état x et l'événement n se produit faire func y et transition à l'état q" - pour chaque état et événement (beaucoup seront null ou dups)

Editer - comment faire un FSM (ébauche)

 struct FSMNode
 {
      int m_nextState;
      void (m_func*);
 }
 FSMNode states[NUMSTATES][NUMEVENTS]=
   { // state 0
      {3, bang}, // event 0
      {2,wiz},
      {1, fertang}
    }
    {
      {1, noop}, // event 0
      {1, noop},
      {3, ole}
     }
     .......
     FSMNode node = states[mystate][event];
     node.m_func(context);
     mystate = node.m_nextState;

Je suis sûr qu'il y a beaucoup de syntaxe invalide, mais j'espère que vous comprenez ce que je veux dire.

0 votes

Bien sûr que je le sais. Ce que je veux savoir, ce sont les meilleures pratiques pour mettre en œuvre ce FSM et la table... c'est ma vraie question.

3voto

miro Points 45

En C++, vous pouvez utiliser la bibliothèque Boost::Spirit pour analyser facilement votre message de protocole. La seule "difficulté" est de définir la grammaire de votre protocole de message. Jetez un coup d'oeil au code source de Gnutella pour voir comment ils résolvent ce problème. Voici http://www9.limewire.com/developer/gnutella_protocol_0.4.pdf est la spécification du protocole Gnutella

2voto

Andres Points 2253

Pourquoi ne pas utiliser XML comme protocole ? Vous pouvez encapsuler et classer tous vos éléments de données dans des nœuds XML.

0 votes

Je l'ai suggéré parce que c'est un format ouvert largement utilisé sur l'Internet aujourd'hui. Je ne dis pas que vous ne savez pas comment mettre en œuvre les codecs. J'essaie simplement de gagner du temps, comme cela m'est arrivé dans des projets réels où j'ai choisi ce format de protocole.

0 votes

En fait, c'est mon choix habituel... mais ma préoccupation n'est pas le formatage des données, mais plutôt la gestion et la mise en œuvre du statut du protocole.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X