Pourquoi y a-t-il une différence entre “hôte local” et “adresse IP locale”?


32

Utiliser cmdet pingsous Windows m'a donné les résultats suivants:

  • Ping "localhost":

Enter image description here

  • Pinging "192.168.0.10" (adresse IP locale):

Enter image description here

Les deux situations ne sont-elles pas exactement les mêmes?

Je veux dire, je cingle la même interface, la même machine et la même adresse. Pourquoi ai-je des résultats si différents?

EDIT: Voici mon ipconfig /allécran:

Enter image description here


18
Vous n’utilisez pas la même interface , même sans interface physique, vous avez toujours un "hôte local".
Tamara Wijsman

Si par "la même interface", vous parlez de l'interface de bouclage, vous avez raison. Si vous parlez de l'interface Ethernet, vous vous trompez pour plusieurs raisons. (Par exemple, comment est associé: 1 à l’interface Ethernet? Et pourquoi l’interface Ethernet, dont le travail consiste à envoyer des paquets Ethernet sur le fil et à les recevoir du fil, est-elle impliquée dans une opération qui n’implique jamais une Paquet Ethernet ou un fil?)
David Schwartz

Je suis à peu près sûr que cette question a déjà été posée sur Stackoverflow, si je peux la trouver ...
Chris S

Je crois que le SO répond au cœur de cette affaire
Dawson Toth le

Je pense que la chose intéressante est: pourquoi obtenez-vous un nombre d'octets transférés et une durée de vie lorsque vous envoyez une commande ping à un hôte distant, mais pas lorsque vous faites une commande localehost? Personne ne se soucie probablement que le format de l'adresse IP soit un peu en retrait.
Dhasenan

Réponses:


46

Vous ne lancez pas la même interface , sans aucune interface physique, vous avez toujours un "hôte local".

Votre localhostest utilisé pour faire référence à votre ordinateur à partir de son IP "interne", et non à partir de toute adresse IP "externe" de votre ordinateur. Ainsi, les paquets ping ne passent par aucune interface réseau physique; uniquement via une interface virtuelle de bouclage qui envoie directement les paquets d'un port à l'autre sans aucun saut physique.

Vous pouvez toujours vous demander pourquoi localhostrésoudre ::1, alors qu'habituellement, nous nous attendions à ce que ce soit une adresse IPv4 127.0.0.1. Notez qu'il .localhosts'agit généralement d'un TLD (voir RFC 2606 ) qui pointe vers l'adresse IP de bouclage (pour IPv4, voir RFC 3330 , en particulier 127.0.0.0/8).

Levant les yeux localhost utilisant nslookupnous donne:

nslookup localhost

...
Name:    localhost
Addresses:  ::1
          127.0.0.1

Ainsi, Windows préfère utiliser l'adresse IP de bouclage IPv6 ::1(voir RFC 2373 ), car elle est répertoriée en premier.

D'accord, d'où vient-il, examinons le fichier hosts.

type %WINDIR%\System32\Drivers\Etc\Hosts

...
# localhost name resolution is handled within DNS itself.
#       127.0.0.1       localhost
#       ::1             localhost
...

Hmm, nous devons examiner les paramètres DNS de Windows.

Cet article de la Base de connaissances décrit un paramètre qui affecte ce que Windows préfère, souligné en gras:

  1. Dans l'Éditeur du Registre, recherchez, puis cliquez sur la sous-clé de registre suivante:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters
    
  2. Double-cliquez sur DisabledComponents pour modifier l'entrée DisabledComponents.

    Remarque: Si l'entrée DisabledComponents n'est pas disponible, vous devez la créer. Pour le faire, suivez ces étapes:

    1. Dans le menu Edition, pointez sur Nouveau, puis cliquez sur Valeur DWORD (32 bits).

    2. Tapez DisabledComponents, puis appuyez sur Entrée.

    3. Double-cliquez sur DisabledComponents.

  3. Tapez l'une des valeurs suivantes dans le champ Données de la valeur: pour configurer le protocole IPv6 à l'état souhaité, puis cliquez sur OK:

    • Type 0 pour activer tous les composants IPv6. (Paramètre par défaut de Windows)
    • Type 0xffffffff pour désactiver tous les composants IPv6, à l'exception de l'interface de bouclage IPv6. Cette valeur configure également Windows pour qu'il préfère utiliser Internet Protocol version 4 (IPv4) plutôt que IPv6 en modifiant les entrées du tableau de stratégie de préfixe. Pour plus d'informations, voir Sélection d'adresses source et de destination.
    • Tapez 0x20pour préférer IPv4 à IPv6 en modifiant les entrées du tableau de règles de préfixe.
    • Type 0x10 pour désactiver IPv6 sur toutes les interfaces non-tunnel (sur les interfaces de réseau local et de protocole point à point [PPP]).
    • Type 0x01 pour désactiver IPv6 sur toutes les interfaces de tunnel. Ceux-ci incluent les protocoles ISATAP (6), 6to4 et Teredo.
    • Tapez 0x11pour désactiver toutes les interfaces IPv6 à l'exception de l'interface de bouclage IPv6.
  4. Redémarrez l'ordinateur pour que ce paramètre prenne effet.

