Les réseaux pair-à-pair constituent un sujet de recherche tout à fait passionnant recouvrant deux domaines que sont l'informatique des pairs et la sociologie des pairs. On appel un pair un noeud ou un ordinateur. Le pair-à-pair constitue un modèle de calcul parallèle dans lequel chaque noeud est un ordinateur, et où chaque noeud communique avec les autres noeuds via l'Internet.
Pour étudier le comportement de tel réseau on met en oeuvre une simulation que nous préférons appeler expérimentation exacte. C'est un programme qui simule l'interaction d'un grand nombre de noeuds selon des profils techniques et comportementaux choisis aux hasards.
On caractérise l'ordinateur et son raccordement à l'Internet à l'aide de 5 paramètres :
d0 : Le débit Internet
d1 : Le débit mémoire vive
q1 : La quantité de mémoire vive
d2 : Le débit disque dur
q2 : La quantité de mémoire disque
La vitesse de l'ordinateur correspond à la valeur d1. On considèrera 2 configurations, l'une dite cliente, l'autre dite serveur.
Configuration cliente Configuration serveur d0 1 Mo/s 100 Mo/s d1 1 000 Mo/s 4 000 Mo/s q1 4 000 Mo 32 000 Mo d2 100 Mo/s 400 Mo/s q2 1000 000 Mo 4000 000 Mo
On pourra par la suite introduire une notion de distance entre les pairs, en tant que ressource devant être minimalisée, basée sur le nombre de routeurs traversées et les éventuels poids qu'ils allouent.
Puis on s'intéresse aux informations détenues par les noeuds. L'information est quantifiée en documents. Et le document doit contenir toutes les références nécessaires pour transcrire l'information qu'il porte. Ainsi, en terme d'information, il n'y a pas vraiment de différence entre un document et une référence à ce document précédent. La seule différence tient dans la capacité du noeud de modifier le document et de pouvoir en sauvegarder une copie, ou seulement de modifier la référence et de se limiter à la seul sauvegarde de celle-ci. Cette petite différence interviendra dans l'évaluation probatoire.
Pour construire notre modèle on doit formaliser une structure de document dit hypertexte. On choisi la structure la plus simple, des documents textes avec la possibilité d'insérer des références selon la codification suivante : La lettre minuscule ed, symbolisée par ð, que l'on peut obtenir par la combinaison de touches <Alt Gr> <H>, est utilisée comme une fonction pour appeller une adresse url. Ainsi la portion de texte ð(http://toto.com/document.txt) constitue un lien hypertexte et désigne un autre document hypertexte accessible via l'Internet à l'adresse http://toto.com/document.txt
Néanmoins le noeud peut vouloir mettre à disposition du réseau des documents de façon anonyme, c'est à dire sans que l'on puisse déterminer l'origine de la transmission, une sorte de lettre anonyme transmise au réseau et mémorisée par le réseau. Pour ce faire, il semble nécessaire d'utiliser la cryptographie et de constituer des noeuds virtuels qui joueront le rôle de noeuds anonymes. Puisque le noeud virtuel n'a pas de corps physique, il est distribué. Sa partie physique est répartie avec plus ou moins de redondance sur l'ensemble des noeuds physiques. Tout se passe comme si nous réservions une petite place dans notre oreille pour écouter des messages anonymes et les mémoriser.
On peut vouloir simplement atteindre un niveau d'anonymisation suffisant pour éviter un éventuel fichage automatisé. Un tel fichage peut néanmoins être assez sophistiqué vu les sommes d'argent dépensées en matière d'espionnage par les Etats (Etat-Unis : 70 millards par an, France : 7 milliards par an) sans compter celles dépensées par les sociétés privés, un secteur florissant bien que la plus part du temps en dehors de toute légalité.
Il se peut aussi que le noeud veuille mettre à disposition du réseau, des documents uniquement pour un traitement collectif, mais de façon que l'information transmise individuellement reste secrète et assurément anonyme, tel que par exemple un vote secret. Et ne prenez pas cet exemple pour une approbation du vote électronique qui va à mon sens contre la démocratie en ne permettant qu'à des experts de contrôler le vote.
D'autres modes sont encore envisageables et jonglent avec les qualités de secret, d'anonymat, de collectivité, d'individualité, d'inter individualité et d'inter collectivité....
Le premier exemple de réseau pair-à-pair qu'il faut considérer est l'ensemble des routeurs mettant en oeuvre l'Internet. Ce réseau utilise quelques algorithmes de routage, de découverte, de recherche du plus court chemin et d'échange d'information... qui ont ainsi fait leur preuves en quelque sorte. Aussi il convient de commencer par connaître ces algorithmes.
La première opération sur le réseau pair-à-pair, à la quelle on pense, est l'envoi d'un broadcast, c'est à dire d'un message à tous les noeuds. Dans un réseau local (LAN, Local Area Network), le broadcast représente un seul message envoyé et lu de façon parallèle en quelque sorte par tout les composants réseaux du LAN. Par contre dans l'Internet, pour envoyer un message à plusieurs noeuds se trouvant dans différents LAN, il faut envoyer autant de messages qu'il y a de noeuds destinataires en utilisant leur adresse IP.
Aussi extraordinaire que cela soit, l'Internet peut être repensé sur des bases constructives à la fois plus simples et naturels, le qualificatif naturel signifiant ici que cela découle de sources logiques et non d'intérêt économiques.
D'un point de vue abstrait, l'Internet peut être perçu comme un graphe où les sommets sont des routeurs ou des culs-de-sac, et où les arrêtes sont des réseaux ou seulement des portions de réseaux full-connexes, contenant les hôtes. Chaque hôte doit posséder une adresse IP unique qui se décompose en 2 adresses que sont l'adresse du réseau et l'adresse de l'hôte.
Les routeurs hôtes d'un même réseau sont full-connexes, c'est à dire que tous les routeurs raccordés à un même réseau local sont connectés entre eux.
Deux réseaux limitrophes sont séparés par des routeurs.
Puis il faut intégrer le concept de sous-réseau. Cela permet de hiérarchiser les réseaux comme des poupées russes, mais en envisageant pour l'instant qu'un seul niveau.
Le réseau est sensé connecter tous ses sous-réseaux. Un réseau pourra ainsi être de 1er niveau ou de 2 ième niveau, selon qu'il est un réseau de l'Internet ou qu'il est un sous-réseau d'un réseau de l'Internet.
L'adresse complète d'un hôte dans un sous-réseau doit se décomposer en 3 adresses que sont l'adresse du réseau, l'adresse du sous-réseau et l'adresse de l'hôte.
Sur ce schéma, les réseaux (en jaune) peuvent contenir des sous-réseaux (en bleu). Et dans un même réseau, les routeurs qui sont hôtes, sont full-connexes. Voyez sur le schéma les 5 routeurs hôtes du grand réseau. Par contre les routeurs qui sont hôtes que de sous-réseaux, ne sont pas hôtes du réseau. Ils sont seulement intérieurs au réseau et forment un graphe simplement connexe, c'est à dire d'un seul morceau. Ceci afin que les algorithmes de recherche de route puissent, en cas d'absence d'information plus précise, aiguiller les messages à destination d'un hôte intérieur au réseau, vers un point quelconque du réseau, en ayant l'asssurance que cela ne constitue pas un cul-de-sac.
Les routeurs séparant deux sous-réseaux d'un même réseau, ou séparant un sous-réseau du reste du réseau, sont dits internes au réseau, voir sur le schéma les routeurs blancs. Et les routeurs séparant deux réseaux sont dits frontaliers au réseau, voir les routeurs noirs.
L'Internet actuel a choisie de définir des airs connexes regroupant différents réseaux formant un découpage supplémentaire arbitraire. Il parait plus judicieux de faire correspondre ces airs avec la définition des réseaux, quitte à donner aux réseaux des fonctionnalités particulières telle des dorsales internet. Cela permet de garder la possibilité d'envoyer un message en préconisant ou en excluant le passage par des réseaux (et routeurs relais associés), puisqu'ils sont alors davantage connus.
L'Internet actuel a également choisie de définir des masques réseaux en plus de l'adresse IP, qui précise le nombre de bits consacrés à l'adresse du réseau et le nombre de bits restant consacrés à l'adresse de l'hôte, formant ainsi un paramètre supplémentaire arbitraire mémorisé dans chaque réseau. L'adresse IP devant toujours être unique, il parait plus judicieux d'enlever cet arbitraire. Avant 1990, la norme IPv4 liait le masque réseau à l'adresse IP selon trois classes d'adresses A, B, C.
Dans notre description schématique, on va maintenir ces deux principes : les airs seront les réseaux, les masques réseaux seront déduisibles des adresses IP, ou bien n'auront plus lieu d'être. Et on va même les répéter récursivement : Il existera des sous-airs qui correspondront aux sous-réseaux, et des masques de sous-réseau déduisibles de l'adresse restante une fois enlevée l'adresse réseau, ou bien qui n'auront plus lieu d'être. Et ainsi de suite....
Un des buts recherchés est de pouvoir utiliser une adresse courte si l'émetteur et le destinataire sont dans un même réseau, ce qui est possible puisque dans ce cas on n'a pas besoin de l'adresse du réseau en question.
Ce processus d'emboîtement se continue donc et nous pouvons considérer des sous-sous-réseaux. Le sous-réseau connecte tous ses sous-sous-réseaux. L'adresse complète d'un hôte dans un sous-sous-réseau se décompose en 4 adresses que sont l'adresse du réseau, l'adresse du sous-réseau, l'adresse du sous-sous-réseau et l'adresse de l'hôte.
L'adresse IP d'un hôte doit permettre de savoir si c'est une adresse qui se décompose en 2 ou 3 ou 4 adresses, c'est à dire si l'hôte fait partie d'un réseau de premier niveau, ou s'il fait partie d'un sous-réseau, ou d'un sous-sous-réseau...
Un hôte peut émettre un message à un autre hôte en connaissant son adresse IP. Le message est transmit soit directement à l'hôte concerné si celui-ci se trouve dans le réseau local de l'émetteur ou sinon il est transmit à un routeur limitrophe, et le message doit alors contenir l'adresse IP de destination pour que le routeur puisse l'aiguiller sur la bonne route. Si l'émetteur et le destinataire sont à l'intérieur d'un même réseau plus large, il n'est pas utile que l'émetteur transmette l'adresse de ce réseau. L'adresse transmise serait alors de taille variable et devrait donc transmettre une information sur sa taille. Pour N adresses, la taille mémoire de l'adresse est log(N) bits et la taille mémoire de la taille mémoire de l'adresse est log(log(N)) bits. Cette capacité, nécessitant des adresses de tailles variables, va nous faire opter pour des adresses IP de taille variable.
Les routeurs sont des sommets du graphe. Ils ont pour mission d'aiguiller les messages sur les bonnes routes et les bonnes dessertes. Ils gèrent autant de routes qu'il y a de routeurs voisins, et autant de desserte qu'il y a de réseaux locaux raccordés. Chaque route correspond à un routeur voisin, chaque desserte correspond à un réseau local directement raccordé au routeur.
Lorsque les routeurs sont internes et sont donc inclus dans un même réseau plus vaste, on peut utiliser pour toute communication interne à ce réseau des adresses courtes en enlevant l'adresse du réseau en question.
La structure en arbre des réseaux peut devenir vite trop rigide. Si deux branches éloignées selon la hiérarchie des réseaux, mais physiquement proches, souhaitent faire partie d'un même réseau utilisant des adresses courtes jusque dans le mécanisme de routage, comment faire ? La racine de l'Internet ne doit pas être absolue. Il ne doit pas y avoir de centre absolu. Sinon la périphérie se révoltera. On recrée un autre système d'adressage IP, un système d'adressage n°2, qui se superpose au premier. Et on peut définir ainsi plusieurs systèmes d'adressages IP superposés, le premier serait de nature physique historique et les suivants seraient de nature davantage logique et contractuelle bien que toujours dépendant des connexions physiques existantes. On pourrait ainsi définir plusieurs racines pour l'Internet, plusieurs centres....
Et si un réseau occupe presque toutes ses adresses de sous-réseaux ou d'hôtes, comment faire pour en créer d'autres dans le même réseau. Il suffit d'opter pour le choix d'une adresse IP de taille variable, ce que nous avons déjà fait.
Dernière remarque concernant l'emboîtement des réseaux, et afin de rendre cohérente cette description, on ajoutera à la racine de l'arbre qu'est l'Internet, un unique réseau appelé l'Internet, dans lequel l'adresse complète d'un hôte sera constituée d'un unique numéro d'hôte.
L'enjeu politique est important. Il consiste à développer un réseau non commercial, l'Internet, qui doit donc être suffisamment souple et attrayant pour être adopté par tous.
L'Internet actuel a choisi de définir une adresse IP de taille fixe, tenant sur un certain nombre d'octets. Pour désigner un hôte sur un réseau de premier niveau, il faut alors scinder l'adresse en deux parties, une première partie désignant le réseau dans l'Internet, et une seconde partie désignant l'hôte dans le réseau. La norme IPv4 autorise 3 classes A, B, C de réseaux locaux, chaque classe ayant un nombre maximum de réseaux possibles, et chaque réseau ayant un nombre d'hôtes maximum possibles. Cela consiste à positionner le curseur de séparation entre les deux adresses (adresse réseau, adresse hôte). Et l'information de ce choix est contenue dans les premiers bits.
Le processus de création d'un réseau dans l'Internet peut se réitérer pour permettre la création d'un sous-réseau dans un réseau. Nous pouvons, au lieu de considérer une adresse hôte simple, scinder celle-ci en deux adresses (adresse sous-réseau, adresse hôte), et ainsi de suite, en mettant toujours l'information de ce choix dans les premiers bits de l'adresse à scinder en deux, toujours dans le cas où l'on opterait pour le choix d'une adresse IP de taille fixe.
Il est plus judicieux de définir une adresse IP de taille variable, ce qui permet de s'affranchir de l'arbitraire des masques réseaux et de se libérer des contraintes de taille de réseau. Concrètement cela consiste à écrire l'adresse IP comme une suite d'octets obéissant à une règle simple et économe en nombre d'octets pour désigner une suite de nombres entiers.
La hiérarchie des réseaux transcrite dans l'adresse en une succession de réseaux emboîtés, nous parait importante pour pouvoir mettre en oeuvre des algorithmes de recherches du plus court chemin auto-adaptatif efficace à grande échelle tout en garantissant un mécanisme de subsidiarité porté par la hiérarchie des réseaux. Les airs ne sont pas définie de façon obscure comme actuellement, mais correspondent exactement aux réseaux de premier niveau.
L'envoie de message fonctionne un peu comme l'envoi d'une lettre via la Poste. Les routeurs sont des sortes de gares de triages, mais décentralisées. Chaque ville, chaque rue, chaque maison.... contient un routeur. Et les adresses sont écrites en partant du général vers le particulier tel que par exemple : Terre, Europe, France, Basse-Normandie, Calvados, Agglomération caennaise, Caen, Quartier St-Jean, Place de la République, n°3, M.Martin.
La norme ne doit pas être trop rigide sans quoi elle ne sera pas appliquée ou désservira le bon fonctionnement de l'Internet. Elle peut donc se spécialisée dans une certaine mesure dans chaque réseau quelconque. C'est à la charge du réseau que de mettre en oeuvre ses spécificités : normes spécifiques, algorithmes distribués de recherche du plus court chemin en son sein, interopérabilité avec les autres réseaux et algorithmes distribués de recherche du plus court chemin extérieur.
Le choix d'une adress IP de taille variable nous permettra l'utilisation d'adresses courtes écourtées par les deux bouts, et nous libèrera des astreintes liées aux découpages obscurs et aux limitations, en simplifiant les protocoles d'interopérabilité et en écartant ces arbitraires devenus inutiles que sont les airs, les masques réseaux, et les tailles limites.
Dans l'Internet, la distribution de message se fait selon un protocole appelé IP (Internet Protocol) qui identifie de manière unique chaque destinataire sédentaire par son adresse IP.
Dans un réseau local, la distribution de message se fait selon un protocole de plus bas niveau que l'on pourrait appeler HP (Host Protocol) et qui identifie de manière unique chaque destinataire par son numéro d'hôte que l'on pourrait appeler adresse HP. Les hôtes sont identifiés par leur adresse HP et ne lisent que les messages ayant comme entête ce numéro.
L'adresse HP correspond à l'adresse MAC, mais à la différence de celle-ci, elle est de taille plus réduite et son initialisation n'est pas matérielle mais logiciel. L'adresse HP correspond au dernier numéro de l'adresse IP, appelé aussi le numéro d'hôte. En ce sens, le protocole HP est inclus dans le protocole IP en utilisant simplement des adresses IP écourtées par le début en ne gardant que le dernier numéro.
L'adresse HP est de taille variable comme l'est l'adresse IP, adaptable pour chaque réseau local. S'il y a moins de 256 hôtes alors l'adresse HP tient sur un octet, et s'il y a moins de 65536 hôtes alors l'adresse HP tient sur deux octets, et ainsi de suite....
Il est inutile pour un hôte de mémoriser son adresse IP, puisque il est placé dans un réseau local qui mémorisera son adresse réseau d'une manière distribuée ou non, pour lui. Seul le numéro d'hôte qui correspond au dernier nombre de l'adresse IP, doit être mémorisé par l'hôte.
Il est tout à fait amusant de pouvoir repenser la conception de la pile des protocoles Internet à la lumière des connaissances d'aujourd'hui en nous libérant des apriori historiques.
L'adresse MAC est utilisée pour permettre à la justice le cas échéant de pouvoir tracer l'origine des messages, comme la législation de certain pays l'exige. Elle est aussi utilisé pour porter les marques des constructeurs de composant réseau, et ainsi fait peser le risque d'usage impromptu de protocoles propriétaires en matière de communication réseau entre composant de même marque. L'argument juridique s'est émoussé, car maintenant il est facile de camoufler son adresse MAC et il existe aujourd'hui d'autres moyens de tracer l'origine des messages. L'argument commercial peut être contré en objectant qu'une place est prévue dans les messages pour spécifier le protocole utilisé qu'il soit public ou propriétaire.
La meilleur façon de lutter contre le développement de protocoles propriétaires n'est pas de rendre difficile leur communication avec l'Internet, l'interdiction suscitant toujours l'opposition, mais consiste à permettre cette communication selon une norme Internet, et de convaincre qu'Internet constitue ainsi la meilleur politique en matière de communication réseau. Reste alors qu'il faudra veiller aux conditions d'une administration des espaces de normes transparente et démocratique.
Le routeur constitue, tel un emblème, la première conception significative du noeud pair-à-pair. Il comprend plusieurs ports (interfaces réseaux) numérotés en interne 1, 2, 3...., et qui sont connectés directement à des réseaux locaux. Le plus souvent il n'en possède que 2.
Le routeur recherche régulièrement la présence d'autres routeurs voisins c'est à dire hôtes de réseaux locaux auxquels il est directement connecté. Et il entretient des échanges d'information avec ses pairs.
Les routeurs ont pour mission d'aiguiller les messages sur les bonnes voies. Il y a deux sortes de voie, les routes et les dessertes. Les routes désignent les routeurs voisin. Elles sont donc caractérisées par un numéro de port (du routeur) suivie d'un numéro d'hôte (du routeur voisin). Les dessertes désignent les réseaux locaux qui sont directement connectés au routeur. Elles sont donc caractérisées par un unique numéro de port (du routeur). Le numéro de port (du routeur) détermine le réseau local qui y est directement connecté.
Le chemin local entre deux hôtes se traduit par une succession de choix d'hôtes et de choix de ports de sortie. Par exemple le chemin local 5(1), 8(1), 4(2), 7 signifie aller sur l'hôte n°5, choisir la sortie n°1, aller sur l'hôtes n°8, choisir la sortie n°1, aller sur l'hôtes n°4, choisir la sortie n°2 puis aller sur l'hôtes n°7.
Pour que le chemin local inverse soit déduisible, il convient d'ajouter des informations supplémentaires que sont le numéro d'hôte de l'émetteur, le numéro de port d'entré dans chaque routeur traversé ainsi que le numéro d'hôte coté sortie de chaque routeur traversé. Par exemple le chemin local précédent se complète par 12, 5(2-1)7, 8(2-1)1, 4(1-2)1, 7. Il signifie partir de l'hôte n°12 aller sur l'hôte n°5, entré par son port n°2, choisir le port de sortie n°1, dans ce nouveauu réseau local l'hôte que l'on vient de traversé possède le numéro n°7, aller sur l'hôtes n°8, entré par son port n°2, choisir le port de sortie n°1, dans ce nouveauu réseau local l'hôte que l'on vient de traversé possède le numéro n°1, aller sur l'hôtes n°4, entré par son port n°1, choisir le port de sortie n°2, dans ce nouveauu réseau local l'hôte que l'on vient de traversé possède le numéro n°1, puis aller sur l'hôtes n°7.
Le chemin local inverse est alors simple a calculer Il suffit d'inverser l'ordre des entiers :7, 1(2-1)4, 1(1-2)8, 7(1-2)5, 12.
La table contient en entré des préfixes d'adresses IP, c'est à dire des adresses IP incomplètes de réseau de niveau quelconque, et dont le dernier numéro de réseau peut même être coupé jusque dans sa décomposition binaire, en ne retenant que quelques bits de poids forts.
A chacune de ces entrés correspond une route ou une desserte si la destination attendue correspond à l'adresse d'un réseau local directement raccordé au routeur. La route est désignée par un numéro interne de port et par le numéro d'hôte d'un routeur limitrophe. La desserte est désignée seulement par un numéro interne de port.
Cette entré signifie que toute adresse commençant par cette adresse réseau, en l'absence d'autre information plus précise, sera redirigée sur la route ou désserte qui lui est assignée.
La table contient une entré particulière qu'est l'adresse IP vide, qui permet de fixer la route par défaut.
Si le routeur est interne à un réseau et que la communication l'est également, alors on enlève les premiers numéros correspondant au réseau en question, car cette information n'est pas utile pour indiquer la route à prendre. Et de même que pour les prefixes, la coupure peut être faite jusque dans la décomposition binaire de l'adresse réseau. Les bits de poids forts de l'adresse réseau du destinataire sont sous-entendus et fixés par défaut s'ils sont les mêmes que celui du routeur.
Par exemple considérons le réseau 80.45 (en bleu sur le schéma), c'est à dire le sous-réseau n°45 du réseau n°80. Considérons le routeur R raccordé à ce réseau par l'interface d'adresse 80.45.1, et considérons qu'il est également raccordé au réseau 80 par l'interface d'adresse 80.2 où le numéro 2 désigne l'hôte numéro 2 du réseau 80, c'est l'adresse HP du routeur dans le réseau 80.
Le réseau 80 joue le rôle de dorsale. Il est raccordé à plusieurs routeurs, R, S et T. Vue depuis le réseau 80, le routeur R ouvre l'accès au réseau 80.45, et permet ainsi l'accès à un hôte d'adresse 80.45.8 par exemple. L'ensemble étant interne au réseau 80, il est inutile de répéter ce numéro dans de nombreuse communications d'adresse, le réseau par défaut est le réseau dans le quel le routeur est interne.
Le routeur T est frontalier. Il permet de passer du réseau 80 au réseau 35, mais en passant ici par le sous réseau 35.2, ce qui peut ne pas être un avantage pour le sous-réseau 35.2 qui risque de recevoir beaucoup de messages transitant.
Lorsque un message IP arrive à un routeur, celui-ci va rechercher dans sa table de routage le préfixe le plus long, correspondant au début de l'adresse IP du destinataire, et va retourner la route qui lui est associée.
Si l'émetteur et le destinataire sont inclus dans le réseau 80, tel que l'hôte 80.45.8 et l'hôte 80.3, alors une procédure simplifiée doit pouvoir se faire sans utiliser l'adresse 80, la référence au réseau 80 se fait par défaut. Et de même que pour le préfixe, la coupure peut être faite jusque dans la décomposition binaire de l'adresse réseau. Les bits de poids forts de l'adresse réseau du destinataire sont fixés par défaut s'ils sont les mêmes que celui du routeur.
Si la route proposée est une desserte sur un réseau local, le routeur délivre le message dans le réseau local selon un protocole de bas niveau. Et si la route passe par un routeur voisin, le routeur délivre le message au routeur voisin toujours selon un protocole de bas niveau.
Ce protocole est utilisé pour la configuration automatique des paramètres réseaux des hôtes d'un même réseau local.
Il est tout à fait possible qu'un réseau local soit très grand et puisse contenir des milliers d'hôtes, voir des millions. Les qualités de résistance et d'adaptabilité du réseau propre à l'Internet, sont alors recherchées. Le principe de distribution des responsabilités s'applique, et toute l'architecture peut être repensée dans cet esprit.
Le plus souvent les protocoles DHCP (Dynamic Host Configuration Protocol) sont conçus de façon centralisée en utilisant un serveur. Or il est tout à fait envisageable de distribuer ce protocole, de faire assurer par les hôtes eux-mêmes cette mission. Le comportement social des hôtes que nous voulons programmer devra s'adapter au nombre d'hôtes, mais aussi à la forme du réseau, et au profil comportemental.... C'est une connaissance sur lui-même que le réseau doit mémoriser de façon distribuée dans la mesure de l'importance qu'il lui accorde et avec la rendondance qu'il lui estime nécessaire.
Plusieurs voix sont possibles. On peut demander à chaque hôte son numéro. Ou bien on peut demander à chaque hôte de demander si l'hôte de numéro juste au dessus existe, et s'il n'existe pas, de nous en informer. De multiples stratégies sociales sont possibles. Définissons en une qui nous parait parmi les plus simples :
Lorsqu'un hôte démarre, il lui est affecté l'adresse hôte INIT qui correspond au mode de dialogue en vue d'acquérir un numéro d'hôte libre. Cette adresse INIT permet à l'hôte de réceptionner les messages multicast adressés aux hôtes en phase d'initialisation.
Puis il attend pendant un temps de latence WAIT d'environ 100 millisecondes, aléatoirement réduit. Le temps de latence doit tenir compte du délai raisonnable de réponse dans le réseau, qui constitue une connaissance sur le réseau que le réseau lui-même doit mémoriser de façon distribué. L'interface revendique un numéro d'hôte. Il envoie un message d'interrogation I-WANT-TO-BE. C'est un unicast, c'est à dire un message adressé à un seul hôte du réseau local, celui qui à le numéro d'hôte revendiqué. Soit il n'existe pas et au bout d'un temps de latence WAIT, l'interface se l'attribut. Soit cet hôte existe et il répond un message ALREADY-TAKEN. C'est un multicast, c'est à dire un message adressé à plusieurs hôtes, à tous les hôtes en cours d'initialisation et qui sont caractérisés par leur numéro d'hôte égale à INIT. Ce message retourne des informations supplémentaires que sont les connaissances sur le réseau et la table d'hôtes connues par l'émetteur. Chaque interface en cours d'initialisation complète ses informations sur le réseau. Puis l'hôte qui c'est vu refuser sa proposition, revendique au hasard un numéro d'hôte, non présent dans sa table d'hôtes, et inférieur à 256 ou à 65536 ou à 2^24 ou à 2^32 selon la classe octales du réseau local. La classe octal, qui définie la taille de l'adresse HP, est une connaissance sur le réseau que le réseau lui-même doit mémoriser de façon distribuée.
On répète cette opération un certain nombre de fois. Et si on échoue toujours il faut envisager de changer la classe octale du réseau local en prenant celle juste au dessus.
Il se peut qu'un noeud s'attribut un numéro d'hôte d'un autre noeud qui était momentanément indisponible ou dont la réponse s'est perdue. Pour éviter cette erreur on peut demander confirmation aux autres noeuds qui ont dans leur mémoire une liste incomplète de noeuds présents avec pour chacun un baille, en envoyant un broadcast I-CAN-REALLY-BE. S'il n'y a pas de réponse au bout d'un temps de latence WAIT, l'interface se l'attribut. Par contre si un noeud sait qu'il existe, il répond un message KNOWN-ALREADY-TAKEN. Ce message retourne des informations supplémentaires que sont les connaissances sur le réseau et la table d'hôtes connues par l'émetteur. Chaque interface en cours d'initialisation complète ses informations sur le réseau....
On voit que les solutions sont innombrables et ouvre un champ de développement peu exploré à l'heure actuelle qu'est la programmation parallèle ou distribué.
Ce nouveau domaine de recherche nous amène à aborder des problématiques nouvelles que sont par exemple les réseaux dont la structure évolue rapidement. D'autre protocoles et comportements sociaux des hôtes devront être étudiés et préconisés.
L'identifiant court ouvre la possibilité d'émettre des messages de taille raisonnable contenant un grand nombre d'identifiants, et ouvre ainsi d'autres possibilités d'algorithmes et de comportements sociaux.
Une problématique générale aux réseaux distribués, c'est à dire sans serveur central, consiste à savoir choisir un noeud devant jouer un rôle particulier à un moment donné. Un moyen consiste à le désigner au hasard parmi les noeuds ayant la capacité de jouer le rôle attendu.
Un broadcast peut déclencher cette désignation, chaque noeud s'estimant capable, répond dans un laps de temps aléatoire, tant que personne ne s'est manifesté. Mais il faut alors considérer un élément de sécurité, à savoir qu'un noeud pirate peut vouloir prendre ce rôle en répondant avant tout le monde. Pour se protéger de cela, il faut intégrer une évaluation probatoire rendant suspects ceux qui répondent trop vites ou plusieurs fois et permettant de les récuser aléatoirement.
Ou bien, on peut demander à un noeud appelé "disposant" de désigner 3 noeuds distincts possibles pour le rôle et de demander à un autre noeud appelé "choisissant" de choisir le noeud qui aura le rôle parmi ces 3 noeuds. Ayant ainsi séparé la responsabilité en deux, le détournement de celle-ci est rendu plus difficile.
On voit dans ces exemples comment la programmation distribuée s'appuie sur les principes probatoires, à savoir que le caractère véridique d'un avis est renforcé lorsqu'il émane d'acteurs indépendants, qu'il est le résultat de plusieurs démonstrations concordantes utilisant des chemins différents, et que sa découverte et ses évolutions sont faites par des instances séparées. Ces principes ne ralentissent en rien le processus puisqu'ils sont implémentés de façon parallèle.
On peut définir un langage adapté pour programmer ces modèles de comportements sociaux, et mettre au point un interpréteur capable d'exécuter ces programmes comme des simulations que nous préférons appeler expérimentations exactes.
Afin de simplifier l'implémentation, la description du modèle de comportements sociaux sera écrite directement dans le code source du programme, insérée dans le logiciel interpréteur lui-même.
Une description trop fine du modèle physique risque d'introduire un niveau de complexité supérieur à la problématique initiale. Souvent, les modèles de comportements sociaux se compliquent en interférant avec des protocoles de plus bas niveau que l'on n'a pas réussie à complètement déléguer. On doit alors faire des hypothèses plus fortes pour écarter cette complexification, et établir un modèle comportemental basé sur un niveau de protocole plus élevé.
Il est donc nécessaire de poser préalablement le niveau de détail avec lequel on veut modéliser les comportements sociaux.
Puisque nous voulons repenser la conception de la pile des protocoles Internet telle que le modèle OSI en 7 couches, il faut commencer par le bas de la pile des protocoles que constitue la couche physique.
Le premier protocole décrit comment les hôtes émettent et réceptionnent des données via un média. On se place dans un modèle filaire classique (mode full-Duplex) où chaque hôte physique est raccordé à un unique hôte physique en tête-bêche, c'est à dire en deux connections, appelés segments, l'une reliant l'émetteur de l'hôte A au récepteur de l'hôte B, et l'autre reliant l'émetteur de l'hôte B au récepteur de l'hôte A. Les hôtes émettent et réceptionnent des trames composées d'une succession d'octets situées sur ces segments reliant un unique émetteur physique à un unique récepteur physique.
La localisation de la trame à ce niveau de détaille est le segment ou l'hôte si en attente d'émission. La trame est composée d'une suite d'octets et se déroule dans le temps.
On choisie de transmettre les informations les plus importantes en premier, ce qui correspond à l'endianess big-endian. Cela signifie que pour transmettre d'un nombre composé de plusieurs octets, on commencera par transmettre l'octet de poids le plus fort, et dans cet octet, on commencera par transmettre le bit de poids le plus fort. Cela signifie également que dans une suite de nombres, le premier nombre est considéré comme le plus important c'est à dire possédant le poids le plus élevé, et les suivant moins importants. Ainsi l'octet est représenté de gauche à droite par des bits du poids le plus forts au poids le plus faible, un nombre est représenté de gauche à droite par des octets du poids le plus forts au poids le plus faible, et une suite de nombres est représenté de gauche à droite par des nombres jugés les plus importants aux nombres jugés les moins importants.
Mais, par convention, l'adresse mémoire suit l'ordre des poids. C'est à dire que l'adresse mémoire de l'octet est d'autant plus élevée que l'octet est de poids fort. De même, on définie l'adresse d'un bit, et celle ci est d'autant plus grande que le poids du bit est grand. (Voir L'ordinateur ). Si nous étions resté dans le principe de l'endianess big-endian pour concevoir l'architecture de l'ordinateur, nous aurions choisie l'autre convention, en considérant la mémoire comme une liste de bits partant de l'adresse zéro, du bit le plus important au bit le moins important, de l'octet le plus important à l'octet le moins important. Mais depuis l'origine, les concepteurs des ordinateurs ont choisie l'autre convention...., une contradiction qui explique en grande partie pourquoi la notion de l'endianess actuelle est une notion difficile à percevoir.
Le niveau de détail choisi ici, introduit une nouvelle notion essentielle qu'est le segment. Le segment comprend un unique hôte physique émetteur et un unique hôte physique récepteur.
Avec la virtualisation, un hôte physique peut être constitué de plusieurs hôtes virtuels. Le segment peut alors relier plusieurs hôtes émetteurs à plusieurs hôtes récepteurs, sans que se pose la question des collisions, puisque physiquement il n'y a qu'un hôte émetteur et un hôte récepteur. La problématique des collisions est ainsi résolue par un paradigme de programmation parallèle auquel se soumet le protocole, de la même façon qu'elle se pose pour les switchs et les ponts.
On regroupe dans le segment, les caractéristiques physiques propres au média comprenant un délai de transmission τ en mico seconde, un niveau de brouillage µ, et les caractéristiques propres aux interfaces réseaux des hôtes (qui doivent être compatibles avec le média) comprenant un délai par trame τ1 en mico seconde (appellé IFS) augmenté d'un délai par octets τ2 en mico seconde, une taille minimale par trame en nombre d'octets n1 et une taille maximale par trame en nombre d'octets n2 (appelé MTU).
τ = Longueur_du_segment_en_mètres / 300
τ1 = 0.96
τ2 = 0.08
n1 = 64
n2 = 1518
Les contraintes techniques nécessites de commencer une trame par un préambule de 7 octets, chaque octet ayant la valeur 01010101, permettant de synchroniser l'horloge du récepteur avec l'horloge de l'émetteur, puis par un octet de début de trame (appelé SFD, Starting Delimitor Frame) ayant pour valeur 11010101, suivi des données transportées par la trame en un nombre d'octets compris entre n1 et n2.
Cette description correspond à un RFC, requests for comments, littéralement « demande de commentaires ». Les RFC constituent une série numérotée de documents officiels décrivant des aspects techniques de l'Internet. Nous imitons en quelque sorte ce fonctionnement dans le cadre de notre langage de programmation. Cette première description constitue un premier protocole dit physique, et est répertorié en le document P1, que l'on formalisera afin qu'il puisse constituer un élément de notre programme et qu'il puisse être ainsi interprété lors de son exécution.
On ne souhaite pas descendre à un niveau de détail en dessous. Seul les paramètres τ, µ, τ1, τ2, n1, n2, et les données de trame transmises après le préambule et le SFD de 8 octets, seront tenus comptes au dessus de ce protocole.
Les interfaces de réception des hôtes sont programmées parallèlement en plusieurs étages. Un premier étage filtre les trames ayant une entête précise décrite dans le protocole Hôte et les empile dans une mémoire tampon, une file d'attente de taille maximale M. Si l'interface est en mode promiscuous, aucun filtrage n'est fait et toutes les trames reçues sont transmises dans la file d'attente. Puis le second étage consulte régulièrement cette file d'attente pour traiter les messages reçus, avec une vitesse de calcule v exprimée sous forme de débit, c'est une capacité à traiter une quantité de données par seconde. Ces deux paramètres M, v sont regroupés sous forme d'une caractéristique physique C1.
La différence entre un protocole et une caractéristique tient dans le fait que le protocole doit être le même pour l'émetteur et le récepteur tandis que les caractéristiques peuvent être différentes. Et les caractéristiques s'empilent également comme les différentes couches d'un logiciel.
Le switch est considéré comme un PC ayant plusieurs interfaces réseaux, la caractéristique physique C1 contient alors un troisième paramètre n qui désigne le nombre de ports.
Afin de simplifier l'implémentation, la description du réseau local qui va servir de base à la simulation est écrite directement dans le code source du programme, inséré dans le logiciel interpréteur lui-même.
Une première partie répertorie les types de noeud. Une seconde partie répertorie les types de segment. Une troisième partie propre à l'interpréteur définie la structure d'un noeud et la structure d'un segment. Une quatrième partie instancie les différents composants du réseau. Et une cinquième partie décrit le graphe proprement dit du réseau.
Un noeud comprend la liste de ses caractéristiques C1, C2, C3... et la liste des protocoles P1, P2, P3... qu'il met en oeuvre.
Un segment comprend deux caractéristiques, un délai τ exprimée en micro seconde et un brouillage µ.
L'interpréteur mémorise dans chaque segment la file des octets qui transitent pendant un intervalle de temps assez large, avec pour chaque trame sa date d'émission et sa taille.
La caractéristique physique C1 comprend la rapidité de calcul v exprimée en mégaoctets par seconde, la taille maximale M de la file d'attente de ses interfaces réseaux exprimée en kilo-octet, et le nombre de port n.
Le protocole physique P1 comprend les paramètres τ1 et τ2 exprimés en micro seconde et les paramètres entiers n1 et n2.
Nous avons vue précédemment la couche physique. Les caractéristiques physiques d'un noeud comprennent les 3 paramètres M, v, n. Le type de segment comprend les 2 paramètres τ, µ. Le protocole comprend les 4 paramètres τ1, τ2, n1, n2.
La couche hôte met dans la trame, l'adresse hôte du destinataire, l'adresse hôte de l'émetteur, les données à transmettre, un éventuel bourrage de zéro pour compléter la trame de n2 octets minimum, puis le contrôle d'erreur checksum.
Si le media est soumis à un brouillage important, il devient nécessaire d'intégrer dans le protocole de la couche hôte, un niveau adaptable de redondance r1 avec un mécanisme de correction d'erreurs. Les composants et la mémoire de l'ordinateur peuvent aussi subir un brouillage tel que causé par la radioactivité, il devient alors nécessaire d'intégrer également dans le traitement informatique un niveau adaptable de redondance r2 avec un mécanisme de correction d'erreurs.
La couche hôte permet le filtrage des trames lors de la réception.
Certaines adresses hôtes sont réservées pour le multicast, et l'adresse hôte -1 est réservée pour le broadcast.
Chaque hôte d'un réseau local possède un unique numéro d'hote l'identifiant dans ce réseau local. C'est un unicast unique. Unicast, car il n'y a au plus qu'un seul hôte dans ce réseau local qui possède cette adresse. Et, unique car chaque hôte en possède qu'une seul de ce type. Cela est nécessaire pour pouvoir optimiser les algorithmes de communication. Mais on peut définir pour un même hôte plusieur adresses unicasts dites multiples. Ce sont d'autres numéros identifiant toujours de façon unique l'hôte. Ainsi un hôte possède un seul unicast unique et peut posséder plusieurs unicasts multiples, chacun pouvant servir d'identifiant de l'hôte. De même pour les multicasts. Chaque hôtes possède au plus un seul multicast unique (on dit qu'il s'inscrit dans un groupe multicast dit unique), et peut posséder plusieurs multicasts dits multiples (on dit qu'il s'inscrit dans plusieurs groupes multicasts dits multiples). Pour mettre en oeuvre ces différentes possibilités, il convient de spécifier à l'aide de 2 bits, les caractères unicast ou multicast, et unique ou multiple, créant ainsi 4 types d'adresse hôte. De tels modes d'adressage apportent-t-il réellement une plus grande interopérabilité sans engorger le réseau ni ralentir les interfaces ? Grâce au simulateur nous pourrons répondre à cette question.
La classe octale est le nombre d'octets nécessaires pour mémoriser une adresse. On considère une adresse sur 1, 2, 3 ou 4 octets, c'est à dire sur un nombre variables d'octets.
Selon le principe de l'endianess big-endian, la taille, qui spécifie la classe octale, est définie dans les 2 premiers bits, auquel on ajoute les 2 bits précédemment décrits. Ainsi selon la classe octale 1, 2, 3, 4, le nombre d'adresses unicasts uniques possibles est 15, 4 milles, 1 million, 250 millions.
La couche hôte met en oeuvre la fonction pause pour éviter les débordements. Lorsque un hôte possède sa file d'attente presque pleine sur un port d'entrer et qu'il reçoit une trame, il émet sur le port de sortie correspondant, une trame pause contenant une durée de temps de pause demandée. Puis s'il est à nouveau disponible avant l'écoulement de ce temps de pause, il réémet une trame pause contenant une durée de temps de pause nulle, celle-ci remplacera la demande de pause précédente. La trame ne contient pas d'adresse destinataire, ou plus exactement elle utilise une adresse destinataire réservée pour cet usage, un multicast multiple particulier, et s'adresse au seul transmetteur directement connecté.
Avec la couche liaison (niveau 2), nous allons décrire le principe d'encapsulation des protocoles. Ce principe d'encapsulation s'inscrit dans un paradigme plus vaste de programmation parallèle qui possède de nombreuse vertus, dont celle d'une grande inter-opérabilité. Il consiste à séparer les protocoles encapsulés et à les rendre totalement indépendants l'un de l'autre. Le protocole contenant ignore les données qu'il transporte, et le protocole contenu ignore par qui il est transporté. Grâce à cela, les protocoles de la couche liaison peuvent être conçus indépendament des protocoles utilisés pour la couche hôte qui eux-mêmes peuvent être conçus indépendament des protocoles utilisés de la couche physique.
Un message utilise un protocole. Sans la connaissance du protocole, le récepteur ne sera pas en capacité d'interpréter le message. Aussi il convient de préciser dans le premier mot du message, qu'elle est le protocole utilisé. Le message s'apparente alors à un objet qui peut être mémorisé dans une séquence contigüe de mémoire et où le premier mot désigne son type qui désigne ici le protocole utilisé. C'est le principe du typage des objets.
Ce principe peut s'appliquer à la trame physique qui commence par deux premiers octets du préambule 01010101 01010101. La trame physique correspond donc au protocole n°43690. Le protocole physique a pour fonction de synchroniser l'horloge du récepteur lors de la réception de la trame physique. Si on souhaite appliquer ce principe à la trame de la couche hôte, il convient alors d'ajouter un mot en tout premier pour désigner ce protocole. Ce sera le protocole n°1. On peut alors vouloir préciser la classe octale dans le numéro de protocole plutôt que dans les adresses HP. Auquel cas on définie les protocoles n°1, n°2, n°3 et n°4. Et ainsi on peut réutiliser les deux bits d'adresse qui étaient réservés pour désigner la classe octale. Le nombre d'adresses unicasts uniques possibles par classe octale devient 64, 16 milles, 4 millions, 1 milliard.
Le principe du typage des messages peut s'appliquer à tous les niveaux, jusqu'aux niveaux les plus élevés, les niveaux applicatifs.
Il existe un nombre potentiellement illimité d'applications et de types de donnés associés. Aussi le mot de typage du message est trop petit pour pouvoir contenir cette information et ne doit donc pas contenir complètement cette information. L'information va se retrouver dans les mots suivants à l'intérieur du message selon une règle dictée par le type désigné par le premier mot, ce qui correspond encore à une encapsulation de protocole, mais ici, pour un protocole applicatif qui ne commence pas par un mot de typage complet mais par une catégorie de typage plus vaste identifiant un type de données applicatives. Ce protocole applicatif se différencie alors des autres protocoles mais sans pour autant rompre avec le principe du paradigme, qui assure que le message contient dans son entête, qui peut être ici composée de plusieurs niveaux, l'information nécessaire pour pouvoir êre interpréter.
Une autre alternative est possible si on choisie une zone de taille variable pour désigner le type, et selon l'endianess big-endian, que l'on réserve les 4 premies bits pour définir sa taille. Les 4 premiers bits forment alors un typage de la zone de typage.
La première solution semble néanmoins la plus suimple et la plus rationnelle, même si elle nécessite une hierarchisation centralisée des types de protocoles et des normes associées, et qui est déjà en partie écrite par les RFC. Reste alors qu'il faudra veiller aux conditions d'une administration des espaces de normes transparente et démocratique.
---- 12 octobre 2014 ----
On privilègie l'endianess big-endian, le typage emboité, la hiérarchie des réseaux. L'implémentation des adresses IP doit permettre l'utilisation de préfixes d'adresses IP dans les tables de routage, et permettre l'utilisation d'adresses IP écourtées par le début selon un suffixe par défaut.
L'IP étant une suite de numéro de taille variable pouvant être 1, 2, 3,ou 4 octes, il convient de lister les numéros comme une suite contiguë de blocs de tailles variables, et comme on privilègie l'endianess big-endian, chaque bloc contient dans leur deux premiers bits (les bits de poid fort, les bits transmis en premier) sa taille en nombre d'octets.
Le premier octet précise la taille de l'adresse IP en nombre d'octets. Le second octet avec les 4 bits de poid fort du troisième octet précise le numéro du système d'adressage IP choisi. Les 4 bits de poid faible du troisième octet avec les 4 bits de poid fort du quatrième octet précise la taille du suffixe en nombre de numéros, et les 4 bits de poid faible du quatrième octet précise la taille du suffixe en nombre de bits concernant le dernier numéro du suffixe. Ces deux mots constitue l'entête de l'adresse IP. Ils sont suivie par une successions contiguë de blocs désignant une liste de numéros.
La taille du blocs est mémorisée dans les deux premiers bits du bloc. Cela ajoute une redondance en donnant un ordre de grandeur du numéros contenue dans le bloc, par une puissance de 256.
Qu'elle doit être le rôle de cette couche ? C'est à cette question que l'on s'attache à répondre sans apriori historique ni économique. L'abandon de l'adresse MAC au profit de l'adresse HP qui est le dernier numéro de l'adresse IP, va rendre inutile plusieurs protocoles (ARP, RARP...) et modifier des missions de la couche liaison. Certains protocoles qui sont placés sur la couche IP (niveau 3), davantage par facilité de programmation que par nécessité, peuvent en faite être intégrés dans la couche liaison (niveau 2).
Les trames possédant une erreur checksum sont ignorées dés la couche hôte (niveau 1). En effet, il n'est pas utile de répondre à une tel trame car l'erreur peut se situer dans l'adresse HP auquel cas le message ne nous est pas destiné.
Le rôle de la couche liaison (niveau 2) se limite au réseau local. Et cela en constitue sa définition. Ainsi, elle est susceptible d`héberger tout protocole qui est limité au réseau local.
Elle gère l'initialisation des hôtes d'un réseau local et l'interconnexion par ponts au niveau 2 de plusieurs réseaux locaux qui se trouvent ainsi réunis en un même réseau local plus vaste.
Elle peut gèrer le transfert de donnés limité au réseau local en envoyant une séquence de trames numérotées dans l'ordre, en assurant le contrôle du séquencement et en assurant l'accusé de réception si besoin, néanmoins cette dernière facultée n'est pas obligatoire et peut être réservée à la couche IP (niveau 3) faisant que le transfert de donnés n'est plus limité au réseau local.
Une trame doit avoir une taille comprise entre n1 et n2 octets selon les paramètres du composant réseau qui l'émet ou qui la reçoit. Ainsi une trame trop grande ou trop petite ne pourra pas être émise ou reçue par ce composant réseau. L'opération de scindement du message en plusieurs trames ainsi que l'opération inverse sont des opérations complexes que l'on évite, et qui, en tout cas, ne sont pas délégués dans les bases couches. Aussi, dans un réseau local, tous les composants réseaux doivent avoir les mêmes paramètres n1, n2. Ils doivent avoir la même MTU ou, dit autrement, on les paramètres avec la MTU minimale, le n2 minimal et le n1 maximal. Ces paramètres doivent être mémorisés par le réseau pour que chaque nouvel hôte puisse les récupérer lors de son initialisation dans le cadre du protocole DHCP.
---- 30 mai 2014 ----
La couche IP peut manipuler une adresse IP complète, c'est-à-dire une adresse Internet unique qui peut être très longue. Mais elle peut également manipuler des adresses IP écourtées par le début, selon un préfixe de début par défaut qui est l'adresse du réseau le plus fin dans lequel se situent l'émetteur, le destinataire et le routeur.
---- 5 mars 2014 ----