Почему существует разница между пингом «localhost» и пингом «локальный IP-адрес»?

32

Использование cmdи pingна Windows дало мне следующие результаты:

  • Пингует "localhost":

Введите описание изображения здесь

  • Пинг "192.168.0.10" (локальный IP-адрес):

Введите описание изображения здесь

Разве обе ситуации не одинаковы?

Я имею в виду, я пингую тот же интерфейс, ту же машину и тот же адрес. Почему я получаю такие разные результаты?

РЕДАКТИРОВАТЬ: Вот мой ipconfig /allэкран:

Введите описание изображения здесь

Диого
источник
18
Вы не пропингуете тот же интерфейс , даже без каких-либо физических интерфейсов у вас все еще есть «локальный хост».
Тамара Вийсман
Если под «тем же интерфейсом» вы подразумеваете петлевой интерфейс, вы правы. Если вы имеете в виду интерфейс Ethernet, вы ошибаетесь по нескольким причинам. (Например, как :: 1 связан с интерфейсом Ethernet? И почему интерфейс Ethernet, задачей которого является отправка пакетов Ethernet по проводам и получение их по проводам, должен участвовать в операции, которая никогда не включает Пакет Ethernet или провод?)
Дэвид Шварц
Я вполне уверен, что этот вопрос задавался ранее в Stackoverflow, если я смогу его найти ...
Chris S
Я полагаю, на суть этого ответа отвечает ТАК: stackoverflow.com/questions/6938039/…
Доусон Тот
Я думаю, что интересная вещь: почему вы получаете количество переданных байтов и TTL при проверке связи с удаленным хостом, но не при проверке связи с localhost? Никто, вероятно, не заботится о том, что формат IP-адреса немного отключен.
дхасенан

Ответы:

46

Вы не пропингуете тот же интерфейс , без каких-либо физических интерфейсов у вас все еще есть «локальный хост».

Ваш localhostиспользуется для обозначения вашего компьютера с его «внутреннего» IP-адреса, а не с любого «внешнего» IP-адреса вашего компьютера. Таким образом, пакеты ping не проходят через какой-либо физический сетевой интерфейс; только через интерфейс виртуальной обратной связи, который напрямую отправляет пакеты от порта к порту без каких-либо физических скачков.

Вы можете все еще задаться вопросом, почему localhostпроисходит разрешение ::1, в то время как традиционно мы ожидаем, что оно разрешится по адресу IPv4 127.0.0.1. Обратите внимание, что .localhostтрадиционно это TLD (см. RFC 2606 ), который указывает на обратный IP-адрес (для IPv4 см. RFC 3330 , особенно 127.0.0.0/8).

Поиск с localhostпомощью nslookupдает нам:

nslookup localhost

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

Таким образом, Windows предпочитает использовать обратный IP-адрес IPv6 ::1(см. RFC 2373 ), поскольку он указан первым.

Итак, откуда это, давайте посмотрим на файл hosts.

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

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

Хм, мы должны посмотреть на настройки DNS Windows.

В этой статье базы знаний рассказывается о настройке, влияющей на предпочтения Windows, выделенной жирным шрифтом:

  1. В редакторе реестра найдите и щелкните следующий раздел реестра:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters
    
  2. Дважды щелкните DisabledComponents, чтобы изменить запись DisabledComponents.

    Примечание. Если запись DisabledComponents недоступна, ее необходимо создать. Для этого выполните следующие действия:

    1. В меню «Правка» выберите пункт «Создать» и нажмите «Значение DWORD (32-разрядное)».

    2. Введите DisabledComponents и нажмите клавишу ВВОД.

    3. Дважды щелкните DisabledComponents.

  3. Введите любое из следующих значений в поле «Значение: данные», чтобы настроить протокол IPv6 на требуемое состояние, и нажмите кнопку «ОК»:

    • Введите, 0чтобы включить все компоненты IPv6. (Настройка Windows по умолчанию)
    • Введите, 0xffffffffчтобы отключить все компоненты IPv6, кроме петлевого интерфейса IPv6. Это значение также настраивает Windows на использование Интернет-протокола версии 4 (IPv4) по сравнению с IPv6 путем изменения записей в таблице политик префиксов. Для получения дополнительной информации см. Выбор источника и адреса назначения.
    • Введите 0x20предпочитаемый IPv4 вместо IPv6, изменив записи в таблице политик префиксов.
    • Введите, 0x10чтобы отключить IPv6 на всех нетуннельных интерфейсах (как на интерфейсах локальной сети, так и на протоколах PPP).
    • Введите 0x01для отключения IPv6 на всех туннельных интерфейсах. К ним относятся протокол внутренней туннельной автоматической адресации (ISATAP), 6to4 и Teredo.
    • Введите, 0x11чтобы отключить все интерфейсы IPv6, кроме петлевого интерфейса IPv6.
  4. Перезагрузите компьютер, чтобы этот параметр вступил в силу.

