9.2. Protocoles en couches

Envoyer une trame de la caméra vers un serveur situé dans une autre ville revient à résoudre plusieurs problèmes à la fois. Le signal électrique doit franchir le premier fil. Les octets présents sur ce fil doivent trouver leur chemin à travers un commutateur local. Le réseau local doit transmettre le message à ce qui se trouve entre lui et le reste d’Internet. Les paquets qui survivent au trajet doivent être réassemblés dans l’ordre. Le destinataire doit savoir à quel de ses programmes les remettre. Et les octets eux-mêmes doivent avoir un sens sur lequel les deux extrémités s’accordent.

Tenter de résoudre tout cela dans un seul bloc de code serait ingérable. La réponse standard consiste à diviser le travail en couches. Chaque couche résout un problème bien défini et expose un service simple à la couche supérieure. Un programme ne dialogue jamais qu’avec la couche située directement en dessous de lui ; les couches inférieures à celle-ci sont invisibles.

Une pile verticale de cinq cases étiquetées de bas en haut : physique, liaison, réseau, transport, application. Une flèche à droite pointe vers le haut de la pile et porte la mention « ce que nous construisons ». Une flèche à gauche pointe vers le bas de la pile et porte la mention « ce qui est fourni ».

Chaque couche d’une pile réseau résout un problème et présente une abstraction propre à la couche suivante.

9.2.1. Les cinq couches

Les noms ci-dessous sont ceux qu’utilise le reste de cette section. Ils proviennent du modèle standard autour duquel les réseaux ont été conçus. Les frontières exactes entre les couches sont parfois floues, mais le rôle joué par chacune reste stable.

Couche physique. Déplacer des bits entre deux appareils sur le même fil ou la même liaison radio. Niveaux de tension, impulsions lumineuses, modulation RF. Le rôle de la caméra ici se limite essentiellement à brancher le bon câble ou à rejoindre le bon réseau sans fil ; le silicium fait le reste.

Couche liaison. Déplacer des trames (petits blocs d’octets) entre deux appareils qui partagent un segment local. Elle ajoute des adresses matérielles afin que chaque trame puisse être dirigée vers un voisin spécifique. Ethernet et Wi-Fi sont les deux technologies de liaison que la caméra rencontre en pratique.

Couche réseau. Déplacer des paquets entre deux appareils quelconques sur Internet, et pas seulement sur le même segment local. Elle ajoute une adresse de niveau logiciel qui identifie un hôte indépendamment du câble auquel il est relié, ainsi qu’un mécanisme de routage qui fait sauter un paquet d’un segment local au suivant jusqu’à son arrivée. C’est la première couche où le code Python de la caméra commence à avoir son mot à dire.

Couche transport. Se place au-dessus des paquets et propose une livraison entre programmes sur deux hôtes, et pas seulement entre les hôtes eux-mêmes. Deux variantes sont courantes : l’une livre un flux d’octets connecté et ordonné (le cheval de bataille de la plupart du trafic), l’autre livre des messages autonomes qui voyagent indépendamment les uns des autres (utilisée lorsque la faible surcharge importe plus que les garanties). Elle ajoute des numéros de port afin que plusieurs programmes sur le même hôte puissent mener des conversations en parallèle.

Couche application. Tout ce qui se trouve au-dessus du transport : les protocoles qui donnent un sens aux octets. Ceux que parle un navigateur web pour charger des pages – et ceux qui sous-tendent presque tous les autres services Internet que le lecteur utilise déjà au quotidien – résident ici. Le tutoriel traite le transport en profondeur ; cette couche bénéficie d’une section dédiée qui suit.

9.2.2. Comment les couches s’empilent à l’exécution

Lorsque la caméra envoie des octets sur le réseau, chaque couche ajoute son propre en-tête devant les données, comme on imbrique une enveloppe dans une autre enveloppe :

  • Les octets de l’application sont placés en premier.

  • La couche transport les enveloppe avec un petit en-tête indiquant à quel programme ils appartiennent (le numéro de port).

  • La couche réseau enveloppe cela avec un en-tête indiquant à quel hôte ils sont destinés (l’adresse de niveau logiciel).

  • La couche liaison enveloppe cela avec un en-tête indiquant à quel appareil du segment local les remettre ensuite (l’adresse matérielle).

  • La couche physique transforme l’ensemble du paquet en bits sur un fil.

À l’autre extrémité, chaque couche retire son propre en-tête et transmet le reste vers le haut. L’application réceptrice récupère ses octets sans savoir que les couches réseau, liaison et physique ont jamais existé.

Cette imbrication explique pourquoi le tutoriel procède de bas en haut. Comprendre ce que fait la couche du dessous rend la couche supérieure évidente. Les deux couches inférieures sont couvertes en une seule page chacune, car il n’y a presque rien à configurer depuis Python. À partir de la couche réseau et au-dessus, le rythme ralentit à mesure que le rôle de Python s’élargit.