Pourquoi localhost IP 127.0.0.1?

85

Je me suis demandé quelle est l'origine de la décision de prendre localhostl'adresse IP 127.0.0.1. Quel est le "sens" de 127? quel est le "sens" de 0.0.1?

Roee Adler
la source
2
Je suis curieux à ce sujet aussi. Le bouclage IPv6 est 0: 0: 0: 0: 0: 0: 0: 1, ce qui est logique pour moi.
hyperslug
1
Oui, l'hôte local d'IPv6 ne soulève pas trop de questions :)
Roee Adler
21
Je n'ai pas encore vu de tapis de porte "Il n'y a pas d'endroit comme 0: 0: 0: 0: 0: 0: 0: 1"!
William Hilsum
9
@Wil Compressez-le "il n'y a pas de place comme :: 1" et vous aurez un peu plus de travail.
new123456
6
@WilliamHilsum développez-le en "Il n'y a pas d'endroit comme 0000: 0000: 0000: 0000: 0000: 0000: 0000: 0001" et chargez davantage.
Nick T

Réponses:

87

127 est le dernier numéro de réseau d’un réseau de classe A avec un masque de sous-réseau de 255.0.0.0. 127.0.0.1est la première adresse assignable du sous-réseau. 127.0.0.0ne peut pas être utilisé car ce serait le numéro de fil. Mais l'utilisation de tout autre numéro pour la partie hôte devrait fonctionner correctement et revenir à l'utilisation 127.0.0.1. Vous pouvez essayer vous-même en faisant un ping 127.1.1.1si vous le souhaitez. Pourquoi ont-ils attendu le dernier numéro de réseau pour implémenter cela? Je ne pense pas que c'est documenté.

John T
la source
14
La seule raison pour laquelle je les verrais choisir arbitrairement 127 est que c’est un numéro facile à retenir (01111111), et peut-être permettaient-ils à 16 millions d’adresses d’hôte de communiquer avec lui-même et uniquement (comme certains programmes et composants Windows utilisent ports de nos jours). Les RFC mentionnent seulement qu'il est d'usage courant d'utiliser 127.0.0.1/32 pour le bouclage. C'est assez nébuleux quant à ce qu'ils voulaient pour le reste du bloc, mis à part le fait qu'il reboucle sur l'hôte et ne frappe jamais le réseau, d'où mes spéculations ci-dessus.
RoyalKnight
2
Le fait de revenir à 127.0.0.1 pour toutes les adresses de bloc dépend de la mise en œuvre et pourrait peut-être simplement être une particularité de la pile Linux. Solaris nécessite au moins qu'une interface soit liée à l'adresse de destination pour que votre test de ping réussisse.
Jlliagre
56

La première mention que je puisse trouver concernant la mission de 127 en tant que bouclage est la RFC 990 de novembre 1986 rédigée par Reynolds et Postel:

L'adresse zéro doit être interprétée comme signifiant "ceci", comme dans "ce réseau".

Par exemple, l'adresse 0.0.0.37 pourrait être interprétée comme signifiant l'hôte 37 sur ce réseau.

...

La fonction de "bouclage" est attribuée au numéro de réseau de classe A 127, c'est-à-dire qu'un datagramme envoyé par un protocole de niveau supérieur à une adresse de réseau 127 doit revenir en boucle à l'intérieur de l'hôte. Aucun datagramme "envoyé" à une adresse de réseau ne devrait jamais apparaître sur aucun réseau, où que ce soit.

Dès septembre 1981, les RFC 790 , 0 et 127 étaient déjà réservés:

000.rrr.rrr.rrr Réservé [JBP]
...
127.rrr.rrr.rrr réservé [JBP]

0 et 127 étaient les seuls réseaux de classe A réservés en 1981. 0 était utilisé pour pointer vers un hôte spécifique, de sorte qu'il en restait 127 pour le bouclage.

Je sais que cela ne répond pas à la question, mais c'est aussi loin que j'ai pu creuser. Il aurait peut-être semblé plus judicieux de choisir 1.0.0.0 pour le bouclage, mais cela avait déjà été donné à BBN Packet Radio Network.

hyperslug
la source
23

Les concepteurs d’Internet savaient vraiment comment le matériel fonctionnait et ils ont conçu pour une implémentation de bas niveau.

Les valeurs 0, 127 et 255 sont spéciales dans la programmation en assemblage 8 bits et en langage machine car il existe des "astuces" que vous pouvez utiliser pour tester ces valeurs et passer à un code différent à l'aide d'instructions plus petites s'exécutant plus rapidement que pour les autres entiers. 127 est le plus grand nombre entier signé de 8 bits, aussi, l'incrémenter de 1 entraînera un dépassement de signature. De même, l'incrémentation de 255 entraînera un débordement non signé. Le simple chargement de la valeur 0 dans un registre définit généralement un indicateur zéro sur la puce. Imaginez que le programme réseau ressemble à ceci en pseudocode:

if (value == 0) doLocal();
if (value == 127) doLoopback();
if (value == 255) doNetwork();