Что это за таблица префиксов политики?

netsh interface ipv6 show prefixpolicies(или prefixpolicyв более ранних версиях)

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

Эта таблица решает, какие префиксы имеют приоритет над другими префиксами при разрешении DNS.

Ах, поэтому, используя этот KB, мы могли бы добавить сюда записи, которые обозначают, что IPv4 имеет более высокий приоритет, чем IPv6.

Примечание. Нет причин переопределять это поведение, если только у вас не возникли проблемы с совместимостью. Изменение этого параметра на нашем Windows Server нарушило работу нашего почтового сервера, поэтому с ним следует обращаться осторожно ...

Тамара Вийсман
источник
На самом деле «localhost» - это не домен верхнего уровня, а имя хоста. Различие очень тонкое, но в основном каждое доменное имя является именем хоста, но не все имена хостов являются доменными именами. По соглашению имена хостов, оканчивающиеся полной остановкой, должны быть полными доменными именами, и большинство имен хостов, не оканчивающихся полной остановкой, могут быть преобразованы в полные доменные имена путем добавления родительского домена, при необходимости прибегая к добавлению корня. Однако это всего лишь условности. «localhost» зарезервирован RFC 2606, чтобы предотвратить его превращение в TLD, так как он может работать неправильно и даже может вызывать проблемы.
Кевин Кэткарт
2
Неверно, поскольку в 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. Обратите внимание на использование TLDи обратите внимание, что это традиционно определено . На самом деле, ping localhost.работы, которые подтверждают, что это по крайней мере верно в контексте этого вопроса. Ваше последнее предложение не соответствует тому, что сказал RFC, пожалуйста, процитируйте, если оно «препятствует тому, чтобы оно стало TLD», потому что, по его словам, это традиционно TLD. Еще они не будут ссылатьсяthe .localhost TLD
Тамара Wijsman
Я был слишком сильным. localhostможет быть TLD, если за него отвечает реальный DNS-сервер, но обычно localhost обычно определяется как имя хоста в / etc / hosts, в котором имена хостов ищутся до попытки разрешения через DNS. Как dig localhostправило , обычно не возвращает запись «A» для 127.0.0.1 или запись AAAA для :: 1. Это означает, что RFC ошибается, когда говорит traditionally been statically defined in host DNS implementations, а скорее возвращается системой поиска имен системы, которая не всегда использует DNS.
Кевин Кэткарт
@KevinCathcart: Здесь у нас вопрос по Windows, и в версиях для Windows упоминается, что это делается самим DNS. nslookupвозвращает записи. Итак, YMMV ...
Тамара Вийсман
1
@KevinCathcart мои digотчеты о возвращениях A, AAAA и NS localhost, включая авторитетную запись для:localhost. IN NS localhost.
KutuluMike
20

Интерфейс обратной связи существует независимо от вашего интерфейса (ов) Ethernet.

Даже без усложнения IPv6 у вас будет два разных адреса.

IPv4- адрес обратной связи: 127.0.0.1 IPv4- адрес
вашего интерфейса Ethernet: 192.168.0.10

Интерфейс обратной связи вполне может находиться на другом программном уровне, более удаленном от реального оборудования. Я сомневаюсь, что это каким-либо образом зависит от вашего конкретного драйвера интерфейса Ethernet, например.

RedGrittyBrick
источник
11

Localhost и ваш IP-адрес не одно и то же.

Локальный хост - это специальный программный IP-адрес, связанный с вашей системой. Localhost, или 127.0.0.1, является адресом обратной связи. Он всегда указывает на вашу систему и доступен только с вашего компьютера. Эта маршрутизация происходит на уровне операционной системы и определенно никогда не покидает сетевой адаптер ... Так что у него нет шансов попасть в сеть ....