Quelle est cette table de politique de préfixe?

netsh interface ipv6 show prefixpolicies(ou prefixpolicysur les versions antérieures)

Precedence  Label  Prefix
----------  -----  --------------------------------
        50      0  ::1/128
        45     13  fc00::/7
        40      1  ::/0
        10      4  ::ffff:0:0/96
         7     14  2002::/16
         5      5  2001::/32
         1     11  fec0::/10
         1     12  3ffe::/16
         1     10  ::/96

Cette table détermine quels préfixes ont la priorité sur les autres préfixes lors des résolutions DNS.

Alors, en utilisant cette base de connaissances, nous pourrions ajouter ici des entrées indiquant que la priorité IPv4 est supérieure à IPv6.

Remarque: Il n'y a aucune raison de remplacer ce comportement, sauf si vous rencontrez des problèmes de compatibilité. La modification de ce paramètre sur notre serveur Windows a brisé notre serveur de messagerie, il doit donc être manipulé avec précaution ...


En réalité, "localhost" n'est pas un domaine de premier niveau, mais un nom d'hôte. La distinction est extrêmement subtile, mais chaque nom de domaine est fondamentalement un nom d’hôte, mais tous les noms d’hôte ne sont pas des noms de domaine. Par convention, les noms d’hôte se terminant par un arrêt complet doivent être du nom de domaine complet, et la plupart des noms d’hôte ne se terminant pas par un arrêt complet peuvent être convertis en nom de domaine complet en ajoutant le domaine parent, puis en ajoutant la racine si besoin est. Cependant, ce ne sont que des conventions. 'localhost' est réservé par la RFC 2606 pour l'empêcher de devenir un TLD, car il risque de ne pas fonctionner correctement et même causer des problèmes.
Kevin Cathcart

2
Incorrect, comme le mentionne la RFC 2606: The ".localhost" TLD has traditionally been statically defined in host DNS implementations as having an A record pointing to the loop back IP address and is reserved for such use. Notez l'utilisation de TLDet la note qui est traditionnellement définie . En fait, des ping localhost.travaux qui confirment que cela est au moins vrai dans le contexte de cette question. Votre dernière phrase est pas ce que le RFC a dit, s'il vous plaît citation si elle ne « l' empêcher de devenir un TLD » parce que par ce qu'il dit , il est traditionnellement un TLD. Sinon, ils ne feraient pas référence àthe .localhost TLD
Tamara Wijsman

J'étais un peu trop fort. localhostpeut être un TLD si un serveur DNS réel répond, mais généralement localhost est généralement défini comme un nom d'hôte dans / etc / hosts, dans lequel les noms d'hôte sont recherchés avant toute tentative de résolution via DNS. En tant que tel, dig localhostil ne retourne généralement pas un enregistrement "A" pour 127.0.0.1, ni un enregistrement AAAA pour:: 1. Cela signifie que la RFC se trompe lorsqu'elle dit traditionally been statically defined in host DNS implementations, mais qu'elle est plutôt renvoyée par le service de recherche de noms du système, qui n'utilise pas toujours le DNS.
Kevin Cathcart le

@KevinCathcart: Nous sommes ici dans une question sur Windows, et les versions Windows le mentionnent est fait par DNS lui-même. nslookuprenvoie des enregistrements. Alors, YMMV ...
Tamara Wijsman

1
@KevinCathcart mes digdéclarations enregistrements A, AAAA et NS pour localhost, y compris une notice d'autorité pour:localhost. IN NS localhost.
KutuluMike

20

L’ interface de bouclage existe indépendamment de votre ou vos interfaces Ethernet.

Même sans la complication d' IPv6, vous auriez deux adresses distinctes.

Adresse IPv4 de bouclage : 127.0.0.1
votre interface Ethernet: 192.168.0.10

L’interface de bouclage pourrait bien se trouver dans une couche logicielle différente, plus éloignée du matériel réel. Je doute que cela dépend par exemple de votre pilote d’interface Ethernet spécifique.


11

Localhost et votre adresse IP ne sont pas la même chose.

Le localhost est une adresse IP uniquement logicielle spéciale, liée à votre système. Localhost, ou 127.0.0.1, est une adresse de bouclage. Il pointe toujours vers votre système et n’est accessible que depuis votre ordinateur. Ce routage se produit au niveau du système d'exploitation et ne quitte définitivement jamais la carte réseau ... Il n'y a donc aucune chance pour qu'il atteigne le réseau ....