Bien que cela dépende de la puce, la plupart des puces pouvaient alors coder ces tests avec 2 mots, 3 mots et 3 mots respectivement (8 mots au total). De plus, ces tests particuliers étaient tous susceptibles de s'exécuter en 1 cycle d'horloge chacun. L'utilisation de toute autre valeur nécessiterait probablement 4 mots chacun (12 mots au total), une augmentation de 50% de la taille du code et probablement une augmentation de 50% du temps d'exécution.

Joseph Bui
la source
1
Notez que j’ai utilisé des "mots" car les anciennes machines avaient à l’époque des tailles de mot inhabituelles, mais elles utilisaient encore souvent l’arithmétique en 8 bits. Pour un 8088, j'aurais dit "octets".
Joseph Bui
5

Si vous réfléchissez à ce que signifie une adresse IP d'hôte local ou de bouclage, vous réalisez que vous ne voulez jamais voir cette adresse, ni le réseau auquel cette adresse appartient, en dehors d'un hôte. (À l'intérieur d'un hôte, il fait trop sombre pour le voir. Toutes mes excuses à Mark Twain.)

Donc, quelqu'un devait choisir un réseau IP pour représenter cette adresse localhost. Je ne me souviens pas du premier qui l'a choisi, mais cela est spécifié dans la demande de commentaires de l'IETF qui est périodiquement publiée en tant que "Configuration requise pour l'hôte".

Cela avait été fait il y a si longtemps que l'idée de "gâcher" une adresse entière de la classe A n'était entrée dans l'esprit de personne à l'époque.

L'utilité de localhost est que vous pouvez vous parler en utilisant une adresse IP codée en dur. Il était utilisé bien avant la mise en place du système de noms de domaine. Vous pouvez en fait utiliser n'importe laquelle des adresses valides 127.xxx, mais personne ne le fait jamais. Vous ne pouvez pas utiliser furtivement 127 comme un véritable réseau, car le RFC "Exigences de routeur" interdit tout routage de ce réseau sur Internet.

kwe
la source
4

Tout d’abord, l’ensemble de la plage 127.xxx pointe vers votre hôte local.
127 en binaire est "01111111". "11111111" = 255 et 0 sont réservés, le choix est donc évident :)

kolypto
la source
25
Comment se fait-il que ce soit à nouveau évident?
Roee Adler
Je crois qu'ils ont juste choisi quelque chose de simple. Encore une fois, tous les "1" sont réservés, donc un zéro a été ajouté :)
kolypto
alors pourquoi ne pas 10111111? :) ou 11011111 ou 11101111 ou 11110111 ou 11111011 ou 11111101 ou quelque chose du genre?
Mushex Antaranian,
1
Nan. Réessayer.
Ardee Aram
3

Parce que lors de la création de ces normes, les ordinateurs étaient lents et généralement limités à des registres à 8 bits. La comparaison des chiffres avec les nombres était très lente, surtout si ces nombres devaient être récupérés à partir de la mémoire arrière, VRAIMENT lente. Les registres, c’est-à-dire le stockage "CPU sur carte", étaient beaucoup plus rapides.

De plus, ces anciens ordinateurs avaient des instructions spéciales plus rapides pour détecter "égal à zéro", "différent de zéro", "entier négatif / positif" (où le signe était ... devinez quoi, le bit le plus à gauche, voyons maintenant une connexion avec 127 , c’est le nombre avec tous les "1" binaires sauf le signe = le plus à gauche?).

Par conséquent, il s’agissait de numéros spéciaux, car ils permettaient à la logique de programmation d’économiser de nombreux cycles de processeur pour les opérations fréquemment effectuées.

Vous ne verrez jamais un "IF CallerIP =" 0 "mais une instruction" IF NotZero (CallerIP) ".

Vous pouvez consulter des instructions de montage anciennes telles que "BEQ, BNE" (6502 CPU) pour de plus amples explications. Consultez également cette page .

À la fin:

Les valeurs 0, 255 et 127 peuvent toutes être vérifiées avec une seule instruction, la plus rapide. Encore plus de langages de haut niveau tels que C ont des fonctions de comparaison "shortuct" que le compilateur peut optimiser en interne en une seule instruction.

Les programmeurs des années 70 et 80 ont vraiment produit de magnifiques architectures avec des ressources extrêmement rares. Derrière des normes telles que la numérotation IP, il y a beaucoup de réflexion et de génie.

Dario Fumagalli
la source
Très bonne réponse. C'est vraiment l'explication la plus claire et la plus sensée.
not2qubit
En fait, à l'époque de la conception de l'IP et de la préparation de ses premières bases, travailler avec des données sous forme de multiples entiers de 8 bits n'était pas évident. Par exemple, de nombreuses architectures avaient des registres et des tailles de mot multiples de 12 ou 18 bits. C'est l'une des raisons pour lesquelles Octal était si populaire à l'époque. 18 bits peuvent être représentés avec exactement 6 chiffres octaux sans perte ni perte; 12 bits est 4 chiffres octaux. Les micro-ordinateurs fonctionnaient généralement en 8 bits, mais ce n’est que bien plus tard que les micro-ordinateurs ont commencé à être connectés régulièrement (en particulier directement) à Internet.
un CVn