Проверка вашего собственного IP-адреса аналогична, но потенциально может включать в себя весь сетевой стек, так как он должен определить, что это ваш IP-адрес, и правильно его направить ...

Эффект должен быть таким же, но могут быть различия.

Например, отключите сетевой кабель. Пингуйте свой статический IP-адрес. Вы можете не получить маршрут к хосту или другие ошибки. Теперь пропингуйте localhost или 127.0.0.1, и все заработает.

Бенджамин Шолльник
источник
Итак, ping localhost совершенно бесполезен? Я имею в виду, если я хочу проверить свой интерфейс ....
Diogo
4
@DiogoRocha правильно, ping localhost не касается аппаратного обеспечения никогда. Heck ping 192.168.0.10 может также не дать вам достоверную информацию, если драйвер сетевой карты перехватывает запросы, данные ему.
Скотт Чемберлен
@DiogoRocha Ваша терминология отключена. 127.0.0.1 - это интерфейс, но виртуальный.
Бароп
@Diogo, не совсем. Localhost позволяет вам протестировать сетевое поведение приложения или убедиться, что сетевой стек работает .... Но он не тестирует драйвер. Например, если у вас плохой драйвер сетевого адаптера, localhost может помочь доказать, что это хороший драйвер. Ваш пробег определенно будет отличаться, хотя!
Бенджамин Шольник,
6

Из скриншотов я понимаю, что этот вопрос не о Linux, но, возможно, он является полезным «примером».

В этой ОС, если вы пропингуете один из адресов локального адаптера, он транслируется на устройство обратной связи (особый случай взломать). Это означает, что пакеты на самом деле отправляются на устройство обратной связи (что имеет все последствия, о которых вы могли подумать: например, с точки зрения межсетевого экрана, эти пакеты поступают на интерфейс обратной связи и будут соответствовать правилам для этого интерфейса).

Устройство, которому назначен IP, никогда не увидит пакеты. (Это хорошо, потому что он не будет делать правильные вещи с этими пакетами: он хотел бы отправить присоски.)

Тем не менее, если интерфейс, который содержит этот IP-адрес, не работает, вы потеряете это соединение. Преобразование в петлю перестанет работать.

Таким образом, другими словами, это приемлемый дизайн, чтобы рассматривать эти локальные адреса как псевдонимы для устройства обратной связи.

Ссылки на код:

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

Посмотрите на функцию ip_route_output_slow. Это вызывает fib_lookup, и если эта функция возвращает код RTN_LOCAL, dev_outпереписывается в loopback:

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

Kaz
источник
4

Похоже, псевдоним «Localhost» преобразуется в петлю IPv6, а когда вы явно используете адрес IPv4, очевидно, что это не так.

EBGreen
источник
6
ОС, похоже, не согласна с вами.
EBGreen
6
Неважно, он явно настроен для компьютера, localhost запускает петлю ipv6.
Роб
1
@DiogoRocha Нет такого адреса :: 1 в мире IPV4. 127.0.0.1 - это IP-адрес, зарезервированный для обратной связи. :: 1, однако, существует для IPV6 и, как и 127.0.0.1, зарезервирован для обратной петли IPV6.
Энди
4
Как это отвечает на вопрос? Вы просто констатируете очевидное.
Тамара Вийсман
4
Пожалуйста, уточните свой ответ, это ничего не объясняет
Ivo Flipse
1

@ebwhite прав насчёт чего.

Теперь, возможно, причина в том, что у вас настроена Teredo (я не могу сказать по вашему скриншоту, лучше скопировать его в текстовый файл и вставить весь вывод) - поведение localhost, поскольку IPv6 соответствует системам на моем IPv4 только сеть с Teredo установлена, но система без него ведет себя , как вы ожидаете , чтобы получить , 127.0.0.1когда вы пинг localhost. Я протестировал это с Windows XP и мне нужно посмотреть, что делают мои системы Windows 7, и обновить вопрос.

Как правило, системы по умолчанию используют IPv6, если IPv6 доступен, поэтому ваша система работает так, как она должна .

Подмастерье Компьютерщик
источник
он не передает байты или TTL с одним из снимков экрана, это IPv6? Зачем?
Бароп
также согласуется с тем, что я вижу на Windows 7 - я предполагаю, что время прохождения туда и обратно незначительно
Путешественник Geek