Faire un ping avec votre propre adresse IP est similaire, mais implique potentiellement l’ensemble de la pile réseau, car il doit détecter qu’il s’agit bien de votre adresse IP et l’ acheminer correctement ...

L'effet devrait être le même, mais il peut y avoir des différences.

Par exemple, débranchez votre câble réseau. Cinglez votre adresse IP statique. Vous pouvez obtenir aucune route à héberger, ou d'autres erreurs. Ping maintenant localhost ou 127.0.0.1, et cela fonctionnera.


Alors, ping localhost est complet inutile? Je veux dire, si je veux tester mon interface ....
Diogo

4
@ DiogoRocha correct, ping localhost ne touche jamais le matériel. Heck ping 192.168.0.10 peut ne pas vous donner une information fiable aussi si le pilote de la carte réseau intercepte les requêtes données à lui-même.
Scott Chamberlain

@ DiogoRocha Votre terminologie est désactivée. 127.0.0.1 est une interface, mais virtuelle.
Barlop

@ Diogo, pas tout à fait. Localhost vous permet de tester le comportement réseau d'une application ou de vérifier que la pile réseau fonctionne ... Mais elle ne teste pas le pilote. Ainsi, par exemple, si vous avez un mauvais pilote de carte réseau, localhost peut vous aider à prouver que c’est le pilote nic. Votre kilométrage variera certainement quand même !!
Benjamin Schollnick,

6

Je réalise à partir des captures d'écran que cette question ne concerne pas Linux, mais elle constitue peut-être un "cas d'école" utile.

Sur cet OS, si vous envoyez une requête ping à l’une de vos adresses d’adaptateur local, elle est traduite dans le périphérique de bouclage (cas particulier). Cela signifie que les paquets vont en réalité au périphérique de bouclage (ce qui a toutes les implications que vous pourriez penser: par exemple, du point de vue du pare-feu, ces paquets arrivent sur l'interface de bouclage et respecteront les règles de cette interface).

Le périphérique auquel l'adresse IP est attribuée ne verra jamais les paquets. (C’est bien parce que cela ne ferait pas le bon choix avec ces paquets: il voudrait faire sortir les ventouses.)

Cependant, si l'interface qui contient cette adresse IP devait tomber en panne, vous avez perdu cette connexion. Le mappage en boucle cessera de fonctionner.

En d’autres termes, c’est une conception viable de considérer ces adresses locales comme des alias du périphérique de bouclage.

Références de code:

http://lxr.linux.no/#linux+v3.3.2/net/ipv4/route.c#L2623

Regardez la fonction ip_route_output_slow. Ceci appelle fib_lookup, et si cette fonction retourne le code RTN_LOCAL, dev_outest réécrit en boucle:

http://lxr.linux.no/#linux+v3.3.2/net/ipv4/route.c#L2769


4

Il semble que l'alias "Localhost" résolve le bouclage IPv6 et que vous utilisez explicitement une adresse IPv4, ce n'est évidemment pas le cas.


6
Le système d'exploitation semble être en désaccord avec vous.
EBGreen

6
Peu importe, il est apparemment configuré pour l'ordinateur, localhost frappe le bouclage ipv6.
Rob

1
@ DiogoRocha Il n'y a pas une telle adresse :: 1 dans le monde IPV4. 127.0.0.1 est l'adresse IP réservée au bouclage. :: 1 Cependant, N'EXISTE PAS pour IPV6 et, comme 127.0.0.1, est réservé pour le bouclage IPV6.
Andy

4
Comment cela répond-il à la question? Vous dites juste l'évidence.
Tamara Wijsman le

4
S'il vous plaît élaborer sur votre réponse, cela ne explique pas vraiment quoi que ce soit
Ivo Flipse

1

@ebwhite a raison sur quoi.

Maintenant, la raison pour laquelle vous avez peut-être configuré Teredo (je ne saurais le dire à partir de votre capture d'écran, le transférer dans un fichier texte et coller l'ensemble de la sortie est préférable) - le comportement de localhost en tant qu'IPv6 est conforme aux systèmes de mon Réseau IPv4 uniquement avec teredo installé, mais les systèmes qui en sont dépourvus se comportent comme vous le souhaitez 127.0.0.1lorsque vous envoyez une commande ping localhost. J'ai testé cela avec Windows XP et j'ai besoin de voir ce que mes systèmes Windows 7 font et de mettre à jour la question.

En général, les systèmes par défaut pour IPv6 si IPv6 est disponible donc, votre système fonctionne comme il se doit .


il ne reçoit pas d'octets transférés ou TTL, avec l'une des captures d'écran, s'agit-il d'IPv6? Pourquoi?
Barlop

conforme également à ce que je vois sur les fenêtres 7 - j’imagine que le temps aller-retour est négligeable
Journeyman Geek
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.