Au-delà de 127.0.0.1 : vous possédez 16 millions d'adresses loopback

Au-delà de 127.0.0.1 : vous possédez 16 millions d’adresses loopback

Table des matières

La plupart des développements locaux commencent de la même façon : vous démarrez un serveur et vous pointez votre navigateur vers localhost:8080 ou 127.0.0.1:8080.

Pendant des années, j’ai pensé que c’était exactement la même chose. Je pensais que 127.0.0.1 était une adresse IP unique et statique, réservée par le système d’exploitation pour le trafic local.

Puis je me suis retrouvé bloqué.

Je testais un système distribué. Le programme devait se connecter à trois nœuds différents. Chaque nœud s’attendait à communiquer avec une IP unique sur le port 8080. Sur une seule machine, il est impossible de lier trois processus différents à 127.0.0.1:8080. Les conflits de ports rendent cela impossible.

Je pensais avoir besoin de Docker ou de trois machines virtuelles. J’avais tort.

Le secret le mieux gardé du réseau

Votre ordinateur ne possède pas une seule adresse loopback. Si vous utilisez IPv4, vous possédez un /8 sous-réseau entier.

Selon la RFC 1122, tout le bloc 127.0.0.0/8 est réservé au loopback. Ce ne sont pas quelques adresses. Ce sont 224=16,777,2162^{24} = 16,777,216 adresses IP qui pointent toutes vers votre machine locale.

La première adresse (127.0.0.0) est réservée à l’identification du réseau et la dernière (127.255.255.255) à la diffusion. Il reste donc 16,777,21416,777,214 adresses utilisables. Elles permettent à votre machine de communiquer avec ses propres services sans que les données ne quittent jamais la pile réseau locale.

Essayez par vous-même

Vous n’avez rien à configurer. Votre système d’exploitation le sait déjà. Ouvrez un terminal et essayez de pinguer une adresse quelconque dans cette plage :

1$ ping 127.42.42.42
2PING 127.42.42.42 (127.42.42.42) 56(84) bytes of data.
364 bytes from 127.42.42.42: icmp_seq=1 ttl=64 time=0.049 ms
464 bytes from 127.42.42.42: icmp_seq=2 ttl=64 time=0.043 ms
564 bytes from 127.42.42.42: icmp_seq=3 ttl=64 time=0.036 ms
664 bytes from 127.42.42.42: icmp_seq=4 ttl=64 time=0.061 ms

Ça fonctionne. Aucune installation. Aucune configuration. Votre trafic ne quitte jamais la pile réseau.

Note

Sur macOS, le système peut ne pas router automatiquement toute la plage. Si le test échoue, vous devrez peut-être créer manuellement un alias sur l’interface loopback :

sudo ifconfig lo0 alias 127.42.42.42 up

Répétez l’opération pour chaque adresse spécifique que vous souhaitez utiliser.

Pourquoi est-ce important ? (La solution aux conflits de ports)

Dans une configuration réseau classique, un « socket » est la combinaison d’une adresse IP et d’un numéro de port.

Si vous liez un serveur web à 127.0.0.1:8080, ce port est occupé. Si vous essayez de lancer un second serveur sur 127.0.0.1:8080, vous obtenez la redoutée erreur EADDRINUSE.

Mais puisque vous disposez de 16 millions d’adresses, vous pouvez faire ceci :

  • Service A : lié à 127.0.0.1:8080
  • Service B : lié à 127.0.0.2:8080
  • Service C : lié à 127.0.0.3:8080

Ils tournent tous sur le port 8080. Ils tournent tous sur la même machine. Ils n’entrent pas en conflit.

Exemple pratique (Python3)

Pour voir cela en action, enregistrez ceci dans server.py :

 1from http.server import HTTPServer, BaseHTTPRequestHandler
 2from threading import Thread
 3
 4def start(ip, msg):
 5    class H(BaseHTTPRequestHandler):
 6        def do_GET(self):
 7            self.send_response(200)
 8            self.end_headers()
 9            self.wfile.write(msg.encode())
10        log_message = lambda *a: None # Coupe les logs dans la console
11
12    Thread(target=HTTPServer((ip, 8080), H).serve_forever).start()
13    print(f"Started: http://{ip}:8080")
14
15start('127.0.0.1', 'I am Node 1\n')
16start('127.0.0.2', 'I am Node 2\n')

Comment tester

  1. Lancez le script dans un terminal : python server.py
  2. Vérifiez dans un second terminal :
1$ curl http://127.0.0.1:8080
2I am Node 1
3
4$ curl http://127.0.0.2:8080
5I am Node 2

Pourquoi ça fonctionne

Le système d’exploitation identifie une connexion par la combinaison IP + Port. Les IP étant différentes, les sockets sont uniques. Vous pouvez étendre ce principe à toute la plage 127.0.0.0/8.

Le point de réalité avec IPv6

On ne peut pas parler de l’avenir sans mentionner IPv6. En IPv6, l’adresse loopback est strictement définie comme ::1. Cela ne signifie pas que tout s’arrête. Cela signifie simplement que la stratégie change.

Alors qu’IPv4 dispose d’un bloc pré-réservé (127.0.0.0/8), IPv6 exige que vous créiez explicitement des alias d’adresses issues de la plage Unique Local Address (ULA) (commençant par fd00::/8) sur votre interface loopback.

En assignant manuellement ces IP « privées » à votre pile locale, vous accédez en réalité à des milliards d’adresses potentielles. Votre environnement de simulation devient encore plus puissant et durable.

Cas d’usage concrets

Ce comportement réseau est particulièrement utile dans les situations suivantes :

  1. Développement de microservices : vous pouvez simuler un environnement de production où chaque service dispose de sa propre adresse IP. Tous les services peuvent ainsi utiliser des ports standards (comme 80 ou 443).
  2. Tests de systèmes distribués : lors du test d’algorithmes de consensus (comme Raft ou Paxos), chaque nœud peut avoir une identité distincte sans le coût de plusieurs machines virtuelles.
  3. Gestion d’identité locale : cela simplifie les tests locaux pour les applications qui s’appuient sur l’adresse IP source, par exemple pour la limitation de débit ou le contrôle d’accès basé sur l’IP.

Conclusion

Localhost est un nom. 127.0.0.1 n’est que la première maison d’un quartier immense. N’utilisez pas 127.0.0.1 uniquement parce que c’est la valeur par défaut. Utilisez l’aliasing d’interface pour créer autant d’identités locales que votre système en a besoin.

Que vous exploitiez le bloc historique 127.0.0.0/8 ou que vous configuriez la plage IPv6 moderne fd00::/8, vous disposez désormais des outils nécessaires pour simuler des environnements distribués complexes sur une seule machine, sans recourir à une virtualisation lourde.

Articles Connexes

`1ms` : La Fausse Promesse de `sleep()` pour le Code Temps Réel — Résolution et Jitter Réparées

1ms : La Fausse Promesse de sleep() pour le Code Temps Réel — Résolution et Jitter Réparées

Si vous avez déjà créé un système en temps réel, un simulateur de données ou une boucle de jeu, vous avez probablement essayé d’utiliser sleep() …

Lire la suite
5 Commandes Essentielles pour Déboguer le Réseau sur Linux Minimal

5 Commandes Essentielles pour Déboguer le Réseau sur Linux Minimal

[Dernière mise à jour: 30 octobre 2025]

Si vous êtes développeur et devez diagnostiquer des problèmes réseau dans des conteneurs ou sur Linux minimal, vous remarquerez que de nombreux outils …

Lire la suite