9.8. Ports

Une adresse IP indique à quel hôte un paquet est destiné. Un hôte moderne exécute de nombreux programmes à la fois – un navigateur web, un client de messagerie, un appel vidéo, une tâche de sauvegarde – et chacun d’eux envoie et reçoit des paquets en parallèle. La couche IP n’a aucun moyen de les distinguer ; elle se contente de remettre chaque paquet entrant à « l’hôte ». Quelque chose doit décider quel paquet appartient à quel programme.

Le numéro de port est la réponse. Chaque paquet de la couche transport porte deux champs supplémentaires au-delà de l’en-tête IP : un port source et un port de destination. Chacun est un entier sur 16 bits, il existe donc 65535 numéros de port possibles par hôte. Combiné à l’adresse IP, le port identifie un point d’extrémité spécifique à l’intérieur d’un hôte – la conversation spécifique d’un programme spécifique.

Une seule boîte d'hôte à droite avec une adresse IP étiquetée en haut. Trois programmes à l'intérieur de l'hôte sont étiquetés « serveur HTTP », « appel vidéo », « client de messagerie », chacun connecté à un numéro de port différent étiqueté 80, 5004, et 4321 respectivement. Trois flèches arrivent à l'hôte depuis le réseau, chacune marquée d'un port de destination ; chaque flèche aboutit au programme correspondant.

De nombreux programmes partagent une seule adresse IP ; le port de destination achemine chaque paquet entrant vers le bon.

9.8.1. Ports bien connus

Les 1024 premiers numéros de port sont réservés par convention aux services standard. Quelques-uns que le lecteur rencontrera :

  • 22 – SSH (le protocole Secure Shell, utilisé pour la connexion distante chiffrée).

  • 53 – DNS, le système de noms de domaine (abordé sur Noms et DNS).

  • 80 – HTTP, le protocole de transfert hypertexte – le protocole non chiffré du web.

  • 123 – NTP, le protocole de temps réseau (la façon dont les appareils règlent leur horloge à partir d’un serveur de temps).

  • 443 – HTTPS, HTTP transporté par-dessus TLS (Transport Layer Security, l’enveloppe de chiffrement standard des protocoles internet) – le protocole derrière chaque page web qui affiche une icône de cadenas dans le navigateur.

C’est cette convention qui permet à un navigateur de se connecter à http://example.com sans spécifier de port – il suppose 80, car c’est le port bien connu pour HTTP. Une caméra se connectant à un serveur web fait de même.

Au-delà de 1024, les numéros de port sont sans restriction et n’importe quel programme peut en revendiquer un. Les serveurs de bases de données (5432 pour PostgreSQL, 3306 pour MySQL), les serveurs d’applications et les protocoles personnalisés résident tous quelque part dans la plage supérieure.

9.8.2. Ports éphémères

Les serveurs écoutent sur un port connu. Les clients utilisent un port différent de leur côté, choisi à neuf pour chaque connexion sortante.

Lorsque la caméra se connecte à un serveur web sur le port 443, la conversation a lieu entre

camera IP : <some-port>     <-->     server IP : 443

Le <some-port> est un port éphémère – MicroPython choisit un numéro inutilisé dans une plage élevée, l’utilise pendant la durée de la connexion, puis le libère ensuite. Le script n’a pas à se soucier du numéro choisi ; la couche socket s’en charge.

9.8.3. Écouter ou dialoguer

Le rôle joué par un port dépend du côté de la conversation où il se trouve. Deux cas distincts :

  • Un port en écoute appartient à un programme qui veut recevoir des connexions non sollicitées. Le programme indique à MicroPython « tout paquet entrant qui m’est adressé sur le port 80 est pour moi », puis attend. Les serveurs procèdent ainsi.

  • Un port connecté appartient à un programme qui veut initier une conversation. Le programme choisit (ou demande à MicroPython de choisir) un port éphémère, envoie un paquet avec ce port comme port source et le port bien connu du serveur comme destination, et utilise la même paire de ports pour le reste de la conversation.

Un seul programme peut faire les deux à la fois, en détenant des ports différents pour chaque rôle. Une caméra pourrait écouter sur le port 8000 les connexions HTTP entrantes d’une interface utilisateur de configuration et maintenir une connexion HTTPS sortante vers un serveur distant sur le port 443. Les deux rôles n’interfèrent pas – chaque conversation est identifiée par le quadruplet complet (src IP, src port, dst IP, dst port), et aucune paire de conversations ne partage le même quadruplet.

9.8.4. Ce que les ports débloquent

Avec les ports en place, la couche transport peut enfin résoudre le problème de livraison de programme à programme. Un paquet porte désormais assez d’informations pour être acheminé non seulement vers le bon hôte (l’adresse IP), mais aussi vers le bon socket à l’intérieur de cet hôte (le numéro de port).

Les deux pages suivantes couvrent les deux variantes que la couche transport offre par-dessus cet adressage : UDP (le User Datagram Protocol – chaque paquet indépendant, sans garanties) et TCP (le Transmission Control Protocol – un flux connecté, fiable et ordonné).