• Tutoriel
  • Comprendre le protocole de Dofus

Un message peut être envoyé sur plusieurs paquets.

    BlueDream

    Un message peut être envoyé sur plusieurs paquets.

    Oui mais même, >60k c'est énorme quand même. J'ai du mal à imaginer des cas où on dépasse cette taille ...

    @Kyu quand je dis "message" c'est juste un paquet dans ce cas là.

    Le RDM doit dépasser cette taille.

    @decompo Quel est le numéro du message que tu souhaites analyser ?

    Le RawDataMessage, l'InventoryContentMessage (et ses dérivés) ou encore le mapComplementaryDataMessage sont susceptibles de dépasser cette taille en effet.

    6 mois plus tard

    bouh2

    Donc pour écrire "Bonjour|123" on aura dans notre paquet 11 octets : 66 78 78 74 79 85 82 124 49 50 51

    Personne à relever l'erreur depuis le temps, "Bonjour" ne prendrait pas "78 78" car aucune lettre en double, ce serait donc "66 79 78 74 79 85 82" et cela partout dans le code ^^

    Sinon merci beaucoup pour ce sujet, j'aimerais savoir, c'est de l'AMF en gros?

    @Unnomcommun Si par AMF, tu veux dire, Action Message Format, inspiré de SOAP, oui c'est le cas.

    Chaque message est constitué d'une enveloppe et d'un modèle de données.

    Après je ne pense que Ankama ait respecté toute les normes, en général SOAP est utilisé pour facilité la communication en HTTP et il reprend le format XML qui alourdit énormément les échanges ce qui n'est pas un problème quand les volumes de données transitées sont faibles, mais dans le cadre d'un jeu, ce n'est pas très optimisé.

    Ankama s'en est inspiré mais leur protocole reste très lend, exemple avec le MapComplementaryInformationsDataMessage, ou le RawDataMessage, les paquets sont très lourds, et mettent parfois plusieurs secondes à être traités.

    Bonjour @BlueDream je te remercie de ta réponse, je me doutes bien qu'ils ont pas repris le protocole AMF, ce serait trop simple il y à des DLL pour traduire dans les deux sens, ce serait bien trop facile ! :D

    4 mois plus tard

    Bonsoir tout le monde,

    En me lançant dans l'analyse du protocole D2, je me retrouve avec des paquets comme celui-ci :

    Test de déplacement d'une cellule

    0e d9 00 00 00 b4 3e 00 02 01 7f 01 80 41 94 00 00 28 00 00 00 97 46 e2 b6 ca ff dd 68 25 2f fa bf 22 94 58 58 c3 9d 67 28 8f d5 05 86 82 1d cc 97 c8 65 45 b2 b7 2b 54 17 ed 43 41 0d 6f 08 74 2e 16 6e da db

    Avec 0e d9 je retrouve bien ID 950, et taille de la taille = 1

    Sauf que l'octet suivant... Bah c'est 00. Mon paquet ne fait pas 0 de taille.

    Il m'est même arrivé de trouve dans les 2 premiers octets une taille de taille de 0.

    Le protocole aurait-il changé ou bien je passe à côté de quelquechose?

    Merci pour vos réponse,

    Jean-Kev

    Il a change pour les messages ENVOYÉ AU SERVEUR , il y a un id d increment , comptant chaque message envoyé.

    Je ne sais pas si le 950 est envoye au serveur mais ça pourrait expliquer !

    Salut @Brasvengeur ! Merci pour ta réponse, je viens de me rendre compte de cela, et effectivement le nombre incrémente en fonction du nombre d'échanges avec le serveur, lors de l'envoi.

    Pour prendre un autre exemple, pour la réception cette fois!

    La réponse du 950 (déplacement cellule) est un paquet d'ID 951:

    0e dd 10 00 02 01 7f 01 80 00 05 42 06 0b 00 06 78 00 00 02 c0

    La taille devrait être 10, soit 16 octets, hors il y en a bien 18!

    Une idée de pourquoi la taille semble erronée?

    Je n'ai pas ce problème avec tous les paquets, la réception des messages canal commerce fonctionne bien par exemple..

    Un packet TCP peut contenir de 0 a x packets DOFUS entier.

    Concretement avec le 951 tu recois aussi le 226 , je ne sais pas compter les octets ect mais le compte doit y etre sachant que le 226 est vide !

    En resume ta taille est bonne donc tu peux couper ton packet dofus et lire le suivant avec la fin de ton packet tcp !

      Brasvengeur

      Un packet TCP peut contenir de 0 a x packets DOFUS entier.

      Concretement avec le 951 tu recois aussi le 226 , je ne sais pas compter les octets ect mais le compte doit y etre sachant que le 226 est vide !

      En resume ta taille est bonne donc tu peux couper ton packet dofus et lire le suivant avec la fin de ton packet tcp !

      TCP n'est pas un protocole orienté paquet/message, c'est un protocole orienté flux/stream, il n'y a donc pas de "paquet TCP"

      De plus, la fragmentation TCP est aléatoire et dépend des différents algorithmes implémentées dans les cartes réseaux et de la configuration du socket (nagle, etc..)

        10 jours plus tard

        DrBrooklyn

        TCP n'est pas un protocole orienté paquet/message, c'est un protocole orienté flux/stream, il n'y a donc pas de "paquet TCP"

        De plus, la fragmentation TCP est aléatoire et dépend des différents algorithmes implémentées dans les cartes réseaux et de la configuration du socket (nagle, etc..)

        (J'espère pas dire n'importe quoi) c'est pour ça que dès le départ il faut développer quelque chose qui va "lire" ce qui est reçu et découper par "paquets" de façon à garder les autres paquets reçu dans le flux et pouvoir lire un par un les paquets et garder le reste qui peut être qu'une partie de paquet (il me semble qu'on peut recevoir parfois un paquet en plusieurs flux, même si c'est bien souvent l'inverse).

        Donc il faut faire une fonction qui dans tout les cas pourra tenir son compte et gérer le paquet entier tout en gardant le surplus pour le traiter par la suite.

        Par "paquet" j'entends plus les groupes formant une entité.

          Unnomcommun

          (J'espère pas dire n'importe quoi) c'est pour ça que dès le départ il faut développer quelque chose qui va "lire" ce qui est reçu et découper par "paquets" de façon à garder les autres paquets reçu dans le flux et pouvoir lire un par un les paquets et garder le reste qui peut être qu'une partie de paquet (il me semble qu'on peut recevoir parfois un paquet en plusieurs flux, même si c'est bien souvent l'inverse).

          Donc il faut faire une fonction qui dans tout les cas pourra tenir son compte et gérer le paquet entier tout en gardant le surplus pour le traiter par la suite.

          Par "paquet" j'entends plus les groupes formant une entité.

          https://devblogs.microsoft.com/dotnet/system-io-pipelines-high-performance-io-in-net/

          Un article qui liste les problématiques et comment les résoudre, en C# mais applicable à n'importe quel langage

          7 mois plus tard

          Bonjour voilà un méga up mdr j'ai sniffer un packet du canal recrutement (je débute l'apprentisage) j'ai un packet commençant par :

          3C 91 80 je vous passe en binaire : 0011 1100 1001 0001 1000 0000

          SI je suis le tuto :

          0011 1100 1001 0001 1000 0000

          En rouge j'ai mon ID = 3876

          En bleu j'ai ma taille = 1

          Bon alors voici un image du packet :

          img

          Donc je me suis fais un tool qui parcours les fichiers de dofusinvoker et j'ai aucun truc qui a un protocole d'id 3876 pour commencer

          de plus il me dise que la lentaille est 1 si je lit sur 1 octet il me dise qu'il faut lire sur 128 bits or le message fait bien plus que 128 bits je coince peut être et surement un soucis de compréhension de ma part en espérant que certaine personne puisse m'aiguiller

          Le paquet que tu as sélectionné dans l'image n'est pas le même que tu as inscrit dans ton post; vérifie cela, tu vas pouvoir ensuite retrouver cet ID dans le protocol (ChatServerMessage)

            9True

            Le paquet que tu as sélectionné dans l'image n'est pas le même que tu as inscrit dans ton post; vérifie cela, tu vas pouvoir ensuite retrouver cet ID dans le protocol (ChatServerMessage)

            Salut merci beaucoup te ta réponse !

            Dans mon packet que j'ai envoyé je commence bien par 3C 91 80 ou je doit commencer par : 0d c5 c2 ?

            Je vais surement allez suivre un tuto wireshark avant de continué a sniffer les packets dofus mdr.

            Merci encore pour m'avoir donné le fichier ou se trouve l'id du protocole que je cherche !

            Tu dois prendre la partie

            data
            des packets TCP. Donc dans ton cas c'est bien le
            0dc5
            ton header dofus

              KingOfGobballs

              Tu dois prendre la partie

              data
              des packets TCP. Donc dans ton cas c'est bien le
              0dc5
              ton header dofus

              Je viens de capter merci beaucoup ! Encore désolé du up ahah !

              Ne pas confondre la structure du socket et les informations contenu dans le message en effet.