Synchronisation

 Bon, après quelques jours de discutions sur le forum, pleins de nouvelles me sont venues a l'idée, il fallait que je mettent tout ca au propre.

 

Tout d'abord, si vous ne l'avez pas fait, il faudrait que vous lisiez l'article protocole qui énumère les bases.

Bon, pour l'instant, on va prendre le fait qu'il n'y a qu'un serveur qui est allumé 24H/24H, mais on est déjà en train de réfléchir sur le fait qu'il n'y aurait pas un serveur mais que toutes les calculettes connectées sont potentiellement des serveurs, en fait, si le serveur va se déconnecter, au lieu de s'arrêter comme un bourrin, il demande a une autre calculette de prendre le "flambeau" ( Et même, on réfléchit aussi a un système sans serveur, en fait, ceci permettrait a une requête de passer par plusieurs calculette, comme ca, on pourrais communiquer sur de plus grandes distances, mais le protocole est plus compliqué ). Mais bon, pour l'instant, on ne vas réfléchir que si il n'y avait qu'un serveur qui émet tout le temps.

 

 Je vais donc m'attarder ici sur la synchronisation, quand une calculette veux ce connecter au réseau.

 Si vous allumez votre calculette et que vous essayez de vous connecter, vous écoutez alors ce que le serveur émet. Quand vous commencez a écouter, vous avez toutes les chances de recevoir la moitiée du premier octet, car le serveur ne vous a pas attendu, il peut être en cours de communication avec une calculette ou faire des requètes de connection a des calculettes.

Comme vous le savez, un octet est composé d'une suite de 8bits (0 ou 1 ), et quand on émet des informations, on émet des suite d'octets, donc indirectement, des suites de bits. Sauf, que ce que l'on recoit, c une suite de bits non découpés en octets, c'est donc le programmeur qui doit "couper" manuellement en bout de 8bits pour donner des octets : par exemple, si on recoit 1010010101001101, ca vas donner :  [10100101][01001101].

Maintenant, je vais expliquer concrètement a quoi sert la synchronisation : par exemple, le serveur émet :

01010101 10101101 00101110 10110101 01110101 (Normalement, il n'y a pas d'espaces, c juste pour montrer le découpage des octets. )

Et maintenant, imaginons, que vous vous connectez, c'est comme prendre une conversation en cours, vous avez très peu de chance d'entendre le début du mot ! Donc, imaginons que vous recevez ca :

0101010110101101001011101011010101110101

 Ce que le serveur a envoyé

010110101101001011101011010101110101

 Ce que la calculette a reçut

On voit donc que le début du message est erroné, la calculette n'a pas entendu le début du premier octet.

On vas dire qu'on fait la méthode normale, on compte 8bits, on dit que c un octet, on prend les 8 suivant etc...

 

01010101 10101101 00101110 10110101 01110101

 Ce que le serveur a envoyé

010110101101001011101011010101110101

 Ce que la calculette a reçut

01011010 11010010 11101011 01010111 0101        

 Après un découpage

On voit donc que les octets envoyés envoyé et reçut ne sont pas les mêmes, la méthode : la synchronisation :

Le problème ici, c'est que l'on ne sait pas où commence un octet, pour pouvoir faire un découpage au bon endroits. La solution est de mettre un marqueur qui permettra de montrer a la calculette : "Tu vois, tu commence là" :

Le marqueur sera un octet a 0, donc, quand la calculette recevra 8 bits d'affilés a 0, il devrait savoir où commence le prochain octet. SAUF QU'IL Y A UN PROBLEME : imaginez que le serveur envoie 11110000 00001111, la calculette reçoit 1111000000001111, elle a compté les 8bits, donc elle se synchronise comme ca : 1111 00000000 1111, ce qui n'est pas bon.

Donc en fait, on vas coder les octets sur 9 bits. Pourquoi ? Premièrement, ce bit en plus permettra de faire la différence entre de la donnée, qui ne doit être traité que pas la calculette réceptrice, et l'entête d'un paquet, qui contient des informations tel que la calculatrice destinataire, la taille du message, ect... , qui doit être traité pas toutes les calculatrices. Donc, si un octet est de cette forme 1xxxxxxxx ( les x les informations ), c'est de la donnée, si un octet est de cette forme : 0xxxxxxxx , c'est une entête de paquet. Et deuxièment, ca vas nous simplifier la vie pour la synchronisation, car la valeur minimun que peut prendre avec ce système un octet de donnée, c 100000000 , donc on sait que la valeur 000000000 ne sera jamais pris par de la donnée. Oui, mais pour l'entête, elle peut prendre la valeur 000000000. Pas si on dis que tous les octets d'une entête d'un paquet sera de la forme 01xxxxxxx , la valeur réellement utilisable n'étant plus que codé sur 7bits ( 7 x ), mais ca suffit largement ( Je ne pense pas qu'il y ai plus de 128 calculettes connectés en même temps )

Et quand émettre les 9 0 d'affilés ( comme maintenant, on est en 9bits ( et oui, faut suivre !! )) ?? En fait, on émettra ca avant le début d'une entête d'un paquet, donc, si vous avez tout conpris, ca marchera comme ca :

[000000000][Entête][Donnée][000000000][Entête][Donnée] et sachant qu'une entête commence toujours par 01, en fait, la calculette doit attendre 00000000001 ( 10:0, 1:1 ), et après, elle est synchronisée et elle peut faire un découpage correct des bits.

Donc, maintenant, on vas voir ce que ca donne exactement concrètement, si une calculette recoit :

....0101101101010110101010000000000100000101.... On voit donc qu'il y a la chaine 00000000001, on sait donc maintenant qu'après les 9:0, l'octet est 0100000101, et on est sur que c'est bien ce que le serveur a voulu envoyer.

 Voila, si vous ne comprenez pas quelque chose ou tout, mettez des messages sur le forum, ou envoyez moi un message a yoann.maheo@wanadoo.fr